板端使用问题

在板上运行网络模型输出数据怎么和PC上不一样?

首先需要明确一点Fixed和Offline模型在PC上和板上运行时,给定相同的输入,输出的有效数据一定是一样的。使用以下方法,可以验证: 在PC上仿真,使用simulator.py运行Fixed或Offline模型时加上参数--dump_rawdata,运行结束后会在当前路径下保存一个图片名+ .bin的文件。该文件是在PC上做过前处理的输入数据,以二进制文件形式保存下来。在板端读取该文件,将该文件内所有数据memcpy到模型的输入Tensor,然后执行MI_IPU_Invoke。得到的输出和在PC上应该是完全一致的。

在板上运行网络模型输出数据维度怎么不一样?

如果转换网络时input_config.ini中dequantizations设为FALSE,Fixed和Offline模型运行完成后,输出数据的最后维度会向上对齐。由于硬件的写数据原则导致,因此无论在PC上仿真还是在板上实际运行,都会有这个现象。使用simulator.py时,-c设Unknown,输出文件中会有如下提示:

layer46-conv Tensor:
{
tensor dim:4, Original shape:[1 13 13 255], Alignment shape:[1 13 13 256]
The following tensor data shape is alignment shape.
tensor data:
...

其中Alignment shape是模型真正输出的数据维度。 使用calibrator_custom.fixed_simulator创建Fixed模型的实例,完成invoke后,调用get_output方法得到result的 numpy.ndarray数据shape也会有对齐。

>>> print(result.shape)
(1, 13, 13, 256)

具体详见5.2.1节去除无用数据。 如果转换网络时input_config.ini中dequantizations设为TRUE,Fix2float算子会帮助完成去除无用数据的功能,保证模型输出维度与原始网络输出一致

在板上输出浮点数全部是IPU完成的吗?

IPU可以通过增加Fix2float算子完成int16乘scale到float32数据的转换。只需网络转换时input_config.ini中dequantizations设为TRUE,在转到Fixed模型后会在模型对应的输出增加Fix2float算子。

运行时,模型占用的内存如何查看?

cat /proc/mi_modules/mi_ipu/mi_ipu0参看以下解释

box_process

ipu_variable:所有网络模型推理过程中临时使用的内存

ipu_heap:ipu firmware中malloc使用的堆

IPU_log:存储log使用的内存

ipu_firmware:ipu firmware运行占用的内存

ipu_chn0_networ:channel 0装载网络模型使用的内存

ipu_chn0_desc:channel 0的网络描述占用的内存

IPU_Buffer_chn0:channel 0临时占用的内存

ipu_chn0_input_:channel 0 输入tensor占用的内存(多个则代表有多个输入tensor可同时使用)

ipu_chn0_output:channel 0输出tensor占用的内存(多个则代表有多个输出tensor可同时使用)