通过参数调优,使吞吐率(TPS)达到时延约束条件下的最大值。
性能调优环境变量配置如表1所示。
参数名称 |
默认值 |
说明 |
推荐值 |
---|---|---|---|
MIES_USE_MB_SWAPPER |
0 |
开启高性能Swap(不设置时默认关闭);
|
maxPreemptCount >0 时,表示使用Swap功能,此时建议开启高性能Swap。 export MIES_USE_MB_SWAPPER=1 |
MIES_RECOMPUTE_THRESHOLD |
0.5 |
表示当前可下发的请求block数占总block数的比例(也就是block资源利用率)。 以0.5为例,当前可下发的请求资源利用率小于0.5时,就会触发重计算,释放少量请求的block,来保证其他请求资源使用。阈值范围只能是[0,1),值越大越容易触发重计算。0表示所有请求都无法下发。 |
取值建议在0.5上下浮动调整。 export MIES_RECOMPUTE_THRESHOLD=0.5 |
最优性能配置各参数说明及取值如表2所示。
配置类型 |
配置项 |
配置介绍 |
推荐配置 |
---|---|---|---|
调度配置 |
maxPrefillBatchSize |
Prefill阶段一个batch中包含请求个数的上限。 |
小于等于maxBatchSize的值,建议设置为:maxBatchSize/2 ,若显存溢出可适当调小。 |
maxPrefillTokens |
Prefill阶段一个batch中包含input token总数的上限。 |
maxPrefillBatchSize * 数据集token id平均输入长度。 不建议设置过大,若显存溢出可适当调小。 |
|
maxBatchSize |
Decode阶段一次推理包含请求的最大个数。 |
|
|
supportSelectBatch |
|
|
|
prefillTimeMsPerReq |
平均每个请求Prefill时间。 “supportSelectBatch”设置为“true”时生效。 |
建议值:600,单位为ms;若需要降低首token时延可适当调小。 计算与decodeTimeMsPerReq的比值,即prefillTimeMsPerReq/decodeTimeMsPerReq,该比值越大,调度时优先做Decode,会降低Decode时延,提高首token时延。 |
|
decodeTimeMsPerReq |
平均每个请求Decode时间。 “supportSelectBatch”设置为“true”时生效。 |
建议值:50,单位为ms。 建议仅调整prefillTimeMsPerReq值,该值固定为50ms。 |
|
maxQueueDelayMicroseconds |
Prefill组Batch时,最大等待时长。 |
建议值:500,单位为us。 该值设置越大,队列等待时间越长,Prefill阶段的BatchSize会越大. |
|
maxPreemptCount |
每一批次最大可抢占请求的上限,即限制一轮调度最多抢占请求的数量,最大上限为maxBatchSize,取值大于0则表示开启可抢占功能。 |
[0, maxBatchSize],当取值大于0时,cpuMemSize取值不可为0。 建议值:0(关闭)。 当环境变量MIES_USE_MB_SWAPPER为"1"时该参数生效。 |
|
模型配置 |
worldSize |
节点可以使用的NPU卡数。 |
根据用户实际环境情况启用NPU卡数量。 |
npuDeviceIds |
推理使用的一组NPU卡号。 |
[0, 1, 2, ..., worldSize-1] |
|
npuMemSize |
单卡预留给KV Cache的显存,单位GB。 |
npuMemSize=(单卡总空闲-权重/NPU卡数-后处理占用)*系数,其中系数取0.8。 通常情况下,大模型推理主要是显存bound,因此该值配置的越大,KV Cache可用的显存越多,BatchSize就越大,吞吐量将会更优。 说明:
在一些小模型场景下,显存充足,主要是计算bound,调大显存效果并不明显。 |
|
cpuMemSize |
单个CPU中可以用来申请KV Cache的size上限。单位:GB。 开启Swap时生效,如何开启请参考性能调优环境变量配置中的MIES_USE_MB_SWAPPER环境变量。 |
上限根据显存和用户需求来决定。只有当maxPreemptCount为0时,才可以取值为0。 建议值:5。 |
|
cacheBlockSize |
表示一个block块的大小;NPU显存会被分成一个一个的block。 例如配置128,表示一个block实际大小为128*sizof(cache数据类型)字节。如果相同的显存,设置的block size越小,那么block num越多。 |
根据请求平均输入输出大小确定,一般默认为128,如果平均输入较小可以适当调小。 |
|
其他配置 |
logLevel |
设置日志级别。
|
建议值:"Error",打印Error级别的日志。 |
以下操作步骤以LLaMA3-8B双卡,数据类型bfloat16为例,进行最优性能的配置,环境信息举例如下:
本机配置8张显存大小为32G的卡,每张卡空闲状态下已占用3G,以占用2卡进行操作。
cpupower -c all frequency-set -g performance
echo always > /sys/kernel/mm/transparent_hugepage/enabled
npuMemSize = Floor[ (32 - 3 - 15/2 )] * 0.8 = 17G。
“Floor”表示计算结果向下取整。
根据计算结果,配置示例如下所示:
"ModelDeployConfig": { "maxSeqLen" : 2560, "maxInputTokenLen" : 2048, "truncation" : false, "ModelConfig" : [ { "modelInstanceType": "Standard", "modelName" : "LLaMa3-8B", "modelWeightPath" : "/home/data/acltransformer_testdata/weights/LLaMa3-8B", "worldSize" : 2, "cpuMemSize" : 5, "npuMemSize" : 17, "backendType": "atb" } ] },
Python日志路径:/usr/local/Ascend/mindie/latest/mindie-llm/logs/pythonlog.log
Total Block Num = Floor[NPU显存/(模型网络层数*cacheBlockSize*模型注意力头数*注意力头大小*Cache类型字节数*Cache数)],公式中各参数的取值信息如表3所示。
参数 |
取值 |
---|---|
NPU显存 |
2中“npuMemSize”的值:17。 |
模型网络层数 |
模型网络层数是模型权重文件config.json中num_hidden_layers参数的值,LLaMA3-8B的模型网络层数取值为:32。 |
cacheBlockSize |
默认值:128。该参数的值与ScheduleConfig参数说明中cacheBlockSize参数的值保持一致。 |
模型注意力头数 |
模型注意力头数是模型权重文件config.json中num_attention_heads参数的值。 |
注意力头大小 |
“模型注意力头数*注意力头大小”的值为模型权重文件config.json中hidden_size参数的值,即注意力头大小可以根据模型注意力头数计算获得。 说明:
对于GQA类模型(分组查询注意力类模型,例如LLaMA3-8B),需使用模型权重文件config.json中num_key_value_heads参数的值而不是num_attention_heads参数的值作为“模型注意力头数”的值参与计算,即对于两卡LLaMA3-8B,每张卡上的“模型注意力头数*注意力头大小”的值应该为8*128/2=512。 |
Cache类型字节数 |
由模型config.json文件中的torch_dtype决定,一般为float16类型,取值为:2。 |
Cache数 |
Key+Value的值,各自代表1个Cache数。默认值:2。 |
将以上参数值代入公式,得到Total Block Num = Floor[17*1024*1024*1024/(32 * 128 * 8*128/2*2*2)] = 2176。
注:以上算式中128/2是由于LLaMA3-8B双卡,所以注意头数需均分在2张卡上。
根据计算公式:
参数 |
取值 |
---|---|
输入Token数 |
从Benchmark输出的InputTokens参数的平均值获取,取值示例:186。 |
最大输出Token数 |
从config.json文件中的maxIterTimes参数获取,示例取值:512。 |
平均输出Token数 |
实际运行测试数据集后统计GeneratedTokens参数平均输出长度,示例取值:346。 |
cacheBlockSize |
默认值:128。该参数的值与ScheduleConfig参数说明中cacheBlockSize的值保持一致。 |
将以上参数值代入公式:
“Ceil”表示计算结果向上取整。
根据3.a和3.b计算出的“Total Block Num”和“Block Num”值,然后使用公式maxBatchSize=Floor[Total Block Num/Block Num]计算“maxBatchSize”的取值范围。
由以上公式得到“maxBatchSize”的取值范围为[362,1088],设置初始值为435,然后根据吞吐量或者时延要求进行调整,具体场景请参见最佳实践。
maxPrefillBatchSize = Floor[maxBatchSize/2] = 435/2 = 217
maxPrefillTokens = maxPrefillBatchSize * 数据集token id平均输入长度 = 217*186 = 40362
根据公式计算出的值大于8192,所以“maxPrefillTokens”的取值为8192。
如果是显存受限场景,可开启“maxPreemptCount”(即设置为1或2),“cpuMemSize”可从5调整至40。
“supportSelectBatch”设置为“true”。
“prefillTimeMsPerReq”和“decodeTimeMsPerReq”按照模型实际平均首token时延和Decode时延设置,也可参见表2使用推荐配置,然后根据下列场景进行调优。
测试性能的数据集问题条数尽量超过1000条以上(可参考MindIE Benchmark支持的开源数据集MMLU,均在1000条以上),否则平均性能会有较大波动。