文档
注册

准备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参数配置

  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算子的输入还是输出数据等)。
      在线推理不支持该模式。
      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模型迁移指南手册。

    • 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))

      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

    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。

  2. 选取计算图文件。

    执行训练脚本完成后会在训练脚本当前目录生成GE图文件,图文件可能会有多个。一般情况下,选取计算图文件方法:将TensorFlow模型保存为pb文件,然后查看该模型,选取其中一个计算类算子的名字作为关键字,找包含该关键字的计算图文件。计算图名称取计算图文件graph下的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_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_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。
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词