Title here
Summary here
本文介绍 Dynamo 的多引擎抽象层设计,包括 AsyncEngine Trait 和各引擎的适配实现。
Dynamo 的核心设计理念之一是 引擎无关性——支持多种推理后端,通过统一接口对外暴露服务。
| 引擎 | 特点 | Feature Flag | 状态 |
|---|---|---|---|
| vLLM | 最成熟的开源方案,PagedAttention | vllm | 生产就绪 |
| TensorRT-LLM | NVIDIA 官方,最高性能 | trtllm | 生产就绪 |
| SGLang | RadixAttention,结构化生成 | sglang | 支持中 |
| mistral.rs | Rust 原生,轻量级 | mistralrs | 实验中 |
| llama.cpp | CPU 友好,GGUF 格式 | llamacpp | 实验中 |
#[async_trait]
pub trait AsyncEngine<Req: Data, Resp: Data + AsyncEngineContextProvider, E: Data>:
Send + Sync
{
async fn generate(&self, request: Req) -> Result<Resp, E>;
}| 类型 | 说明 |
|---|---|
| Input | SingleIn<BackendInput> - 已 tokenize 的请求 |
| Output | ManyOut<Annotated<LLMEngineOutput>> - 流式输出 |
| Error | Error - 统一错误类型 |
pub struct VllmEngine {
cancel_token: CancellationToken,
worker: worker::VllmWorker,
}#[async_trait]
impl AsyncEngine<SingleIn<BackendInput>, ManyOut<Annotated<LLMEngineOutput>>, Error>
for VllmEngine
{
async fn generate(&self, request: SingleIn<BackendInput>)
-> Result<ManyOut<Annotated<LLMEngineOutput>>, Error>
{
// 1. 解包请求和上下文
let (request, context) = request.into_parts();
let ctx = context.context();
// 2. 创建响应通道
let (resp_tx, mut resp_rx) = tokio::sync::mpsc::channel(128);
// 3. 构造工作请求
let work_req = worker::WorkRequest {
request_id: context.id().to_string(),
request,
response_channel: resp_tx,
};
// 4. 入队请求
self.worker.enqueue_request(work_req).await?;
// 5. 构造流式响应
let output = stream! {
loop {
match resp_rx.recv().await {
Some(out) => yield out,
None => break,
}
}
};
Ok(ResponseStream::new(Box::pin(output), ctx))
}
}TensorRT-LLM 引擎直接与 C++ 库交互:
pub struct Executor {
inner: TrtllmExecutor,
// ...
}| 特点 | 说明 |
|---|---|
| C++ 绑定 | 通过 FFI 调用 TensorRT-LLM C++ 库 |
| 编译优化 | 使用预编译的 TensorRT 引擎 |
| 取消支持 | 支持请求级别的取消 |
| 状态机 | 使用 unfold 模式构造流 |
// 启动取消监控任务
tokio::spawn(async move {
tokio::select! {
_ = context.stopped() => {
// 请求被取消
engine_context.cancel();
cancel_token.cancel();
}
_ = tx.closed() => {
// 响应流关闭
}
}
});| 场景 | 推荐引擎 | 原因 |
|---|---|---|
| 生产环境,NVIDIA GPU | TensorRT-LLM | 最高性能 |
| 快速开发,灵活配置 | vLLM | 成熟稳定 |
| JSON 输出,正则约束 | SGLang | RadixAttention |
| CPU 推理,边缘设备 | llama.cpp | 轻量级 |
AsyncEngine Trait#[cfg(feature = "my_engine")]
pub mod my_engine;
// my_engine/engine.rs
pub struct MyEngine {
// ...
}
#[async_trait]
impl AsyncEngine<SingleIn<BackendInput>, ManyOut<Annotated<LLMEngineOutput>>, Error>
for MyEngine
{
async fn generate(&self, request: SingleIn<BackendInput>)
-> Result<ManyOut<Annotated<LLMEngineOutput>>, Error>
{
// 实现推理逻辑
}
}本文介绍了 Dynamo 的多引擎抽象层:
继续阅读 04-Worker 设计详解,了解 Dynamo 的 Worker 架构。