从零玩转国产大模型!DeepSeek/Qwen3/ChatGLM部署、微调、私有化实战一条龙

最近在尝试将大模型能力集成到内部业务系统时,发现从环境搭建到模型微调,每一步都充满了“惊喜”。网上的教程要么过于零散,只讲部署不讲优化;要么过于学术,对工程落地帮助有限。本文将整合一套从零开始的完整闭环方案,手把手带你搞定 DeepSeek、Qwen3、ChatGLM 这三款主流国产大模型的本地部署、高效微调以及私有化服务搭建。无论你是想快速体验大模型能力的学生,还是需要在企业内网安全落地的开发者,都能从本文中找到可直接复用的代码、配置和避坑指南。

1. 背景与核心概念:为什么选择国产大模型?

在 ChatGPT 引领的浪潮下,国内也涌现出一批优秀的大语言模型。对于开发者而言,选择国产模型进行私有化部署和微调,主要基于以下几点考虑:

  • 数据安全与合规性 :许多企业业务涉及敏感数据,无法将数据上传至海外云端服务。本地化部署能确保数据不出域,完全符合国内的数据安全法规要求。
  • 定制化需求 :通用大模型在特定垂直领域(如法律、医疗、金融)的表现往往不尽如人意。通过微调,我们可以让模型更好地理解专业术语、遵循行业规范,输出更符合业务场景的内容。
  • 成本可控 :虽然一次性硬件投入可能较高,但私有化部署避免了按 token 计费的持续支出,长期来看对于高频调用场景更具成本效益。
  • 网络稳定性 :服务部署在内网或国内服务器,避免了因国际网络波动导致的 API 调用延迟或失败,服务更稳定。

本文聚焦的三款模型各有特色:

  • DeepSeek :由深度求索公司开发,以强大的代码能力和推理性能著称,对开发者友好,社区活跃。
  • Qwen3 :阿里通义千问的最新系列,在中文理解、多模态和长上下文方面表现突出,工具调用能力强大。
  • ChatGLM :智谱 AI 开源的双语对话模型,以其优秀的对话流畅度和较低的部署资源要求,成为许多入门项目的首选。

接下来,我们将从环境准备开始,一步步实现这三款模型的实战应用。

2. 环境准备与版本说明

工欲善其事,必先利其器。一个稳定、兼容的环境是后续所有操作的基础。本节将详细说明硬件、软件及关键依赖的配置。

2.1 硬件与操作系统要求

大模型对算力有较高要求,尤其是微调阶段。

  • GPU(强烈推荐) :用于模型推理和微调。显存是关键指标。
    • 体验/轻量推理 :至少需要 8GB 显存(如 RTX 3070/4060 Ti),可运行 7B 参数模型的量化版。
    • 全量微调/多模型部署 :建议 24GB 及以上显存(如 RTX 3090/4090, A10, A100)。
  • CPU(仅推理) :若无 GPU,可使用 CPU 进行纯推理,但速度会慢数十倍。需要足够的内存(RAM),通常需要模型大小的 1.5-2 倍。
  • 内存(RAM) :建议 32GB 或以上,用于加载模型和处理数据。
  • 磁盘空间 :预留 50GB 以上空间,用于存放模型文件(单个 7B 模型约 15GB)、数据集和虚拟环境。
  • 操作系统 :本文以 Ubuntu 22.04 LTS 为主要环境进行演示,大部分命令在 Linux/macOS 上通用。Windows 用户建议使用 WSL2(Windows Subsystem for Linux 2)以获得接近原生 Linux 的体验。
2.2 基础软件安装

首先更新系统并安装必要的编译工具和 Python 环境。

# 更新系统包列表
sudo apt update && sudo apt upgrade -y

# 安装基础编译工具、GPU驱动依赖等
sudo apt install -y build-essential git curl wget software-properties-common

# 安装 Python 3.10(Ubuntu 22.04 默认是 3.10,确保版本)
sudo apt install -y python3.10 python3.10-venv python3.10-dev python3-pip
2.3 CUDA 与 cuDNN 安装(GPU用户必看)

