统计和使用
SyNAP 通过标准的 Linux /sysfs 接口提供 NPU 使用信息和统计信息。/sysfs 允许使用伪文件系统提供有关系统设备和资源的信息,其中每条信息都被视为一个文件,用户可以使用标准工具读取/写入。
在 Android 上,统计信息位于 /sys/class/misc/synap/device/misc/synap/statistics/:
$ SYNAP_STAT_DIR=/sys/class/misc/synap/device/misc/synap/statistics
在 Yocto Linux 上,统计信息位于 /sys/class/misc/synap/statistics/:
$ SYNAP_STAT_DIR=/sys/class/misc/synap/statistics
$ ls $SYNAP_STAT_DIR
inference_count inference_time network_profile networks
重要提示:统计文件的内容仅对 root 用户可用。
注意:没有关于在 CPU 或 GPU 上执行的推理的统计信息。CPU 推理可以在用户空间级别进行,无法在 SyNAP 驱动程序中跟踪。
inference_count
此文件包含自系统启动以来在 NPU 上执行的推理总数。示例:
# cat $SYNAP_STAT_DIR/inference_count
1538
inference_time
此文件包含自系统启动以来在 NPU 推理上花费的总时间。它是一个以微秒表示的 64 位 整数。示例:
# cat $SYNAP_STAT_DIR/inference_time
32233264
networks
此文件包含 NPU 驱动程序中当前加载的每个网络的详细信息,每行一个网络。每行包含以下信息:
- pid:创建网络的进程
- nid:唯一网络 ID
- inference_count:此网络的推理次数
- inference_time:此网络的总推理时间(微秒)
- inference_last:此网络的最后一次推理时间(微秒)
- iobuf_count:当前注册到此网络的 I/O 缓冲区数量
- iobuf_size:当前注册到此网络的 I/O 缓冲区总大小
- layers:网络中的层数
示例:
# cat $SYNAP_STAT_DIR/networks
pid: 3628, nid: 38, inference_count: 22, inference_time: 40048, inference_last: 1843, iobuf_count: 2, iobuf_size: 151529, layers: 34
pid: 3155, nid: 4, inference_count: 3, inference_time: 5922, inference_last: 1843, iobuf_count: 2, iobuf_size: 451630, layers: 12
重要提示:如果没有网络当前加载,此文件将为空。
可以使用标准的 watch 命令实时显示当前加载的所有网络的信息:
# watch -n 1 cat $SYNAP_STAT_DIR/networks
network_profile
此文件包含 NPU 驱动程序中当前加载的每个网络的详细信息,每行一个网络。每行中的信息与 networks 文件相同。此外,如果模型在离线编译时启用了分析功能(参见模型分析部分)或在在线执行时启用了分析功能(参见使用 NNAPI 进行模型基准测试部分),相应的行后面将包含详细的逐层信息:
- lyr:层的索引(或层组)
- cycle:执行周期数
- time_us:执行时间(微秒)
- byte_rd:读取的字节数
- byte_wr:写入的字节数
- ot:操作类型(NN:神经网络核心,SH:着色器,TP:张量处理器)
- name:操作名称
示例:
# cat $SYNAP_STAT_DIR/network_profile
pid: 21756, nid: 1, inference_count: 78, inference_time: 272430, inference_last: 3108, iobuf_count: 2, iobuf_size: 151529, layers: 34
| lyr | cycle | time_us | byte_rd | byte_wr | ot | name
| 0 | 153811 | 202 | 151344 | 0 | TP | TensorTranspose
| 1 | 181903 | 461 | 6912 | 0 | NN | ConvolutionReluPoolingLayer2
| 2 | 9321 | 52 | 1392 | 0 | NN | ConvolutionReluPoolingLayer2
| 3 | 17430 | 51 | 1904 | 0 | NN | ConvolutionReluPoolingLayer2
| 4 | 19878 | 51 | 1904 | 0 | NN | ConvolutionReluPoolingLayer2
...
| 28 | 16248 | 51 | 7472 | 0 | NN | ConvolutionReluPoolingLayer2
| 29 | 125706 | 408 | 120720 | 0 | TP | FullyConnectedReluLayer
| 30 | 137129 | 196 | 2848 | 1024 | SH | Softmax2Layer
| 31 | 0 | 0 | 0 | 0 | -- | ConvolutionReluPoolingLayer2
| 32 | 0 | 0 | 0 | 0 | -- | ConvolutionReluPoolingLayer2
| 33 | 671 | 51 | 1008 | 0 | NN | ConvolutionReluPoolingLayer2
清除统计信息
可以通过写入 inference_count 或 inference_time 文件来清除统计信息。示例:
# cat $SYNAP_STAT_DIR/inference_time
32233264
# echo > $SYNAP_STAT_DIR/inference_time
# cat $SYNAP_STAT_DIR/inference_time
0
# cat $SYNAP_STAT_DIR/inference_count
0
使用 /sysfs 信息
/sysfs 中的信息可以轻松地在脚本或工具中使用。例如,要获取 5 秒期间的平均 NPU 利用率:
us=5000000;
echo > $SYNAP_STAT_DIR/inference_time;
usleep $us;
npu_usage=$((`cat $SYNAP_STAT_DIR/inference_time`*100/us));
echo "Average NPU usage: $npu_usage%"