梯度切分调优
本节介绍TensorFlow训练场景下,如何进行梯度调优,包括调优前须知、配置环境变量、调优命令和注意事项。
调优前须知
- 请保证训练脚本在昇腾AI处理器上执行成功,功能和精度满足预期。
- 进行梯度切分调优前,请确保关闭Profiling功能,关闭内存静态分配方式(即设置static_memory_policy=0,示例为:custom_op.parameter_map["static_memory_policy"].i = 0),避免影响调优结果,梯度调优目前只支持静态图模式训练。关闭Profiling功能具体操作请参见《性能分析工具使用指南》。
- 进行梯度切分调优前,请确保训练脚本为分布式脚本。
- 如当前网络已进行过梯度切分调优,且已生成知识库信息,则无需再次开启调优。
- AOE不支持不同用户同时使用同一device进行调优。
- 单个AOE进程时,请确保调优用户的家目录下磁盘可用空间>=20G。多个AOE进程时,请自行增加相应的磁盘空间。
- 梯度切分调优不支持模型并行。
配置环境变量
通过TFAdapter发起调优前,需要添加如下环境变量。
- CANN软件基础环境变量
CANN组合包提供进程级环境变量设置脚本,供用户在进程中引用,以自动完成环境变量设置。执行命令参考如下,以下示例均为root或非root用户默认安装路径,请以实际安装路径为准。
# 以root用户安装toolkit包 . /usr/local/Ascend/ascend-toolkit/set_env.sh # 以非root用户安装toolkit包 . ${HOME}/Ascend/ascend-toolkit/set_env.sh
- AOE工具依赖Python,以Python3.7.5为例,请以运行用户执行如下命令设置Python3.7.5的相关环境变量。
#用于设置python3.7.5库文件路径 export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH #如果用户环境存在多个python3版本,则指定使用python3.7.5版本 export PATH=/usr/local/python3.7.5/bin:$PATH
Python3.7.5安装路径请根据实际情况进行替换,您也可以将以上命令写入~/.bashrc文件中,然后执行source ~/.bashrc命令使其立即生效。
- 配置调优模式:
# 调优模式,指定为4:GDAT调优,必选配置 export AOE_MODE=4 # 指定调优后自定义知识库的存储路径,可选配置 export TUNE_BANK_PATH=/home/HwHiAiUser/custom_tune_bank
表1 环境变量说明 环境变量
说明
可选/必选
AOE_MODE
调优模式,支持取值为4(GDAT调优)。
必选
TUNE_BANK_PATH
可通过此环境变量指定调优后自定义知识库的存储路径。
设置的存储路径必须为绝对路径或相对于执行AOE调优引擎所在路径的相对路径,配置的路径需要为已存在的目录,且执行用户具有读、写、可执行权限。若配置的TUNE_BANK_PATH路径不存在或用户无权限,则调优进程会报错并退出。- 若不配置此环境变量,自定义知识库默认存储在:${HOME}/Ascend/latest/data/aoe/custom/graph/${soc_version}路径下。
- 若配置了此环境变量,自定义知识库存储在该环境变量路径下。绝对路径配置以“/”开头,例如:/home/HwHiAiUser/gdat/output。
说明:在多用户共享知识库场景下,共享知识库的用户需要设置TUNE_BANK_PATH为同一路径,并且对配置的路径具有读、写权限。
若调优时自定义了知识库路径,后续进行模型转换时,若想直接使用自定义知识库,也需要配置上此环境变量。
可选
用户可将设置环境变量的命令写入自定义脚本,方便后续执行。
执行调优
- 确保单Device执行时集合通信算子在训练过程中存在。
可检查脚本中是否存在以下两种设置方法中任意一项:
- 包含手动插入的集合通信算子,例如:
from npu_bridge.hccl import hccl_ops from npu_bridge.npu_init import * if get_npu_rank_size() > 0: result = hccl_ops.allreduce(tensor, "sum")
- 包含分布式优化器插入的集合通信算子,例如:
from npu_bridge.estimator.npu.npu_optimizer import NPUOtimizer from npu_bridge.npu_init import * #定义优化器 optimizer = LAMBOptimizer(......) optimizer = NPUOptimizer(optimizer,is_distributed=true)
- 包含手动插入的集合通信算子,例如:
- 设置分布式训练脚本在单个Device上运行。
以Resnet50_HC在device 0上为例,命令修改方式如下。
“for((RANK_ID_n=$RANK_ID_START;RANK_ID_n<$((RANK_SIZE+RANK_ID_START));RANK_ID_n++))”
修改为:
for((RANK_ID_n=$RANK_ID_START;RANK_ID_n<$((1+RANK_ID_START));RANK_ID_n++))
- 直接执行训练脚本,则会生成自定义知识库。训练过程中,调优的关键日志信息:
# TFAdapter开启调优 in tune mode, training graph handled by tools # 工具启动调优 Aoe tuning graph.
生成的自定义知识库,会存储到TUNE_BANK_PATH环境变量中指定的路径。若不设置此配置选项,默认存储到${HOME}/Ascend/latest/data/aoe/custom/graph/${soc_version}目录下。如何使用调优后的自定义知识库请参见如何使用调优后的自定义知识库。
- 训练结束后,删除环境变量AOE_MODE(命令:unset AOE_MODE),即可关闭调优模式。若需要使用自定义知识库,请确保环境变量TUNE_BANK_PATH设置有效。
- 将单Device运行的训练脚本恢复为分布式训练脚本,执行分布式训练,网络会按照知识库中的梯度切分策略实现allreduce融合。
- 训练过程中,知识库计算得到的梯度切分点的关键日志信息:
Use fusion library value
注意事项
如果训练脚本中已手工配置了梯度切分点,则优先使用配置好的切分策略,配置方法:
from hccl.split.api import set_split_strategy_by_idx set_split_strategy_by_idx([118,159,160])
父主题: TensorFlow训练场景下在线调优