如果你的机器有 NVIDIA GPU,必须正确安装 CUDA 工具包和 cuDNN 库,这是 PyTorch 等框架调用 GPU 的基础。

  1. 检查 GPU 和驱动

    nvidia-smi
    

    确保命令能正确输出 GPU 信息。如果未安装驱动,可参考 NVIDIA 官网或使用 ubuntu-drivers 工具安装。

  2. 安装 CUDA Toolkit :访问 NVIDIA CUDA Toolkit 下载页面 ,选择与你的驱动兼容的版本(如 12.1)。使用 runfile 或 deb 包安装。

    # 例如,安装 CUDA 12.1 的示例命令(具体请以官网为准)
    wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run
    sudo sh cuda_12.1.0_530.30.02_linux.run
    

    安装后,将 CUDA 路径加入环境变量:

    echo 'export PATH=/usr/local/cuda-12.1/bin:$PATH' >> ~/.bashrc
    echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
    source ~/.bashrc
    
  3. 安装 cuDNN :在 NVIDIA cuDNN 页面 下载与 CUDA 版本对应的 cuDNN 库(需要注册账号),按照指南安装。

2.4 创建 Python 虚拟环境

为每个项目创建独立的虚拟环境是 Python 开发的最佳实践,可以避免依赖冲突。

# 创建一个名为 `llm_env` 的虚拟环境
python3.10 -m venv llm_env

# 激活虚拟环境
source llm_env/bin/activate

# 激活后,命令行提示符前会出现 (llm_env)
# 升级 pip 和 setuptools
pip install --upgrade pip setuptools wheel

至此,基础环境已准备就绪。后续所有 Python 包的安装都应在激活的 llm_env 虚拟环境中进行。

3. 核心工具与框架选型

在开始部署具体模型前,我们需要了解几个核心工具,它们能极大简化我们的工作。

  • Ollama :一个强大的本地大模型运行和管理的命令行工具。它简化了模型的下载、加载和运行,特别适合快速体验和轻量级服务。支持众多开源模型,包括本文提到的 Qwen 和 Llama 系列。
  • LM Studio :一个图形化界面的本地大模型运行工具,对新手极其友好。无需命令行,通过点击即可下载、加载模型并进行对话。适合 Windows/macOS 用户快速上手。
  • Llama-Factory :一个功能强大且易用的开源大模型微调框架。它统一了多种微调方法(如 LoRA, QLoRA, 全参数微调),并提供了 Web UI,让微调像填写表单一样简单,极大降低了微调门槛。
  • vLLM :一个专注于 高速推理 的库。它采用了 PagedAttention 等优化技术,能够极大地提升大模型的文本生成速度,特别适合用于部署高并发的 API 服务。
  • Dify :一个开源的 LLM 应用开发平台。它允许你通过可视化工作流的方式,快速构建基于大模型的 AI 应用(如智能客服、知识库问答),而无需编写大量后端代码。

了解这些工具后,我们就可以根据目标(快速体验、微调还是部署服务)选择合适的工具链。

4. 实战一:使用 Ollama 快速本地运行 Qwen3

Ollama 是体验开源大模型最快捷的方式之一。它自动处理模型下载和运行环境。

4.1 安装 Ollama

在 Linux/macOS 上,使用一键安装脚本:

curl -fsSL https://ollama.com/install.sh | sh

安装完成后,Ollama 服务会自动启动。

4.2 拉取并运行 Qwen3 模型

Ollama 官方提供了许多模型,可以直接拉取。以 Qwen2.5 的 7B 参数版本为例:

# 拉取模型(首次运行会自动下载)
ollama run qwen2.5:7b

运行后,会进入一个交互式对话界面,你可以直接输入问题。例如输入“用 Python 写一个快速排序函数”,模型会立即生成代码。

4.3 以 API 服务器模式运行

为了后续集成,我们更常将 Ollama 作为后台服务运行。

# 启动 Ollama 服务(如果尚未启动)
ollama serve &
# 在另一个终端,以服务器模式运行特定模型
ollama run qwen2.5:7b
# 或者,直接调用已拉取的模型生成内容
curl http://localhost:11434/api/generate -d '{
  "model": "qwen2.5:7b",
  "prompt": "你好,请介绍一下你自己。",
  "stream": false
}'

Ollama 默认在 11434 端口提供兼容 OpenAI 格式的 API,这使得我们可以用类似调用 ChatGPT API 的方式调用本地模型。

5. 实战二:使用 Llama-Factory 微调 ChatGLM3

微调是大模型适应特定任务的关键。我们以 ChatGLM3-6B 模型为例,使用 Llama-Factory 对其进行 LoRA 微调,使其擅长写“科技新闻稿”。

5.1 环境与项目准备

首先,确保在之前创建的虚拟环境中,安装 Llama-Factory 及其依赖。

# 激活虚拟环境
source llm_env/bin/activate

# 克隆 Llama-Factory 仓库
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory

# 安装依赖(推荐使用豆瓣源加速)
pip install -r requirements.txt -i https://pypi.douban.com/simple
5.2 准备微调数据集

微调需要特定格式的数据。Llama-Factory 支持多种格式,这里我们使用简单的 json 格式,包含指令和输出。

  1. 创建数据集文件 data/tech_news_train.json

    [
      {
        "instruction": "写一篇关于人工智能芯片突破的新闻稿。",
        "output": "近日,某科技公司发布了新一代人工智能训练芯片‘玄武’,其算力较上一代提升300%,能效比显著优化。该芯片采用5纳米工艺,集成超过1000亿晶体管,专为大模型训练设计,预计将加速AGI(通用人工智能)的研发进程。行业专家认为,此举将打破算力瓶颈,推动AI应用遍地开花。"
      },
      {
        "instruction": "撰写一则关于量子计算云平台发布的短讯。",
        "output": "全球领先的量子计算公司‘量子前沿’今日正式对外开放其量子云服务平台。该平台允许研究人员通过互联网远程访问其127量子比特处理器,进行复杂的化学模拟和优化算法实验。此举降低了量子计算的研究门槛,被誉为‘量子计算的AWS时刻’。"
      },
      {
        “instruction”: “报道一下新能源汽车电池技术的新进展。”,
        “output”: “在最新电池技术论坛上,‘绿色动力’实验室宣布成功研发固态电池原型,能量密度达到每公斤500瓦时,是当前主流锂电池的两倍以上。该电池在零下30度至80度的极端环境下仍能稳定工作,充电速度提升至15分钟充满80%。分析指出,这项技术有望彻底解决电动汽车的里程焦虑和充电慢难题。”
      }
    ]
    

    你可以根据需要准备几十到几百条这样的数据。

  2. 创建数据集配置文件 data/dataset_info.json ,告诉框架如何读取数据:

    {
      "tech_news": {
        "file_name": "tech_news_train.json",
        "file_sha1": "" // 可留空,或通过 `sha1sum` 命令计算后填入
      }
    }
    
5.3 配置与启动微调

Llama-Factory 提供了便捷的 Web UI 和命令行两种方式。这里使用其提供的训练脚本。

  1. 下载基础模型 :从 Hugging Face 或 ModelScope 下载 ChatGLM3-6B 模型到本地目录,例如 ./model/chatglm3-6b

    # 使用 git lfs 克隆(需先安装 git-lfs)
    git lfs install
    git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git ./model/chatglm3-6b
    
  2. 准备训练脚本 :创建一个训练配置脚本 train_glm3_lora.sh

    #!/bin/bash
    export CUDA_VISIBLE_DEVICES=0 # 指定使用第一块GPU
    
    python src/train_bash.py \
        --stage sft \ # 监督微调阶段
        --do_train \
        --model_name_or_path ./model/chatglm3-6b \ # 基础模型路径
        --dataset tech_news \ # 对应 dataset_info.json 中的 key
        --template chatglm3 \ # 使用 chatglm3 的对话模板
        --finetuning_type lora \ # 使用 LoRA 微调
        --lora_target query_key_value \ # 对 GLM 的 Attention 层进行 LoRA
        --output_dir ./saves/chatglm3-6b-lora-tech-news \ # 输出目录
        --overwrite_cache \
        --per_device_train_batch_size 4 \ # 根据显存调整
        --gradient_accumulation_steps 4 \
        --lr_scheduler_type cosine \
        --logging_steps 10 \
        --save_steps 1000 \
        --learning_rate 5e-5 \
        --num_train_epochs 3.0 \
        --plot_loss \
        --fp16 # 使用混合精度训练节省显存
    
  3. 开始微调

    chmod +x train_glm3_lora.sh
    ./train_glm3_lora.sh
    

    训练开始后,终端会显示损失(loss)下降曲线。训练完成后,LoRA 权重文件会保存在 ./saves/chatglm3-6b-lora-tech-news 目录下。

5.4 加载与测试微调后的模型

训练完成后,可以使用以下脚本加载基础模型和 LoRA 权重进行推理测试。

# test_lora_model.py
from transformers import AutoTokenizer, AutoModel
from peft import PeftModel
import torch

# 1. 加载原始模型和分词器
model_name = “./model/chatglm3-6b”
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
base_model = AutoModel.from_pretrained(model_name,
                                       trust_remote_code=True,
                                       torch_dtype=torch.float16,
                                       device_map=“auto”) # 自动分配 GPU/CPU

# 2. 加载 LoRA 适配器权重
lora_path = “./saves/chatglm3-6b-lora-tech-news”
model = PeftModel.from_pretrained(base_model, lora_path)

# 3. 将模型设置为评估模式
model.eval()

# 4. 进行推理
prompt = “写一篇关于太空探索机器人最新发现的新闻稿。”
inputs = tokenizer(prompt, return_tensors=“pt”).to(model.device)

with torch.no_grad():
    outputs = model.generate(**inputs, max_length=500, temperature=0.9)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)

print(“提问:”, prompt)
print(“\n模型生成:\n”, response)

运行此脚本,你将看到模型生成的新闻稿已经带有你训练数据中的风格和领域特征。

6. 实战三:使用 vLLM 高性能部署 DeepSeek 模型

当我们需要将模型部署为可供多个用户或系统同时调用的 API 服务时,推理速度至关重要。vLLM 正是为此而生。

6.1 安装 vLLM

在虚拟环境中安装 vLLM,它会自动安装兼容的 PyTorch 版本。

pip install vllm
# 如果需要使用 OpenAI 兼容的 API 服务器,额外安装
pip install ‘vllm[openai]’
6.2 下载 DeepSeek 模型

从 Hugging Face 下载 DeepSeek 模型,例如 deepseek-ai/DeepSeek-V2-Lite-Chat

# 使用 huggingface-cli(需先登录:huggingface-cli login)
huggingface-cli download deepseek-ai/DeepSeek-V2-Lite-Chat --local-dir ./model/deepseek-v2-lite-chat

或者直接使用 git lfs clone

6.3 启动 vLLM OpenAI API 服务器

vLLM 提供了与 OpenAI API 完全兼容的接口,这意味着之前为 ChatGPT 编写的代码几乎可以无缝迁移。

# 启动 API 服务器,指定模型路径和端口
python -m vllm.entrypoints.openai.api_server \
    --model ./model/deepseek-v2-lite-chat \
    --served-model-name deepseek-v2-lite-chat \
    --api-key “your-api-key-here” \ # 设置一个 API 密钥
    --port 8000 \
    --tensor-parallel-size 1 # 如果有多张 GPU,可以设置为 GPU 数量以并行计算

服务器启动后,会在 http://localhost:8000 提供 v1/chat/completions 等端点。

6.4 调用部署的 API

现在,你可以像调用 OpenAI 一样调用你的本地模型服务。

# call_vllm_api.py
from openai import OpenAI

# 注意:base_url 指向本地 vLLM 服务器
client = OpenAI(
    api_key=“your-api-key-here”,
    base_url=“http://localhost:8000/v1” # vLLM OpenAI API 的地址
)

completion = client.chat.completions.create(
    model=“deepseek-v2-lite-chat”, # 与 --served-model-name 一致
    messages=[
        {“role”: “system”, “content”: “你是一个乐于助人的AI助手。”},
        {“role”: “user”, “content”: “用三句话解释什么是量子计算。”}
    ],
    temperature=0.7,
    max_tokens=500
)

print(completion.choices[0].message.content)

vLLM 的高效引擎能显著降低每个请求的响应时间,尤其在高并发场景下优势明显。

7. 常见问题与排查思路 (FAQ)

在部署和微调过程中,你可能会遇到以下常见问题。

问题现象 可能原因 排查思路与解决方案
Ollama 运行时提示 CUDA error GPU not found 1. Ollama 未检测到 GPU。
2. Docker 容器内无 GPU 访问权限。
1. 运行 ollama ps 查看运行环境。在 Linux 宿主机上运行通常没问题。
2. 若在 Docker 中,确保使用 --gpus all 参数运行容器。
微调时 OutOfMemoryError (CUDA) 显存不足。批处理大小(batch size)太大或模型太大。 1. 减小 per_device_train_batch_size
2. 增大 gradient_accumulation_steps 以补偿。
3. 使用 fp16 bf16 混合精度训练。
4. 使用 --quantization_bit 4 (QLoRA)进行 4 比特量化微调,极大减少显存占用。
Llama-Factory 训练时损失(loss)为 NaN 学习率(learning rate)过高,导致梯度爆炸。 大幅降低学习率,例如从 5e-5 降至 1e-5 5e-6 。同时可以尝试启用梯度裁剪 --max_grad_norm 1.0
vLLM 启动失败,提示 不支持的模型架构 vLLM 尚未官方支持该模型架构。 1. 查看 vLLM 官方文档的 Model Support 页面。
2. DeepSeek、Qwen、ChatGLM 的最新版本通常都能得到快速支持,请确保 vLLM 版本最新 pip install -U vllm
3. 可尝试使用 --dtype float16 --dtype bfloat16 指定精度。
加载微调后的模型生成效果毫无变化 1. LoRA 权重未正确加载或合并。
2. 微调数据量太少或质量不高。
3. 在推理时未激活 LoRA 模块。
1. 确保推理代码中通过 PeftModel 正确加载了 LoRA 路径。
2. 检查训练日志,确认 loss 确实下降了。
3. 尝试增加训练数据至数百条,并确保指令和输出质量。
API 调用返回 401 Unauthorized 未提供或提供了错误的 API Key。 1. 检查调用代码中的 api_key 是否与启动 vLLM 服务器时设置的 --api-key 一致。
2. 如果仅用于本地测试,可以在启动 vLLM 时使用 --disable-log-requests 并省略 --api-key 参数(不推荐生产环境)。

8. 最佳实践与工程建议

将大模型真正用于生产环境,除了能跑起来,还需要考虑更多工程化因素。

  1. 模型选择与量化

    • 平衡速度与效果 :参数越大的模型通常效果越好,但推理和微调成本也越高。7B-14B 参数模型是性价比很高的起点。
    • 积极使用量化 :使用 GPTQ、AWQ、GGUF 等量化技术,可以将模型显存占用降低 2-4 倍,而精度损失很小。例如,使用 TheBloke 在 Hugging Face 上传的 Qwen2.5-7B-Instruct-GGUF 模型,配合 llama.cpp 或 Ollama,可以在 8GB 显存的消费级显卡上流畅运行。
  2. 微调数据与策略

    • 质量优于数量 :精心设计 100-500 条高质量、多样化的指令数据,远胜于数万条爬取的粗糙数据。数据应覆盖你希望模型掌握的所有任务类型。
    • 从 LoRA/QLoRA 开始 :全参数微调成本极高。优先尝试 LoRA(低秩适配)或 QLoRA(量化低秩适配),它们只需训练极少的参数(通常 <1%),就能达到接近全参数微调的效果,且保存的权重文件很小(几 MB 到几百 MB)。
    • 验证集与早停 :一定要从训练数据中留出一部分(如 10%)作为验证集,监控验证集上的损失。当验证集损失不再下降时,启用早停(early stopping)防止过拟合。
  3. 部署与服务化

    • 使用专用推理服务器 :生产环境不要直接用 transformers pipeline 或脚本。应使用 vLLM TGI (Text Generation Inference) 这类高性能推理服务器,它们具备连续批处理、动态批处理、流量控制等特性,能极大提升吞吐量和资源利用率。
    • API 网关与鉴权 :在 vLLM API 前放置一层 API 网关(如 Nginx, Kong),实现负载均衡、限流、熔断和更完善的鉴权(如 JWT),提升服务稳定性和安全性。
    • 监控与日志 :集成 Prometheus 和 Grafana 监控 GPU 使用率、显存占用、请求延迟、QPS 等关键指标。记录详细的请求和响应日志(注意脱敏),便于问题排查和效果分析。
  4. 版本管理与回滚

    • 对基础模型、微调后的适配器权重、推理服务代码进行版本控制(如 Git)。
    • 制定清晰的回滚策略。当新微调的模型上线后效果不佳时,能快速切换回上一个稳定版本。
  5. 成本控制

    • 无请求时休眠 :对于内部使用频率不高的服务,可以编写脚本,在长时间无请求时自动休眠模型释放 GPU 显存,有请求时再唤醒(虽然有一定冷启动延迟)。
    • 考虑 CPU 推理 :对于对延迟不敏感的后台任务,可以考虑使用 llama.cpp ollama 在 CPU 上运行量化模型,充分利用空闲的 CPU 和内存资源。

通过以上步骤,你不仅能让大模型在本地跑起来,更能以工程化的思维,将其稳健、高效、安全地融入到实际业务流中。从快速体验的 Ollama,到灵活微调的 Llama-Factory,再到高性能服务的 vLLM,这套组合拳基本覆盖了个人学习与企业级应用的主要场景。

更多推荐