昇腾社区首页
中文
注册

自动绑核

简介

Ascend Extension for PyTorch可以通过设置环境变量CPU_AFFINITY_CONF来开启粗/细粒度绑核。该配置能够优化任务的执行效率,避免跨NUMA(非统一内存访问架构)节点的内存访问,减少任务调度开销。

粗粒度绑核:将所有任务绑定在NPU对应NUMA的CPU核上,避免跨NUMA节点的内存访问;并支持粗粒度绑核上的自定义绑核。

细粒度绑核:在粗粒度绑核的基础上, 将主要任务限定在NUMA节点的某固定CPU核上,减少核间切换的开销。

图1 线程绑核的时机和策略设计示意图

使用场景

host下发任务慢的情况下,可以考虑该特性。

使用指导

环境变量CPU_AFFINITY_CONF=<mode>,npu<value1>:<value2>-<value3>

  1. <mode>:绑核模式。
    • 0或未设置:表示不启用绑核功能。
    • 1:表示开启粗粒度绑核,默认绑核策略是根据CPU核的id均分绑核。比如单机8卡服务器,有192核,0卡对应前24核,1卡对应25~48核,依此类推。
    • 2:表示开启细粒度绑核。绑核方式:将torch_npu的热点线程(前向下发、反向下发、二级流水)绑定在每片NUMA区域的前几个核上(0~5核);非torch_npu的热点任务(如dataloader进程),将其绑定在每片NUMA区域的剩余核上,避免与torch_npu下发任务的干扰。
  2. npu<value1>:<value2>-<value3>:自定义NPU的绑核范围。
    1. 自定义绑核当前仅支持粗粒度模式下使用,即mode=1时此项设置生效。
    2. npu<value1>:<value2>-<value3>表示第“value1”张卡绑定在“value2”“value3”的闭区间CPU核上。例如,“npu0:0-2”表示运行在编号为0的NPU上的进程会绑定到编号为0、1、2的CPU核。
    3. 支持部分NPU卡自定义绑核。例如,有两张卡npu0和npu1,对于设置CPU_AFFINITY_CONF=1,npu0:0-0,绑核策略中0卡会被指定为绑定0核,而1卡则保持mode=1的绑核策略。

默认不开启绑核功能。如果需要通过绑核提升性能,推荐使用细粒度绑核。

  • NUMA节点对应的CPU核组可以通过命令lscpu查看。
  • 绑核注意虚拟机与物理机的拓扑结构是否一致。默认情况下,npu0或Device 0对应的核组是NUMA0;但是Docker等虚拟机环境可能会改变映射关系,推荐根据映射关系自定义绑核范围。
  • 由于代码内绑核较后触发,一般会覆盖外界的绑核,比如taskset
  • 绑核对于不同模型优化程度不同,对于CPU瓶颈的模型会有较大提升,对于NPU瓶颈的模型能保证性能持平。

使用样例

  • 粗粒度绑核示例:
    export CPU_AFFINITY_CONF=1
    # 或者
    export CPU_AFFINITY_CONF=mode:1
  • 细粒度绑核示例:
    export CPU_AFFINITY_CONF=2
    # 或者
    export CPU_AFFINITY_CONF=mode:2
  • 自定义多张NPU卡的绑核范围示例:
    比如,0卡绑在第0到1核,1卡绑在第2到5核, 3卡绑在第6核;其他卡是粗粒度。其设置方式如下:
    export CPU_AFFINITY_CONF=1,npu0:0-1,npu1:2-5,npu3:6-6

约束说明

  • 粗粒度功能在Ascend Extension for PyTorch 6.0.RC2及以上版本;只支持export CPU_AFFINITY_CONF=1开启粗粒度绑核。
  • 细粒度功能在Ascend Extension for PyTorch 6.0.0及以上版本。