转换元文件
在转换模型时,可以提供 YAML 元文件来自定义生成的模型。例如,可以指定:
- 内存中的数据表示(nhwc 或 nchw)
- 模型量化选项
- 输出反量化
- 输入预处理选项
- 用于推理的委托(npu、gpu、cpu)
示例:
$ synap convert --model mobilenet_v1_quant.tflite --meta mobilenet.yaml --target VS680 --out-dir mnv1
在转换 TensorFlow .pb 模型时,此元文件是必需的。在转换已量化的 .tflite 模型时,可以完全省略。
理解元文件内容的最佳方法可能是先看一个示例。以下是一个典型的 mobilenet_v1 模型的示例,后面是对每个字段的详细描述。大多数字段是可选的;必需字段已明确标记。
delegate: npu
data_layout: nhwc
security:
secure: true
file: ../security.yaml
inputs:
- name: input
shape: [1, 224, 224, 3]
means: [128, 128, 128]
scale: 128
format: rgb
security: any
preprocess:
type: nv21
size: [1920, 1080]
crop: true
outputs:
- name: MobilenetV1/Predictions/Reshape_1
dequantize: false
format: confidence_array
quantization:
data_type: uint8
scheme: default
mode: standard
algorithm: standard
options:
dataset:
- ../../sample/*_224x224.jpg
字段
delegate
选择用于推理的委托。可用的委托有:
default(默认,根据目标硬件自动选择委托)npugpucpu
如果未指定,则使用目标硬件的默认委托。也可以逐层指定委托。请参见 heterogeneous_inference 部分。
data_layout
内存中的数据布局。允许的值有:default、nchw 和 nhwc。
对于 TensorFlow 和 TensorFlow Lite 模型,默认为 nhwc。当输入数据已经处于这种格式时,强制转换后的模型为 nchw 可能会提供一些性能优势,因为不需要额外的数据重组。
对于 Caffe 和 ONNX 模型,默认为 nchw。在这种情况下,不能强制为 nhwc。
input_format
输入张量的格式。这是一个可选字符串,将作为属性附加到所有未指定 "format" 字段的网络输入张量。
output_format
输出张量的格式。这是一个可选字符串,将作为属性附加到所有未指定 "format" 字段的网络输出张量。
security
此部分包含模型的安全配置。如果不存在此部分,则禁用安全性。安全性仅在使用 npu 委托时支持。
secure:如果为 true,则为模型启用安全性。对于安全模型,还可以为每个输入和输出指定安全策略。安全模型在转换时被加密和签名,以便其结构和权重不会被访问,并且可以验证其真实性。这是通过一组密钥和证书文件完成的,其路径包含在安全文件中。file:安全文件的路径。这是一个包含以下字段的yaml文件:
encryption_key: `[path-to-encryption-key-file](path-to-encryption-key-file)`
signature_key: `[path-to-signature-key-file](path-to-signature-key-file)`
model_certificate: `[path-to-model-certificate-file](path-to-model-certificate-file)`
vendor_certificate: `[path-to-vendor-certificate-file](path-to-vendor-certificate-file)`
可以使用相对路径和绝对路径。相对路径被视为相对于安全文件本身的位置。这些字段也可以直接在模型元文件中指定,而不是 'file' 字段。有关安全策略以及如何生成和验证安全模型的详细信息,请参阅 SyNAP_SyKURE.pdf。
inputs (pb)
必须为网络的每个输入包含一个条目。每个条目有以下字段:
name(pb):网络图中输入的名称。对于tflite和onnx模型,此字段不是必需的,但仍可用于指定与网络默认输入不同的输入层。此功能允许转换网络的子集,而无需手动编辑源模型。对于.pb模型或未指定name时,输入必须与模型中出现的顺序相同。当指定此字段时,shape字段是必需的。shape(pb):输入张量的形状。这是一个维度列表;顺序由模型中输入张量的布局给出(即使为编译后的模型选择了不同的布局)。第一个维度按惯例必须表示样本数 N(也称为"批量大小"),在生成的模型中会被忽略,该模型始终使用批量大小为 1。当指定此字段时,name字段是必需的。means:用于归一化输入值的范围。均值列表,对应输入中每个通道一个。如果指定单个值而不是列表,它将用于所有通道。如果未指定,则假定均值为0。每个输入的第 i 个通道按以下方式归一化:norm = (in - means[i]) / scale。scale:用于归一化输入值的范围。比例是相应输入中所有通道的单个值。如果未指定,则假定比例为1。format:关于张量中数据类型和组织的信息。此字符串的内容和含义是自定义定义的。但是,SyNAP 工具包和 SyNAPPreprocessor按惯例识别初始格式类型,可选地后跟一个或多个命名属性:[format-type](format-type) [[key](key)=value]...。识别的类型有rgb(默认):8 位 RGB 或 RGBA 或灰度图像,bgr:8 位 BGR 图像或 BGRA 或灰度图像。识别的属性有keep_proportions=1(默认):在使用Preprocessor调整图像大小或量化时保持宽高比,keep_proportions=0:在使用Preprocessor调整图像大小或量化时不保持宽高比。SyNAP 会忽略任何其他属性(如果存在)。preprocess:此输入张量的输入预处理选项。它可以包含以下字段:type:输入数据的格式(例如rgb、nv12)size:输入图像的大小作为列表 [H, W]crop:启用输入图像的运行时裁剪
security:此输入张量的安全策略。此字段仅对安全模型有效,可以有以下值:any(默认):输入可以在安全或非安全内存中secure:输入必须在安全内存中non-secure:输入必须在非安全内存中
outputs (pb)
必须为网络的每个输出包含一个条目。每个条目有以下字段:
name(pb):网络图中输出的名称。对于tflite和onnx模型,此字段不是必需的,但仍可用于指定与网络默认输出不同的输出层。此功能允许转换网络的子集,而无需手动编辑源模型。对于.pb和.onnx模型或未指定name时,输出必须与模型中出现的顺序相同。dequantize:网络的输出在内部被反量化并转换为float。这比在软件中执行转换更有效。format:关于张量中数据类型和组织的信息。此字符串的内容和含义是自定义定义的。但是,SyNAPClassifier和Detector后处理器按惯例识别初始格式类型,可选地后跟一个或多个命名属性:[format-type](format-type) [[key](key)=value]...。所有字段由一个或多个空格分隔。键和值之间不允许有空格。示例:confidence_array class_index_base=0。请参见Classifier和Detector类以了解支持的特定属性描述。security:此输出张量的安全策略。此字段仅对安全模型有效,可以有以下值:secure-if-input-secure(默认):如果至少一个输入在安全内存中,则输出缓冲区必须在安全内存中any:输出可以在安全或非安全内存中
quantization (q)
在转换期间量化模型时需要量化选项。导入已量化的模型时不需要。量化仅在使用 npu 委托时支持。
data_type:用于量化网络的数据类型。激活数据和权重使用相同的数据类型。可用的数据类型有:uint8(默认)int8int16float16
scheme:选择量化方案。可用的方案有:default(默认)asymmetric_affinedynamic_fixed_pointperchannel_symmetric_affine
mode:选择量化模式。可用的模式有:standard(默认)full
algorithm:选择量化算法。可用的算法有:standard(默认)kl_divergencemoving_average
options:在特定情况下微调量化的特殊选项。通常不需要。dataset(q):量化数据集,即用于量化模型的输入文件集。对于多输入网络,需要为每个输入指定一个数据集。每个数据集将由在量化期间应用于相应输入的样本文件组成。样本文件可以以两种形式之一提供:- 作为图像文件(
.jpg或.png) - 作为 NumPy 文件(
.npy)
- 作为图像文件(
当网络输入是图像时,即 4 维张量(NCHW 或 NHWC),图像文件是合适的。在这种情况下,在用于量化模型之前,将指定的 means 和 scale 值应用于每 个输入图像。此外,每个图像都会被调整大小以适应输入张量。
NumPy 文件可以用于所有类型的网络输入。NumPy 文件应包含与相应网络输入具有相同形状的数据数组。在这种情况下,不能为输入指定 means 和 scale;如果需要任何预处理,必须在生成 NumPy 文件时完成。
为了避免必须手动列出每个输入的量化数据集中的文件,量化数据集改为使用 glob 表达式列表指定,每个输入一个 glob 表达式。这使得很容易将目录的全部内容或其子集指定为一个输入的量化数据集。例如,目录 samples 中的所有 jpeg 文件可以用以下方式表示:
samples/*.jpg
可以使用相对路径和绝对路径。相对路径被视为相对于元文件本身的位置。不能为同一输入指定图像和 .npy 文件的混合。有关 glob 规范语法的更多信息,请参阅 Python 文档:https://docs.python.org/3/library/glob.html。
如果指定了特殊关键字 random,将自动为此输入生成随机数据文件。此选项对于初步时间测试很有用,但不适用于实际量化。
如果未指定此字段,则禁用量化。
注释
- 标记为
(pb)的字段在转换.pb模型时是必需的。 - 标记为
(q)的字段在量化模型时是必需的。
元文件还支持有限的变量扩展:元文件中的 ${ENV:name} 被替换为环境变量 name 的内容(如果变量不存在,则替换为空字符串)。格式字符串中的 ${FILE:name} 被替换为相应文件的内容(文件路径相对于转换元文件本身的位置)。应谨慎使用此功能,因为它会使元文件不是自包含的。