襄阳市网站建设_网站建设公司_服务器维护_seo优化
2026/1/22 7:36:26 网站建设 项目流程

DeepSeek-R1-Distill-Qwen-1.5B自动化部署:Shell脚本编写实例

1. 引言:让模型部署像启动音乐播放器一样简单

你有没有这样的经历?好不容易调好一个AI模型,结果每次重启服务器都要重新安装依赖、下载模型、配置路径,重复操作让人头大。今天我们要解决的就是这个问题——把 DeepSeek-R1-Distill-Qwen-1.5B 的部署变成一键启动

这个模型不一般:它是在 Qwen-1.5B 基础上,用 DeepSeek-R1 的强化学习蒸馏数据训练出来的推理专家,特别擅长数学题、写代码和逻辑推演。跑起来需要 GPU 支持(CUDA),但只要配置一次,就能永久复用。

本文会带你从零写一个完整的 Shell 脚本,实现:

  • 自动检查环境
  • 智能安装依赖
  • 后台启动服务
  • 日志追踪与安全关闭

学完你不仅能部署这个模型,还能套用到其他 AI 项目中。咱们的目标是:以后只需要敲一行命令./deploy.sh,整个服务就跑起来

2. 环境准备与依赖管理

2.1 系统要求与前置判断

在写脚本之前,先明确几个关键点:

  • Python 版本必须 ≥3.11
  • CUDA 需要 12.8(兼容性最好)
  • 核心库:torch,transformers,gradio

我们的 Shell 脚本第一步就是“自我诊断”——自动检测当前环境是否满足条件。

#!/bin/bash echo " 正在检查系统环境..." # 检查 Python 版本 PYTHON_VERSION=$(python3 --version 2>&1 | awk '{print $2}') if [[ "$PYTHON_VERSION" < "3.11" ]]; then echo "❌ 错误:Python 版本过低,当前为 $PYTHON_VERSION,需要 3.11 或更高" exit 1 else echo " Python 版本符合要求: $PYTHON_VERSION" fi # 检查 CUDA 是否可用 if ! command -v nvidia-smi &> /dev/null; then echo "❌ 未检测到 NVIDIA 显卡驱动" exit 1 else echo " NVIDIA 驱动已安装" fi # 检查 GPU 上是否有足够的显存(至少 6GB) GPU_MEM=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits -i 0) if [ "$GPU_MEM" -lt 6144 ]; then echo " 显存不足($GPU_MEM MB),建议使用更大显存的 GPU" read -p "是否继续在 CPU 模式下运行?(y/N): " choice if [[ ! "$choice" =~ ^[Yy]$ ]]; then exit 1 fi export DEVICE="cpu" else export DEVICE="cuda" echo " 检测到充足显存: ${GPU_MEM}MB,将使用 GPU 加速" fi

这段脚本做了三件事:

  1. 检查 Python 版本
  2. 确认有 NVIDIA 显卡支持
  3. 判断显存是否够用,不够则提示切换 CPU 模式

这样即使换一台机器,也能自动适应。

2.2 自动化依赖安装

接下来是安装 Python 包。我们不想每次都重装,所以加个判断:如果已经装了且版本正确,就跳过。

# 安装依赖函数 install_dependencies() { echo "📦 开始安装 Python 依赖..." # 创建虚拟环境避免污染全局 if [ ! -d "venv" ]; then python3 -m venv venv fi source venv/bin/activate # 检查是否已安装并版本达标 PIP_LIST=$(pip list) if echo "$PIP_LIST" | grep -q "torch" && pip show torch | grep -q "Version: 2.9.1"; then echo " torch 已安装" else pip install torch==2.9.1 --index-url https://download.pytorch.org/whl/cu121 fi if echo "$PIP_LIST" | grep -q "transformers" && pip show transformers | grep -q "Version: 4.57.3"; then echo " transformers 已安装" else pip install transformers==4.57.3 fi if echo "$PIP_LIST" | grep -q "gradio" && pip show gradio | grep -q "Version: 6.2.0"; then echo " gradio 已安装" else pip install gradio==6.2.0 fi echo " 所有依赖安装完成" }

