最佳实践
以昇腾800I A3推理服务器为例,请参见《CANN 安装指南》进行软件环境的搭建并安装推理框架vLLM-Ascend。搭建完成后,即可加载CMF驱动并使能L2 I/D分离特性进行推理加速。
指定线程绑核原理
由于CMF依赖分线程绑核以取得更好收益,因此需要对指定线程绑核后进行定制化L2 I/D分离设置。
在部署Qwen 1.5b推理服务时,服务端负载主要集中于中断处理、主进程及ACL(Ascend Computing Language)线程这三个功能模块。因各功能模块特征不同,需为它们配置不同的L2 I/D分离配比。绑核策略如图 1 不同模块NPU业务绑核示意图所示。
图 1 不同模块NPU业务绑核示意图
线程ID查询
执行绑核前需要查询主进程和ACL线程的ID。
主进程ID可以通过NPU信息查询。若推理服务在容器中执行,则以下命令在容器内执行。
THDNAME="acl_thread" THREADS=`ps -Te | grep ${THDNAME} | grep -v grep | awk '!a[$1]++' | awk '{print $1}'`显示NPU的进程号。
echo $THREADS
ACL线程ID查询命令。
for THREAD_ID in ${ THREADS[@]} do ACL=`ps -Te | grep ${THREAD_ID} | grep acl_thread | grep -v grep | awk '!a[$1]++' | awk '{print $2}'` done显示ACL的线程号。
echo $ACL
执行绑核
本章节通过命令实现主进程绑核、ACL线程绑核和NPU中断绑核。
NPU中断包括以下两部分:
- “dev*_sq_send_wq“处理发送队列的中断任务。
- “dev*_sq_fair_wq“处理需要公平调度的任务的中断。
其中“*”部分表示NPU编号,例如dev2_sq_send_wq与dev2_sq_fair_wq分别表示NPU2对应的两个中断队列。
cpumask为一个掩码值,其格式为16进制,其二进制表示的每一个bit位代表一个CPU核心(从低到高依次为CPU0、CPU1、...),例如:
- 3(二进制 0011),表示将中断绑定到CPU0与CPU1。
- f (二进制 1111),表示将中断绑定到CPU0-CPU3。
中断绑核命令:
在物理机上执行中断绑核命令,(例如将NPU2的中断绑定在CPU80、81)。
echo "00000000,00000000,00000000,00000000,00000000,00000000,00000000,00010000,00000000,00000000" > /sys/devices/virtual/workqueue/dev2_sq_send_wq/cpumask echo "00000000,00000000,00000000,00000000,00000000,00000000,00000000,00020000,00000000,00000000" > /sys/devices/virtual/workqueue/dev2_sq_fair_wq/cpumask主进程绑核命令(例如将主进程绑定在CPU82、83),若推理服务在容器中执行,则以下命令在容器内执行,否则在物理机上执行。
for THREAD_ID in ${THREADS[@]} do taskset -acp 82-83 ${THREAD_ID} doneACL线程绑核命令(例如将ACL线程绑定在CPU84、85),若推理服务在容器中执行,则以下命令在容器内执行,否则在物理机上执行。
for THREAD_ID in ${ THREADS[@]} do ACL=`ps -Te | grep ${THREAD_ID} | grep acl_thread | grep -v grep | awk '!a[$1]++' | awk '{print $2}'` taskset -acp 84-85 ${ACL} done
分线程设置L2 I/D分离策略
对不同进程/线程采用不同的L2 I/D分离调优策略。
以上述步骤中举例绑核方案为例,在物理机上对CPU80-85进行L2 I/D分离配置。
./devcman -m l2-restrict --start_cpu 80 --end_cpu 81 --d-mask 0xxxx --i-mask 0xxxx
./devcman -m l2-restrict --start_cpu 82 --end_cpu 83 --d-mask 0xxxx --i-mask 0xxxx
./devcman -m l2-restrict --start_cpu 84 --end_cpu 85 --d-mask 0xxxx --i-mask 0xxxx在上述命令示例中,0xxxx为具体的L2 I/D分离配置,请参见设置对应CPU核的L2 I/D配置。
