开发者
资源

准备基于GPU运行生成的原始训练网络npy数据文件

前提条件

已下载原始resnet50模型脚本(git clone -b r1.13.0 https://github.com/tensorflow/models.git),并参考相应README在GPU上完成训练任务。

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

本样例可参考原始训练脚本处理(GPU)处理。

操作步骤

利用TensorFlow官方提供的debug工具tfdbg生成npy文件。详细的操作方法如下:

  1. 进入训练脚本所在路径(如“~/models/official/resnet”)。
  2. 修改训练脚本,添加tfdbg的hook。
    编辑resnet_run_loop.py文件,添加如下加粗字体的信息。
    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    from tensorflow.python import debug as tf_debug
    
    import functools
    import math
    import multiprocessing
    import os
    
    # pylint: disable=g-bad-import-order
    from absl import flags
    import tensorflow as tf
    ...
    
      train_hooks = hooks_helper.get_train_hooks(
          flags_obj.hooks,
          model_dir=flags_obj.model_dir,
          batch_size=flags_obj.batch_size)
      train_hooks.append(tf_debug.LocalCLIDebugHook(ui_type="readline"))
    ...
  3. 配置环境变量。
    export PYTHONPATH=$PYTHONPATH:~/models   
  4. 执行训练脚本。
    python3 -u ./cifar10_main.py
  5. 训练任务停止后,在命令行输入run,训练会往下执行一个step。
    tfdbg> run
  6. 收集npy文件。
    run命令执行完成后,获取第一个step的训练结果参数,可以通过lt查询已存储的张量,通过pt命令可以查看已存储的张量内容,可以保存数据为npy格式文件。因为tfdbg一次命令只能dump一个tensor,为了自动生成收集所有数据,可以执行以下操作:
    1. 执行lt > gpu_dump命令将所有tensor的名称暂存到自定义名称的gpu_dump文件里。命令行中会有如下回显。
      Wrote output to gpu_dump
    2. 另外开启一个终端,在Linux命令行下进入gpu_dump文件所在目录,执行下述命令,用以生成在tfdbg命令行执行的命令。
      timestamp=$[$(date +%s%N)/1000] ; cat gpu_dump | awk '{print "pt",$4,$4}' | awk '{gsub("/", "_", $3);gsub(":", ".", $3);print($1,$2,"-n 0 -w "$3".""'$timestamp'"".npy")}'>dump.txt
    3. 打开dump.txt文件,复制所有存储tensor的命令(所有以“pt”开头的命令),回到tfdbg命令行所在的控制台粘贴执行,即可存储所有的npy文件,存储路径为训练脚本所在目录。

      npy文件默认是以numpy.save()形式存储的,上述命令会将“/”与“:”用下划线“_”替换。

      • 如果命令行界面无法粘贴文件内容,可以在tfdbg命令行中输入“mouse off”指令关闭鼠标模式后再进行粘贴。
      • 检查生成的npy文件命名是否符合规则。

        npy文件命名规则:{op_name}.{output_index}.{timestamp}.npy,其中op_name字段需满足“A-Za-z0-9_-”正则表达式规则,timestamp需满足[0-9]{1,255}正则表达式,output_index为0~9数字组成。

        • 如果因算子名较长,造成按命名规则生成的npy文件名超过255字符而产生文件名异常,这类算子不支持精度比对。
        • 因tfdbg自身原因或运行环境原因,可能存在部分生成的npy文件名不符合精度比对要求,请按命名规则手工重命名。如果不符合要求的npy文件较多,请参见精度比对工具使用指南的“批量处理生成的npy文件名异常情况”重新生成npy文件。
  7. 退出tfdbg命令行,将生成的npy文件保存到tf_resnet50_gpu_dump_data(用户可自定义)目录下。
    mkdir tf_resnet50_gpu_dump_data
    mv ./*.npy ./tf_resnet50_gpu_dump_data

    将tf_resnet50_gpu_dump_data目录拷贝至准备基于NPU运行生成的训练网络dump数据和计算图文件中NPU所在环境,以便进行精度比对。