这里用了虚拟环境venv来隔离包,防止和其他项目冲突。同时指定了 PyTorch 的 CUDA 12.1 版本源,确保 GPU 支持。

3. 模型加载与服务启动

3.1 模型路径智能识别

模型默认缓存在/root/.cache/huggingface/deepseek-ai/DeepSeek-R1-Distill-Qwen-1___5B,但不同用户可能路径不同。我们可以让脚本自动查找或引导下载。

# 设置模型路径 MODEL_DIR="/root/.cache/huggingface/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B" if [ ! -d "$MODEL_DIR" ]; then echo " 模型未找到,位于: $MODEL_DIR" read -p "是否从 Hugging Face 下载?(y/N): " download_choice if [[ "$download_choice" =~ ^[Yy]$ ]]; then huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --local-dir $MODEL_DIR else echo "请手动下载模型后重试" exit 1 fi else echo " 模型已就位: $MODEL_DIR" fi

这样既支持本地已有模型快速启动,也提供一键下载选项。

3.2 编写 Web 服务入口文件

我们需要一个app.py文件作为 Gradio 接口。下面是简化版示例:

# app.py import os from transformers import AutoTokenizer, AutoModelForCausalLM import gradio as gr import torch # 使用前面脚本设置的设备 device = os.getenv("DEVICE", "cuda") tokenizer = AutoTokenizer.from_pretrained("/root/.cache/huggingface/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B") model = AutoModelForCausalLM.from_pretrained( "/root/.cache/huggingface/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B", torch_dtype=torch.float16, device_map="auto" if device == "cuda" else None, local_files_only=True ).eval() def generate_text(prompt): inputs = tokenizer(prompt, return_tensors="pt").to(device) outputs = model.generate( **inputs, max_new_tokens=2048, temperature=0.6, top_p=0.95, do_sample=True ) response = tokenizer.decode(outputs[0], skip_special_tokens=True) return response.replace(prompt, "").strip() gr.Interface( fn=generate_text, inputs=gr.Textbox(label="输入你的问题"), outputs=gr.Markdown(label="回复"), title="🧠 DeepSeek-R1-Distill-Qwen-1.5B 助手", description="支持数学推理、代码生成与复杂逻辑分析" ).launch(server_port=7860, share=False)

这个脚本能根据环境变量自动选择 CPU/GPU,并限制最大 token 数为 2048,温度设为推荐值 0.6。

3.3 一键后台启动服务

现在把所有步骤整合进主脚本,实现“一键部署”。

# 主程序逻辑 main() { echo " 开始部署 DeepSeek-R1-Distill-Qwen-1.5B 服务..." # 激活环境 source venv/bin/activate # 检查端口是否被占用 if lsof -i:7860 > /dev/null; then echo "❌ 端口 7860 已被占用,请关闭其他服务" ps aux | grep 7860 exit 1 fi # 启动服务并输出日志 nohup python3 app.py > /tmp/deepseek_web.log 2>&1 & # 获取进程 ID 并保存 echo $! > /tmp/deepseek_pid.txt echo " 服务已启动!" echo " 访问地址: http://localhost:7860" echo "📄 日志路径: /tmp/deepseek_web.log" echo " 使用 'tail -f /tmp/deepseek_web.log' 查看实时日志" } # 调用主函数 main

这一步完成了真正的“自动化”:自动检查端口、后台运行、记录 PID 方便后续管理。

4. 服务管理与运维脚本增强

4.1 添加停止与重启功能

光能启动还不够,还得能优雅关闭。我们在脚本里加入子命令支持。

