开发者
资源
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

最佳实践

以昇腾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}
    done
  • ACL线程绑核命令(例如将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配置