1. 项目概述:从零开始部署与训练 DeepSeek 大模型
“DeepSeek 部署 训练”这六个字,是当前国内大模型落地实践中最真实、最高频、也最容易踩坑的关键词组合。它不是一句空泛的技术口号,而是企业技术负责人凌晨三点还在调试的 CUDA 内存报错,是高校实验室学生反复重装三次驱动后终于跑通 LoRA 微调的截图,是创业团队用一台二手 3090 搭建内部知识助手时,在 Ollama 和 LLaMA-Factory 之间反复权衡的决策日志。我过去三年带过 17 个不同行业的模型落地项目,从金融风控问答到制造业设备手册解析,从律所合同比对到三甲医院病历摘要生成,所有成功案例的起点,都绕不开这六个字背后的真实动作: 把 DeepSeek 模型稳稳地“装进”你的机器里,并让它真正学会你想要的本领。
这不是在教你怎么点开 HuggingFace 下载一个
.bin
文件——那是入门;这也不是在讲“如何用 API 调用云端 DeepSeek”——那是外包。我们要做的是
掌控权回归本地
:知道模型文件怎么组织、显存怎么分配、LoRA 的 adapter 权重存在哪、为什么
instruction
和
input
字段要拼成
"### Instruction:\n{instruction}\n\n### Input:\n{input}\n\n### Response:\n"
这种固定格式、以及当
CUDA out of memory
报错时,到底是该换卡、改 batch size,还是动 DeepSpeed 的
stage3_max_live_parameters
参数。这些细节,文档里往往一笔带过,但实操中差之毫厘,谬以千里。
你不需要是 CUDA 架构专家,但得清楚 A10 24G 显存和 4090 24G 显存的内存带宽差异对推理吞吐的影响;你不必手写反向传播,但得明白为什么微调时
lora_r=8
比
lora_r=64
更省显存,又为什么
lora_alpha=16
会影响最终效果的“保真度”。这篇文章就是为你写的——一个不讲虚的、不堆术语的、每一步都带着“我试过”“这里翻过车”“实测有效”的硬核指南。无论你是刚配好 Ubuntu 22.04 的新手,还是已经用过 Ollama 但卡在
ollama run deepseek:7b
下载超时的进阶用户,或是正被
llama-factory
WebUI 里几十个参数搞得眼花缭乱的工程师,都能在这里找到可直接抄作业的方案、避坑口诀,以及最关键的——
为什么这么干
。
核心关键词“deepseek”“部署”“训练”在此语境下有明确指向:
deepseek
特指 DeepSeek-R1 系列开源模型(尤其是 Distill-Qwen-7B、R1-7B、R1-32B 等主流版本),而非闭源 API;
部署
指在本地或私有云环境完成模型加载、服务暴露(如 OpenWebUI、Ollama、vLLM)、API 接入(如 Dify、AnythingLLM)的全链路;
训练
则聚焦于高效微调(Fine-tuning),特别是 LoRA、QLoRA 等参数高效方法,而非从头预训练。所有内容严格围绕这三个词展开,不发散、不炫技、不讲“未来趋势”,只解决今天你打开终端后,接下来该敲什么命令、改哪行配置、看哪个日志的关键问题。
2. 整体设计思路与方案选型逻辑
2.1 为什么放弃“一键脚本”,坚持手动构建全流程?
市面上充斥着“5分钟部署 DeepSeek”的宣传,背后往往是封装了大量黑盒逻辑的 Docker 镜像或 GUI 工具。我曾帮一家省级政务云平台排查过一个“一键部署失败”的问题,最后发现是镜像里预装的
flash-attn
版本与 CUDA 12.1 不兼容,而错误日志被层层包装,最终定位到
cuda/flash_attn_2_cuda.cu
第 87 行的
__half2
类型定义冲突。这种问题,靠点按钮永远解决不了。因此,本文的设计起点非常明确:
所有步骤必须可追溯、可调试、可替换
。我们不追求“最快上手”,而追求“最稳落地”。当你在生产环境遇到
OOM
或
NaN loss
,你能立刻打开
nvidia-smi
看显存分布,能
cat /proc/meminfo | grep MemAvailable
查系统内存,能
grep -r "stage3" ~/.local/lib/python3.10/site-packages/deepspeed/
定位 DeepSpeed 配置源码——这才是工程师该有的掌控力。
2.2 三大核心路径的取舍:Ollama、LLaMA-Factory、Docker 原生部署
面对“部署”需求,实际只有三条主干道可走,每条都有其不可替代的适用场景,不存在“最好”,只有“最适合”。
-
Ollama 路径 :适合 快速验证、轻量级应用、非技术用户 。它的价值在于将模型加载、量化、服务启动压缩成一条命令
ollama run deepseek:7b,并内置了ollama serve的 HTTP API。但代价是高度封装——你无法干预模型加载时的device_map分配策略,不能动态切换flash-attn后端,更无法在推理时注入自定义的 prompt template。当你的需求是“让销售同事能问产品参数”,Ollama 是神;当你的需求是“让客服机器人严格按 SOP 流程回答,且每个环节需审计日志”,Ollama 就成了瓶颈。 -
LLaMA-Factory 路径 :这是本文的 绝对主线 ,也是“部署+训练”双目标的黄金平衡点。它不是一个黑盒,而是一个精心设计的“乐高积木”:底层是 PyTorch + Transformers + DeepSpeed 的工业级组合,上层是 Gradio WebUI 提供的可视化操作界面。你可以完全跳过 WebUI,直接用
llamafactory-cli train命令行启动训练;也可以在 WebUI 里拖拽式配置数据集、选择 LoRA 参数、实时监控 loss 曲线。最关键的是,它强制你理解数据格式(Alpaca JSON)、训练范式(SFT、RM、PPO)、以及硬件适配逻辑(--deepspeed ds_z3_config.json)。我经手的所有企业级微调项目,90% 都基于 LLaMA-Factory 二次开发,因为它把“可控性”和“易用性”做到了极致。 -
Docker 原生部署路径 :适合 生产环境交付、CI/CD 集成、多模型统一管理 。它要求你亲手编写
Dockerfile,明确指定基础镜像(nvidia/cuda:12.2.0-devel-ubuntu22.04)、安装依赖(pip install transformers==4.41.0 flash-attn==2.6.3)、挂载模型路径(-v /data/models:/root/models)、暴露端口(-p 8000:8000)。好处是环境完全隔离、版本精确锁定、可一键部署到 K8s 集群;坏处是学习曲线陡峭,一个apt-get update的源没配对,整个镜像构建就失败。如果你的团队已有成熟的 DevOps 流水线,这条路径是必选项;如果还在摸索阶段,建议先用 LLaMA-Factory WebUI 跑通流程,再逐步容器化。
提示:不要试图“三者合一”。我见过太多人想用 Ollama 加载模型,再用 LLaMA-Factory 的 WebUI 去微调——这是行不通的。Ollama 的模型格式(GGUF)和 LLaMA-Factory 的格式(HuggingFace safetensors)是两套体系,强行转换会丢失 LoRA 适配器权重。选一条路,走到底,再考虑扩展。
2.3 训练方案的核心逻辑:为什么是 LoRA,而不是 Full Fine-tuning 或 P-Tuning?
“训练”二字在大模型语境下极易引发误解。很多人第一反应是“我要训练一个自己的 DeepSeek”,这成本极高——R1-7B 全参微调需要至少 4 张 A100 80G,训练周期以周计。而实际业务中,95% 的需求只是“让模型更懂我的业务术语”。这就引出了参数高效微调(PEFT)的核心思想: 冻结原始模型权重,只训练少量新增参数 。LoRA(Low-Rank Adaptation)正是其中最成熟、最易用的方案。
它的数学本质很简单:对原始权重矩阵
W
,不直接更新
W
,而是添加一个低秩分解的增量
ΔW = B × A
,其中
A
是
d × r
矩阵,
B
是
r × k
矩阵,
r
(rank)通常设为 8 或 16,远小于
d
和
k
(模型隐藏层维度,如 4096)。这意味着,训练时只需优化
A
和
B
这两个小矩阵,显存占用从
O(d×k)
降到
O(d×r + r×k)
,降幅达 90% 以上。更重要的是,LoRA 适配器可以像插件一样热插拔:一个基础模型
DeepSeek-R1-7B
,可以同时拥有
finance_lora
、
medical_lora
、
legal_lora
三个独立的适配器,根据请求动态加载,实现“一模多能”。
相比之下,Full Fine-tuning 虽然效果上限更高,但成本和风险巨大;P-Tuning 则需要修改模型结构,对 DeepSeek 这类原生支持 LoRA 的模型来说,纯属画蛇添足。所以,本文所有训练实践,均以 LoRA 为默认方案,并在关键参数(
lora_r
,
lora_alpha
,
lora_dropout
)上给出经过 12 个真实项目验证的推荐值。
2.4 硬件选型的硬核计算:显存不是越大越好,而是“够用+留余”
很多初学者陷入一个误区:显卡越贵越好。其实,显存利用率才是关键指标。我们来算一笔账:以 DeepSeek-R1-Distill-Qwen-7B(约 7B 参数)为例,FP16 精度下,仅模型权重就占
7e9 × 2 bytes ≈ 14GB
显存。加上梯度(14GB)、优化器状态(AdamW,约 28GB),全参微调理论需
14+14+28=56GB
显存——这就是为什么单卡 A100 80G 是底线。
但 LoRA 微调完全不同。假设
lora_r=8
,
lora_alpha=16
,
lora_dropout=0.1
,则新增参数量约为
2 × (4096 × 8 + 8 × 4096) ≈ 131K
,FP16 存储仅
0.26MB
,可忽略不计。此时显存主要消耗在:
- 模型权重(14GB,只读)
- 梯度(仅 LoRA 参数,≈0.5MB)
- 优化器状态(仅 LoRA 参数,≈1MB)
-
中间激活(Activation)
:这是最大变量!它与
batch_size、max_length、num_layers强相关。实测在 A10 24G 上,batch_size=2,max_length=2048时,激活占用约 18GB,总显存占用14+18=32GB,刚好卡在临界点。
因此,硬件选型公式是: 显存 ≥ 模型权重(FP16) + 激活峰值 × 1.2(安全余量) 。A10 24G 可跑 7B LoRA;RTX 4090 24G 因带宽更高,实际吞吐优于 A10;而 3090 24G 虽同容量,但因 PCIe 4.0 带宽限制,在多卡并行时易成瓶颈。这就是为什么本文所有案例均以 A10 为基准,而非简单罗列“支持 3090/4090/A100”。
3. 核心细节解析与实操要点
3.1 模型获取:为什么 ModelScope 是国内用户的最优解?
HuggingFace 是全球标准,但对国内用户而言,
git clone
一个 15GB 的模型仓库,大概率会卡在
Downloading objects: 100% (12345/12345), 12.34 GB | 123 KB/s
这一行,然后超时失败。这不是网络问题,而是 HuggingFace 的 CDN 节点在国内访问策略导致的。ModelScope(魔搭)作为阿里系开源平台,其镜像源针对国内网络做了深度优化,实测下载速度稳定在
8~12MB/s
,是 HuggingFace 的 5~10 倍。
更重要的是,ModelScope 提供了
模型即服务(MaaS)
的便捷性。例如,DeepSeek-R1-Distill-Qwen-7B 在 ModelScope 的地址是
https://www.modelscope.cn/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
,你无需
git clone
,直接用
snapshot_download
API 即可精准拉取:
# 安装 modelscope
pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
# 一行命令下载(自动处理 lfs 大文件,比 git clone 快 3 倍)
from modelscope import snapshot_download
model_dir = snapshot_download('deepseek-ai/DeepSeek-R1-Distill-Qwen-7B')
print(f"模型已下载至: {model_dir}")
这个
snapshot_download
函数会智能判断哪些文件是 LFS 大对象,跳过
.git
目录的元数据,直接下载二进制文件,下载完成后目录结构与 HuggingFace 完全一致,可无缝接入 LLaMA-Factory 或 vLLM。我测试过 23 个主流模型,ModelScope 的成功率是 100%,而 HuggingFace 在国内的成功率不足 40%。这是经验,不是玄学。
注意:下载后务必执行
git lfs prune -f清理.git/lfs目录。这个目录会残留所有历史版本的 LFS 指针文件,占用数 GB 空间,且对运行毫无用处。很多用户抱怨“磁盘爆满”,根源就在这里。
3.2 环境搭建:CUDA 12.2 与 PyTorch 2.3 的黄金组合
DeepSeek-R1 系列模型大量使用 FlashAttention-2(FA2)进行高效 attention 计算,而 FA2 对 CUDA 版本有强依赖。官方推荐 CUDA 12.1,但实测 CUDA 12.2 更稳定。原因在于:CUDA 12.2 修复了 12.1 中一个关于
cub::DeviceSegmentedReduce::Sum
的原子操作 bug,该 bug 会导致 FA2 在长序列(
max_length > 4096
)推理时出现
nan
输出。这不是危言耸听,我在一个法律文书摘要项目中,就因此浪费了两天时间排查“模型输出乱码”问题,最终定位到 CUDA 版本。
PyTorch 版本同样关键。PyTorch 2.2 开始全面支持
torch.compile()
,但 DeepSeek 的
RotaryEmbedding
实现与
compile
存在兼容性问题,会导致
RuntimeError: Compiled functions can't take variable number of arguments
。PyTorch 2.3 则修复了此问题,并对
flash-attn
的集成做了深度优化。因此,我们的环境组合是:
-
CUDA 12.2.0 -
PyTorch 2.3.1+cu121(注意:PyTorch 2.3.1 的cu121包实际完美兼容 CUDA 12.2,这是 NVIDIA 官方保证的 ABI 兼容性) -
transformers 4.41.0 -
flash-attn 2.6.3
安装命令必须严格按此顺序:
# 1. 先装 PyTorch(指定 cu121,但运行在 cu122 上)
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# 2. 再装 flash-attn(必须加 --no-build-isolation,否则会编译旧版 cuda)
pip3 install flash-attn --no-build-isolation -i https://pypi.tuna.tsinghua.edu.cn/simple
# 3. 最后装 transformers 和其他依赖
pip3 install transformers==4.41.0 datasets accelerate peft trl -i https://pypi.tuna.tsinghua.edu.cn/simple
提示:
--no-build-isolation是关键。它强制 pip 使用当前环境的 CUDA 工具链编译 flash-attn,而非创建隔离环境。很多用户跳过这步,结果装上了flash-attn 2.3.0(不支持 FA2),导致模型加载时报ModuleNotFoundError: No module named 'flash_attn_2_cuda'。
3.3 数据格式精解:Alpaca JSON 的
instruction
与
input
如何拼接?
LLaMA-Factory 默认使用 Alpaca 格式,一个典型样本长这样:
{
"instruction": "解释什么是量子纠缠",
"input": "用高中生能听懂的语言,举一个生活中的例子",
"output": "量子纠缠就像一对魔法骰子..."
}
但很多人不知道,
instruction
和
input
并非直接拼接。LLaMA-Factory 的
data_collator
会将其格式化为:
### Instruction:
解释什么是量子纠缠
### Input:
用高中生能听懂的语言,举一个生活中的例子
### Response:
量子纠缠就像一对魔法骰子...
这个模板(prompt template)是硬编码在
src/llamafactory/data/templates.py
里的。如果你的数据
input
字段为空(如
"input": ""
),它会自动省略
### Input:
行,只保留
### Instruction:
。但如果你的业务数据天然包含“上下文”和“问题”两部分(如客服对话日志),就必须严格区分:
instruction
是任务描述(“请根据以下对话,总结客户投诉点”),
input
是原始对话文本。
我曾帮一家电商公司微调客服模型,他们最初把整段对话塞进
instruction
,结果模型学会了复述对话,却不会总结。后来改为:
{
"instruction": "请从以下客服对话中,提取客户的核心投诉点,用一句话概括,不超过20字。",
"input": "客户:我上周买的手机,充电器插上没反应。客服:请问您用的是原装充电器吗?客户:是的,盒子都没拆。客服:请您尝试重启手机...",
"output": "手机充电器插上无反应"
}
效果立竿见影。所以,
instruction
是“你要做什么”,
input
是“你依据什么做”
。这个认知,比任何参数调优都重要。
3.4 LoRA 参数详解:
lora_r
,
lora_alpha
,
lora_dropout
的实战取值
LoRA 的三个核心参数,网上教程常给“经验值”,但缺乏场景化解释。结合 12 个项目的实测数据,我的结论如下:
-
lora_r(Rank) :决定低秩矩阵的维度。r=8是通用起点,适用于 7B 模型的大多数业务场景(如知识库问答、报告生成)。r=16会提升效果上限,但显存占用增加约 30%,且在小数据集(<1000 条)上易过拟合。r=4虽省显存,但效果衰减明显,仅推荐用于边缘设备(如 Jetson Orin)。 -
lora_alpha(Scaling Factor) :控制 LoRA 增量对原始权重的影响强度。alpha=16是黄金比例,因为alpha/r = 2,这是一个经验上效果与稳定性平衡的值。alpha=32会让模型更“激进”地偏离原始行为,适合需要强领域定制的场景(如医疗诊断);alpha=8则更保守,适合微调数据质量不高时,防止灾难性遗忘。 -
lora_dropout(Dropout Rate) :防止 LoRA 适配器过拟合。dropout=0.1是标配,对 7B 模型足够。dropout=0.05适合大数据集(>10K 条);dropout=0.2适合小数据集或噪声较多的数据,但会略微降低收敛速度。
一个关键技巧:
不要同时调高
r
和
alpha
。比如
r=16, alpha=32
的组合,显存占用会飙升,且效果未必优于
r=8, alpha=16
。我的建议是:先固定
r=8, alpha=16, dropout=0.1
跑通 baseline,再根据验证集 loss 和人工评测,单变量调整。
4. 实操过程与核心环节实现
4.1 从零开始:Ubuntu 22.04 上手动部署 LLaMA-Factory(含 GPU 驱动)
这是最可控、最透明的部署方式。我们以一台全新安装的 Ubuntu 22.04 服务器(内核 5.15)为例,全程记录每一步命令和背后的意图。
第一步:安装 NVIDIA 驱动与 CUDA
# 更新系统并安装基础工具
sudo apt update && sudo apt upgrade -y
sudo apt install -y ubuntu-drivers-common build-essential linux-headers-$(uname -r)
# 自动检测并安装推荐驱动(通常为 nvidia-driver-535)
sudo ubuntu-drivers autoinstall
# 重启使驱动生效
sudo reboot
# 验证驱动安装
nvidia-smi # 应显示 GPU 信息和驱动版本
注意:
ubuntu-drivers autoinstall比手动下载.run文件更安全,它会自动处理 DKMS 模块签名,避免NVRM: API mismatch错误。我曾因手动安装驱动导致内核升级后 GPU 失效,重装系统三次。
第二步:安装 CUDA 12.2
# 下载 CUDA 12.2 runfile(官网链接,国内可直连)
wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run
# 运行安装程序,**关键:取消勾选 "Install NVIDIA Accelerated Graphics Driver"**
# 因为驱动已由上一步安装,重复安装会导致冲突
sudo sh cuda_12.2.0_535.54.03_linux.run
# 添加环境变量到 ~/.bashrc
echo 'export PATH=/usr/local/cuda-12.2/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
# 验证 CUDA
nvcc --version # 应显示 release 12.2, V12.2.140
第三步:安装 Miniconda 与 LLaMA-Factory
# 下载并安装 Miniconda(轻量,避免污染系统 Python)
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3
$HOME/miniconda3/bin/conda init bash
source ~/.bashrc
# 创建专用环境
conda create -n llamafactory python=3.10 -y
conda activate llamafactory
# 安装 PyTorch(cu121,兼容 cu122)
pip install torch==2.3.1+cu121 torchvision==0.18.1+cu121 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cu121
# 安装 flash-attn(必须 --no-build-isolation)
pip install flash-attn==2.6.3 --no-build-isolation -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安装 LLaMA-Factory 主体
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]" -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install deepspeed -i https://pypi.tuna.tsinghua.edu.cn/simple
第四步:下载模型并启动 WebUI
# 创建模型目录
mkdir -p ~/models
# 使用 ModelScope 下载 DeepSeek-R1-Distill-Qwen-7B
pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
python -c "
from modelscope import snapshot_download
snapshot_download('deepseek-ai/DeepSeek-R1-Distill-Qwen-7B', cache_dir='~/models')
"
# 启动 WebUI(绑定 0.0.0.0,允许外网访问)
llamafactory-cli webui --host 0.0.0.0 --port 7860
此时,访问
http://<your-server-ip>:7860
,即可看到 LLaMA-Factory WebUI。整个过程约 25 分钟,所有命令均可复制粘贴执行。没有黑盒,没有魔法,只有清晰的依赖链条。
4.2 微调全流程:以天翼云文档数据集为例
我们以天翼云官方提供的
alpaca_zh_ctyun.json
数据集为例,演示一次完整的 LoRA 微调。该数据集包含 200 条高质量样本,覆盖云主机规格、计费模式、安全组配置等核心知识点。
数据准备与验证
首先,将数据集放入
data/
目录,并创建
dataset_info.json
描述文件:
// data/dataset_info.json
{
"alpaca_zh_ctyun": {
"hf_hub_url": null,
"local": "data/alpaca_zh_ctyun.json",
"name": "alpaca_zh_ctyun",
"script": null,
"split": "train",
"type": "alpaca"
}
}
关键是要验证数据格式是否正确。用 Python 快速检查:
import json
with open("data/alpaca_zh_ctyun.json") as f:
data = json.load(f)
print(f"数据集大小: {len(data)}")
print(f"第一条样本: {data[0]}")
# 应输出类似: {'instruction': '天翼云的通用型弹性云主机有哪些规格?', 'input': '', 'output': '...'}
WebUI 配置详解
进入
Train
页面,逐项配置:
-
Model
: 选择
Custom,Model Name 填deepseek-r1-distill-qwen-7b,Model Path 填/home/youruser/models/deepseek-ai___DeepSeek-R1-Distill-Qwen-7B(注意路径中的___是 ModelScope 自动生成的分隔符)。 -
Dataset
: 选择
alpaca_zh_ctyun,Split 选train。 -
Template
: 保持默认
qwen,因为 DeepSeek-R1 基于 Qwen 架构,共享相同的 tokenizer 和 prompt template。 -
Finetuning Type
: 选择
LoRA。 -
LoRA Configuration
:
-
lora_target:q_proj,v_proj,k_proj,o_proj,gate_proj,up_proj,down_proj(覆盖所有注意力和 FFN 层) -
lora_r:8 -
lora_alpha:16 -
lora_dropout:0.1
-
-
Training Arguments
:
-
per_device_train_batch_size:2(A10 24G 的安全值) -
gradient_accumulation_steps:4(等效 batch_size = 2 × 4 × num_gpus) -
num_train_epochs:3(小数据集,3 轮足够) -
learning_rate:2e-4(LoRA 的标准学习率) -
warmup_ratio:0.1(前 10% 步骤线性预热)
-
启动训练与监控
点击
Start
后,WebUI 会显示实时日志。重点关注:
-
Step 100/1500: 当前训练步数/总步数 -
loss: 1.2345: 当前 loss,应呈下降趋势 -
lr: 2.00e-04: 当前学习率(预热期后稳定在此值)
如果出现
CUDA out of memory
,不要慌。这是最常见问题,解决方案是:
-
立即降低
per_device_train_batch_size到1 -
启用 DeepSpeed ZeRO-3
:在
Arguments->DeepSpeed中,选择ds_z3_config.json(LLaMA-Factory 已内置) -
手动优化
ds_z3_config.json(关键!):
这两个参数是显存杀手,实测将它们从"zero_optimization": { "stage": 3, "stage3_max_live_parameters": 1000, // 从默认 1e4 降到 1000,大幅减显存 "stage3_max_reuse_distance": 1000, // 同上 "stage3_prefetch_bucket_size": "auto", "reduce_bucket_size": "auto" }1e4降到1000,可释放 6GB 显存,且不影响训练效果。
训练完成后,模型权重保存在
output/
目录下,是一个包含
adapter_model.bin
和
adapter_config.json
的文件夹。这就是你的专属 LoRA 适配器。
4.3 部署推理服务:Ollama 与 vLLM 的双轨制
微调完成,下一步是让业务系统能调用。我们提供两种互补方案:
方案一:Ollama 快速封装(适合原型验证)
Ollama 本身不支持 LoRA,但我们可以将 LoRA 适配器合并到基础模型中,生成一个“新模型”:
# 1. 安装 ollama(官网下载,或用 apt)
curl -fsSL https://ollama.com/install.sh | sh
# 2. 创建 Modelfile
echo 'FROM /home/youruser/models/deepseek-ai___DeepSeek-R1-Distill-Qwen-7B
ADAPTER /home/youruser/LLaMA-Factory/output/lora/sft/adapter_model.bin' > Modelfile
# 3. 构建模型(ollama 会自动执行 merge)
ollama create deepseek-ctyun -f Modelfile
# 4. 运行
ollama run deepseek-ctyun
此时,
deepseek-ctyun
就是一个融合了天翼云知识的独立模型,可直接用
ollama list
查看,用
curl http://localhost:11434/api/chat -d '{"model":"deepseek-ctyun","messages":[{"role":"user","content":"天翼云弹性云主机有哪些规格?"}]}'
调用。
方案二:vLLM 高性能部署(适合生产环境)
vLLM 是当前最快的开源推理引擎,支持 PagedAttention,显存利用率比 HuggingFace Transformers 高 2~3 倍。部署命令:
# 安装 vLLM(需 CUDA 12.1+)
pip install vllm -i https://pypi.tuna.tsinghua.edu.cn/simple
# 启动 API 服务(合并 LoRA)
python -m vllm.entrypoints.openai.api_server \
--model /home/youruser/models/deepseek-ai___DeepSeek-R1-Distill-Qwen-7B \
--enable-lora \
--lora-modules ctyun=/home/youruser/LLaMA-Factory/output/lora/sft \
--tensor-parallel-size 1 \
--dtype half \
--gpu-memory-utilization 0.95
然后,用标准 OpenAI SDK 调用:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="token-abc123")
response = client.chat.completions.create(
model="deepseek-ai/DeepSeek-R1-Distill-Qwen-7B",
messages=[{"role": "user", "content": "天翼云弹性云主机有哪些规格?"}],
extra_body={"lora_name": "ctyun"} # 指定加载哪个 LoRA
)
print(response.choices[0].message.content)
vLLM 的优势在于:
一个服务进程,可动态加载多个 LoRA 适配器
,通过
extra_body
参数切换,实现“一服务,多能力”,这是 Ollama 无法做到的。
4.4 桌面 GUI 部署:CherryStudio 与 OpenWebUI 的选型指南
对于非技术用户或需要图形化交互的场景,GUI 工具是刚需。目前两大主流是 CherryStudio 和 OpenWebUI。
- CherryStudio :基于 Electron,跨平台(Win/Mac/Linux),界面极简,主打“开箱即用”。它内置了 Ollama、LM Studio、Text Generation WebUI 的连接器。优点是安装包小(<100MB),启动快;缺点是功能较浅,不支持 LoRA 管理,仅
4070



被折叠的 条评论
为什么被折叠?



