
# 大语言模型推理性能PD配比仿真
acs-advisor基于python simpy实现了对vllm的轻量化仿真，支持针对PD混合、PD分离两类部署形态进行性能仿真，在给定请求负载和SLO约束下仿真出最优的实例数（混合实例、预填充推理实例，增量推理实例）。acs-advisor中实现了vllm内部的请求调度逻辑，从而近似还原了vllm中请求组batch的情况。对于模型执行耗时，acs-advisor中基于vllm服务的真实打点数据构建模型单步推理耗时的预测模型，从而屏蔽掉不同模型推理耗时对仿真的影响。注意，仿真工具当前没有适配前缀缓存，针对开了前缀缓存的场景，prefill实例的TTFT仿真偏差会较大。
#### 安装acs-advisor工具
昇腾云6.5.910及以后版本的配套镜像中默认已经安装acs-advisor工具的whl包acs_advisor-xxx-py3-none-any.whl，无需单独安装。
可以通过如下命令查看是否已经安装acs-advisor工具。
```
pip show acs-advisor
```
如果需要安装acs-advisor工具，请参考以下步骤执行。
1. 获取acs-advisor工具的whl包。whl包存放在软件包AscendCloud-LLM-xxx.zip \> llm_tools目录中。acs-advisor工具安装在具备python的环境即可。
2. 在已经安装python的环境中如windows机器（打开Windows PowerShell）或者linux服务器中，执行如下命令安装acs-advisor工具。(可选)
   ```
   pip install llm_tools/acs_advisor-*-py3-none-any.whl
   ```
   
 
#### 获取仿真数据源
使用acs-advisor进行实例数或者PD配比仿真，需要提前获取到vllm服务的真实service profiler打点数据作为工具输入。因此需要真实启动vllm服务，然后基于[acs-bench工具](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_infer_5910029.html) 触发性能测试并导出服务的性能打点数据。样本量较少时会导致仿真得出的TTFT/TPOT等指标偏差较大，建议使用acs-bench采集性能打点数据时确保请求数在200以上。
#### 仿真工具参数说明
下述命令表示，针对PD分离部署，在给定service profiler数据路径、预填充推理实例数（prefill实例数）范围\[1, 4\]和增量推理实例数（decode实例数）范围\[1, 2\]时，寻找满足P90 TTFT不超过3000ms且P90 TPOT不超过50ms的最优实例数。
```
acs-advisor simulate infer -i {{仿真数据源文件路径}} -ttft 3000 -tpot 50 -pmax 4 -pmin 1 -dmax 2 -dmin 1 -percent 90 -dt service_profiler -ds pd-disagg
```
下述命令表示，针对PD混合部署，在给定service profiler数据路径和推理实例数范围\[1, 4\]时，寻找满足P90 TTFT不超过3000ms且P90 TPOT不超过50ms的最优实例数。
```
acs-advisor simulate infer -i {{仿真数据源文件路径}} -ttft 3000 -tpot 50 -mmax 4 -mmin 1 -percent 90 -dt service_profiler -ds pd-mix
```
表1acs-advisor 仿真工具参数介绍 
| 字段                            | 是否必填 | 可选值                                      | 说明                                                                                                                                                                                                                 |
|:---|:---|:---|:---|
| -i/--input_path               | 是    | 无                                        | service profiler文件夹路径                                                                                                                                                                                              |
| -dt/--datasource-type         | 是    | 默认为metrics，可选值包括service_profiler和metrics | service_profiler，需要先启动服务，基于acs-bench和service profiler采集服务内部信息，然后基于该数据进行仿真。离线使用acs-advisor工具进行仿真时需要使用service_profiler数据源。 metrics为vllm的metrics指标，通常在在线扩缩容场景使用，当前暂不支持。 |
| -ttft/--slo-ttft              | 是    | 任意正整数                                    | 期望的首token时延，单位为毫秒ms                                                                                                                                                                                                |
| -tpot/--slo-tpot              | 是    | 任意正整数                                    | 期望的token间时延，单位为毫秒ms                                                                                                                                                                                                |
| -percent/--slo-percent        | 是    | -1或者1到100的任意正整数                          | 当取值为正整数时表示百分比，如90表示百分之90（P90）的请求。-1表示所有请求的指标取均值。                                                                                                                                                                   |
| -ds/--deployment-strategy     | 否    | 默认为pd-disagg，可选值包括pd-disagg和pd-mix       | 仿真 "PD分离" 或者 "PD混合"                                                                                                                                                                                                |
| -pmax/--prefill-max-replicas  | 否    | 默认为1，任意正整数                               | prefill 最大实例数                                                                                                                                                                                                      |
| -pmin/--prefill-min-replicas  | 否    | 默认为1，任意正整数                               | prefill最小实例数                                                                                                                                                                                                       |
| -dmax/-decode-max-replicas    | 否    | 默认为1，任意正整数                               | decode最大实例数                                                                                                                                                                                                        |
| -dmin/--decode-min-replicas   | 否    | 默认为1，任意正整数                               | decode最小实例数                                                                                                                                                                                                        |
| -mmax/--mix-max-replicas      | 否    | 默认为1，任意正整数                               | mix最大实例数（非PD分离）                                                                                                                                                                                                    |
| -mmin/--mix-min-replicas      | 否    | 默认为1，任意正整数                               | mix最小实例数（非PD分离）                                                                                                                                                                                                    |
| -rdt/--rate-distribution-type | 否    | 默认为None，可选值包括poisson或者uniform            | 默认不指定请求分布，将采集的请求负载信息在仿真系统中重放。仅当指定rdt时，-rc / -r / -il / -ol 参数才生效                                                                                                                                                   |
| -rc/--request-count           | 否    | 默认为300，可选值为任意正整数                         | 仿真请求数，默认将采集的请求负载信息在仿真系统中重放。仅当指定 -rdt 参数时 -rc 参数才会生效                                                                                                                                                                |
| -r/--request-rate             | 否    | 默认为5，可选值为任意正整数                           | 默认值为-1表示不指定请求速率，将采集的请求负载信息在仿真系统中重放。仅当指定 -rdt 参数时 -r 参数才会生效                                                                                                                                                         |
| -il/--input-length            | 否    | 默认为1024，可选值为任意正整数                        | 仿真时请求的输入token长度，默认将采集的请求负载信息在仿真系统中重放。仅当指定-rdt参数时 -il参数才会生效                                                                                                                                                         |
| -ol/--output-length           | 否    | 默认为512，可选值为任意正整数                         | 仿真时请求的输出token长度，默认将采集的请求负载信息在仿真系统中重放。仅当指定-rdt参数时 -ol参数才会生效                                                                                                                                                         |
| -pdp/--prefill-dp-size        | 否    | 默认为-1，可选值为任意正整数                          | 默认为-1表示使用service profiler数据中采集到的dp参数，注意ascend-vllm v0版本中必须手动指定该参数。prefill实例的数据并行参数，在当前vllm的部署形态中，Prefill的数据并行通常为1                                                                                                  |
| -ddp/--decode-dp-size         | 否    | 默认为-1，可选值为任意正整数                          | 默认为-1表示使用service profiler数据中采集到的dp参数，注意ascend-vllm v0版本中必须手动指定该参数。decode实例的数据并行参数，在当前vllm的部署形态中，decode的数据并行通常为16/32/64                                                                                             |
| -cb/--communication-bandwidth | 否    | 默认为20，可选值为任意正整数                          | PD分离部署形态时，decode pull kv cache的带宽大小，单位为GB/s，这个参数会轻微影响时延。通常使用默认值即可。                                                                                                                                                 |
| -vv/--vllm-version            | 否    | 默认为v1，可选值包括v0和v1                         | 默认为vllm v1版本。不同版本的vllm，其调度逻辑不一样，会影响ttft和tpot。                                                                                                                                                                      |
| -mtpar/--mtp-accept-rate      | 否    | 默认为0，可选值为0到1之间的任意浮点数                     | mtp接收率，deepseek通常为0.8，不同模型需要评估对应的mtp接受率。指定该参数后，仿真过程中会概率性一次生成2个token。                                                                                                                                               |
| -nss/--num-scheduler-steps    | 否    | 默认为1，可选值为1-8之间的正整数                       | 调度一次前向推理多次，在ascend-vllm v1中通常为4。                                                                                                                                                                                   |
| -profile/--profile            | 否    | 默认为False，bool类型参数。                       | 指定该参数表示生成仿真系统内部的trace图，可用于白盒化展示仿真系统的内部逻辑。指定该参数时会导致仿真速度变慢，因此通常仅debug阶段打开。                                                                                                                                           |
| -l/--lite-mode                | 否    | 默认为False，bool类型参数                        | 对于data-parallel-size大于1的场景，仿真耗时会随data-parallel-size参数增加而线性增加。指定该参数时将会使能轻量化仿真，即仅针对部分dp实际触发仿真任务，从而减少耗时，使用该参数后可能导致tpot的偏差增大1ms左右。                                                                                     |
| -seed/--seed                  | 否    | 默认为3，可选值为任意正整数                           | 仿真时，工具内部生成请求速率和机器学习模型的随机种子                                                                                                                                                                                         |
   
