排除以上问题后,在训练网络精度仍未达预期时,通过采集训练过程中各算子的运算结果(即Dump数据),然后和业界标准算子(如TensorFlow)运算结果进行数据偏差对比,快速定位到具体算子的精度问题。主要过程为:
利用TensorFlow的debug工具tfdbg_ascend生成npy文件。详细的操作方法如下:
样例一:
1
|
import tfdbg_ascend as dbg |
1 2 3 4 |
tfdbg.disable() if current_step == 5: tfdbg.enable() tfdbg.set_dump_path('home/test/gpu_dump') |
1
|
import tfdbg_ascend as dbg |
1 2 3 4 5 6 7 8 9 |
class DumpConfig(tf.keras.callbacks.Callback): def __init__(self): super().__init__() def on_batch_begin(self, batch, logs={}): if batch == 4: dbg.enable() dbg.set_dump_path("/user/name1/pip_pkg/dump4") else: dbg.disable() |
1 2 3 4 5 6 7 8 9 10 |
# define callbacks callbacks = [ ModelCheckpoint( f'models/model_epochs-{epochs}_batch-{batch_size}_loss-{loss_function}_{Mask2FaceModel.get_datetime_string()}.h5'), LossHistory(batch_size), DumpConfig() ] # fit the model 调起模型的代码位置 history = self.model.fit(train_dataset, validation_data=valid_dataset, epochs=1, callbacks=callbacks, verbose=2) |
以下操作在NPU训练环境执行。Dump数据前,需要注意的是:
一般情况下,dump首个step的数据用作后续比对分析即可,为了避免随机权重导致比对不准确的问题,可以在训练开始前保存ckpt,并在训练时加载。如果确定是某个step的精度问题,则建议加载最靠近异常步的ckpt文件。
1 2 |
# dump特定step的数据,一般对比分析dump首层即可,即保持默认值,如需指定特定step可以修改,例如 '0|5|10' TF_DUMP_STEP = '0' |
1 2 |
import precision_tool.tf_config as npu_tf_config npu_tf_config.npu_device_dump_config(npu_device, action='dump') |
精度数据分析依赖CANN Toolkit软件包中的atc工具和msaccucmp.py工具,以下操作需要在CANN开发环境,即Toolkit安装环境进行。
├── precision_tool │ ├── cli.py │ ├── ... ├── precision_data │ ├── npu │ │ ├── debug_0 // 存放npu dump数据 │ ├── tf │ │ ├── dump // 存放标杆dump数据
# graphviz为可选依赖,只有当需要绘制算子子图时才需要安装 pip3 install rich graphviz # ubuntu/Debian sudo apt-get install graphviz # fedora/CentOS sudo yum install graphviz
# 依赖Toolkit包中的atc和msaccucmp.py工具,配置为Toolkit包安装目录 # 默认Toolkit包安装在/usr/local/Ascend,可以不用修改,指定目录安装则需要修改 CMD_ROOT_PATH = '/usr/local/Ascend'
python3 ./precision_tool/cli.py
进入交互命令行界面:
PrecisionTool >
PrecisionTool > ac -c
根据数据量大小,比对过程需要时间不同。
对比结果会以csv的格式存放在precision_data/temp/vector_compare目录中:
您可以直接打开csv文件进行分析,具体请参考整网精度比对结果文件说明。
vcs命令默认筛选余弦相似度小于0.98的结果,您也可以通过-c参数自定义阈值:
从上图的比对结果可以看到,算子的输入基本一致,但第一个输出与标杆存在明显差异(余弦相似度为0.806927,小于0.98),说明该算子可能存在精度问题。
当出现多个算子精度问题时,会出现N个异常算子信息,默认按照算子执行顺序排序,由于后面算子精度问题可能是因为前一个算子精度问题导致,建议用户优先分析第一个异常算子。
ni命令可以根据传入的算子名称,得到如下关键信息:
另外,PassName表示该算子为融合算子,对应值表示融合规则名称,OriginOp为融合前的算子,表明是由于算子融合导致精度问题。正常情况下,融合问题应该在浮点异常检测阶段解决。
整网数据比对提供了一个全网Dump数据与TF标杆数据的逐层累计比对报表,由于整网数据由于硬件差异本身是存在一定给误差的,且误差会随着层数增多而累计,即便精度正常的网络数值上也会存在细微误差,一般采用余弦相似度做初步的可疑算子筛选(注意:余弦相似度较高也不一定说明没有问题,但较低一般代表可能存在问题),精度对比结果可以给出一个大致的分析方向。
1 2 3 |
import npu_device as npu with npu.keep_dtype_scope(): v = tf.add(1, 1) |