SNPE(7)1.62.0-支持骁龙8Gen1平台

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 :

  • 库文件的主要更新
  • 骁龙8Gen1的支持
  • 模型的兼容性方案

目录

一 、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

总结


一 、SNPEv1.62.0 库文件的更新


对比SNPE v1.61.0 下面的lib文件夹,可以看出v1.62.0 有很大改动。

1 支持平台的更新

SNPE(7)1.62.0-支持骁龙8Gen1平台_第1张图片

  • V1.62.0 去掉了一些其他平台的库,仅仅保留了Android相关的内容。
  • clang也升级到了8.0

2 库文件的更新

2.1 aarch64-android-clang8.0 的更新

SNPE(7)1.62.0-支持骁龙8Gen1平台_第2张图片

  • 去掉了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的更新

SNPE(7)1.62.0-支持骁龙8Gen1平台_第3张图片

  • 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  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.

有以上打印表示离线编译成功了。

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文件,对模型数据不会做任何改变。

SNPE(7)1.62.0-支持骁龙8Gen1平台_第4张图片

 

总结

到此为止,基本介绍 了SNPEv1.62.0的主要更新。

  • 开始支持骁龙8Gen1平台
  • snpe-dlc-graph-prepare重新生成 Cache,解决模型兼容性问题。

参考:

  • Qualcomm Neural Processing SDK for AI - Qualcomm Developer Network

 

你可能感兴趣的:(SNPE,人工智能,神经网络)