准备基于昇腾AI处理器运行生成的训练网络dump数据和计算图文件

前提条件

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

  • 如果训练网络包含了随机因子,请在执行生成dump数据前去除。
  • 确保你的代码在网络结构上、算子、优化器的选择上,以及参数的初始化策略等方面跟GPU上训练的代码完全一致,否则比对无意义。
  • 不要在一个训练脚本中既做训练又做验证,也就是不要把train和evaluate放到同一个脚本中,否则会生成两组dump数据,导致混淆。
  • 目前仅支持AI CPU和AI Core算子进行dump数据,不支持HCCL等算子dump数据。

Dump参数配置

  1. 为了让训练脚本能够dump出计算图,我们在训练脚本中的包引用区域引入os,并在构建模型前设置DUMP_GE_GRAPH参数。这样,在训练过程中,计算图文件会保存在训练脚本所在目录中。

    import os
    ...
    def main():
        ...
        os.environ['DUMP_GE_GRAPH'] = '2'

  2. 修改训练脚本,开启dump功能。在相应代码中,增加如下的加粗字体信息。

    • Estimator模式:通过NPURunConfig中的dump_config采集dump数据,在创建NPURunConfig之前,实例化一个DumpConfig类进行dump的配置(包括配置dump路径、dump哪些迭代的数据、dump算子的输入还是输出数据等)。关于DumpConfig类的构造函数中每个字段的详细解释,请参见TensorFlow 1.15网络模型迁移和训练指南手册。
      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
        )
    • session.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/HwHiAiUser/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

      是否开启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算子输入和输出数据。

      dump_data

      指定算子dump内容类型,取值:

      • tensor:dump算子数据,默认为tensor。
      • stats:dump算子统计数据,结果文件为csv格式。

      大规模训练场景下,通常dump数据量太大并且耗时长,可以先dump所有算子的统计数据,根据统计数据识别可能异常的算子,然后再指定dump异常算子的input或output数据。

      dump_layer

      指定需要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/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数据量随之增大,建议控制迭代次数,一般仅执行一次迭代。
    • 多P环境下,因训练脚本中多device进程调起时间有差异会导致落盘时产生多个时间戳目录。
    • 在docker内执行时,生成的数据存在docker里。

  2. 选取计算图文件。

    由于“ge”开头的dump图文件非常多,而且dump数据文件中的model_name层可能存在多个文件夹,实际仅需要找到计算图文件,且仅需要model_name为计算图名称的文件夹。以下提供两种方法帮助用户快速找到对应的文件。

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

      如上图所示,“ge_proto_00292_Build.txt”文件即是我们需要找到的计算图文件。

    • 方法二:将tensorflow模型保存为pb文件,然后查看该模型,选取其中一个计算类算子的名字作为关键字,找包含该关键字的计算图文件。计算图名称取计算图文件graph下的name字段值。

  3. 选取dump数据文件。

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

    3. 找到前面记录的名称为name值的文件夹,例如ge_default_20201209083353_71,这些文件即为需要的dump数据文件。