DeepSeek-R1-Distill-Qwen-1.5B持续集成:自动化测试与部署流程
1. 引言
1.1 业务场景描述
在大模型二次开发过程中,如何高效、稳定地将训练或蒸馏后的模型部署为可对外服务的 Web 接口,是工程落地的关键环节。本文围绕DeepSeek-R1-Distill-Qwen-1.5B模型展开,该模型基于 DeepSeek-R1 的强化学习数据对 Qwen-1.5B 进行知识蒸馏优化,在数学推理、代码生成和逻辑推导任务中表现优异。
项目由开发者“by113小贝”完成二次构建,目标是将其封装为高可用的推理服务,并实现从本地调试到生产环境的一键部署与持续集成(CI/CD)能力。
1.2 痛点分析
传统模型部署方式存在以下问题:
- 手动操作易出错,难以保证环境一致性
- 缺乏自动化测试机制,上线风险高
- 多人协作时版本混乱,回滚困难
- GPU 资源利用率低,缺乏容器化管理
因此,亟需一套标准化、可复用、自动化的部署流程来提升研发效率和系统稳定性。
1.3 方案预告
本文将详细介绍基于 Gradio + Docker + GitHub Actions 的完整 CI/CD 实践方案,涵盖:
- 本地服务快速启动
- 容器镜像构建与运行
- 自动化测试脚本设计
- GitHub Actions 驱动的持续集成与远程部署
2. 技术方案选型
2.1 核心组件说明
| 组件 | 作用 |
|---|---|
| Gradio | 快速构建交互式 Web UI,支持文本输入输出可视化 |
| Docker | 实现环境隔离与镜像打包,确保跨平台一致性 |
| NVIDIA CUDA 基础镜像 | 支持 GPU 加速推理 |
| Hugging Face Transformers | 加载并运行 LLM 模型 |
| GitHub Actions | 触发 CI/CD 流程,执行测试与部署 |
2.2 为什么选择此技术栈?
- 轻量高效:Gradio 相比 FastAPI + Vue 更适合快速原型验证
- 易于集成:Docker 可无缝对接云平台(如 Kubernetes、AWS ECS)
- 生态成熟:Hugging Face 提供统一接口,降低维护成本
- 免费可用:GitHub Actions 对公开仓库提供充足免费额度
相比手动部署或 Ansible 脚本,该方案具备更强的可扩展性与可审计性。
3. 实现步骤详解
3.1 环境准备
确保宿主机满足以下条件:
# Python 版本要求 python --version # >= 3.11 # CUDA 驱动正常 nvidia-smi # 安装依赖包 pip install torch==2.9.1 transformers==4.57.3 gradio==6.2.0 --extra-index-url https://download.pytorch.org/whl/cu128注意:CUDA 版本需匹配 PyTorch 安装源,本文使用
cu128对应 CUDA 12.8。
3.2 模型加载与本地服务启动
创建app.py文件,实现模型加载与 Gradio 界面:
import torch from transformers import AutoTokenizer, AutoModelForCausalLM import gradio as gr # 配置参数 MODEL_PATH = "/root/.cache/huggingface/deepseek-ai/DeepSeek-R1-Distill-Qwen-1___5B" DEVICE = "cuda" if torch.cuda.is_available() else "cpu" MAX_TOKENS = 2048 TEMPERATURE = 0.6 TOP_P = 0.95 # 加载 tokenizer 和 model tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, local_files_only=True) model = AutoModelForCausalLM.from_pretrained(MODEL_PATH, local_files_only=True).to(DEVICE) def generate_response(prompt): inputs = tokenizer(prompt, return_tensors="pt").to(DEVICE) with torch.no_grad(): outputs = model.generate( **inputs, max_new_tokens=MAX_TOKENS, temperature=TEMPERATURE, top_p=TOP_P, do_sample=True, pad_token_id=tokenizer.eos_token_id ) response = tokenizer.decode(outputs[0], skip_special_tokens=True) return response[len(prompt):] # 去除输入部分 # 构建 Gradio 界面 demo = gr.Interface( fn=generate_response, inputs=gr.Textbox(label="输入提示", placeholder="请输入您的问题..."), outputs=gr.Markdown(label="模型回复"), title="DeepSeek-R1-Distill-Qwen-1.5B 推理服务", description="支持数学推理、代码生成与逻辑分析" ) if __name__ == "__main__": demo.launch(host="0.0.0.0", port=7860)代码解析:
- 使用
local_files_only=True强制从本地缓存加载模型,避免网络请求 max_new_tokens控制生成长度,防止 OOMtemperature=0.6,top_p=0.95平衡生成多样性与稳定性- 输出仅返回新增内容,提升用户体验
3.3 启动服务
python3 app.py访问http://<server_ip>:7860即可使用 Web 服务。
3.4 后台运行与日志监控
# 启动后台服务 nohup python3 app.py > /tmp/deepseek_web.log 2>&1 & # 查看实时日志 tail -f /tmp/deepseek_web.log # 停止服务 ps aux | grep "python3 app.py" | grep -v grep | awk '{print $2}' | xargs kill4. Docker 部署实践
4.1 Dockerfile 构建
FROM nvidia/cuda:12.1.0-runtime-ubuntu22.04 RUN apt-get update && apt-get install -y \ python3.11 \ python3-pip \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY app.py . # 复制本地缓存模型(需提前下载) COPY --chown=root:root /root/.cache/huggingface /root/.cache/huggingface RUN pip3 install torch==2.9.1+cu121 torchvision==0.16.1+cu121 --extra-index-url https://download.pytorch.org/whl/cu121 RUN pip3 install transformers==4.57.3 gradio==6.2.0 EXPOSE 7860 CMD ["python3", "app.py"]关键点说明:
- 使用
nvidia/cuda:12.1.0-runtime-ubuntu22.04确保 CUDA 兼容性- 模型文件通过
COPY指令嵌入镜像,避免运行时下载- 安装 PyTorch 时指定
cu121版本以匹配基础镜像
4.2 构建与运行容器
# 构建镜像 docker build -t deepseek-r1-1.5b:latest . # 运行容器(绑定 GPU 与端口) docker run -d --gpus all -p 7860:7860 \ -v /root/.cache/huggingface:/root/.cache/huggingface \ --name deepseek-web deepseek-r1-1.5b:latest
-v卷挂载用于共享模型缓存,节省磁盘空间;若已 COPY 到镜像内,则可省略。
5. 自动化测试与 CI/CD 集成
5.1 编写单元测试脚本
创建test_model.py验证模型基本功能:
import unittest from app import generate_response class TestModelGeneration(unittest.TestCase): def test_math_reasoning(self): prompt = "求解方程:x^2 - 5x + 6 = 0" response = generate_response(prompt) self.assertIn("x =", response) self.assertGreater(len(response), 10) def test_code_generation(self): prompt = "用 Python 写一个快速排序函数" response = generate_response(prompt) self.assertIn("def quicksort", response) self.assertIn("pivot", response) def test_logic_inference(self): prompt = "如果所有的猫都会飞,而汤姆是一只猫,那么汤姆会飞吗?" response = generate_response(prompt) self.assertIn("会飞", response) if __name__ == '__main__': unittest.main()运行测试:
python -m pytest test_model.py -v5.2 GitHub Actions CI/CD 配置
创建.github/workflows/ci-cd.yml:
name: Deploy DeepSeek-R1-1.5B Service on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker uses: docker/setup-qemu-action@v3 with: platforms: linux/amd64 - name: Build Docker image run: | docker build -t deepseek-r1-1.5b:latest . - name: Run tests run: | docker run deepseek-r1-1.5b:latest python -m pytest test_model.py -v - name: Deploy to server via SSH uses: appleboy/ssh-action@v1.0.2 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SSH_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | docker stop deepseek-web || true docker rm deepseek-web || true docker rmi deepseek-r1-1.5b:latest || true cp -r ./* /root/deepseek-deploy/ cd /root/deepseek-deploy docker build -t deepseek-r1-1.5b:latest . docker run -d --gpus all -p 7860:7860 --name deepseek-web deepseek-r1-1.5b:latest前提条件:
- 在 GitHub Secrets 中配置
SERVER_HOST,SSH_USER,SSH_PRIVATE_KEY- 目标服务器已安装 Docker 并配置免密登录
6. 故障排查与优化建议
6.1 常见问题及解决方案
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 端口被占用 | 7860 已有进程监听 | lsof -i:7860查找并终止 |
| GPU 内存不足 | 显存容量 < 8GB | 降低max_new_tokens或启用fp16 |
| 模型加载失败 | 缓存路径错误或权限不足 | 检查/root/.cache/huggingface是否存在且可读 |
| Docker 构建失败 | CUDA 版本不匹配 | 确认基础镜像与 PyTorch 版本兼容 |
6.2 性能优化建议
启用半精度推理:
model = AutoModelForCausalLM.from_pretrained(MODEL_PATH, torch_dtype=torch.float16, local_files_only=True).to(DEVICE)使用
accelerate库进行设备映射:from accelerate import infer_auto_device_map device_map = infer_auto_device_map(model, max_memory={0:"7GiB", "cpu":"16GiB"})限制并发请求数:Gradio 默认允许并发,可通过
queue()启用排队机制:demo.queue(max_size=5).launch(...)
7. 总结
7.1 实践经验总结
本文实现了DeepSeek-R1-Distill-Qwen-1.5B模型从本地部署到自动化 CI/CD 的全流程闭环,核心收获包括:
- 使用 Gradio 快速构建交互界面,显著缩短开发周期
- Docker 容器化保障了环境一致性,便于迁移与发布
- GitHub Actions 实现“提交即部署”,提升团队协作效率
- 自动化测试有效拦截低级错误,增强系统可靠性
7.2 最佳实践建议
- 模型缓存预加载:在生产环境中,建议预先下载模型至共享存储,避免重复拉取
- 日志集中管理:结合 ELK 或 Loki 实现日志聚合分析
- 健康检查接口:为服务添加
/healthz探针,支持 Kubernetes 等编排系统 - 资源监控:使用 Prometheus + Grafana 监控 GPU 利用率与响应延迟
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。