开发者
资源

准备基于NPU运行生成的训练网络dump数据和计算图文件

前提条件

已参考分析迁移快速入门样例(TensorFlow GPU2Ascend)完成迁移并在NPU上完成训练任务。

  • 数据比对前,需要先检查并去除训练脚本内部使用到的随机处理,避免由于输入数据不一致导致数据比对结果不可用。
  • 请勿在一个训练脚本中既做训练又做验证,即不要把train和evaluate放到同一个脚本中,否则会生成两组dump数据,导致使用时无法辨别。

本样例可参考迁移后的训练脚本处理(NPU)处理。

操作步骤

以下操作请在MindStudio环境上操作。

  1. 单击菜单栏File > Open...,选中迁移后的训练工程,如图1所示,单击“OK”,导入工程。
    图1 导入训练工程
  2. dump参数配置。
    1. 为了让训练脚本能够dump出计算图,我们在训练脚本中的包引用区域引入os,并在构建模型前设置DUMP_GE_GRAPH参数。配置完成后,在训练过程中,计算图文件会保存在训练脚本所在目录中。
      编辑cifar10_main.py,添加如下加粗字体的信息。
      import os
      ...
      def main(_):
        os.environ['DUMP_GE_GRAPH'] = '2'
        with logger.benchmark_context(flags.FLAGS):
      图2 设置DUMP_GE_GRAPH参数
    2. 修改训练脚本(resnet_run_loop.py),开启dump功能。在相应代码中,增加如下加粗字体的信息。
      session_config = tf.ConfigProto(
            inter_op_parallelism_threads=flags_obj.inter_op_parallelism_threads,
            intra_op_parallelism_threads=flags_obj.intra_op_parallelism_threads,
            allow_soft_placement=True)
        custom_op = session_config.graph_options.rewrite_options.custom_optimizers.add()
        custom_op.name = 'NpuOptimizer'
        custom_op.parameter_map["enable_dump"].b = True
        # enable_dump:是否开启dump功能
        custom_op.parameter_map["dump_path"].s = tf.compat.as_bytes("/home/username/tf_resnet50_npu_dump_data")
        # dump_path:dump数据存放路径,需要在运行环境上提前创建目录且确保运行用户有读写权限
        custom_op.parameter_map["dump_step"].s = tf.compat.as_bytes("0")
        # dump_step:指定采集哪些迭代的dump数据
        custom_op.parameter_map["dump_mode"].s = tf.compat.as_bytes("all")
        # dump_mode:dump模式,取值:input/output/all
      
        distribution_strategy = distribution_utils.get_distribution_strategy(
            flags_core.get_num_gpus(flags_obj), flags_obj.all_reduce_alg)
      图3 开启dump功能
  3. 执行训练生成dump数据。
    1. 执行训练脚本,具体操作可参考分析迁移快速入门样例(TensorFlow GPU2Ascend)的“迁移后训练”章节。

      生成dump数据文件和计算图文件。

      • 计算图文件:以“ge”开头的文件,是设置“DUMP_GE_GRAPH=2”生成的计算图文件,存储在训练脚本所在目录。
      • dump数据文件:生成在dump_path指定的目录下,即{dump_path}/{time}/{deviceid}/{model_name}/{model_id}/{data_index}目录下,以{dump_path}配置“~/tf_resnet50_npu_dump_data”为例,存放在“~/tf_resnet50_npu_dump_data/20220613180259/0/ge_default_20220613180409_NPU_61/5/0”(以实际为准)目录下。
        表1 dump数据文件路径格式说明

        路径key

        说明

        备注

        dump_path

        2.b中设置的dump_path路径(如果设置的是相对路径,则为拼接后的全路径)。

        -

        time

        dump数据文件落盘的时间。

        格式为:YYYYMMDDHHMMSS

        deviceid

        设备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出现了“.”、“/”、“\”和空格时,转换为下划线“_”表示。

    2. 选取计算图文件。

      由于“ge”开头的dump图文件非常多,且dump数据文件中的model_name层可能存在多个文件夹。事实上,我们仅需要找到计算图文件,且仅需要model_name为计算图名称的文件夹。

      在所有以“_Build.txt”为结尾的dump图文件中,查找“Iterator”关键词。执行以下命令记录查找出的计算图文件名称,用于后续精度比对。

      grep Iterator *_Build.txt

      图4所示,“ge_proto_00000363_Build.txt”文件即是需要找到的计算图文件。将此文件拷贝至用户家目录下,便于在执行比对操作时选择。

      图4 grep结果
    3. 选取dump数据文件。
      1. 打开3.b中找到的计算图文件,记录下第一个graph中的name字段值。如下示例中,记录下“ge_default_20220928110438_NPU_61”。
        图5 ge_default_20220613180409_NPU_61
      2. 进入以时间戳命名的dump文件存放路径下,我们会看到该目录下存在几个文件夹。
        图6 dump目录
      3. 找到刚记录的名称为name值的文件夹,例如ge_default_20220928110438_NPU_61,则下图目录下的文件即为需要的dump数据文件。
        图7 目标dunm目录