model_tool
--info model_file : show brief model info
--print model_file : show detailed model info
--extract model_file : extract one multi-net bmodel to multi one-net bmodels
--combine file1 .. fileN -o new_file: combine bmodels to one bmodel by filepath
--combine_dir dir1 .. dirN -o new_dir: combine bmodels to one bmodel by directory path
--dump model_file start_offset byte_size out_file: dump binary data to file from bmodel
TPU-MLIR
本项目是算能深度学处理器的TPU编译器工程。该工程提供了一套完整的工具链,其可以将不 同框架下预训练的神经网络,转化为可以在算能TPU上高效运算的二进制文件
bmodel
。目前该工程直接支持的深度学习框架包括PyTorch、ONNX、TFLite和Caffe,其他框架模型需要转成ONNX。
也支持编译HuggingFace LLM模型,目前支持qwen2系列/llama系列,后续会支持更多类型的LLM模型。
编译工程
首先需要安装指定的Docker,然后可以选择用预编译包或者编译源码。
安装Docker
预编译包 (方式一)
我们提供 TPU-MLIR Python 包以便跳过编译工程的步骤快速安装。环境要求:python >= 3.10 和 ubuntu:22.04(推荐直接使用我们的docker镜像)。
编译源码 (方式二)
容器建立后,代码在docker中的目录为
/workspace/tpu-mlir
。在工程目录下运行以下命令:
使用方法 (Qwen2.5-VL为例)
以
Qwen2.5-VL
为例,介绍如何编译HuggingFace LLM模型。Qwen2.5-VL
模型, 如下:Qwen2.5-VL
, 如下:llm_convert.py
支持的主要参数如下:672,896
,也可以是602112
执行完成后在指定目录会生成对应的bmodel
将python_demo代码拷贝到PCIE或者SoC环境后如下编译代码:
将bmodel拷贝到运行环境后执行:
执行效果图如下:
使用方法 (yolov5s为例)
以
yolov5s.onnx
为例,介绍如何编译迁移一个onnx模型至BM1684X TPU平台运行。该模型来在yolov5的官网: https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.onnx。
在本工程已经放在
regression/model/yolov5s.onnx
。准备模型和数据
建立
model_yolov5s
目录,注意是与本工程同级目录;并把模型文件和图片文件都放入model_yolov5s
目录中。操作如下:
将模型转化MLIR
如果模型是图片输入,在转模型之前我们需要了解模型的预处理。如果模型用预处理后的npz文件做输入,则不需要考虑预处理。 预处理过程用公式表达如下(x代表输入): $ y = (x - mean) \times scale $
官网yolov5的图片是rgb,每个值会乘以
1/255
,转换成mean和scale对应为0.0,0.0,0.0
和0.0039216,0.0039216,0.0039216
。模型转换命令如下:
model_transform.py
支持的主要参数如下(完整参数信息请查看开发参考手册):.onnx
或.pt
或.tflite
或.prototxt
文件.caffemodel
文件[[1,3,640,640]]
;二维数组,可以支持多输入情况转成mlir文件后,会生成一个
${model_name}_in_f32.npz
文件,该文件是模型的输入文件。它是通过对图片输入进行预处理后得到的数据。MLIR转F16模型
将mlir文件转换成f16的bmodel,操作方法如下:
model_deploy.py的主要参数说明如下(完整参数信息请查看开发参考手册):
MLIR转INT8模型
转INT8模型前需要跑calibration,得到量化表;输入数据的数量根据情况准备100~1000张左右。
然后用量化表,生成对称或非对称bmodel。如果对称符合需求,一般不建议用非对称,因为非对称的性能会略差与对称模型。
这里用现有的100张来自COCO2017的图片举例,执行calibration:
转成INT8对称量化模型,执行如下命令:
效果对比
本工程有用python写好的yolov5用例,源码路径
python/samples/detect_yolov5.py
,用于对图片进行目标检测。阅读该代码可以了解模型是如何使用的:先预处理得到模型的输入,然后推理得到输出,最后做后处理。以下用该代码分别来验证onnx/f32/int8的执行结果。onnx模型的执行方式如下,得到
dog_onnx.jpg
:f16 bmodel的执行方式如下,得到
dog_f16.jpg
:int8 对称bmodel的执行方式如下,得到dog_int8_sym.jpg:
三张图片对比如下:
辅助工具
模型推理工具
model_runner.py
支持 bmodel/mlir/onnx/tflite
bmodel
模型工具可以通过
model_tool
工具来查看和编辑bmodel
文件, 用法参考以下列表:例如, 获取
bmodel
的基本信息:资源
以下资源可以帮助你更好地了解TPU-MLIR:
如果你在完成上述任务时有任何疑问,可以在中Issues提问或查看现有答案。