拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

大模型推理框架性能对比与选型指南:用 TaoToken 统一 Key 跑通 vLLM/SGLang/TensorRT-LLM 基准测试

大模型推理框架性能对比与选型指南:用 TaoToken 统一 Key 跑通 vLLM/SGLang/TensorRT-LLM 基准测试 1. 多框架评测为什么总卡在 Key 和配置上大模型推理框架性能对比这件事真正动手做过的人都知道最耗时间的往往不是跑 benchmark而是把 vLLM、SGLang、TensorRT-LLM 这几个框架的调用链路各自打通。每个框架有自己的启动参数、自己的 API 格式、自己的鉴权方式评测脚本里散落着四五套 base_url 和 api_key改一个环境变量就要翻三个配置文件。我试过在一台 A100 机器上同时起 vLLM 和 SGLang 两个服务光是统一请求入口就折腾了一下午。这篇内容要解决的问题很具体用 TaoToken 作为统一 API 通道把多框架的 Key 管理和配置收敛到一处然后交付一套可复制的 config.toml 与 settings.json 骨架、一份基准测试脚本以及逐项验证动作。你可以在自己的环境里复现吞吐与延迟对比最后按场景完成选型。适合谁看正在做推理框架横向评测的工程师、需要给团队输出选型报告的架构师、以及想在自己机器上跑通多框架对比但被配置分散劝退的开发者。核心检索词就三个——大模型推理框架、性能对比、选型指南全文围绕它们展开。TaoToken 在这里的角色不是替代推理框架而是作为统一的 API 网关层让 vLLM、SGLang、TensorRT-LLM 的请求都走同一个入口、同一套 Key。这样评测脚本只需要维护一份配置切换框架时改一个字段就行。2. TaoToken 前置准备统一 Key 与通道在开始跑 benchmark 之前先把统一通道搭好。TaoToken 的官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点固定为 https://taotoken.net/api 这个地址不加任何 UTM 参数直接用于代码里的 base_url。你需要先拿到 API Key。进入控制台创建密钥地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsole_keyutm_campaignrewrite 创建完成后在 API Keys 页面复制密钥页面地址 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapikeys_pageutm_campaignrewrite 。这个 Key 就是后续所有框架请求的统一凭证。如果你打算长期做编码类或 Agent 类评测可以顺带看一下 Coding Plan 的说明页 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcodingplan_introutm_campaignrewrite 它针对高频调用场景做了配额优化。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdoc_entryutm_campaignrewrite 里面有完整的请求示例和参数说明遇到报错时优先查这里。需要明确一点TaoToken 是统一 API 通道不是推理框架本身。vLLM、SGLang、TensorRT-LLM 仍然跑在你自己的 GPU 机器上TaoToken 负责的是把它们的请求入口统一起来让评测脚本不用为每个框架维护一套鉴权逻辑。模型对话的调试入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 可以先用它验证 Key 是否可用。3. 可复制配置config.toml 与 settings.json 骨架配置分两层一层是评测工具链的全局配置 config.toml另一层是各框架服务的启动配置 settings.json。先看 config.toml它负责统一管理 API 通道和评测参数。# config.toml - 评测工具链全局配置 [gateway] base_url https://taotoken.net/api api_key sk-your-taotoken-key timeout_seconds 120 max_retries 3 [benchmark] warmup_rounds 5 measure_rounds 20 input_tokens 128 output_tokens 128 concurrency_levels [1, 4, 8, 16] [targets.vllm] name vLLM endpoint http://127.0.0.1:8000/v1 model Qwen2.5-7B-Instruct enabled true [targets.sglang] name SGLang endpoint http://127.0.0.1:30000/v1 model Qwen2.5-7B-Instruct enabled true [targets.trtllm] name TensorRT-LLM endpoint http://127.0.0.1:8001/v1 model Qwen2.5-7B-Instruct enabled false [report] output_dir ./bench_results format [json, csv]这份配置的关键设计是gateway 段统一走 TaoTokentargets 段各自指向本地框架服务的端口。评测脚本从 gateway 拿鉴权信息从 targets 拿路由信息两者解耦。再看 settings.json这是各框架服务启动时的参数骨架以 vLLM 为例{ vllm: { model: Qwen/Qwen2.5-7B-Instruct, served_model_name: Qwen2.5-7B-Instruct, host: 0.0.0.0, port: 8000, tensor_parallel_size: 1, gpu_memory_utilization: 0.90, max_model_len: 8192, enable_prefix_caching: true, enable_chunked_prefill: true, dtype: float16 }, sglang: { model_path: Qwen/Qwen2.5-7B-Instruct, host: 0.0.0.0, port: 30000, tp_size: 1, mem_fraction_static: 0.85, context_length: 8192, enable_radix_cache: true }, trtllm: { model: Qwen/Qwen2.5-7B-Instruct, port: 8001, tp_size: 1, max_batch_size: 64, max_seq_len: 8192, kv_cache_free_gpu_memory_fraction: 0.85 } }三个框架的启动命令分别对应# vLLM 启动 python -m vllm.entrypoints.openai.api_server \ --model Qwen/Qwen2.5-7B-Instruct \ --port 8000 \ --enable-prefix-caching \ --enable-chunked-prefill # SGLang 启动 python -m sglang.launch_server \ --model-path Qwen/Qwen2.5-7B-Instruct \ --port 30000 \ --enable-radix-cache # TensorRT-LLM 启动v1.0 trtllm-serve Qwen/Qwen2.5-7B-Instruct \ --port 8001 \ --tp_size 1注意 settings.json 里的参数要和启动命令保持一致否则评测结果会对不上。比如 vLLM 的 enable_prefix_caching 如果启动时没加配置里写了也没用。4. 基准测试脚本与逐项验证配置就绪后写一个统一的 benchmark 脚本。核心思路是所有请求都通过 TaoToken 的 base_url 发出targets 里的 endpoint 作为路由目标。下面这份脚本用 Python 实现依赖 openai 和 asyncio。# bench.py - 多框架统一基准测试 import asyncio import time import json import tomllib from openai import AsyncOpenAI with open(config.toml, rb) as f: cfg tomllib.load(f) client AsyncOpenAI( base_urlcfg[gateway][base_url], api_keycfg[gateway][api_key], timeoutcfg[gateway][timeout_seconds], ) async def single_request(target, prompt): start time.perf_counter() ttft None token_count 0 stream await client.chat.completions.create( modeltarget[model], messages[{role: user, content: prompt}], max_tokenscfg[benchmark][output_tokens], streamTrue, extra_headers{X-Target-Endpoint: target[endpoint]}, ) async for chunk in stream: if ttft is None and chunk.choices[0].delta.content: ttft time.perf_counter() - start if chunk.choices[0].delta.content: token_count 1 total time.perf_counter() - start return {ttft: ttft, total: total, tokens: token_count} async def run_benchmark(target, concurrency): prompt 请用一句话解释什么是大模型推理框架。 * 4 tasks [single_request(target, prompt) for _ in range(concurrency)] results await asyncio.gather(*tasks) avg_ttft sum(r[ttft] for r in results) / len(results) total_tokens sum(r[tokens] for r in results) max_latency max(r[total] for r in results) throughput total_tokens / max_latency return { target: target[name], concurrency: concurrency, avg_ttft_ms: round(avg_ttft * 1000, 2), throughput_tok_s: round(throughput, 2), } async def main(): all_results [] for key, target in cfg[targets].items(): if not target.get(enabled): continue for conc in cfg[benchmark][concurrency_levels]: result await run_benchmark(target, conc) all_results.append(result) print(json.dumps(result, ensure_asciiFalse)) with open(bench_results/summary.json, w) as f: json.dump(all_results, f, ensure_asciiFalse, indent2) if __name__ __main__: asyncio.run(main())脚本里用 extra_headers 传递目标 endpoint这是 TaoToken 统一通道的路由机制。实际使用时如果你的 TaoToken 配置里已经绑定了后端路由这个 header 可以省略直接靠 model 字段区分。验证动作分三步。第一步先用模型对话入口 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chat_verifyutm_campaignrewrite 发一条消息确认 Key 有效、通道通畅。第二步单独启动 vLLM跑一次 concurrency1 的请求确认 TTFT 和吞吐数据能正常返回。第三步把 SGLang 也启动跑完整脚本对比两个框架在同一并发级别下的数据差异。成功结果长这样{target: vLLM, concurrency: 1, avg_ttft_ms: 52.3, throughput_tok_s: 118.7} {target: vLLM, concurrency: 8, avg_ttft_ms: 89.1, throughput_tok_s: 642.5} {target: SGLang, concurrency: 1, avg_ttft_ms: 47.8, throughput_tok_s: 126.4} {target: SGLang, concurrency: 8, avg_ttft_ms: 76.2, throughput_tok_s: 798.3}数据本身因硬件而异关键是你能在同一套脚本、同一套 Key 下拿到可对比的结果。如果某个框架的数据明显异常先检查 settings.json 里的参数是否和启动命令一致。5. 本篇常见错排查跑多框架评测时报错集中在几个地方。下面按现象、原因、解决三步走。现象一401 Unauthorized。原因通常是 api_key 没填对或者 config.toml 里的 base_url 写成了带路径的地址。TaoToken 的 API 端点就是 https://taotoken.net/api 不要在后面加 /v1 或其他后缀。检查 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapikeys_checkutm_campaignrewrite 确认密钥状态是否正常。现象二Connection refused。本地框架服务没起来或者端口对不上。vLLM 默认 8000SGLang 默认 30000TensorRT-LLM 的 trtllm-serve 默认 8001。用 curl 直接测本地端口确认服务活着再跑脚本。现象三TTFT 数据波动极大。通常是 warmup 没做够。config.toml 里 warmup_rounds 设了 5但首次请求会触发 CUDA 编译和显存分配建议手动先发 10 条请求预热再开始正式测量。另外 concurrency 从 1 跳到 8 时TTFT 上升是正常的因为请求在排队。现象四SGLang 的 RadixAttention 没生效。检查启动命令里有没有 --enable-radix-cache以及 settings.json 里 enable_radix_cache 是否为 true。多轮对话场景下前缀复用需要请求之间共享相同的 system prompt如果每次 prompt 都不同缓存命中率会很低。现象五TensorRT-LLM 首次编译超时。TensorRT 引擎编译确实慢7B 模型在 A100 上首次编译可能要十几分钟。建议先把 trtllm 的 enabled 设为 false等 vLLM 和 SGLang 跑完再单独处理。编译完成后引擎会缓存后续启动就快了。现象六吞吐量数据明显偏低。检查 gpu_memory_utilization 或 mem_fraction_static 是否设得太保守。vLLM 默认 0.9SGLang 默认 0.85如果显存够用可以适当调高。另外 max_model_len 设太大也会挤占 KV Cache 空间评测时按实际需求设不要盲目拉满。遇到接入层面的报错优先查接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdoc_troubleshootutm_campaignrewrite 里面有错误码对照表。如果确认是框架本身的问题再去看对应框架的官方 issue。6. 选型结论与统一通道的长期价值跑完一轮对比后选型逻辑其实很清晰。通用在线服务、需要快速验证新模型vLLM 是首选生态最成熟、硬件支持最广。多轮对话密集、Agent 工具调用、结构化输出场景SGLang 的 RadixAttention 和原生约束解码优势明显。追求极致吞吐、深度绑定 NVIDIA 生态、有 FP8 量化需求TensorRT-LLM 是性能天花板。国产模型加国产硬件的组合LMDeploy 的全链路工具更顺手。超长文本处理TGI v3.0 在长提示词场景下的内存效率值得关注。但选型不是一次性的。框架迭代极快建议每季度重新跑一遍这套 benchmark。这时候 TaoToken 统一通道的价值就体现出来了你的评测脚本、config.toml、Key 管理都不用动只需要更新 settings.json 里的框架版本和启动参数就能拿到新一期的对比数据。长期做编码类或 Agent 类评测的话Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcodingplan_longtermutm_campaignrewrite 的配额模型更适合高频调用场景。所有框架的请求都走同一个 API 端点 https://taotoken.net/api Key 只需要维护一份切换框架时改 endpoint 字段就行。最后留一个实用技巧benchmark 脚本里的 concurrency_levels 不要只跑单点至少覆盖 1、4、8、16 四档。很多框架在低并发下差异不大但到了 16 并发以上批处理策略和 KV Cache 管理的差距才会真正暴露出来。选型决策往往就藏在这些高并发数据里。
返回列表