如何对LLM推理服务做压测?EnergonAI+Locust的完整实操指南
如何对LLM推理服务做压测EnergonAILocust的完整实操指南【免费下载链接】EnergonAILarge-scale model inference.项目地址: https://gitcode.com/gh_mirrors/en/EnergonAILLM推理服务响应时间长、输出长度不可控不做压测就上线很容易在真实流量下崩掉。本文带你用开源框架EnergonAI大规模模型推理服务框架搭配压测工具Locust从零完成一次完整的 LLM 推理服务压测并看懂结果、调优服务参数。 为什么LLM推理服务必须做压测传统Web接口的响应时间在毫秒级而大模型生成任务有三大特点耗时长一次生成可能持续数秒甚至数十秒长度动态输出token数由模型决定无法预先截断并发敏感批处理batching、请求队列会显著改变吞吐表现。不压测你无法回答这些关键问题服务每秒能处理多少请求P95延迟是多少队列多快会满因此LLM推理服务压测是大模型上线前的必修课。 压测对象EnergonAI推理服务长什么样EnergonAI 是一个大规模模型推理服务框架核心能力包括张量并行、流水线并行、自定义CUDA内核以及基于 FastAPI 的在线服务封装详见 README.md 中的项目介绍。以官方OPT示例为例服务入口在examples/opt/opt_fastapi.py启动命令只需一行python opt_fastapi.py opt-125m服务会在0.0.0.0:7070提供/generationHTTP接口。三个与压测直接相关的参数见examples/opt/README.md参数说明压测关注点--queue_size请求队列容量0表示无限队列满时返回406状态码--max_batch_size批处理大小上限直接影响并发吞吐--cache_size结果缓存大小默认0缓存会虚高压测结果压测时应关闭--tp张量并行度1到GPU数决定单实例推理速度 一键搭建Locust压测环境项目已经内置了现成的压测脚本位于examples/opt/benchmark/locustfile.py只需两步pip install locust2.11.0 # 版本要求见 examples/opt/requirements.txt cd examples/opt/benchmark locust启动后Locust 会在控制台打印 Web 界面地址浏览器打开即可配置目标地址如http://localhost:7070、虚拟用户数、启动速率。整个过程无需写一行代码。 没有GPU、没有模型权重也能压测Bloom示例examples/bloom/README.md支持--random_init True随机初始化560M模型非常适合搭建压测沙盒。 读懂压测脚本Locust如何模拟真实用户examples/opt/benchmark/locustfile.py全文只有十几行设计却很有讲究class GenerationUser(HttpUser): task def generate(self): prompt Question: What is the longest river on the earth? Answer: for i in range(4, 9): data {max_tokens: 2**i, prompt: prompt} with self.client.post(/generation, jsondata, catch_responseTrue) as response: if response.status_code in (200, 406): response.success() else: response.failure(Response wrong)三个关键设计值得学习梯度压力max_tokens取 16~2562的4次方到8次方模拟不同输出长度的请求分布而不是单一长度406也算成功服务端队列满时主动丢弃请求并返回406见opt_fastapi.py中QueueFullError的处理这是预期行为而非故障压测中应视为成功避免污染失败率指标catch_response手动判定成功/失败比默认2xx即成功更贴合推理服务的真实语义。Bloom版本的脚本examples/bloom/benchmark/locustfile.py逻辑相同仅请求字段改为max_new_tokens可直接复用到其他模型。 压测结果怎么看调优怎么做Locust Web界面实时展示四项核心指标RPS每秒请求数服务端吞吐上限响应时间 P50 / P95 / P99重点关注 P99 尾延迟LLM场景下用户感知最敏感失败率406不计入失败后真正的失败才是服务问题请求总数配合观察服务端日志中的批处理命中率。拿到基线数据后可依次尝试以下调优手段并对比数据调优项命令示例预期效果提高并行度--tp 8单卡放不下/算不动时首选扩大批处理--max_batch_size 16并发请求合并成batch吞吐提升收紧队列--queue_size 32防止过载雪崩用406快速失败换稳定延迟⚠️ 压测前务必确认--cache_size为0默认值否则缓存命中会返回随机旧结果压测数据完全失真。 扩展到更多压测场景EnergonAI 的示例目录覆盖了多种推理负载压测脚本模式均可复用examples/bert/、examples/gpt/文本理解/生成类服务examples/hf_gpt2/HuggingFace格式GPT-2服务examples/bloom/Bloom模型支持int8量化--dtype int8可对比量化前后吞吐examples/vit/视觉模型推理输入图片即可下图就是其自带的测试样本对图像类服务做压测时只需把 Locust 脚本中的prompt换成图片文件上传即可其余梯度压力、成功判定逻辑完全通用。✅ 常见坑清单压测结果异常高先查是否开启了结果缓存大量406说明队列过小或吞吐不足先提--tp/--max_batch_size再决定放大队列还是接受快速失败输出被截断OPT示例中max_tokens上限为256压测脚本的梯度最大256恰好贴合该限制忘记预热首批请求包含权重加载与显存分配建议正式统计前跑一轮预热流量。总结用 EnergonAI 起服务、用 Locust 打流量、用406和P99说话——这就是 LLM 推理服务压测的最小闭环。先跑通opt-125m拿到基线再逐步替换更大的模型和真实流量分布你的推理服务上线会更有底气。【免费下载链接】EnergonAILarge-scale model inference.项目地址: https://gitcode.com/gh_mirrors/en/EnergonAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考