SNPE更新到了v1.62.0, 最大的改动是开始支持骁龙8Gen1平台,解决HTP模型兼容性问题。
Qualcomm Neural Processing SDK for AI - Qualcomm Developer NetworkThe Qualcomm Neural Processing SDK for AI is designed to run neural networks on Qualcomm Snapdragon processors.https://developer.qualcomm.com/software/qualcomm-neural-processing-sdk
这里介绍一下SNPE v1.62.0 :
目录
一 、SNPEv1.62.0 库文件的更新
1 支持平台的更新
2 库文件的更新
3. HTP推理需要的库文件
二、SNPEv1.62.0 对骁龙8的支持
1. snpe-dlc-quantize离线量化编译dlc
2. snpe-dlc-info 查看模型信息
3. SNPE-HTP推理
三、HTP模型的兼容性方案
1. 离线编译和在线编译
2. 兼容性方案 snpe-dlc-graph-prepare
总结
对比SNPE v1.61.0 下面的lib文件夹,可以看出v1.62.0 有很大改动。
平台 | 库文件 |
备注 |
888 | libSNPE.so libc++_shared.so libSnpeHtpV68Stub.so libSnpeHtpV68Skel.so |
如果需要在线编译模型需要libSnpeHtpPrepare.so |
骁龙8 | libSNPE.so libc++_shared.so libSnpeHtpV69Stub.so libSnpeHtpV69Skel.so |
如果需要在线编译模型需要libSnpeHtpPrepare.so |
骁龙8Gen1对应的HTP版本是V69,SNPE1.62.0开始支持,所需要库如上表所示。
需要注意的一点是在模型量化的时候需要设定 --htp_socs sm8450, 这一步的目的是让模型针对骁龙8Gen1做离线编译。
示例:
这里我用之前生成过得Yolov5m.dlc模型做个实验。
#Command
snpe-dlc-quantize --input_dlc yolov5m.dlc --input_list raw_list.txt --output_dlc yolov5m_htp.dlc --enable_htp --htp_socs sm8450
#log:
[INFO] InitializeStderr: DebugLog initialized.
[INFO] Writing intermediate model
[USER_INFO] CpuGraph::finalize
[USER_INFO] CpuGraph::execute
[INFO] Setting activation for layer: images and buffer: images
[INFO] bw: 8, min: 0.000000, max: 1.000000, delta: 0.003922, offset: 0.000000
[INFO] Setting activation for layer: Conv_0 and buffer: 166
[INFO] bw: 8, min: -64.113039, max: 57.893118,
....
[INFO] Writing quantized model to: yolov5m_htp.dlc
[INFO] SNPE HTP Offline Prepare: Creating Subnet Record for layers: 0-272.
[INFO] dlopen libHtpPrepare.so SUCCESS handle 0x29ef9c0
[USER_INFO] QnnDsp Qnn log initialized
[USER_INFO] QnnDsp exits with 0
[USER_INFO] QnnDsp exits with 0
....
[INFO] SNPE HTP Offline Prepare: Done creating QNN HTP graph cache.
[INFO] Successfully compiled HTP metadata into DLC.
[USER_INFO] QnnDsp Context free contextId 1
[USER_INFO] QnnDsp exits with 0
...
[INFO] DebugLog shutting down.
[INFO] SNPE HTP Offline Prepare: Done creating QNN HTP graph cache.
[INFO] Successfully compiled HTP metadata into DLC.
有以上打印表示离线编译成功了。
除了模型的层信息之外,还可以看到一个Cache Info,这个就是针对HTP离线生成的Cache信息。
# command
snpe-dlc-info -i yolov5m_htp.dlc
# print info
....
Cache Info:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Cache Record Name | snpe_version | record_version | backend_record_search_key | backend_type | record_size | Subnets |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| backend.metadata0 | 1.62.0 | 3.0.0.0 | Vtcm Size in MB: 8 | HTP | 21648704 | num_of_subnets: 1 |
| | | | | | | subnet_0: |
| | | | | | | start_layer_Id: 0 |
| | | | | | | end_layer_Id: 272 |
| | | | | | | input_buffers: |
| | | | | | | [name:images, dataType:UNSPECIFIED] |
| | | | | | | output_buffers: |
| | | | | | | [name:559, dataType:UNSPECIFIED] |
可以按照之前的文档采用snpe-net-run测试或者snpe-sample等在骁龙8Gen1的HTP上选择dsp runtime 推理模型。
需要注意的是如果是商用手机平台,需要使用unsignedPD,同样在之前的文章中可以找到方法。
如果snpe-dlc-quantize版本和推理使用的snpe版本不一致,那么模型就会在初始化的时候重新在线编译,也就是大家说的不同版本之间模型不兼容。其实也就是离线编译生成的Cache文件和SNPE的库不匹配,为了避免推理时出现问题再次编译对应版本的Cache文件。
这就带来一个问题,每次升级SNPE版本都需要重新量化模型,如果之前的量化数据,原始模型等已经丢到垃圾箱了,那就又需要重新调整、量化、测试模型等繁杂工作。
为了解决这个问题,SNPEv1.62.0 给出了一个重新生成Cache的工具,snpe-dlc-graph-prepare。
采用新版本的SNPE的snpe-dlc-graph-prepare,输入旧的量化DLC模型,就可以得到新版本的带离线编译Cache的DLC,新的DLC的参数和旧的DLC的参数完全一致。
Usage Command:
snpe-dlc-graph-prepare --input_dlc yolov5m_quantized.dlc --htp_socs sm8450 --output_dlc yolov5m_quantized_htp.dlc
示例:
# quantize and offline compile with SNPE1.59.0
snpe-dlc-quantize --input_dlc yolov5m.dlc --input_list raw_list.txt --output_dlc yolov5m_quant_160.dlc --enable_htp
# snpe version
snpe-dlc-quantize --version
SNPE v1.59.0.3230
#dlc info
snpe-dlc-info -i yolov5m_quant_160.dlc > 160.dlc.info
#cache info in the DLC info
Cache Info:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Cache Record Name | snpe_version | record_version | backend_record_search_key | backend_type | record_size | Subnets |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| backend.metadata0 | 1.59.0 | 2.2.0.0 | Vtcm Size in MB: 4 | HTP | 21696843 | num_of_subnets: 1 |
| | | | | | subnet_0: |
| | | | | | start_layer_Id: 0 |
| | | | | | end_layer_Id: 272 |
| | | | | | output_buffers: |
| | | | | | [name:559, dataType:UNSPECIFIED]|
# snpe version
snpe-dlc-graph-prepare --version
SNPE v1.62.0.3457
# Regenerate offline cache from previouse version's quantized DLC
snpe-dlc-graph-prepare --input_dlc yolov5m_quant_160.dlc --htp_socs sm8450 --output_dlc yolov5m_quant_162_8450.dlc
# New dlc info
snpe-dlc-info -i yolov5m_quant_162_8450.dlc
# Dlc info
....
Cache Info:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Cache Record Name | snpe_version | record_version | backend_record_search_key | backend_type | record_size | Subnets |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| backend.metadata0 | 1.59.0 | 2.2.0.0 | Vtcm Size in MB: 4 | HTP | 21696843 | num_of_subnets: 1 |
| Warning: backend.metadata0 is incompatible with the latest version of SNPE.
|
| backend.metadata1 | 1.62.0 | 3.0.0.0 | Vtcm Size in MB: 8 | HTP | 21648704 | num_of_subnets: 1 |
| | | | | | | subnet_0: |
| | | | | | | start_layer_Id: 0 |
| | | | | | | end_layer_Id: 272 |
| | | | | | | input_buffers: |
| | | | | | | [name:images, dataType:UNSPECIFIED] |
| | | | | | | output_buffers: |
| | | | | | | [name:559, dataType:UNSPECIFIED] |
新生成的模型里面多了一份Cache信息,这个DLC就可以用于snpe1.62.0的SNPE-HTP了
两个模型的encoding信息完全一致,也就是说这个工具只是从新生成了cache文件,对模型数据不会做任何改变。
到此为止,基本介绍 了SNPEv1.62.0的主要更新。
参考: