跳过正文
  1. blog/

Python算法项目 容器化

·585 字·
Blog Linux Docker
Aoidayo
作者
Aoidayo
懒人
目录

实验室的一套 Python 算法项目在部署阶段需要以容器/虚拟化方式运行,因此整理了整个 Docker 化流程,方便后续参考。

背景
#

  • 算法部分:包含 PyTorch、XGBoost
  • 后端部分:使用 Flask 提供简单 API 服务

将算法后端打包成可直接部署的 Docker 镜像。

算法容器化 / Now
#

1、构建 dockerfile
#

新建Dockerfile.alg

# 🐋 基于指定的 PyTorch CUDA 镜像
FROM pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel

# 📁 设置工作目录
WORKDIR /workspace

# 📦 复制本地 alg 仓库到容器
COPY alg /workspace/alg

# 🔧 进入 alg 目录
WORKDIR /workspace/alg

# 🪞 配置 pip 使用清华源加速下载
RUN pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

# 📚 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 🌐 暴露 Flask 服务的端口
EXPOSE 20010

# 🚀 启动容器时运行 Flask 服务,并将日志写入 output.log
# ⚠️ 这里保留前台,以使docekr run -d不会直接退出
CMD ["bash", "-c", "python main.py > output.log 2>&1"]

2、构建镜像
#

docker build -t alg:v1.0 -f Dockerfile.alg .

3、运行容器
#

# single
docker run -d -p 20010:20010 -v /opt/code/alg:/workspace/mount --gpus all --name alg --restart=unless-stopped alg:v1.0

# multiple
docker run -d \
  -p 20010:20010 \
  -v /opt/code/alg:/workspace/mount \
  --gpus all \
  --name alg \
  --restart=unless-stopped \
  alg:v1.0

4、查看容器运行状态
#

docekr ps -a
docker logs -f alg

5、端口连通性测试
#

测试端口联通

curl -I http://localhost:20010

镜像保存与迁移
#

1、保存 image 为 tar

docker save -o alg.tar alg:v1.0

2、加载 image

# 7z x alg.7z -o./ # 得到 alg.tar
docker load -i alg.tar
docker images

3、启动容器

docker run -d -p 20010:20010 -v /opt/code/alg:/workspace/mount --gpus all --name alg --restart=unless-stopped alg:v1.0

4、开防火墙

ufw allow 20010

5、API 测试


# 测试
curl -X POST http://localhost:20010/predict

# 返回如下输出即完成
{
  "code": 415,
  "error": "Internal Server Error",
  "message": "415 Unsupported Media Type: Did not attempt to load JSON data because the request Content-Type was not 'application/json'."
}

非 docker 部署 / Before
#

  • 配置 python 环境
    • conda/miniforge/mamba
    • pip
    • poetry
  • 下载依赖
    • pip install -r requirements.txt
    • conda 下载 pytorch 相关依赖
  • 部署
    • nohup python main.py > output.log 2>&1,将算法的输出重定向至 output.log 中,同时每次向 predict 发送的请求存放至 log/json 中,以时间戳顺序排布。