BYOM Converter
Bring Your Own Model (BYOM) 是一个基于 Python 的软件包,可将任何开源 ONNX 模型转换为 TAO 兼容模型。TAO BYOM Converter 提供了一个 CLI 来导入 ONNX 模型并将其转换为 Keras。转换后的模型以 .tltb
格式存储,该格式基于 EFF。

目前,TAO BYOM Converter 支持以下模型
分类
UNet
TAO 支持的更多任务,例如对象检测,将在未来的版本中添加。
软件要求
软件 | 版本 |
python | >=3.6.9 <3.7 |
python-pip | >21.06 |
nvidia-pyindex | >=1.0 |
通过 pip 安装
TAO BYOM Converter 是一个 Python pip 包,托管在官方 PyPI 上。它是一个仅支持 Python 3 的软件包,能够在 Python 3.6 上运行。
使用
miniconda
创建一个新的conda
环境。按照此链接中的说明使用 miniconda 设置 conda 环境。
安装
miniconda
后,通过将 Python 版本设置为 3.6 来创建一个新环境。conda create -n launcher python=3.6
激活您刚刚创建的
conda
环境。conda activate launcher
激活
conda
环境后,命令提示符应显示您的 conda 环境的名称。(launcher) py-3.6.9 desktop:
当您完成会话后,可以使用
deactivate
命令停用您的conda
环境conda deactivate
您可以使用以下命令重新实例化已创建的
conda
环境。
conda activate launcher
从 NVIDIA 安装 Tensorflow 1.15.x 包,该包托管在
nvidia-pyindex
上。pip3 install nvidia-pyindex pip3 install nvidia-tensorflow
安装名为
nvidia-tao-byom
的 TAO BYOM Converter Python 包。pip3 install nvidia-tao-byom
注意如果您安装了旧版本的
nvidia-tao-byom
启动器,则可以通过运行以下命令升级到最新版本。pip3 install --upgrade nvidia-tao-byom
使用
tao_byom
命令调用入口点。tao_byom --help
上述命令的示例输出如下
usage: BYOM Converter [-h] -m ONNX_MODEL_FILE -n MODEL_NAME -r RESULTS_DIR [--verbose] [-c CUSTOM_META] [-k KEY] [-p PENULTIMATE_NODE] [-ki {glorot_uniform,glorot_normal,he_uniform,he_normal, \ zeros,random_uniform,random_normal,constant,ones,identity}] [-fn [FREEZE_NODE [FREEZE_NODE ...]]] [-fb] Convert onnx model into TAO Model. optional arguments: -h, --help show this help message and exit -m ONNX_MODEL_FILE, --onnx_model_file ONNX_MODEL_FILE Onnx model path to the pre-trained weights. -n MODEL_NAME, --model_name MODEL_NAME Name of the architecture inside onnx file -r RESULTS_DIR, --results_dir RESULTS_DIR Path to a folder where converted Keras model will be stored. --verbose log level NOTSET -c CUSTOM_META, --custom_meta CUSTOM_META Path to custom meta json file that contains info about custom layer implementation -k KEY, --key KEY Key to encrpyt tltb file -p PENULTIMATE_NODE, --penultimate_node PENULTIMATE_NODE Name of ONNX node corresponding to the penultimate layer -ki {glorot_uniform,glorot_normal,he_uniform,he_normal,zeros,random_uniform,\ random_normal,constant,ones,identity}, \ --kernel_initializer {glorot_uniform,glorot_normal, he_uniform,\ he_normal,zeros,random_uniform,random_normal,constant,ones,identity} Type of kernel initializer used to initialize Conv, ConvTranspose, and Gemm -fn [FREEZE_NODE [FREEZE_NODE ...]], --freeze_node [FREEZE_NODE [FREEZE_NODE ...]] List of ONNX nodes to freeze. Examples: -i item1 item2 -fb, --freeze_bn Whether to freeze every BatchNorm in the model.
如果在您的主机上的原生 Python 3 环境中安装 TAO BYOM Converter,而不是推荐的使用虚拟环境的方式,您可能会收到一个错误,指出找不到 tao_byom
二进制文件。这是因为 pip 安装的 tao_byom
二进制文件的路径未添加到本地计算机的 PATH
环境变量中。在这种情况下,运行以下命令
export PATH=$PATH:~/.local/bin
软件要求
软件 | 版本 |
python | ==3.8.* |
python-pip | >21.06 |
nvidia-pyindex | >=1.0 |
通过 pip 安装
TAO BYOM Converter 是一个 Python3 pip 包,托管在官方 PyPI 仓库上。它能够在 Python 3.8 for TF2 上运行。
使用
miniconda
创建一个新的conda
环境。按照此链接中的说明使用 miniconda 设置 conda 环境。
安装
miniconda
后,通过将 Python 版本设置为 3.8 来创建一个新环境。conda create -n launcher python=3.8
激活您刚刚创建的
conda
环境。conda activate launcher
激活
conda
环境后,命令提示符应显示环境名称。(launcher) py-3.8.9 desktop:
当您完成会话后,可以使用
deactivate
命令停用您的conda
环境conda deactivate
您可以使用以下命令重新实例化已创建的
conda
环境。
conda activate launcher
安装 Tensorflow 2.9.x 包和必要的 CUDA 相关依赖项。
conda install -c conda-forge cudatoolkit=11.2 cudnn=8.1.0 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/ pip3 install tensorflow==2.9.1
安装名为
nvidia-tao-byom
的 TAO BYOM Converter Python 包。pip3 install nvidia-tao-byom
注意如果您安装了旧版本的
nvidia-tao-byom
启动器,则可以通过运行以下命令升级到最新版本。pip3 install --upgrade nvidia-tao-byom
使用
tao_byom
命令调用入口点。tao_byom --help
上述命令的示例输出如下
usage: BYOM Converter [-h] -m ONNX_MODEL_FILE -n MODEL_NAME -r RESULTS_DIR [--verbose] [-c CUSTOM_META] [-k KEY] [-p PENULTIMATE_NODE] [-ki {glorot_uniform,glorot_normal,he_uniform,he_normal, \ zeros,random_uniform,random_normal,constant,ones,identity}] [-fn [FREEZE_NODE [FREEZE_NODE ...]]] [-fb] Convert onnx model into TAO Model. optional arguments: -h, --help show this help message and exit -m ONNX_MODEL_FILE, --onnx_model_file ONNX_MODEL_FILE Onnx model path to the pre-trained weights. -n MODEL_NAME, --model_name MODEL_NAME Name of the architecture inside onnx file -r RESULTS_DIR, --results_dir RESULTS_DIR Path to a folder where converted Keras model will be stored. --verbose log level NOTSET -c CUSTOM_META, --custom_meta CUSTOM_META Path to custom meta json file that contains info about custom layer implementation -k KEY, --key KEY Key to encrpyt tltb file -p PENULTIMATE_NODE, --penultimate_node PENULTIMATE_NODE Name of ONNX node corresponding to the penultimate layer -ki {glorot_uniform,glorot_normal,he_uniform,he_normal,zeros,random_uniform,\ random_normal,constant,ones,identity}, \ --kernel_initializer {glorot_uniform,glorot_normal, he_uniform,\ he_normal,zeros,random_uniform,random_normal,constant,ones,identity} Type of kernel initializer used to initialize Conv, ConvTranspose, and Gemm -fn [FREEZE_NODE [FREEZE_NODE ...]], --freeze_node [FREEZE_NODE [FREEZE_NODE ...]] List of ONNX nodes to freeze. Examples: -i item1 item2 -fb, --freeze_bn Whether to freeze every BatchNorm in the model.
如果在您的主机上的原生 Python3 环境中安装 TAO BYOM Converter,而不是推荐的使用虚拟环境的方式,您可能会收到一个错误,指出找不到 tao_byom
二进制文件。这表明 pip 安装的 tao_byom
二进制文件的路径尚未添加到本地计算机的 PATH
环境变量中。在这种情况下,运行以下命令
export PATH=$PATH:~/.local/bin
您将需要一个 ONNX 模型来运行 TAO BYOM Converter。有多种方法可以获取您需要的模型架构的 ONNX 模型。您可以首先浏览官方 ONNX 模型 zoo中支持的模型。ONNX 提供了从不同深度学习框架导出的各种视觉模型架构。
除了官方 ONNX 模型网站外,您还可以从您选择的框架导出您的模型到 ONNX。对于 PyTorch,请参阅他们的 API 以导出到 ONNX。对于 Tensorflow,请参阅 ONNX 支持的库 tensorflow-onnx。
目前,仅支持 channel_first
模型。这意味着您的模型的输入形状应为 (N, C, H, W)
。如果您希望转换基于 TensorFlow 的模型,请设置 keras.backend.set_image_data_format('channels_first')
属性。此外,TAO BYOM Converter 已经在 opset version
9 到 13 上进行了测试。如果您的 opset 版本低于 9 或高于 13,请运行 ONNX 提供的 此版本转换脚本,将 ONNX 模型转换为合适的版本。
使用 tao_byom
命令将开源 ONNX 模型转换为 TAO 兼容模型
tao_byom [-h] -m <onnx model path>
-k <encoding key>
-r <result directory>
-n <name of the model>
[-p <name of penultimate ONNX node>]
[-c <custom meta json>]
[-ki <type of kernel initialization>]
[-fn <list of ONNX nodes to freeze>]
[-fb]
[--verbose]
必需参数
-m, --onnx_model_file
:ONNX 模型文件的路径-k, --key
:用于保存.tltb
模型的用户特定编码密钥-r, --results_dir
:应写入转换后的输出的文件夹路径-n, --model_name
:模型架构的名称
可选参数
--penultimate_node, -p
:与倒数第二层对应的 ONNX 节点名称。如果提供,转换器将拦截到所提供节点的输出。如果您想通过 TAO 在不同的数据集上微调开源模型,请提供此参数。--penultimate_node
的定义可能因任务而异。对于分类,它通常是全局平均池化之前的最后一个激活层。TAO 将在末尾添加一个层,以根据目标数据集中的类数量更新分类头的尺寸。对于 UNet,它是最后一个 softmax/sigmoid 之前的最后一个卷积(如果输出之前有激活层)。--custom_meta, -c
:自定义 meta JSON 文件的路径,其中包含有关自定义层实现的信息。如果存在 BYOM Converter 当前不支持的 ONNX 节点,请提供此参数。您可以引入自己的实现来扩展 BYOM Converter 的功能。有关更多详细信息,请参阅 BYOM 示例仓库。--kernel_initializer, -ki
:用于初始化 Conv、ConvTranspose 和 Gemm 的内核初始化器的类型。可用选项包括 glorot_uniform、glorot_normal、he_uniform、he_normal、zeros、random_uniform、random_normal、constant、ones、identity。有关内核初始化的更多信息,请参阅 Keras 文档。--freeze_node, -fn
:要冻结的 ONNX 节点列表。ONNX 节点仅限于可训练节点(例如 Conv、ConvTranspose 和 Gemm)。与提供的 ONNX 节点对应的层的权重在训练期间不会更新。此参数类似于分类 model_config中的freeze_blocks
。--freeze_bn, -fb
:一个标志,用于指定是否冻结模型中的每个批归一化层。此参数类似于分类 model_config中的freeze_bn
。--verbose
:打印详细输出。日志级别设置为NOTSET
。-h, --help
:打印帮助消息。
BYOM 包通过比较原始 ONNX 模型和转换后的 TAO 模型的输出来检查转换的正确性。如果差异大于设定的 1e-4 阈值,您将看到以下消息。
INFO: Difference between the original ONNX and converted Keras model is larger than the set threshold 0.0001 with error of 0.000356.
INFO: This may be due to difference in deep learning frameworks. If the error is not far from the threshold, you may proceed with
training with TAO. If difference is large, please post an issue on the forum and link your original model.
如日志消息所示,如果差异低于阈值,您可以继续通过 TAO 微调 BYOM 模型。在微调过程中,这种差异的影响可能会减小。如果差异太大,请在 TAO 论坛中发布问题。
通过 TAO BYOM Converter 转换开源模型的示例工作流程在 TAO BYOM 示例仓库中描述。
下表显示了 TAO BYOM 中所有支持的 ONNX 运算符。这可能会在未来的版本中更新。如果您希望向 TAO BYOM 添加新的 ONNX 运算符,请参阅 TAO BYOM 文档的Bring your Own Layer 部分中的示例。
ONNX 运算符 |
支持状态 |
注意 |
---|---|---|
Add | 是 | |
ArgMax | 是 | |
AveragePool | 是 | |
BatchNormalization | 是 | |
Cast | 是 | |
Clip | 是 | |
Concat | 是 | |
Constant | 是 | |
ConstantOfShape | 是 | |
Conv | 是 | |
ConvTranspose | 是 | 不支持 dilation!=1, group!=1, output_padding!=0 |
Div | 是 | |
Dropout | 是 | |
Elu | 是 | |
Equal | 是 | |
Exp | 是 | |
Expand | 是 | |
Flatten | 是 | |
Floor | 是 | |
Gather | 是 | |
Gemm | 是 | |
GlobalAveragePool | 是 | |
Identity | 是 | |
InstanceNormalization | 是 | |
LeakyRelu | 是 | |
Log | 是 | |
LRN | 是 | |
MatMul | 是 | |
MaxPool | 是 | |
Max | 是 | |
Mean | 是 | |
Min | 是 | |
Mul | 是 | |
PRelu | 是 | |
Pad | 是 | |
Pow | 是 | |
Range | 是 | |
ReduceL2 | 是 | |
ReduceMax | 是 | |
ReduceMean | 是 | |
ReduceSum | 是 | |
Relu | 是 | |
Reshape | 是 | |
Resize | 是 | |
Selu | 是 | |
Shape | 是 | |
Sigmoid | 是 | |
Slice | 是 | |
Softmax | 是 | |
Softplus | 是 | |
Split | 是 | 不支持多个轴 |
Sqrt | 是 | |
Squeeze | 是 | |
Sub | 是 | |
Sum | 是 | |
Tanh | 是 | |
Tile | 是 | |
Transpose | 是 | |
Unsqueeze | 是 | |
Upsample | 是 | |
Where | 是 |