@misc{tpumlir2022,
title = {TPU-MLIR: A Compiler For TPU Using MLIR},
author = {HuPengchao and LuMan and WangLei and JiangGuoyue},
year = {2022},
eprint = {2210.15016},
archivePrefix = {arXiv},
primaryClass = {cs.PL}
}
@misc{llmtpu2026,
title = {An MLIR-Based Compilation Method for Large Language Models},
author = {HuPengchao and XinZhibin and ChenYifan and ZhouYangyang and WangLiang and ZhangXin},
year = {2026},
eprint = {2607.15865},
archivePrefix = {arXiv},
primaryClass = {cs.PL}
}
TPU-MLIR
面向 TPU 的开源 MLIR 机器学习编译器。
English · 简体中文 · 快速入门 · 开发手册 · Issues
✨ 项目简介
TPU-MLIR 提供完整的工具链,将主流框架下预训练的神经网络转换为可在 SOPHGO TPU 上高效运行的
bmodel文件。基于 MLIR 构建,提供统一 IR、清晰的下降流水线,以及完善的量化、校准与部署工具。🚀 主要特性
llm_convert.py直接编译 HuggingFace 大模型(Qwen、MiniCPM-V 等)。model_runner、model_tool、精度验证、模拟器、可视化工具。📚 目录
🔧 安装
TPU-MLIR 在指定的 Docker 镜像内运行。容器启动后,既可以直接安装预编译 wheel,也可以从源码编译。
1. 拉取 Docker 镜像
如果拉取失败,可手动下载并加载镜像包:
创建并进入容器:
2a. 安装预编译 wheel
2b. 从源码编译 (推荐)
🤖 快速上手 — LLM (Qwen)
将 HuggingFace 上的 LLM 编译为 TPU 上的 bmodel。
点击展开完整 LLM 流程
1. 下载模型
推荐使用预量化 (AWQ / GPTQ / AutoRound) 版本:
2. 编译为 bmodel
LLM 的编译场景可归纳为两类,通过
--use_history_kv控制。不支持历史 —— 编译
block_(prefill 阶段)和block_cache_(decode 阶段)两种指令。如果是单轮对话且长度较短(如 4K 以内),建议用该方式编译:支持历史 —— 编译
block_(prefill)、block_kv_(带历史的 prefill)和block_cache_(decode)三种指令。如果需要支持历史、长度较长(如 8K),或者不确定,建议用该方式编译——它有更高的灵活性,且兼顾性能:--chunk_length指定分段长度,用于分段推理:比如指定为 1K 时,实际输入为 7K,prefill 阶段会分成block_加 7 个block_kv_来完成推理;decode 阶段也会根据 KV cache 的长度不同进行分段,1K / 2K / 4K / 8K 的性能依长度而定。llm_convert.py主要参数:model_pathmseq_lengthsmax_input_lengthseq_length(-s)use_history_kvblock_kv_)chunk_lengthuse_history_kv搭配使用时有效chipcbm1684x/bm1688/cv186ahout_dirodynamicqwen3_5强制走动态)do_samplemax_pixelsembedding_disklora_max_rank3. 在 PCIe / SoC 环境运行
将
cpp_demo拷贝到设备上并编译:执行 bmodel:
运行示例:
demo 中用
/表达指令(如/exit、/clear等),用@指定文件路径——图片如“what is the image about? @./test.jpg”,文本(.txt/.md)如“what is it talking about? @./story.txt”。🖼️ 快速上手 — 视觉 (YOLOv5)
以
yolov5s.onnx为例,在 BM1684X TPU 上完成编译与部署。模型已置于regression/model/yolov5s.onnx。点击展开完整 YOLOv5 流程
1. 准备工作目录
2. 模型转 MLIR
如果模型以图像为输入,需指定预处理;输入为 npz 文件时则无需预处理。预处理公式为:
y=(x−mean)×scale
YOLOv5 官方输入为 RGB,每像素乘
1/255,因此mean = 0,0,0、scale = 0.0039216,0.0039216,0.0039216。model_transform.py主要参数:model_namemodel_def.onnx/.pt/.tflite/.prototxt)model_data.caffemodel)input_shapes[[1,3,640,640]],支持多输入resize_dimskeep_aspect_ratiomean0,0,0scale1,1,1pixel_formatrgb/bgr/gray/rgbdoutput_namestest_inputtest_resultexceptsdebugmlir完成后会生成预处理后的
${model_name}_in_f32.npz。3. MLIR → F16 bmodel
model_deploy.py主要参数:mlirquantizeF32/BF16/F16/INT8processorcalibration_tabletolerancecorrectness0.99,0.90)exceptsdebugmodeldynamic4. MLIR → INT8 bmodel
先做校准(一般 100~1000 张样本),优先使用对称量化。
5. 验证结果
示例脚本位于
python/samples/detect_yolov5.py:不同模型的输出对比:
🛠️ 辅助工具
model_runner.py—— 通用推理工具支持
bmodel/mlir/ PyTorch / ONNX / TFLite / Caffe。model_tool—— bmodel 查看与编辑📖 资源
文档与论文
分享会
视频教程
点击展开视频目录
📝 引用
如果 TPU-MLIR 对您的研究有帮助,请按下列格式引用:
🤝 贡献
欢迎提交 Bug、功能请求与 Pull Request!
regression/下的回归测试。📄 许可证
本项目采用根目录下 LICENSE 文件中规定的开源许可证。