ONNXRUNTIME_FIX.md 2.4 KB

Docker 部署 onnxruntime 问题修复指南

问题描述

在 Docker 容器中部署时,如果遇到 onnxruntime DLL 加载失败的错误:

ImportError: DLL load failed while importing onnxruntime_pybind11_state: 动态链接库(DLL)初始化例程失败

解决方案

1. 已更新的 Dockerfile

docker/adhServer.Dockerfile 已经更新,添加了以下系统依赖:

  • libgomp1 - OpenMP 支持(onnxruntime 需要)
  • libgcc-s1 - GCC 运行时库
  • libstdc++6 - C++ 标准库
  • libc6 - C 标准库

2. 重新构建 Docker 镜像

# 在项目根目录执行
docker-compose build --no-cache adhServer

# 或者如果使用单独的 Dockerfile
docker build -f docker/adhServer.Dockerfile -t adh-server:latest .

3. 验证安装

启动容器后,可以通过以下方式验证 onnxruntime 是否正常工作:

# 进入容器
docker exec -it <container_name> python3 -c "import onnxruntime as ort; print(ort.get_available_providers())"

如果成功,应该看到类似输出:

['CPUExecutionProvider']

4. 如果仍然失败

方案 A:使用 CPU 专用版本

如果标准版本仍然有问题,可以尝试安装 CPU 专用版本:

requirements.txt 中:

onnxruntime==1.16.3

或者明确指定 CPU 版本:

pip install onnxruntime==1.16.3

方案 B:检查 Python 版本兼容性

确保使用 Python 3.10(onnxruntime 1.16.3 支持 Python 3.8-3.11)。

方案 C:使用延迟导入(已实现)

代码已经实现了延迟导入机制,即使 onnxruntime 加载失败,服务器也能正常启动,只是人脸检测功能会返回无脸结果。

5. 调试步骤

如果问题仍然存在,可以:

  1. 检查容器日志

    docker logs <container_name>
    
    1. 检查系统库bash docker exec -it <container_name> ldd /usr/local/lib/python3.10/site-packages/onnxruntime/capi/libonnxruntime_providers_shared.so
  2. 检查 Python 环境

    docker exec -it <container_name> python3 -c "import sys; print(sys.version)"
    

    注意事项

    • 确保 Docker 镜像基于 Debian Bookworm(或类似系统)
    • 如果使用其他基础镜像,可能需要调整包名(例如 Ubuntu 使用 libgomp1,CentOS 使用 libgomp
    • 建议使用固定版本的 onnxruntime(当前为 1.16.3)以确保稳定性