SNPE更新到了v1.62.0, 最大的改动是开始支持骁龙8Gen1平台,解决HTP模型兼容性问题。
这里介绍一下SNPE v1.62.0 :
- 库文件的主要更新
- 骁龙8Gen1的支持
- 模型的兼容性方案
目录
2. 兼容性方案 snpe-dlc-graph-prepare
一 、SNPEv1.62.0 库文件的更新
对比SNPE v1.61.0 下面的lib文件夹,可以看出v1.62.0 有很大改动。
1 支持平台的更新
- V1.62.0 去掉了一些其他平台的库,仅仅保留了Android相关的内容。
- clang也升级到了8.0
2 库文件的更新
2.1 aarch64-android-clang8.0 的更新
- 去掉了libsnpe_dsp_domains_v3.so;
- 增加了libSnpeHtpPrepare.so,libSnpeHtpV68Stub.so,libSnpeHtpV69Stub.so;
- libSnpeHtpPrepare.so 是用来做HTP的在线图编译的,之前这个功能是在libsnpe_dsp_domains_v3.so之中的;
- libSnpeHtpV68Stub.so 是用于888平台的HTP(DSP版本V68),同样是从libsnpe_dsp_domains_v3.so中分离出来,HTP推理网络对应的Stub库;
- libSnpeHtpV69Stub.so 是用于骁龙8Gen1 平台的HTP(DSP版本V68)网络推理的stub库。
2.2 dsp的更新
- 888HTP的libsnpe_dsp_v68_domains_v3_skel.so 被libSnpeHtpV68Skel.so代替;
- 增加了支持骁龙8Gen1 的libSnpeHtpV69Skel.so。
3. HTP推理需要的库文件
平台 | 库文件 | 备注 |
888 | libSNPE.so libc++_shared.so libSnpeHtpV68Stub.so libSnpeHtpV68Skel.so | 如果需要在线编译模型需要libSnpeHtpPrepare.so |
骁龙8 | libSNPE.so libc++_shared.so libSnpeHtpV69Stub.so libSnpeHtpV69Skel.so | 如果需要在线编译模型需要libSnpeHtpPrepare.so |
二、SNPEv1.62.0 对骁龙8的支持
骁龙8Gen1对应的HTP版本是V69,SNPE1.62.0开始支持,所需要库如上表所示。
需要注意的一点是在模型量化的时候需要设定 --htp_socs sm8450, 这一步的目的是让模型针对骁龙8Gen1做离线编译。
示例:
1. snpe-dlc-quantize离线量化编译dlc
这里我用之前生成过得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 <I> Qnn log initialized
[USER_INFO] QnnDsp <I> exits with 0
[USER_INFO] QnnDsp <I> exits with 0
....
[INFO] SNPE HTP Offline Prepare: Done creating QNN HTP graph cache.
[INFO] Successfully compiled HTP metadata into DLC.
[USER_INFO] QnnDsp <I> Context free contextId 1
[USER_INFO] QnnDsp <I> 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.
有以上打印表示离线编译成功了。
2. snpe-dlc-info 查看模型信息
除了模型的层信息之外,还可以看到一个Cache Info,这个就是针对HTP离线生成的Cache信息。
- 如果采用的是 --htp_socs sm8450,那么可以看到Vtcm Size in MB: 8.
- 如果不指定--htp_socs,默认应该是sm8350,可以看到VTCM 是不同的。
# 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] |
3. SNPE-HTP推理
可以按照之前的文档采用snpe-net-run测试或者snpe-sample等在骁龙8Gen1的HTP上选择dsp runtime 推理模型。
需要注意的是如果是商用手机平台,需要使用unsignedPD,同样在之前的文章中可以找到方法。
三、HTP模型的兼容性方案
1. 离线编译和在线编译
- 离线编译:采用snpe-dlc-quantize 量化模型时候加上--enable_htp --htp_socs sm8350, 目的是让模型针对对应的平台做编译,从而减少模型在设备上的加载时间。
- 在线编译:snpe-dlc-quantize量化模型是不需要加上任何htp相关的参数,仅仅是将模型量化。模型会在SNPE初始化的时候在线编译模型。这样会增加模型的初始化时间,这个时间从几百毫秒到几秒钟不等,与模型相关。
如果snpe-dlc-quantize版本和推理使用的snpe版本不一致,那么模型就会在初始化的时候重新在线编译,也就是大家说的不同版本之间模型不兼容。其实也就是离线编译生成的Cache文件和SNPE的库不匹配,为了避免推理时出现问题再次编译对应版本的Cache文件。
2. 兼容性方案 snpe-dlc-graph-prepare
这就带来一个问题,每次升级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
示例:
-
(1)用SNPE v1.59.0的snpe-dlc-quantize量化模型
# 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]|
-
(2)用SNPE v1.62.0的snpe-dlc-graph-prepare重新生成 Cache
# 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了
-
(3)对比两个模型的encoding信息
两个模型的encoding信息完全一致,也就是说这个工具只是从新生成了cache文件,对模型数据不会做任何改变。
总结
到此为止,基本介绍 了SNPEv1.62.0的主要更新。
- 开始支持骁龙8Gen1平台。
- snpe-dlc-graph-prepare重新生成 Cache,解决模型兼容性问题。
参考: