准备NPU侧dump数据和计算图文件
前提条件
在进行迁移后的训练/在线推理网络dump数据前,需要完成训练或在线推理网络开发、编译和运行,确保具备可执行的训练/在线推理工程。
详细介绍请参见《TensorFlow 1.15模型迁移指南》。
- 每次迭代都会产生dump数据,在训练数据集较大的情况下,每次迭代的dump数据量随之增大,建议控制迭代次数,一般仅执行一次迭代。同时对于大模型场景,通常dump数据量太大并且耗时长,可以通过dump_data开启算子统计功能,根据统计数据识别可能异常的算子后,再dump可能异常的算子。
- 多卡环境下,因训练脚本中多device进程调起时间有差异会导致落盘时产生多个时间戳目录。
- 在docker内执行时,生成的数据保存在docker里。
- 如果训练/在线推理网络包含了随机因子,请在执行生成dump数据前去除。
- 确保你的代码在网络结构上、算子、优化器的选择上,以及参数的初始化策略等方面跟GPU上训练的代码完全一致,否则比对无意义。
- 不建议在一个训练/在线推理脚本中既做训练/在线推理又做验证,即不把train和evaluate放到同一个脚本中,否则会生成两组dump数据,导致混淆。
- 目前仅支持AI CPU、AI Core和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算子的输入还是输出数据等)。
在线推理不支持该模式。
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/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 custom_op.parameter_map["enable_dump"].b = True custom_op.parameter_map["dump_path"].s = tf.compat.as_bytes("$HOME/output") custom_op.parameter_map["dump_step"].s = tf.compat.as_bytes("0|5|10") custom_op.parameter_map["dump_mode"].s = tf.compat.as_bytes("all") custom_op.parameter_map["dump_data"].s = tf.compat.as_bytes("stats") custom_op.parameter_map["dump_layer"].s = tf.compat.as_bytes("nodename1 nodename2 nodename3") config.graph_options.rewrite_options.remapping = RewriterConfig.OFF with tf.Session(config=config) as sess: print(sess.run(cost))
表1 参数详细说明 参数名
描述
enable_dump
是否开启dump功能。取值为:
- True:开启dump功能,从dump_path读取dump文件保存路径。
- False:关闭dump功能。默认值。
dump_path
dump文件保存路径。enable_dump为True时,该参数必须配置。
该参数指定的目录需要在启动训练的环境上(容器或Host侧)提前创建且确保安装时配置的运行用户具有读写权限,支持配置绝对路径或相对路径(相对执行命令行时的当前路径)。
dump_step
指定采集哪些迭代的dump数据。默认值:None,表示所有迭代都会产生dump数据。
多个迭代用“|”分割,例如:0|5|10;也可以用"-"指定迭代范围,例如:0|3-5|10。
dump_mode
dump模式,用于指定dump算子输入还是输出数据。取值为:
- input:仅dump算子输入数据。
- output:仅dump算子输出数据。默认值。
- all:dump算子输入和输出数据。
dump_data
指定算子dump内容类型,取值为:
- tensor:dump算子数据。默认值。
- stats:dump算子统计数据,结果文件为csv格式。
大规模训练场景下,通常dump数据量太大并且耗时长,可以先dump所有算子的统计数据,根据统计数据识别可能异常的算子,然后再指定dump异常算子的input或output数据。
dump_layer
指定需要dump的算子。取值为算子名,多个算子名之间使用空格分隔。若不配置此字段,默认dump全部算子。
- Estimator模式:通过NPURunConfig中的dump_config采集dump数据,在创建NPURunConfig之前,实例化一个DumpConfig类进行dump的配置(包括配置dump路径、dump哪些迭代的数据、dump算子的输入还是输出数据等)。
获取dump数据文件和计算图文件
- 执行训练/在线推理脚本,生成dump数据文件和计算图文件。
- 计算图文件:以“ge”开头的文件,是设置“DUMP_GE_GRAPH=2”生成的计算图文件,存储在训练/在线推理脚本所在目录。
- dump数据文件:生成在dump_path指定的目录下,即{dump_path}/{time}/{deviceid}/{model_name}/{model_id}/{data_index}目录下,以{dump_path}配置$HOME/output为例,例如存放在“$HOME/output/20200808163566/0/ge_default_20200808163719_121/11/0”目录下。
表2 dump数据文件路径格式说明 路径key
说明
备注
dump_path
dump数据存放路径(如果设置的是相对路径,则为拼接后的全路径)。
-
time
dump数据文件落盘的时间。
格式为:YYYYMMDDHHMMSS
deviceid
DeviceID。
-
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。
- 选取计算图文件。
执行训练脚本完成后会在训练脚本当前目录生成GE图文件,图文件可能会有多个。一般情况下,选取计算图文件方法:将TensorFlow模型保存为pb文件,然后查看该模型,选取其中一个计算类算子的名字作为关键字,找包含该关键字的计算图文件。计算图名称取计算图文件graph下的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_20240613143502_1”。
graph { name: "ge_default_20240613143502_1" op { name: "atomic_addr_clean0_71" type: "AtomicAddrClean" attr { key: "_fe_imply_type" value { i: 6 } }
- 进入以时间戳命名的dump文件存放路径下,我们会看到该目录下存在几个文件夹:
- 找到前面记录的名称为name值的文件夹,例如ge_default_20201209083353_71,这些文件即为需要的dump数据文件。
- dump文件命名格式需满足:
- {op_type}.{op_name}.{task_id}.{stream_id}.{timestamp}
- Atlas A2 训练系列产品还支持如下两种格式:
- {op_type}.{op_name_lxsliceX}.({stream_id}.){task_id}.{timestamp}.{task_type}.{context_id}.{thread_id}.{device_id}
- {op_type}.{op_name}.({stream_id}.){task_id}.{timestamp}.{task_type}.{context_id}.{thread_id}.{device_id}
文件命名各字段详细介绍请参见数据格式要求。
- 如果dump文件名称长度超过了OS文件名称长度限制(一般是255个字符),则会将该dump文件重命名为一串随机数字,映射关系可查看同目录下的mapping.csv。
- dump文件命名格式需满足:
- 打开步骤2中找到的计算图文件,记录第一个graph中的name字段值。如下示例中,记录“ge_default_20240613143502_1”。