昇腾社区首页
中文
注册

准备NPU侧dump数据和计算图文件

前提条件

在进行迁移后的训练/在线推理网络dump数据前,需要完成训练/在线推理网络开发、编译和运行,确保具备可执行的训练/在线推理工程。

详细介绍请参见TensorFlow 1.15模型迁移指南

  • 每次迭代都会产生dump数据,在训练数据集较大的情况下,每次迭代的dump数据量随之增大,建议控制迭代次数,一般仅执行一次迭代。同时对于大模型场景,通常dump数据量太大并且耗时长,可以通过dump_data开启算子统计功能,根据统计数据识别可能异常的算子后,再dump可能异常的算子。
  • 多卡环境下,因训练/在线推理脚本中多device进程调起时间有差异会导致落盘时产生多个时间戳目录。
  • 容器内执行时,生成的数据保存在容器里。
  • 如果训练/在线推理网络包含了随机因子,请在执行生成dump数据前去除。
  • 确保代码在网络结构、算子、优化器的选择上,以及参数的初始化策略等方面跟GPU上训练/在线推理的代码完全一致,否则比对无意义。
  • 不建议在一个训练脚本中既做训练又做验证,即不把train和evaluate放到同一个脚本中,否则会生成两组dump数据,导致混淆。
  • 目前仅支持AI CPU、AI Core和HCCL算子进行dump数据。

dump参数配置

  1. 为了让训练/在线推理脚本能够dump出计算图,我们在训练/在线推理脚本的包引用区域引入os,并在构建模型前设置DUMP_GE_GRAPH参数。
    1
    2
    3
    4
    5
    import os
    ...
    def main():
        ...
        os.environ['DUMP_GE_GRAPH'] = '2'
    

    在训练/在线推理过程中,计算图文件会保存在训练/在线推理脚本所在目录中。

  2. 修改训练/在线推理脚本,开启dump功能。在相应代码中,增加如下的加粗字体信息。
    • Estimator模式:通过NPURunConfig中的dump_config采集dump数据,在创建NPURunConfig之前,实例化一个DumpConfig类进行dump的配置(包括配置dump路径、dump哪些迭代的数据、dump算子的输入还是输出数据等)。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      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
        )
      

      关于DumpConfig类的构造函数中每个字段的详细解释,请参见TensorFlow 1.15模型迁移指南中的“DumpConfig构造函数”。

    • sess.run模式:通过session配置项enable_dump、dump_path、dump_step、dump_mode配置dump参数。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      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))
      

      以上dump参数详细介绍请参见表1

      TensorFlow模型训练/在线推理过程中可能存在算子溢出的情况,此时若直接进行精度比对操作则会造成比对结果不准确。参见TensorFlow 1.15模型迁移指南中的溢出数据采集章节可配置开启dump溢出数据。

      表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全部算子。

获取dump数据文件和计算图文件

  1. 执行训练/在线推理脚本,生成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

    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。

  2. 选取计算图文件。
    • 方法一:

      执行训练脚本完成后会在训练脚本当前目录生成GE图文件,图文件可能会有多个。一般情况下,选取计算图文件方法:将TensorFlow模型保存为pb文件,然后查看该模型,选取其中一个计算类算子的名字作为关键字,找包含该关键字的计算图文件。计算图名称取计算图文件graph下的name字段值。

    • 方法二:
      在所有以“_Build.txt”为结尾的dump图文件中,查找“Iterator”关键词。记录查找出的计算图文件名称,用于后续精度比对。
      grep Iterator *_Build.txt

      如上图所示,“ge_proto_00292_Build.txt”即为需要的计算图文件。

  3. 选取dump数据文件。
    1. 打开步骤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
            }
      }
    2. 进入以时间戳命名的dump文件存放路径下,我们会看到该目录下存在几个文件夹:

    3. 找到前面记录的名称为name值的文件夹,例如ge_default_20240613143502_1,这些文件即为需要的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。