多卡算子调度性能分析及优化

对于鲲鹏服务器,如果出现多卡的算子调度不齐整导致的性能问题,如下图,不同卡的算子调度时长不一致。可以尝试使用“TASK_QUEUE”“NUMA”绑核进行优化。

NUMA绑核前,需要通过命令lspci -vs Bus-Id查看每张卡亲和的NUMA节点,以减少调度时间。

参考下图,Bus-Id可以通过命令npu-smi info查询。

使用绑核,多卡进程启动方式需要使用Python脚本方式,绑核参考脚本如下:

# 请根据机器上的NUMA亲和性配置每个芯片对应的NUMA node映射,并通过numactl进行绑核
# 查询NUMA node命令示例:lspci -vs c1:00.0
declare -A map
map["0"]="3"
map["1"]="3"
map["2"]="2"
map["3"]="2"
map["4"]="0"
map["5"]="0"
map["6"]="1"
map["7"]="1"
export HCCL_WHITELIST_DISABLE=1
RANK_ID_START=0
WORLD_SIZE=8
for((RANK_ID=$RANK_ID_START;RANK_ID<$((WORLD_SIZE+RANK_ID_START));RANK_ID++));
do
    export LOCAL_RANK=$RANK_ID
    export WORLD_SIZE=$WORLD_SIZE
    bind=${map["$RANK_ID"]}
    echo "Device ID: $RANK_ID, bind to NUMA node: $bind"
    numactl --cpunodebind=$bind --membind $bind python3 ddp_test_shell.py &
done
wait

绑核后,多卡算子调度情况如下图,可以看到不同卡算子调度时长变得齐整。