亲和性CPU自动绑核调优
基本原理
相比于X86服务器,ARM服务器通常CPU核数更多,但单核性能更弱,因此更容易触发内核的负载均衡策略,该策略是通过启用进程迁移来降低繁忙的处理器压力。进程迁移会导致进程上下文切换、降低Cache命中率和跨numa内存访问等,从而影响训练性能。
亲和性CPU自动绑核工具无需修改工程脚本,直接运行工具即可实现训练进程与ARM服务器中的CPU进行自动核绑定,提高训练进程的CPU亲和性。
环境准备
使用场景
该问题通常发生在多卡场景。
在进行多卡训练时,通过htop命令查看各个核心CPU的占用情况,其中每列数字为CPU的核编号,进度为当前核的占用情况。如图1所示,可见部分CPU占用已达百分之百,但部分CPU未占用或占用较少,资源分配不均衡。
此种场景下,可使用亲和性CPU自动绑核工具实现CPU的负载均衡。
操作步骤
亲和性CPU自动绑核工具有两种模式:
launch模式:启动绑核工具时,同时调起训练任务并实现绑核。
attach模式:先自行启动训练任务,再启动绑核工具实现绑核。
- launch模式
- 进入训练脚本所在目录,执行以下命令运行绑核工具。
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所示,表示绑核完成。
绑核工具运行后,将会在30s内自动检测当前训练进程,如果30s内训练进程没有启动,则会报错,导致绑核失败。请根据当前模型训练时所需要的数据预处理时间,使用-t或者--time参数设置时延,具体命令如下所示。
python3 bind.py --time 60 --applicationbash "bash xxx.sh" #表示绑核工具将在60s后开始运行。
- 执行以下命令打开结果文件,查看绑核结果,如图3所示。
cat bind_core_xxxx_xx_xx_xx_xx_xx.log
- attach模式
- 进入训练脚本所在目录,执行以下命令开始训练。
bash xxx.sh
xxx.sh:训练脚本,请根据实际替换。
- 新开一个窗口并进入$HOME/test目录,执行以下命令运行绑核工具。
python3 bind_core.py
训练进程结束后,绑核工具自动停止运行,并将绑核结果打印到当前目录的指定文件(该文件自动生成,文件格式为:bind_core_xxxx_xx_xx_xx_xx_xx.log,xxxx_xx_xx_xx_xx_xx为时间戳),如图4所示,表示绑核完成。
绑核工具运行后,将会在30s内自动检测当前训练进程,如果30s内训练进程没有启动,则会报错,导致绑核失败。请根据当前模型训练时所需要的数据预处理时间,使用-t或者--time参数设置时延,具体命令如下所示。
python3 bind_core.py --time 60 #表示绑核工具将在60s后开始运行。
- 执行以下命令打开结果文件,查看绑核结果,如图5所示。
cat bind_core_xxxx_xx_xx_xx_xx_xx.log
上述launch模式和attach模式中,启动绑核命令后,通过htop命令查看显示如图6所示,可以发现CPU占用非常均衡。