当训练网络精度未达预期时,可以通过采集训练过程中各算子的运算结果(即Data Dump数据),然后借助精度比对工具,和业界标准算子(如TensorFlow)运算结果进行数据偏差对比,从而准帮助开发人员快速解决算子精度问题。当前支持采集的算子数据主要包括:
默认训练过程中不采集算子的dump数据,如需采集并对数据进行分析,可从以下两种方法中任选一种:
Estimator模式下,通过NPURunConfig中的dump_config采集Dump数据,在创建NPURunConfig之前,实例化一个DumpConfig类进行dump的配置(包括配置dump路径、dump哪些迭代的数据、dump算子的输入还是输出数据等)。
关于DumpConfig类的构造函数中每个字段的详细解释,请参见对应接口说明。
from npu_bridge.npu_init import * # dump_path:dump数据存放路径,该参数指定的目录需要在启动训练的环境上(容器或Host侧)提前创建且确保安装时配置的运行用户具有读写权限 # enable_dump:是否开启Dump功能 # dump_step:指定采集哪些迭代的Dump数据 # dump_mode:Dump模式,取值:input/output/all dump_config = DumpConfig(enable_dump=True, dump_path = "/home/HwHiAiUser/output", dump_step="0|5|10", dump_mode="all") session_config=tf.ConfigProto() config = NPURunConfig( dump_config=dump_config, session_config=session_config )
sess.run模式下,通过session配置项enable_dump、dump_path、dump_step、dump_mode配置相关参数。
config = tf.ConfigProto() custom_op = config.graph_options.rewrite_options.custom_optimizers.add() custom_op.name = "NpuOptimizer" custom_op.parameter_map["use_off_line"].b = True # enable_dump:是否开启Dump功能 custom_op.parameter_map["enable_dump"].b = True # dump_path:dump数据存放路径,该参数指定的目录需要在启动训练的环境上(容器或Host侧)提前创建且确保安装时配置的运行用户具有读写权限 custom_op.parameter_map["dump_path"].s = tf.compat.as_bytes("/home/HwHiAiUser/output") # dump_step:指定采集哪些迭代的Dump数据 custom_op.parameter_map["dump_step"].s = tf.compat.as_bytes("0|5|10") # dump_mode:Dump模式,取值:input/output/all custom_op.parameter_map["dump_mode"].s = tf.compat.as_bytes("all") config.graph_options.rewrite_options.remapping = RewriterConfig.OFF config.graph_options.rewrite_options.memory_optimization = RewriterConfig.OFF with tf.Session(config=config) as sess: print(sess.run(cost))
分布式的数据并发场景下,如果需要减少dump数据量,可以指定在某个RANK上采集Dump数据,下面以Estimator模式训练脚本为例介绍指定方法。
if int(os.getenv('RANK_ID')) == 7: dump_flag = True else: dump_flag = False dump_config = DumpConfig(enable_dump=dump_flag, dump_path="/home/data_dump", dump_step="20", dump_mode="output")
export DUMP_GE_GRAPH=2 export DUMP_GRAPH_PATH=/home/dumpgraph # 指定dump图路径,如果不配置存储在训练脚本所在目录
路径key |
说明 |
备注 |
---|---|---|
dump_path |
训练脚本中设置的dump_path路径(如果设置的是相对路径,则为拼接后的全路径) |
-- |
time |
dump数据文件落盘的时间 |
格式为:YYYYMMDDHHMMSS |
deviceid |
Device设备ID号 |
-- |
model_name |
子图名称 |
model_name层可能存在多个文件夹。 如果model_name出现了“.”、“/”、“\”、空格时,转换为下划线表示。 |
model_id |
子图ID号 |
-- |
data_index |
迭代数,用于保存对应迭代的dump数据 |
如果指定了dump_step,则data_index和dump_step一致;如果不指定dump_step,则data_index序号从0开始计数,每dump一个迭代的数据,序号递增1。 |
dump文件 |
命名规则格式为{op_type}.{op_name}.{taskid}.{stream_id}.{timestamp}。如果按命名规则定义的文件名称长度超过了OS文件名称长度限制(一般是255个字符),则会将该dump文件重命名为一串随机数字,映射关系可查看同目录下的mapping.csv。 |
如果op_type、op_name出现了“.”、“/”、“\”、空格时,转换为下划线表示。 |
由于“ge”开头的dump图文件非常多,而且dump数据文件夹的model_name层可能存在多个文件夹,事实上,我们仅需要找到计算图文件,且仅需要model_name为计算图名称的文件夹。下面提供一些方法帮助用户快速找到对应的文件。
grep Iterator *_Build.txt
如上图所示,“ge_proto_00292_Build.txt”文件即是我们需要找到的计算图文件。
graph { name: "ge_default_20201209083353_71" op { name: "atomic_addr_clean0_71" type: "AtomicAddrClean" attr { key: "_fe_imply_type" value { i: 6 } }
您可以通过精度比对工具解析Data Dump数据,从而进行算子精度分析,具体请参考《精度比对工具使用指南》。