# 停止服务 stop_server() { if [ -f "/tmp/deepseek_pid.txt" ]; then PID=$(cat /tmp/deepseek_pid.txt) if ps -p $PID > /dev/null; then kill $PID rm /tmp/deepseek_pid.txt echo "🛑 服务已停止 (PID: $PID)" else echo " 进程不存在,清理残留 PID 文件" rm /tmp/deepseek_pid.txt fi else echo "ℹ 未发现运行中的服务" fi } # 重启服务 restart_server() { stop_server sleep 2 main }

然后通过参数调用:

case "$1" in start|"" ) main ;; stop ) stop_server ;; restart ) restart_server ;; logs ) tail -f /tmp/deepseek_web.log ;; * ) echo "用法: $0 [start|stop|restart|logs]" exit 1 ;; esac

现在你可以这样操作:

  • ./deploy.sh→ 启动
  • ./deploy.sh stop→ 停止
  • ./deploy.sh restart→ 重启
  • ./deploy.sh logs→ 实时看日志

4.2 故障自检与容错处理

再加一点“健壮性”:比如网络断了重试、磁盘满了预警。

# 检查磁盘空间 check_disk_space() { USAGE=$(df /root | tail -1 | awk '{print $5}' | sed 's/%//') if [ $USAGE -gt 90 ]; then echo "🚨 警告:根分区使用率已达 ${USAGE}%,可能影响模型加载" read -p "是否继续?(y/N): " confirm [[ ! "$confirm" =~ ^[Yy]$ ]] && exit 1 fi }

还可以加超时机制防止卡死:

# 设置最长执行时间(30分钟) export TIMEOUT=1800 { # 主流程放在这里 } & PID=$! ( sleep $TIMEOUT if kill -0 $PID 2>/dev/null; then echo "⏰ 超时 ($TIMEOUT 秒),强制终止" kill $PID fi ) &

5. Docker 化部署方案优化

虽然可以直接运行脚本,但在生产环境中更推荐容器化。我们改进之前的 Dockerfile,让它更高效。

5.1 多阶段构建减少体积

# Stage 1: 构建依赖 FROM nvidia/cuda:12.1.0-runtime-ubuntu22.04 AS builder RUN apt-get update && apt-get install -y \ python3.11 \ python3-pip \ && rm -rf /var/lib/apt/lists/* WORKDIR /build COPY requirements.txt . RUN pip3 download -r requirements.txt --dest ./wheels # Stage 2: 最终镜像 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 --from=builder /build/wheels ./wheels RUN pip3 install ./wheels/*.whl COPY app.py . # 挂载模型目录 VOLUME ["/root/.cache/huggingface"] EXPOSE 7860 CMD ["python3", "app.py"]

配合requirements.txt

torch==2.9.1+cu121 transformers==4.57.3 gradio==6.2.0

5.2 容器启动脚本封装

创建start_container.sh

#!/bin/bash docker build -t deepseek-r1-1.5b:latest . docker run -d --gpus all \ -p 7860:7860 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ -e DEVICE=cuda \ --name deepseek-web \ deepseek-r1-1.5b:latest echo "容器已启动,访问 http://localhost:7860"

这样就把整个部署流程彻底标准化了。

6. 总结:打造可复用的 AI 部署模板

我们一步步实现了 DeepSeek-R1-Distill-Qwen-1.5B 的全自动化部署方案:

  • 环境自检:自动判断 Python、GPU、显存
  • 依赖管理:虚拟环境 + 版本锁定
  • 模型处理:本地优先,缺失则提示下载
  • 服务控制:支持 start/stop/restart/logs
  • Docker 封装:便于跨平台迁移

这套脚本不仅可以用于这个模型,稍作修改就能适配其他基于 Transformers 的 LLM。关键是掌握了“把重复劳动交给机器”的思路。

未来你还可以继续扩展:

  • 加入 HTTPS 支持
  • 集成 Prometheus 监控
  • 添加 API 密钥认证
  • 实现多模型热切换

自动化不是一蹴而就的,但每写一个脚本,你就离“躺着跑 AI”更近一步。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询