准备基于昇腾AI处理器运行生成的训练网络dump数据和计算图文件
前提条件
在进行迁移后的训练网络dump数据前,您需要完成训练网络开发、编译和运行,确保具备可执行的训练工程。

- 如果训练网络包含了随机因子,请在执行生成dump数据前去除。
- 确保你的代码在网络结构上、算子、优化器的选择上,以及参数的初始化策略等方面跟GPU上训练的代码完全一致,否则比较起来也是没有意义的。
- 不要在一个训练脚本中既做训练又做验证,也就是不要把train和evaluate放到同一个脚本中,否则会生成两组dump数据,导致分不清用哪个。
- 目前仅支持AI CPU和AI Core算子进行dump数据,不支持HCCL等算子dump数据。
Dump参数配置
- 为了让训练脚本能够dump出计算图,我们在训练脚本中的包引用区域引入os,并在构建模型前设置DUMP_GE_GRAPH参数。这样,在训练过程中,计算图文件会保存在训练脚本所在目录中。
import os ... def main(): ... os.environ['DUMP_GE_GRAPH'] = '2'
- 修改训练脚本,开启dump功能。在相应代码中,增加如下的加粗字体信息。
- Estimator模式:通过NPURunConfig中的dump_config采集dump数据,在创建NPURunConfig之前,实例化一个DumpConfig类进行dump的配置(包括配置dump路径、dump哪些迭代的数据、dump算子的输入还是输出数据等)。关于DumpConfig类的构造函数中每个字段的详细解释,请参见《TensorFlow网络模型迁移和训练指南》手册。
from npu_bridge.estimator.npu.npu_config import DumpConfig # dump_path:dump数据存放路径,该参数指定的目录需要在启动训练的环境上(容器或Host侧)提前创建且确保安装时配置的运行用户具有读写权限 # enable_dump:是否开启Data Dump功能 # dump_step:指定采集哪些迭代的Data Dump数据 # dump_mode:Data Dump模式,取值:input/output/all dump_config = DumpConfig(enable_dump=True, dump_path = "/home/HwHiAiUser/output", dump_step="0|5|10", dump_mode="all") config = NPURunConfig( dump_config=dump_config, session_config=session_config )
- sess.run模式:通过session配置项enable_dump、dump_path、dump_step、dump_mode配置dump参数。
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:是否开启Data 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出第几个step的结果,多个step之间用“|”隔开,连续多个step可以用诸如“5-10”来表达。 custom_op.parameter_map["dump_step"].s = tf.compat.as_bytes("0|5|10") # dump_mode:Data Dump模式,取值:input/output/all custom_op.parameter_map["dump_mode"].s = tf.compat.as_bytes("all") config.graph_options.rewrite_options.remapping = RewriterConfig.OFF with tf.Session(config=config) as sess: print(sess.run(cost))
表1 参数详细说明 参数名
描述
enable_dump
是否开启Data Dump功能,默认值:False。
- True:开启Data Dump功能,从dump_path读取Dump文件保存路径。
- False:关闭Data Dump功能。
dump_path
Dump文件保存路径。enable_dump为True时,该参数必须配置。
该参数指定的目录需要在启动训练的环境上(容器或Host侧)提前创建且确保安装时配置的运行用户具有读写权限,支持配置绝对路径或相对路径(相对执行命令行时的当前路径)。
- 绝对路径配置以“/”开头,例如:/home/HwHiAiUser/output。
- 相对路径配置直接以目录名开始,例如:output。
dump_step
指定采集哪些迭代的Data Dump数据。默认值:None,表示所有迭代都会产生dump数据。
多个迭代用“|”分割,例如:0|5|10;也可以用"-"指定迭代范围,例如:0|3-5|10。
dump_mode
Data Dump模式,用于指定dump算子输入还是输出数据。取值如下:
- input:仅dump算子输入数据
- output:仅dump算子输出数据,默认为output
- all:dump算子输入和输出数据
- Estimator模式:通过NPURunConfig中的dump_config采集dump数据,在创建NPURunConfig之前,实例化一个DumpConfig类进行dump的配置(包括配置dump路径、dump哪些迭代的数据、dump算子的输入还是输出数据等)。关于DumpConfig类的构造函数中每个字段的详细解释,请参见《TensorFlow网络模型迁移和训练指南》手册。
执行训练生成Dump数据
- 执行训练脚本,生成dump数据文件和计算图文件。
- 计算图文件:以“ge”开头的文件,是设置“DUMP_GE_GRAPH=2”生成的计算图文件,存储在训练脚本所在目录。
- dump数据文件:生成在dump_path指定的目录下,即{dump_path}/{time}/{deviceid}/{model_name}/{model_id}/{data_index}目录下,以{dump_path}配置/home/HwHiAiUser/output为例,例如存放在“/home/HwHiAiUser/output/20200808163566/0/ge_default_20200808163719_121/11/0”目录下。
表2 dump数据文件路径格式说明 路径key
说明
备注
dump_path
2中设置的dump_path路径(如果设置的是相对路径,则为拼接后的全路径)
--
time
dump数据文件落盘的时间
格式为:YYYYMMDDHHMMSS
deviceid
Device设备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出现了“.”、“/”、“\”、空格时,转换为下划线表示。
- 每次迭代都会产生dump数据,在训练数据集较大的情况下,每次迭代的dump数据量很大(约几十G,甚至更多),建议控制迭代次数,一般仅执行一次迭代。
- 多p环境下,因训练脚本中多device进程调起时间有差异会导致落盘时产生多个时间戳目录。
- 在docker内执行时,生成的数据存在docker里。
- 选取计算图文件。
由于“ge”开头的dump图文件非常多,而且dump数据文件中的model_name层可能存在多个文件夹,事实上,我们仅需要找到计算图文件,且仅需要model_name为计算图名称的文件夹。以下提供两种方法帮助用户快速找到对应的文件。
- 方法一:在所有以“_Build.txt”为结尾的dump图文件中,查找“Iterator”这个关键词。记住查找出的计算图文件名称,用于后续精度比对。
grep Iterator *_Build.txt
如上图所示,“ge_proto_00292_Build.txt”文件即是我们需要找到的计算图文件。
- 方法二:将tensorflow模型保存为pb文件,然后查看该模型,选取其中一个计算类算子的名字作为关键字,找包含该关键字的计算图文件。计算图名称取计算图文件graph下的name字段值。
- 方法一:在所有以“_Build.txt”为结尾的dump图文件中,查找“Iterator”这个关键词。记住查找出的计算图文件名称,用于后续精度比对。
- 选取dump数据文件。
- 打开2中找到的计算图文件,记录下第一个graph中的name字段值。如下示例中,记录下“ge_default_20201209083353_71”。
graph { name: "ge_default_20201209083353_71" op { name: "atomic_addr_clean0_71" type: "AtomicAddrClean" attr { key: "_fe_imply_type" value { i: 6 } }
- 进入以时间戳命名的dump文件存放路径下,我们会看到该目录下存在几个文件夹:
- 找到刚记录的名称为name值的文件夹,例如ge_default_20201209083353_71,这些文件即为需要的dump数据文件。
- 打开2中找到的计算图文件,记录下第一个graph中的name字段值。如下示例中,记录下“ge_default_20201209083353_71”。