骁龙神经处理引擎SDK参考指南(35)
10 限制和问题
本章介绍了测试期间在此版本中发现的限制。未来的版本将为已发现的问题提供修复。
一般 SNPE 限制
- SNPE 目前支持 4D 输入数据,其中第一个维度是批量。
- Faster-RCNN 等 RCNN 网络仅支持批次 1。请参阅下面的层限制。
一般 Java API 限制
- 将 INeuralNetwork 实例的使用限制在单个线程中
当前的 SDK INeuralNetwork 类实例旨在从单个线程访问。开发人员必须确保在应用程序中强制执行这一点,否则可能会出现意外错误。
一般 CPU 运行时限制
- 并非所有层都针对 CPU 运行时进行了优化。例如,反卷积比卷积慢得多。
一般 GPU 运行时限制
-
在 GPU_FLOAT32_16_HYBRID 模式下,GPU 内核使用 HALF_FLOAT 精度进行所有中间数据处理,使用 FULL_FLOAT 精度进行所有计算。虽然这通常不会影响用于分类的网络的 mAP,但它可能会溢出/下溢,从而影响引擎用于分类以外的用途。如果观察到影响,请尝试使用始终为 FULL_FLOAT 的 CPU 运行时运行,以验证任何上溢/下溢问题。
-
在 GPU_FLOAT16 模式下,GPU 内核对所有中间数据处理及其所有计算使用 HALF_FLOAT 精度。在此模式下,由于与 GPU_FLOAT32_16_HYBRID 相比计算精度较低,对网络精度(例如 mAP 分数)产生负面影响的机会更高。鼓励用户使用此模式测试其网络的准确性性能,以确保其满足其用例的要求。
-
对于绝对大小限制,“打包”通道的概念是指通道数除以 4,并向上舍入到最接近的整数:
packed_channels = ceil(channels / 4.0)
每当层具有 4 维(即批次 x 宽度 x 高度 x 通道)组件(例如输入、输出或权重张量)时,该组件将具有以下大小限制:- 打包通道数 * 宽度 < MaxPerGPUSize
-
对于具有权重/偏差的所有层,限制为:
- 过滤器大小 * 过滤器大小 * 4 <= MaxPerGPUSize
- 输出通道数 / 4 <= MaxPerGPUSize
-
MaxPerGPUSize 取决于 Qualcomm Adreno™ GPU 类型,值如下所示
- A330:8192
- A430、A530:16384
-
在加载任何网络时,GPU 运行时可能会选择将几个层与网络中的先前层合并(压缩),具体取决于层的兼容性。这会导致被压扁的层的性能信息丢失。
一般 DSP 运行时限制
- 当使用非量化模型时,网络初始化后的第一次网络执行可能会比后续执行慢得多。为了避免这种情况,请使用已通过snpe-dlc-quantize量化的 DLC 文件。
一般 AIP 运行时限制
- 如果网络的输入层需要由 HTA 处理,则输入必须是形状格式为 NHWC 的 4D 张量,其中批量维度 N 必须为 1,通道数 C 不能超过 16。
- 然而,人们可以利用手动分区网络来绕过这一限制,方法是让输入层在 HVX 上进行处理。有关分区的详细信息, 请参阅添加 HTA 部分。
- AIP运行时支持完全使用HTA的模型或所有层都在HTA上运行的模型(除了Softmax(分区到HVX))的批量输入。
层限制
-
最大精氨酸
- 对于DSP运行时,ArgMax仅输出浮点数;由于准确性,其输出不能是量化数据类型。
-
批量归一化(+ 缩放)
- Caffe:缩放(scale_layer)是可选的。如果存在,它会扩展批量归一化 (batch_norm_layer) 的功能。如果不存在,batch_norm_layer 仍将按照 Caffe 规范进行转换。
不支持在网络中其他任何地方使用scale_layer,但不支持在batch_norm_layer之后立即使用。 - 1d(即每通道)批量归一化:仅支持 caffe 模型。DSP 运行时 不支持。
- 从1.15.0开始,caffe转换器使用batchnorm_param use_global_stats的值来区分batch_norm_layer和instance_norm_layer。如果 use_global_stats 设置为 True,转换器将使用该层作为 batch_norm_layer。如果 use_global_stats 设置为 False,转换器将使用该层作为 instance_norm_layer。重要的是要确保用于转换带有batch_norm_layer的caffe模型的prototxt的use_global_stats值未定义为“False”(即不要使用训练prototxt来转换带有batch_norm_layers的caffe模型)
- Caffe:缩放(scale_layer)是可选的。如果存在,它会扩展批量归一化 (batch_norm_layer) 的功能。如果不存在,batch_norm_layer 仍将按照 Caffe 规范进行转换。
-
色彩空间转换
- 对于 NV21 输入图像编码类型,宽度或高度必须是 2 的倍数。原因是 4 Y (2wx2h) 共享一对 UV。
-
级联
对于 GPU 运行时,每个输入中的输入通道数可以采用任意值。然而,如果其中一个或多个不是 4 的倍数,则该层的性能将会下降。 -
卷积
- 对于GPU运行时,当组数大于1时,输出通道数必须是4 * 组数的倍数。例如,2组,输出通道数必须是8的倍数(4*2=8)。
-
庄稼
- 对于 GPU 运行时,每个输入中的输入通道数必须是 4 的倍数。
- DSP 上的裁剪并非在所有情况下都得到优化。优化空间裁剪(裁剪高度和/或宽度,保持其他尺寸不变)
-
反卷积
- 对于GPU和CPU运行时,输出通道的数量(即过滤器的数量)可以是任何值(不一定是4的倍数)。
- 对于 GPU 运行时,存在以下限制:
- 打包输入通道数 * 输出通道数 <= MaxPerGPUSize
- 过滤器大小-X * 过滤器大小-Y <= MaxPerGPUSize
- 步长 <= 过滤器大小
- 对于 DSP 运行时,步长 > 4 的反卷积未完全优化。
- Caffe参数限制:不支持膨胀和矩形过滤器
-
深度卷积
- DSP 上的深度卷积并未针对所有情况进行优化。优化了以下情况:
- 水平步幅 <= 2。
- 过滤器为 3x3。
- 深度是 32 的倍数。
- DSP 上的深度卷积并未针对所有情况进行优化。优化了以下情况:
-
检测输出
- 必须提供 keepTopK。
- 输出缓冲区必须有足够的大小并且采用浮点格式。
- 对于 DSP 运行时,不支持批量 > 1 和 dlc 缓存。
-
全连接
- 对于 GPU 运行时,存在以下限制:
- 输入宽度 * 输入高度 * 输入通道数 <= MaxPerGPUSize
- 输出通道数 <= MaxPerGPUSize
- 对于 DSP 运行时,仅当输入高度 * 宽度 * 通道为 16 的倍数时,才会优化批次 > 1。
- 对于 GPU 运行时,存在以下限制:
-
输入图像缩放
- DSP 运行时图像缩放在下列条件下表现良好。其他配置没有优化。
- 比例因子是 2 倍 AND 的高档
- 深度是 2 的幂 AND
- 深度小于 128,宽度等于 2 的幂或
- 深度大于 128。
- DSP 运行时图像缩放在下列条件下表现良好。其他配置没有优化。
-
实例标准化
-
对于包含 InstanceNorm 层的某些模型,“epsilon”参数的默认值可能会压倒输入张量的标准差。在这种情况下,源框架和 SNPE 之间可能会出现数值差异。对于这种情况,它有助于将源模型中的 epsilon 值覆盖为更小的值。
以咖啡为例:batch_norm_param { use_global_stats: false eps: 1e-9 }
-
-
软垫
- 对于 DSP 运行时,
- 不支持非 4D 填充输入。
- 不支持批量填充。
- 不支持反射填充沿深度填充。
- 对于 DSP 运行时,
-
池化
- Caffe 参数限制:支持 Average 和 Maximum pooling 方法,但不支持 Stochastic。
-
力量
- Power 层仅在 DSP 上受支持,并且具有 Caffe 参数限制:仅支持 shift = 0 和 power = 1。
-
提议
- GPU 不支持提案层。
- 仅支持批量 1。
-
投资回报率池
- GPU 不支持 ROI 池化。
- 对于 DSP 运行时,ROI Pooling 层的输入必须是 Proposal 层或 OPAQUE 输入层。
- 仅支持批量 1。
-
规模
- 仅 DSP 支持缩放。
- 对于 DSP 运行时,仅支持通道缩放。
-
片
- 目前不支持创建未定义切片点的切片图层。
-
瓦
- 当使用 snpe-dlc-info 查看包含 Tile 层的网络拓扑时,Tile 层当前将显示为“串联”层。
-
你做
- DSP运行时间
- 如果 UDO 至少有一个量化输出,则 SNPE DSP 需要量化模型。
- DSP UDO 层支持的数据类型为 FLOAT_32 和 UINT_8(使用 TF 模式量化)。
- GPU运行时间
- 网络仅支持 16 位浮点(OpenCL half)激活。
- GPU UDO 层中激活张量支持的唯一数据类型是 FLOAT_16。
- CPU运行时间
- CPU 运行时始终以全精度 (FP32) 张量运行。
- CPU UDO 层中激活张量支持的唯一数据类型是 FLOAT_32。
- 型号转换
- 使用 UDO 进行模型转换不适用于使用 Caffe 训练的模型。
- 仅使用 Caffe2 训练且以 ONNX 格式表示的模型支持使用 UDO 进行模型转换。
- 包生成
- 如果多个 UDO 打算与核心类型 = DSP 一起使用,则不能在单个配置文件中定义多个 UDO。在这种情况下,用户需要为每个 UDO 创建一个配置文件,并为每个操作生成单独的包。此限制不适用于 CPU 或 - GPU 核心类型。
- UDO 定义中的张量参数只能用一种数据类型表示(例如:FLOAT_32 或 FLOAT_16,但不能同时使用两者)。
希望在具有不同数据类型的多个运行时上使用其 UDO 的用户可能需要为每个数据类型创建单独的配置文件并生成多个相应的包。
- 应用
- 仅本机 C API 支持 UDO 集成。Java 扩展在此版本中不可用。
想要将 UDO 集成到 Android 应用程序中的用户必须在 JNI 级别与 SNPE API 进行交互才能利用此功能。
- 仅本机 C API 支持 UDO 集成。Java 扩展在此版本中不可用。
- DSP运行时间
工具限制
-
默认输入原始数据类型是 float32。
-
SNPE 网络运行
- 默认分析级别是详细的。 -
snpe_bench.py
- 默认分析级别是基本的。 -
snpe-caffe2-to-dlc
- 预计初始化权重是通过 caffe 翻译器 Python 脚本生成的相同 NetDef 格式输入的。
- 尚不支持任何数据库格式。 -
SNPE DLC 信息
- 对于 CMRN 层,显示的 alpha 值实际上是从 Caffe 转换的模型的 alpha/window_size。
示例:snpe-dlc-info 显示来自 Caffe 的 CMRN 层的 alpha 为 2e-05,window_size 为 5,alpha 为 0.0001。
- 对于反卷积层,显示的过滤器数量值实际上是过滤器数量/组。
- 示例:snpe-dlc-info 将反卷积层的 num_filters 显示为 1,其中 num_output 为 11,组为 11。 -
snpe-tensorflow-to-dlc
- TensorFlow 转换器不支持转换已使用 TensorFlow 工具量化的 TensorFlow 图。为了量化 TensorFlow 模型,请首先运行 TensorFlow 转换器 ( snpe-tensorflow-to-dlc ),然后对 TensorFlow 转换器生成的 DLC 文件运行snpe-dlc-quantize 。
- 卷积
- BiasAdd 节点是可选的,当缺少零偏差时,将添加零偏差。
- Concat
- Concat 节点必须至少有 2 个非 Const 输入。
- ElementWise 总和/相乘/最大
- 必须是其范围内的唯一操作。
- 不支持标量操作数。
- 完全连接
- MatMul 运算的输入必须是一维的。