use std::time::Duration;
use ts_client::{ClientConfig, EngineClient, LoadBalance, Routing};
use ts_wire::{SamplingParams, TokenizedGenerateReqInput};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = std::env::args().collect();
let [_, handshake, num_engines, max_new_tokens, prompts] = args.as_slice() else {
return Err(
"usage: generate <handshake-address> <num-engines> <max-new-tokens> <prompts-file>"
.into(),
);
};
let prompts: Vec<Vec<i32>> = std::fs::read_to_string(prompts)?
.lines()
.filter(|line| !line.trim().is_empty())
.map(|line| line.split(',').map(|id| id.trim().parse()).collect())
.collect::<Result<_, _>>()?;
let client = EngineClient::connect(ClientConfig {
handshake_address: handshake.clone(),
input_address: "tcp://127.0.0.1:0".to_owned(),
output_address: "tcp://127.0.0.1:0".to_owned(),
first_engine_index: 0,
num_engines: num_engines.parse()?,
routing: Routing::Aggregated(LoadBalance::LeastInFlight),
handshake_timeout: Duration::from_secs(1800),
send_timeout: Duration::from_secs(10),
})
.await?;
eprintln!("connected to {} engine(s)", client.engines().len());
let max_new_tokens: i64 = max_new_tokens.parse()?;
let mut streams = Vec::new();
for (i, input_ids) in prompts.into_iter().enumerate() {
let sampling_params = SamplingParams {
max_new_tokens: Some(max_new_tokens),
temperature: 0.0,
..Default::default()
};
let request = TokenizedGenerateReqInput {
input_ids: Some(input_ids),
stream: true,
..TokenizedGenerateReqInput::new(format!("rust-{i}"), sampling_params)
};
streams.push(client.generate(request).await?);
}
let mut results = Vec::new();
for mut stream in streams {
let mut output_ids = Vec::new();
let mut last = None;
while let Some(chunk) = stream.next().await {
let chunk = chunk?;
output_ids.extend_from_slice(&chunk.output_ids);
last = Some(chunk);
}
let last = last.ok_or("stream ended without output")?;
results.push(format!(
r#"{{"rid": "{}", "output_ids": {:?}, "finish_reason": "{}", "prompt_tokens": {}, "completion_tokens": {}, "cached_tokens": {}}}"#,
stream.rid(),
output_ids,
last.finish_reason.unwrap_or_default(),
last.prompt_tokens,
last.completion_tokens,
last.cached_tokens,
));
}
for line in results {
println!("{line}");
}
eprintln!("engine loads: {:?}", client.loads());
Ok(())
}