努力
加油

在阿里云服务器上部署深度学习模型的步骤有哪些?

在阿里云 ECS(云服务器)上部署深度学习模型,核心在于“算力选型”、“环境隔离”和“服务暴露”。很多初学者容易直接在系统层面装 CUDA 和 PyTorch,结果遇到驱动冲突或依赖地狱。下面按实际生产环境的逻辑,拆解一套稳健的部署流程。

1. 实例选型:别拿 CPU 跑推理,也别乱买 GPU

首先得明确你的模型是训练还是推理。如果是训练,直接去阿里云控制台选“GPU 计算型”实例(如 gn6、gn7 系列),搭配 vGPU 或者独占 GPU 资源。如果是推理,且并发不高,CPU 实例配合 ONNX Runtime 可能性价比更高;如果必须用 GPU 推理,建议选带 TensorRT 优化的实例,或者使用 PAI-EAS(机器学习平台工程化服务)这种托管方案,能省去大量运维麻烦。

这里假设你是自建 ECS 进行通用部署。购买时注意:

  • 带宽:模型文件通常很大,初期下载要买按量付费的大带宽包,或者直接用 OSS 挂载,避免流量费爆炸。
  • 系统盘:至少 40G-50G,因为 Docker 镜像和 conda 环境很占空间。
  • 安全组:提前开好端口(如 80, 443, 以及你打算用的 API 端口如 5000/8080)。

2. 环境搭建:Docker 是底线,Conda 是备选

现在生产环境几乎没人裸机装 Python 环境了,版本冲突太致命。强烈建议使用 Docker。

步骤 A:安装 Docker 和 NVIDIA Container Toolkit
这是关键。阿里云 Linux 发行版通常是 Alibaba Cloud Linux 或 Ubuntu/CentOS。

# 以 Ubuntu 为例,安装基础 Docker
sudo apt-get update
sudo apt-get install docker.io
sudo systemctl enable --now docker

# 重点:安装 NVIDIA 容器工具集,让 Docker 能识别宿主机的 GPU
# 这一步如果不做,容器内 nvidia-smi 会报错
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://nvidia.github.io/libnvidia-container/stable/deb/$(lsb_release -cs) $(lsb_release -cs)-main" | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

验证是否成功:docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi,如果能输出显卡信息,说明底层通了。

步骤 B:编写 Dockerfile
不要手动在容器里 pip install,写一个 Dockerfile 保证可复现。

FROM nvidia/cuda:11.7-cudnn8-runtime-ubuntu20.04

# 设置工作目录
WORKDIR /app

# 先复制依赖文件,利用 Docker 缓存层
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制代码和模型权重
COPY ./model.py ./
COPY ./weights.pt ./

# 暴露端口
EXPOSE 8000

# 启动命令,假设你用 FastAPI 或 Flask
CMD ["python", "model.py"]

注意:requirements.txt 里最好指定具体的 torch 版本,确保与宿主机 CUDA 版本匹配。

3. 模型加载与服务封装

模型本身不能只存在本地,建议将模型权重上传到 OSS(对象存储),然后在 ECS 上通过 OSSFS 或 SDK 挂载/下载。这样即使 ECS 重启或更换实例,模型数据不丢失,也方便版本管理。

代码层面,推荐使用 FastAPI + Uvicorn 或 Flask。

  • FastAPI:异步支持好,自带 Swagger 文档,适合高并发场景。
  • 预热:在应用启动时(startup event)加载模型到内存,避免第一次请求超时。

示例结构:

from fastapi import FastAPI
import torch
import uvicorn

app = FastAPI()
model = None  # 全局变量,进程内单例

@app.on_event("startup")
def load_model():
    global model
    print("Loading model...")
    model = torch.load('weights.pt', map_location='cpu') # 根据需求决定 cpu/gpu
    model.eval()

@app.post("/predict")
def predict(data: dict):
    # 预处理
    input_tensor = preprocess(data['image'])
    # 推理
    with torch.no_grad():
        output = model(input_tensor)
    return {"result": output.tolist()}

4. 反向XX与 HTTPS

不要直接把 Uvicorn 暴露在公网。中间加一层 Nginx。
Nginx 负责:

  1. 负载均衡:如果你有多台 ECS,可以做轮询。
  2. SSL 终止:配置 Let’s Encrypt 证书,提供 HTTPS,保护数据传输安全。
  3. 静态资源:如果有前端页面,由 Nginx 处理。

Nginx 配置片段示例:

server {
    listen 443 ssl;
    server_name your-domain.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

5. 监控与优化(容易被忽视的一步)

部署完不是结束,是开始。

  • 资源监控:使用阿里云云监控插件,观察 GPU 利用率、显存占用、ECS CPU/内存。如果 GPU 利用率长期低于 10%,说明瓶颈在 IO 或网络,而不是算力。
  • 日志收集:将应用日志通过 Filebeat 发送到 SLS(日志服务),方便排查错误。
  • 弹性伸缩:如果流量波动大,可以结合 SLB(负载均衡)和 AS(弹性伸缩),在高峰期自动增加 ECS 实例,低谷期释放,省钱利器。

常见坑点提醒

  1. CUDA 版本不匹配:宿主机驱动版本必须 >= 容器内 CUDA 版本要求的最低驱动。查看 nvidia-smi 顶部的 Driver Version,确保它支持你 Docker 里用的 CUDA Toolkit。
  2. 内存泄漏:深度学习服务长时间运行容易出现显存泄漏。建议在代码中定期清理缓存(torch.cuda.empty_cache()),或者设置合理的 Worker 数量,让 Gunicorn/Uvicorn 定期重启 worker 进程。
  3. 冷启动延迟:首次请求加载模型可能很慢(几秒到几十秒)。做好前端 Loading 提示,或者采用预热机制。

这套流程覆盖了从基础设施到应用层的完整链路,既保证了稳定性,也预留了扩展空间。对于个人开发者或小团队,这是一套兼顾成本与效率的最佳实践。