表2acs-advisor 仿真工具环境变量介绍 
| 字段                           | 是否必填 | 可选值                                           | 说明                                                                 |
|:---|:---|:---|:---|
| ADVISOR_LOG_LEVEL            | 否    | 默认为info，debug, info, warning, error, critical | advisor工具日志等级。                                                     |
| MAX_PADDING_LIMITS           | 否    | 默认为50000，可选值为任意正整数                            | ascend-vllm v0中特有环境变量。这个参数会影响请求调度逻辑，需要根据ascend-vllm v0部署服务的参数配置确定。 |
| PREFILL_STOP_SCHEDULE_TOKENS | 否    | 默认为-1，可选值为任意正整数                               | ascend-vllm v1中特有环境变量。这个参数会影响请求调度逻辑，需要根据ascend-vllm v1部署服务的参数配置确定。 |
   
#### 输出示例
下述截图为工具输出示例，表示不同P实例（预填充推理）和D实例（增量推理）数量下的TTFT、TPOT和输出吞吐，以及在P90 TTFT不超过5000ms且P90 TPOT不超过50ms下的有效输出吞吐-goodput。最后给出最佳的PD实例数为3P1D。
![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002509726693.png "点击放大")
#### 仿真系统可视化
当指定--profile参数时，会在当前路径下生成simulate_profile文件夹，文件夹中包含不同配比下的仿真可视化文件。拖拽下述任意json文件至chrome://tracing（浏览器中输入该地址）中即可可视化仿真系统内部请求的推理过程。
![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002509846719.png)
可视化示例如下所示：
![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002477646760.png "点击放大")
