SNPE模型转换(2)
一、简介在上节中我们介绍了Caffe、Tensorflow的模型转换,接下来我们继续对SNPE中提及的其它模块进行介绍。二、SNPE模型转换ONNX模型转换:机器学习框架具有用于存储神经网络模型的特定格式。 SNPE通过将它们转换为框架中立的深度学习容器(DLC)格式来支持这些各种模型。 SNPE运行时将DLC文件用于神经网络的执行。 SNPE包含一个工具“ snpe-onnx-to-dl...
一、简介
在上节中我们介绍了Caffe、Tensorflow的模型转换,接下来我们继续对SNPE中提及的其它模块进行介绍。
二、SNPE模型转换
ONNX模型转换:
机器学习框架具有用于存储神经网络模型的特定格式。 SNPE通过将它们转换为框架中立的深度学习容器(DLC)格式来支持这些各种模型。 SNPE运行时将DLC文件用于神经网络的执行。 SNPE包含一个工具“ snpe-onnx-to-dlc”,用于将以ONNX格式序列化的模型转换为DLC。
将模型从ONNX转换为DLC
snpe-onnx-to-dlc工具将序列化的ONNX模型转换为等效的DLC表示形式。
通过遵循https://github.com/onnx/models/tree/master/bvlc_alexnet/README.md中的说明获得的ONNX alexnet模型,以下命令将生成alexnet的DLC表示形式:
snpe-onnx-to-dlc --model_path models/bvlc_alexnet/bvlc_alexnet/model.onnx
–dlc_path bvlc_alexnet.dlc
SNPE支持的操作,版本和参数的信息可在Supported ONNX Ops中找到。
snpe-onnx-to-dlc或SNPE运行时都不支持符号张量形状变量。 有关初始化时调整SNPE网络大小的信息,可以参阅网络调整大小。通常,SNPE根据运行时和构建器参数的需求来确定张量和操作的数据类型。 通常会忽略ONNX模型指定的数据类型。
snpe-dlc-quantize --input_dlc inception_v3.dlc --input_list image_file_list.txt
–output_dlc inception_v3_quantized.dlc
量化模型:
每个snpe-framework-to-dlc转换工具都将未量化的模型转换为未量化的DLC文件。 量化需要另外一步。 snpe-dlc-quantize工具用于将模型量化为支持的定点格式之一。
例如,以下命令会将Inception v3 DLC文件转换为量化的Inception v3 DLC文件。
snpe-dlc-quantize --input_dlc inception_v3.dlc --input_list image_file_list.txt
–output_dlc inception_v3_quantized.dlc
对输入数据进行量化:
为了正确地计算量化参数的范围,需要使用一组代表性的输入数据作为snpe-dlc-quantize的输入。实验表明,在input_list中提供5-10个输入数据示例以进行snpe-dlc-quantize通常就足够了,并且对于快速实验而言绝对是实用的。 为了获得更可靠的量化结果,我们建议为给定的模型用例提供50-100个代表性输入数据的示例,而不使用训练集中的数据。 代表性的输入数据集理想地应该包括代表/产生模型的所有输出类型/类别的所有输入数据模态,优选每个输出类型/类别具有几个输入数据示例。
添加HTA部分:
在Hexagon Tensor Accelerator(HTA)上运行模型需要对模型进行量化,并为在HTA上运行的部分生成二进制文件。 两者均使用snpe-dlc-quantize工具完成,该工具已扩展为在内部包含HTA编译器。
例如,以下命令将Inception v3 DLC文件转换为量化的Inception v3 DLC文件,并生成HTA部分以在HTA上运行整个模型:
snpe-dlc-quantize --input_dlc inception_v3.dlc --input_list image_file_list.txt
–output_dlc inception_v3_quantized.dlc --enable_hta
除最后一个参数(enable_hta)外,所有参数均与常规量化相同,并在“量化模型”中进行了说明。 添加此参数将触发在提供的模型上生成HTA部分,并将已编译的部分添加到AIP记录到DLC中。 如果HTA编译器无法处理/编译网络的任何部分,则snpe-dlc-quantize会发出错误消息。 但是,仍将创建DLC-仅没有HTA部分。
模型分割:
默认情况下,HTA编译器会自动对网络进行分区,以最大化在HTA上运行的部分。在这种情况下,加载模型后,AIP运行时将使用Hexagon NN在HVX上运行非HTA部分。如果启用了CPU回退,则AIP运行时未处理的任何部分都可以回退以在CPU运行时执行。
在某些情况下,可能需要手动对网络进行分区,并选择可能与编译器自动生成的分区点不同的分区点。当事先知道不支持网络的某个部分在HTA上运行,仅要求为HTA或性能优势编译其余部分时,这可能是一个可取的选择。在所有情况下,SNPE snpe-dlc-quantize工具都会创建记录,这些记录存储有关HTA子网的元数据以及HTA编译器为指定部分生成的已编译二进制文件。
此外,它还检测并创建HNN子网的记录以覆盖模型的其余部分,并存储有关它们的元数据,这些元数据指定与分区确定的其他HTA子网的缓冲区连接性。所有这些记录都以加载模型时在运行时解析的格式存储在DL容器中。 要在对模型进行分区时手动指定要使用的HTA节,除“ enable_hta”外,还应将附加参数“ hta_partitions”传递给snpe-dlc-quantize。分区边界被指定为逗号分隔的(开始-结束)对,它们表示必须属于该分区的层的ID。
例如,以下命令将Inception v3 DLC文件转换为量化的Inception v3 DLC文件,并为第0-11层生成单个HTA节:
snpe-dlc-quantize --input_dlc inception_v3.dlc --input_list image_file_list.txt
–output_dlc inception_v3_quantized.dlc --enable_hta --hta_partitions 0-11
在这种情况下,以下命令将分区扩展到多个HTA分区,即0-11和177-215:
snpe-dlc-quantize --input_dlc inception_v3.dlc --input_list image_file_list.txt
–output_dlc inception_v3_quantized.dlc --enable_hta --hta_partitions 0-11,177-215
HTA编译过程会从以前使用–enable_hta进行snpe-dlc-quantize的运行中删除DLC中可能已经存在的所有较旧的AIP记录。建议使用者从用于HTA编译的原始DLC开始,以免无意中丢失先前生成的AIP记录。
由于在HVX和HNN子网之间进行了重复的重新量化和格式转换,因此在AIP子网中创建大量分区可能会导致性能欠佳,并且在运行时降低准确性。在这种情况下优化AIP性能的一种方法是通过重新排序与源网络中每个层关联的唯一ID(在转换为DLC之前),以便脱机编译在网络中产生更有意义的分区和更少的碎片。
更多推荐
所有评论(0)