准备基于NPU运行生成的训练网络dump数据和计算图文件
前提条件
已参考《分析迁移快速入门样例(TensorFlow GPU2Ascend)》完成迁移并在NPU上完成训练任务。
- 数据比对前,需要先检查并去除训练脚本内部使用到的随机处理,避免由于输入数据不一致导致数据比对结果不可用。
- 请勿在一个训练脚本中既做训练又做验证,即不要把train和evaluate放到同一个脚本中,否则会生成两组dump数据,导致使用时无法辨别。
本样例可参考迁移后的训练脚本处理(NPU)处理。
操作步骤
以下操作请在MindStudio环境上操作。
- 单击菜单栏,选中迁移后的训练工程,如图1所示,单击“OK”,导入工程。
- dump参数配置。
- 为了让训练脚本能够dump出计算图,我们在训练脚本中的包引用区域引入os,并在构建模型前设置DUMP_GE_GRAPH参数。配置完成后,在训练过程中,计算图文件会保存在训练脚本所在目录中。
编辑cifar10_main.py,添加如下加粗字体的信息。
import os ... def main(_): os.environ['DUMP_GE_GRAPH'] = '2' with logger.benchmark_context(flags.FLAGS):
图2 设置DUMP_GE_GRAPH参数
- 修改训练脚本(resnet_run_loop.py),开启dump功能。在相应代码中,增加如下加粗字体的信息。
session_config = tf.ConfigProto( inter_op_parallelism_threads=flags_obj.inter_op_parallelism_threads, intra_op_parallelism_threads=flags_obj.intra_op_parallelism_threads, allow_soft_placement=True) custom_op = session_config.graph_options.rewrite_options.custom_optimizers.add() custom_op.name = 'NpuOptimizer' custom_op.parameter_map["enable_dump"].b = True # enable_dump:是否开启dump功能 custom_op.parameter_map["dump_path"].s = tf.compat.as_bytes("/home/username/tf_resnet50_npu_dump_data") # dump_path:dump数据存放路径,需要在运行环境上提前创建目录且确保运行用户有读写权限 custom_op.parameter_map["dump_step"].s = tf.compat.as_bytes("0") # dump_step:指定采集哪些迭代的dump数据 custom_op.parameter_map["dump_mode"].s = tf.compat.as_bytes("all") # dump_mode:dump模式,取值:input/output/all distribution_strategy = distribution_utils.get_distribution_strategy( flags_core.get_num_gpus(flags_obj), flags_obj.all_reduce_alg)图3 开启dump功能
- 为了让训练脚本能够dump出计算图,我们在训练脚本中的包引用区域引入os,并在构建模型前设置DUMP_GE_GRAPH参数。配置完成后,在训练过程中,计算图文件会保存在训练脚本所在目录中。
- 执行训练生成dump数据。
- 执行训练脚本,具体操作可参考《分析迁移快速入门样例(TensorFlow GPU2Ascend)》的“迁移后训练”章节。
生成dump数据文件和计算图文件。
- 计算图文件:以“ge”开头的文件,是设置“DUMP_GE_GRAPH=2”生成的计算图文件,存储在训练脚本所在目录。
- dump数据文件:生成在dump_path指定的目录下,即{dump_path}/{time}/{deviceid}/{model_name}/{model_id}/{data_index}目录下,以{dump_path}配置“~/tf_resnet50_npu_dump_data”为例,存放在“~/tf_resnet50_npu_dump_data/20220613180259/0/ge_default_20220613180409_NPU_61/5/0”(以实际为准)目录下。
表1 dump数据文件路径格式说明 路径key
说明
备注
dump_path
2.b中设置的dump_path路径(如果设置的是相对路径,则为拼接后的全路径)。
-
time
dump数据文件落盘的时间。
格式为:YYYYMMDDHHMMSS
deviceid
设备ID。
-
model_name
子图名称。
model_name层可能存在多个文件夹,dump数据取计算图名称对应目录下的数据。
如果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为计算图名称的文件夹。
在所有以“_Build.txt”为结尾的dump图文件中,查找“Iterator”关键词。执行以下命令记录查找出的计算图文件名称,用于后续精度比对。
grep Iterator *_Build.txt
如图4所示,“ge_proto_00000363_Build.txt”文件即是需要找到的计算图文件。将此文件拷贝至用户家目录下,便于在执行比对操作时选择。
- 选取dump数据文件。
- 打开3.b中找到的计算图文件,记录下第一个graph中的name字段值。如下示例中,记录下“ge_default_20220928110438_NPU_61”。
图5 ge_default_20220613180409_NPU_61
- 进入以时间戳命名的dump文件存放路径下,我们会看到该目录下存在几个文件夹。
图6 dump目录
- 找到刚记录的名称为name值的文件夹,例如ge_default_20220928110438_NPU_61,则下图目录下的文件即为需要的dump数据文件。
图7 目标dunm目录
- 打开3.b中找到的计算图文件,记录下第一个graph中的name字段值。如下示例中,记录下“ge_default_20220928110438_NPU_61”。
- 执行训练脚本,具体操作可参考《分析迁移快速入门样例(TensorFlow GPU2Ascend)》的“迁移后训练”章节。

