简介:本文按实际操作顺序讲解大模型推理服务的部署:先估算显存与并发,再准备环境与配置参数,随后完成单实例验证、多副本上线、监控告警和回滚。读完可得到参数表、验证步骤和一份上线检查清单,减少上线时的反复试错。
部署前先回答三个问题:模型有多大,需要支撑多少并发,单次请求平均有多长。
显存由两部分构成。
除此之外,激活值、推理框架的运行时开销和显存碎片也会占用空间。建议预留一部分余量,具体比例以实际测量为准。
并发数增加会提高吞吐,但增长到显存或计算能力饱和后,请求排队变长,首词元延迟会快速上升。量化可以降低权重占用,但输出质量可能下降,需要用业务评测集对比量化前后的结果。
容量数据必须通过压测获得。压测时应统一以下口径:输入长度分布、输出长度分布、并发数、是否流式返回。口径不统一,测得的数字无法比较。
部署环境中的各个组件版本需要互相匹配。下表列出需要锁定的版本及核对方式。
| 组件 | 要求 | 核对方式 |
|---|---|---|
| GPU驱动 | 满足所选GPU型号与CUDA运行时的最低版本 | 执行 nvidia-smi |
| CUDA与cuDNN运行时 | 与推理框架的预编译版本一致 | 查阅框架的发行说明 |
| 容器运行时 | 能够把GPU设备透传进容器 | 运行官方提供的测试镜像 |
| 推理框架 | 固定到具体版本号,不使用 latest 标签 | 镜像标签或依赖锁文件 |
| 模型文件 | 权重、配置和分词器来自同一次发布 | 核对文件的 sha256 值 |
准备步骤如下。
参数名称因推理框架而异,下表列出的是通用含义。
| 参数 | 作用 | 设置原则 |
|---|---|---|
| 模型路径 | 指向权重目录 | 使用带版本号的目录,例如 /models/名称/版本号 |
| 分词器路径 | 指向分词器文件 | 与模型来自同一次发布 |
| 最大上下文长度 | 输入加输出的词元总上限 | 按业务最长请求设定,设置过大会占用更多KV缓存 |
| 单次最大输出词元数 | 限制单次生成的长度 | 由接口默认值和业务上限共同决定 |
| 最大并发序列数 | 同时处理的请求上限 | 由压测结果确定,且要落在显存余量之内 |
| 张量并行度 | 模型切分到的GPU数量 | 等于模型所需的卡数,且不超过节点可用卡数 |
| 显存使用上限比例 | 框架可占用的显存比例 | 先取保守值,压测后再调整 |
| 请求超时时间 | 单个请求的最长等待时间 | 大于P99生成时长,并留出余量 |
| 健康检查路径 | 存活与就绪探测地址 | 就绪前不接入业务流量 |
| 预热请求数 | 启动后发送的预热请求次数 | 覆盖常见的输入长度 |
一个完整的推理服务通常包含以下组件。
依赖关系是:客户端经网关访问运行时副本,副本在启动时从存储读取模型,监控从网关和副本拉取指标。
在扩展到多个副本之前,先把单个实例验证通过。
接口调用示例如下,具体路径以所用框架的接口文档为准。
curl -N http://127.0.0.1:8000/v1/chat/completions \-H "Authorization: Bearer $API_KEY" \-H "Content-Type: application/json" \-d '{"model": "your-model", "messages": [{"role": "user", "content": "你好"}], "stream": true}'
副本数由压测结果推算:副本数不少于目标峰值请求量除以单副本稳定承载的请求量,再额外增加一个冗余副本。
上线时先接入一个副本,观察指标稳定后再逐步增加。
监控应覆盖以下指标。
| 指标 | 含义 | 告警设置 |
|---|---|---|
| P95首词元延迟 | 第95百分位的首个输出词元返回时间 | 以压测基线为依据设定 |
| 每秒输出词元数 | 实际吞吐 | 低于基线的一定比例时告警 |
| GPU显存利用率 | 显存占用比例 | 长时间接近上限时告警 |
| 5xx错误率 | 服务端错误请求占比 | 持续超过阈值时告警 |
| 排队等待时长 | 请求在队列中的等待时间 | 持续增长时告警 |
告警阈值应由自己的压测数据决定,不要套用其他团队公布的数字。
只有在旧版本保持运行的前提下,回滚才可能在几分钟内完成。因此上线时需要做到以下几点。
灰度上线的流程如下。
回滚耗时取决于网关切换速度和旧副本的响应情况。应在预发环境演练一次,记录实际耗时,再确定对外承诺的时间。