一、场景说明
业务需求:基于 Ultralytics YOLO 模型,用 FastAPI 封装推理接口,通过 Docker Buildx 打包ARM64 / 欧拉系统镜像,适配华为昇腾 910B4 NPU 离线推理环境。
环境:x86_64 开发机跨架构构建,目标设备 ARM64+CANN 驱动,离线无外网依赖。
二、核心踩坑点与完整解决方案
1. 跨架构构建基础配置(Buildx)
问题
直接 build 默认 x86 镜像,放到 ARM 昇腾设备报exec format error;拉取基础镜像架构不匹配。
解决脚本
bash
运行
# 创建多架构构建器
docker buildx create --name arm-builder --use
docker buildx inspect --bootstrap
# 构建并推送(离线可导出镜像包)
docker buildx build --platform linux/arm64 -t yolov8-atlas:v1.0 --load .
Dockerfile 关键基础镜像选用适配昇腾 ARM:
dockerfile
FROM openeuler/openeuler:22.03-LTS-aarch64
# 预装CANN基础依赖、gcc、python3.9
2. NPU 设备挂载与驱动兼容报错
报错 1:libascendcl.so: cannot open shared object file
原因:容器未映射宿主机 CANN 驱动路径、LD_LIBRARY_PATH 未配置。
修复 docker-compose 挂载配置:
yaml
volumes:
- /usr/local/Ascend:/usr/local/Ascend
environment:
- LD_LIBRARY_PATH=/usr/local/Ascend/nnrt/latest/lib64:/usr/local/Ascend/driver/lib64
devices:
- /dev/davinci0:/dev/davinci0
报错 2:NPU 设备权限不足,推理初始化失败
容器启动增加特权参数:
yaml
privileged: true
user: root
3. 依赖跨平台编译问题(ARM64 pip 安装踩坑)
离线 whl 包架构不匹配
不要直接用 x86 开发机 pip 下载的包,使用--platform aarch64下载 ARM 包:
bash
运行
pip download --platform aarch64 --only-binary=:all: ultralytics fastapi uvicorn pydantic
OpenCV 缺失libGL.so.1
欧拉 ARM 镜像默认无图形库,Dockerfile 追加安装:
dockerfile
RUN yum install -y mesa-libGL
4. YOLO 模型昇腾转换(.pt 转.om)常见问题
- 转换工具 atc 需匹配 CANN 版本,版本差 1 个大版本会算子不兼容;
- 输入尺寸固定后推理不可动态修改,转换时指定
--input_shape=x,3,640,640;
- 批量推理需开启多流,否则 NPU 算力利用率不足 30%。
5. FastAPI 高并发推理优化
- 单进程单 NPU,禁止多 uvicorn 工作进程抢占设备;
- 推理模型全局单例初始化,避免每次请求重载.om 模型;
- 增加请求队列限流,防止批量图片并发导致 NPU 内存溢出。
三、完整可用目录结构
plaintext
yolov-atlas/
├── Dockerfile
├── docker-compose.yml
├── requirements-arm64.txt
├── model/ # 存放om离线模型
├── api/
│ └── main.py # FastAPI推理服务
└── offline_whl/ # ARM64离线依赖包