以decode平均时延限制50ms以内为目标,限制非首token时延的极限吞吐的调试方式如下所示。
- 服务端:
- “maxBatchSize”调小到卡对应的时延,一般情况下“maxBatchSize”越小,则decode时延越小。
- 设置supportSelectBatch=True,“prefillTimeMsPerReq”和“decodeTimeMsPerReq”按照模型实际平均首token时延和decode时延进行设置。
- 客户端
- 按并发数发送请求:客户端Concurrency通常配置为maxBatchSize的值减1。
- 按频率发送请求:则Concurrency可设置为1000,请求发送频率根据实际业务场景或按模型实际QPS设置。
操作步骤
- 使用以下命令启动服务,以当前所在Ascend-mindie-service_{version}_linux-{arch}目录为例。
./bin/mindieservice_daemon
回显如下则说明启动成功。
Daemon start success!
服务启动后,可通过info级打屏日志k_caches[0].shape=torch.Size([npuBlockNum, x, x, x])中torch.Size的第一个值获取npuBlockNum的值,如图1所示,与2.a中计算出来的值一致。
图1 启动成功
- 根据2.c计算出“maxBatchSize”的取值范围为[362,1088],设置初始值为435;“maxPrefillBatchSize”参数的值设置为“maxBatchSize”值的一半,取值为217。
- 配置完成后,用户可使用HTTPS客户端(Linux curl命令,Postman工具等)发送HTTPS请求,此处以Linux curl命令为例进行说明。
重开一个窗口,使用以下命令发送请求,获取当前DecodeTime的平均值(Average),如图2所示,此时decode平均时延为60.1889ms。
benchmark \
--DatasetPath "/{模型库安装路径}/tests/modeltest/dataset/full/GSM8K" \ //数据集路径
--DatasetType "gsm8k" \ //数据集类型
--ModelName LLaMa3-8B \ //模型名称
--ModelPath "/{data}/LLaMa3-8B" \ //模型路径
--TestType client \ //模式选择
--Http https://{ipAddress}:{port} \ //请求url
--Concurrency 1000 \ //并发数
--TaskKind stream \ //Client不同推理模式,此处为文本流式推理
--Tokenizer True \ //分词向量化标识
--MaxOutputLen 512 //最大输出长度
图2 maxBatchSize取值为435时decode的平均时延(Average)
以上结果超过了decode平均时延为50ms的限制,所以需要调小“maxBatchSize”的值继续调试。
- 设置“maxBatchSize”的值为300,“maxPrefillBatchSize”参数的值设置为150。然后执行3,继续观察decode平均时延,执行结果如图3所示,此时decode平均时延为46.9689ms。
图3 maxBatchSize取值为300时decode的平均时延(Average)
以上结果可以看到decode平均时延满足50ms以内的限制,但是还未接近50ms,所以需要调大“maxBatchSize”的值继续进行调试。
- 设置“maxBatchSize”的值为350,“maxPrefillBatchSize”参数的值设置为175。然后执行3,继续观察decode平均时延,执行结果如图4所示,此时decode平均时延为49.846ms。
图4 maxBatchSize取值为350时decode的平均时延(Average)
以上结果可以看到decode平均时延已经很接近50ms,此时几乎已达到限制decode时延下的最大吞吐量。如需获取decode平均时延更接近50ms时的“maxBatchSize”值,请根据以上操作步骤继续调试。