准备基于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文件。详细的操作方法如下:
- 进入训练脚本所在路径(如“~/models/official/resnet”)。
- 修改训练脚本,添加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")) ... - 配置环境变量。
export PYTHONPATH=$PYTHONPATH:~/models
- 执行训练脚本。
python3 -u ./cifar10_main.py
- 训练任务停止后,在命令行输入run,训练会往下执行一个step。
tfdbg> run
- 收集npy文件。run命令执行完成后,获取第一个step的训练结果参数,可以通过lt查询已存储的张量,通过pt命令可以查看已存储的张量内容,可以保存数据为npy格式文件。因为tfdbg一次命令只能dump一个tensor,为了自动生成收集所有数据,可以执行以下操作:
- 执行lt > gpu_dump命令将所有tensor的名称暂存到自定义名称的gpu_dump文件里。命令行中会有如下回显。
Wrote output to gpu_dump
- 另外开启一个终端,在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 - 打开dump.txt文件,复制所有存储tensor的命令(所有以“pt”开头的命令),回到tfdbg命令行所在的控制台粘贴执行,即可存储所有的npy文件,存储路径为训练脚本所在目录。
- 执行lt > gpu_dump命令将所有tensor的名称暂存到自定义名称的gpu_dump文件里。命令行中会有如下回显。
- 退出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所在环境,以便进行精度比对。
父主题: 比对数据准备