完整的深度学习模型跨平台部署解决方案
从PyTorch训练到移动端推理的端到端工作流
DL2C (Deep Learning to C) 是一个完整的跨平台AI模型部署框架,专注于MNIST手写数字识别任务。项目展示了从模型训练、优化、导出到多平台高性能推理的完整工作流,使用统一的源代码支持macOS和Android平台。
- 🎯 完整工作流: PyTorch训练 → ONNX导出 → 跨平台部署
- 🔥 多语言支持: Python、C++、C三种语言实现
- 📱 跨平台部署: macOS本地 + Android移动端
- ⚡ 高性能推理: 最高6600+ FPS推理速度
- 📊 智能分析: 自动化性能对比和可视化分析
- 🛠️ 一键部署: 全自动化编译、部署、测试流程
- 🔧 统一架构: 单一源码支持多平台,降低维护成本
| 平台/语言 | FPS | 推理时间 | 准确率 | 部署复杂度 |
|---|---|---|---|---|
| macOS C++ | 6662 | 0.150ms | 99.0% | 低 |
| macOS C | 2614 | 0.383ms | 99.0% | 低 |
| macOS Python | 2518 | 0.397ms | 99.0% | 极低 |
| Android C | 2386 | 0.420ms | 99.0% | 中 |
| Android C++ | 2355 | 0.425ms | 99.0% | 中 |
🔥 关键发现:
- 最大性能差距: macOS C++ 比 Android C++ 快 2.8倍
- 算法一致性: 所有平台准确率均为 99.0%
- 移动端性能: Android 达到 2300+ FPS,满足实时应用需求
./run_all_platforms.sh
open results/cross_platform_analysis.png cat results/cross_platform_report.md
### 📋 环境要求
#### 基础依赖
```bash
# Python环境
pip install torch torchvision onnx onnxruntime numpy matplotlib Pillow netron
# macOS工具链
brew install cmake ninja android-ndk pkg-config openjdk@11
brew install --cask android-platform-tools #adb
# onnxruntime 运行时
brew install onnxruntime
- Android设备连接并开启USB调试
- 验证连接:
adb devices
这是整个流程中最复杂的部分,需要从源码编译 ONNX Runtime 的 Android 版本。
cd /Users/mintisan/Workplaces # 或您的工作目录
git clone --recursive https://github.com/Microsoft/onnxruntime.git
cd onnxruntime# 设置环境变量
export ANDROID_NDK_HOME="/opt/homebrew/share/android-ndk"
export ANDROID_SDK_ROOT="$HOME/android-sdk"
export PATH="/opt/homebrew/opt/openjdk@11/bin:$PATH"
# 开始编译 (这是一个耗时的过程)
./build.sh --android \
--android_abi arm64-v8a \
--android_api 21 \
--android_sdk_path $ANDROID_SDK_ROOT \
--android_ndk_path $ANDROID_NDK_HOME \
--config Release \
--cmake_extra_defines onnxruntime_USE_KLEIDIAI=OFF# 检查生成的库文件
ls -la build/Android/Release/libonnxruntime_*.a
# 应该看到以下文件:
# libonnxruntime_session.a
# libonnxruntime_providers.a
# libonnxruntime_framework.a
# libonnxruntime_graph.a
# 等等...- ⏱️ 编译时间: 首次编译需要30-60分钟,取决于机器性能
- 💾 磁盘空间: 编译过程需要约5-10GB的磁盘空间
- 🔧 依赖工具: 确保已安装cmake、ninja、git等工具
- 📱 SDK配置: Android SDK和NDK路径需要正确设置
# 如果编译失败,可以尝试清理后重新编译
./build.sh --clean
rm -rf build/Android
# 确认环境变量设置
echo "NDK: $ANDROID_NDK_HOME"
echo "SDK: $ANDROID_SDK_ROOT"DL2C/
├── 🧠 train/ # 模型训练模块
│ ├── train_model.py # PyTorch模型训练
│ ├── quantize_model.py # 模型量化优化
│ └── export_onnx.py # ONNX格式导出
├── ⚡ inference/ # 跨平台推理实现
│ ├── python_inference.py # Python版本(开发友好)
│ ├── cpp_inference.cpp # C++版本(高性能)
│ └── c_inference.c # C版本(最大兼容性)
├── 🔨 build/ # 编译配置和构建输出
│ ├── CMakeLists.txt # 统一的CMake配置
│ ├── build_android/ # Android构建目录
│ ├── build_macos/ # macOS构建目录
│ ├── onnxruntime-android-arm64-v8a/ # Android ONNX Runtime
│ └── onnxruntime-osx-arm64-1.16.0/ # macOS ONNX Runtime
├── 🔧 build.sh # 统一的编译脚本
├── 📱 deploy_and_test.sh # 自动部署测试脚本
├── 📊 models/ # 训练好的模型
│ └── mnist_model.onnx # ONNX格式模型
├── 📈 results/ # 性能分析结果
│ ├── *_c_results.txt # C语言推理结果
│ ├── *_cpp_results.txt # C++推理结果
│ ├── python_inference_results.json # Python推理结果
│ ├── cross_platform_analysis.png # 可视化性能图表
│ └── cross_platform_report.md # 详细分析报告
├── 📦 test_data/ # 测试数据,来自data_loader.py
├── 🚀 run_all_platforms.sh # 一键完整测试
├── data_loader.py # 测试数据生成
├── android_executables/ # Android可执行文件
└── 📋 README.md # 项目说明(本文件)
项目采用统一源码架构,通过预处理器宏实现平台适配,大大简化跨平台部署:
#ifdef __ANDROID__
#define MODEL_PATH "/data/local/tmp/mnist_onnx/models/mnist_model.onnx"
#define RESULTS_PATH "/data/local/tmp/mnist_onnx/results/android_c_results.txt"
#define PLATFORM_NAME "Android"
#else
#define MODEL_PATH "../models/mnist_model.onnx"
#define RESULTS_PATH "../results/macos_c_results.txt"
#define PLATFORM_NAME "macOS"
#endif- 路径适配: 自动处理不同平台的文件路径差异
- 数据加载: 统一的数据加载接口,平台特定的实现
- 编译配置: CMake自动检测平台并应用相应配置
- 部署流程: 单一脚本处理不同平台的部署差异
如果不想运行完整流程,可以分步执行:
cd train
python train_model.py # 训练模型,下载数据
python quantize_model.py # 量化优化
python export_onnx.py # 导出ONNX
netron # 查看 model 结构python data_loader.py # 生成推理测试数据cd inference
python python_inference.py # Python推理基准# 编译macOS版本
./build.sh macos
# 编译Android版本(需连接Android设备)
./build.sh android# 测试macOS版本
./deploy_and_test.sh macos
# 测试Android版本(需连接Android设备)
./deploy_and_test.sh android# 编辑 data_loader.py
num_samples = 1000 # 默认100,可改为更大规模测试# 编译时启用详细输出
./build.sh android --verbose
# 测试时查看详细日志
./deploy_and_test.sh android --debug// 编辑推理源码,修改模型路径
#define MODEL_PATH "your_custom_model_path"- 🧠 训练: PyTorch 2.4+
- 🔄 转换: ONNX 标准格式
- ⚡ 推理: ONNX Runtime C/C++ API
- 🔨 构建: CMake + Ninja
- 💻 平台: macOS (Apple Silicon), Android (ARM64)
- 🗣️ 语言: Python 3.8+, C++17, C99
- 📱 移动端: Android NDK 25+, API Level 21+
- 📊 可视化: Matplotlib, NumPy
- 📈 分析: 自研跨平台性能分析系统
- 🔍 诊断: 智能环境检测和故障排除
# 检查NDK配置
echo $ANDROID_NDK_HOME
ls $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/
# 重新安装NDK
brew reinstall android-ndk# macOS安装
brew install onnxruntime
# 或设置环境变量
export ONNXRUNTIME_ROOT=/path/to/onnxruntime# 重启ADB服务
adb kill-server && adb start-server
adb devices
# 确认USB调试已开启图表中文显示乱码时,脚本会自动切换到英文模式。如需中文显示,请确保系统安装了中文字体。
- 查看日志: 运行脚本时注意错误输出信息
- 重置环境: 删除
build/build_*目录后重新编译 - 性能分析: 查看
results/目录下的详细报告
- 跨平台准确率: 所有平台均达到99.0%准确率
- 数值一致性: ONNX标准保证算法完全一致
- 自动验证: 智能检测平台间性能差异
- 极致优化: macOS C++达到6600+ FPS
- 移动端高效: Android设备2300+ FPS满足实时需求
- 内存高效: 静态链接部署,无外部依赖
- 自动化工具链: 一键完成训练→编译→部署→测试
- 智能故障诊断: 详细的错误检测和解决建议
- 可视化分析: 6子图综合性能分析报告
- 统一代码库: 降低维护成本,提高开发效率
- 🔬 算法扩展: 尝试其他深度学习模型(ResNet、Transformer等)
- ⚡ 性能优化: GPU加速、量化优化、算子融合
- 📱 移动端开发: 集成到Android Studio项目
- 🌐 Web部署: 使用ONNX.js部署到浏览器
- CI/CD集成: 将测试流程集成到持续集成系统
- 生产监控: 添加推理性能监控和告警
- 模型管理: 版本控制和A/B测试框架
- 多模型支持: 扩展为通用模型部署平台
我们欢迎社区贡献!
- Fork 本仓库
- 创建 特性分支:
git checkout -b feature/amazing-feature - 提交 改动:
git commit -m 'Add amazing feature' - 推送 分支:
git push origin feature/amazing-feature - 提交 Pull Request
- 🐛 Bug修复和性能优化
- 📚 文档改进和翻译
- 🔧 新平台支持(iOS、Web等)
- 🧪 新模型和算法集成
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
- PyTorch团队: 提供优秀的深度学习框架
- ONNX社区: 推动AI模型标准化
- Microsoft: 开发高性能ONNX Runtime
- 贡献者们: 感谢所有为项目做出贡献的开发者
🌟 如果这个项目对你有帮助,请给个Star!🌟
🚀 开始你的跨平台AI部署之旅!