下载
中文
注册

亲和性CPU自动绑核调优

基本原理

相比于X86服务器,ARM服务器通常CPU核数更多,但单核性能更弱,因此更容易触发内核的负载均衡策略,该策略是通过启用进程迁移来降低繁忙的处理器压力。进程迁移会导致进程上下文切换、降低Cache命中率和跨numa内存访问等,从而影响训练性能。

亲和性CPU自动绑核工具无需修改工程脚本,直接运行工具即可实现训练进程与ARM服务器中的CPU进行自动核绑定,提高训练进程的CPU亲和性。

环境准备

  • 已获取亲和性CPU自动绑核工具脚本bind_core.py,并上传至环境任意目录(比如:$HOME/test)。单击链接获取bind_core.py。
  • 驱动版本必须是23.0.RC2及以上版本。

使用场景

该问题通常发生在多卡场景

在进行多卡训练时,通过htop命令查看各个核心CPU的占用情况,其中每列数字为CPU的核编号,进度为当前核的占用情况。如图1所示,可见部分CPU占用已达百分之百,但部分CPU未占用或占用较少,资源分配不均衡。

图1 核心CPU占用情况

此种场景下,可使用亲和性CPU自动绑核工具实现CPU的负载均衡。

操作步骤

亲和性CPU自动绑核工具有两种模式:

launch模式:启动绑核工具时,同时调起训练任务并实现绑核。

attach模式:先自行启动训练任务,再启动绑核工具实现绑核。

  • launch模式
  1. 进入训练脚本所在目录,执行以下命令运行绑核工具。
    python3 $HOME/test/bind.py --application "bash xxx.sh"

    --application或者-app:配置训练命令,请根据实际替换。application带参数输入,此时需要使用英文双引号将application的参数值括起来。

    绑核工具运行后即可启动训练进程并实现自动绑核,绑核完成后将绑核结果打印到当前目录的指定文件(该文件自动生成,文件格式为:bind_core_xxxx_xx_xx_xx_xx_xx.log,xxxx_xx_xx_xx_xx_xx为时间戳),如图2所示,表示绑核完成。

    图2 launch模式绑核完成

    绑核工具运行后,将会在30s内自动检测当前训练进程,如果30s内训练进程没有启动,则会报错,导致绑核失败。请根据当前模型训练时所需要的数据预处理时间,使用-t或者--time参数设置时延,具体命令如下所示。

    python3 bind.py --time 60 --applicationbash "bash xxx.sh" #表示绑核工具将在60s后开始运行。
  2. 执行以下命令打开结果文件,查看绑核结果,如图3所示。
    cat bind_core_xxxx_xx_xx_xx_xx_xx.log
    图3 launch模式绑核结果
  • attach模式
  1. 进入训练脚本所在目录,执行以下命令开始训练。
    bash xxx.sh

    xxx.sh:训练脚本,请根据实际替换。

  2. 新开一个窗口并进入$HOME/test目录,执行以下命令运行绑核工具。
    python3 bind_core.py

    训练进程结束后,绑核工具自动停止运行,并将绑核结果打印到当前目录的指定文件(该文件自动生成,文件格式为:bind_core_xxxx_xx_xx_xx_xx_xx.log,xxxx_xx_xx_xx_xx_xx为时间戳),如图4所示,表示绑核完成。

    图4 attach模式绑核完成

    绑核工具运行后,将会在30s内自动检测当前训练进程,如果30s内训练进程没有启动,则会报错,导致绑核失败。请根据当前模型训练时所需要的数据预处理时间,使用-t或者--time参数设置时延,具体命令如下所示。

    python3 bind_core.py --time 60 #表示绑核工具将在60s后开始运行。
  3. 执行以下命令打开结果文件,查看绑核结果,如图5所示。
    cat bind_core_xxxx_xx_xx_xx_xx_xx.log
    图5 attach模式绑核结果

上述launch模式和attach模式中,启动绑核命令后,通过htop命令查看显示如图6所示,可以发现CPU占用非常均衡。

图6 核心CPU占用均衡