本地大模型部署与微调新手指南

本地大模型部署与微调新手指南

① 本地运行环境准备与工具安装

硬件怎么选

先搞清楚你的机器能跑什么模型。绝大多数近三年的消费级显卡,都能跑 7B~14B 级别的模型,关键在于选对量化版本。

速查表(Q4 量化下):

模型规模 显存需求 推荐显卡
7B ~4GB GTX 1660 / RTX 3050
14B ~8GB RTX 4060 / RTX 3070
27B 15-16GB RTX 4080 / RTX 3090

参数规模 × 量化位数 ÷ 8 字节 × 1.2(覆盖 KV Cache 和框架开销)≈ 显存需求。没独显也没关系------纯 CPU 也能跑,只是速度慢一些。

系统方面,Windows 10/11、macOS、Linux 都行。内存建议 16GB 起步,能流畅跑;8GB 勉强能聊天,但速度偏慢。

核心工具装什么

本地部署大模型,最常用的两套工具:

  • Ollama:轻量级,一条命令搞定下载+运行,适合个人开发者快速上手
  • vLLM:高性能推理引擎,吞吐量大,适合生产环境

建议新手从 Ollama 开始,等熟悉了再上 vLLM。

Ollama 安装(Windows):

去官网下载安装包,别直接双击安装 ------打开下载文件夹,地址栏输入 cmd 回车,执行:

bash 复制代码
OllamaSetup.exe /DIR=D:\Ollama

这样把程序装到 D 盘,不占 C 盘空间。

装完后,把模型存储路径也改到 D 盘(模型动辄 5GB+):

  1. Win+R 输入 sysdm.cpl → 高级 → 环境变量
  2. 系统变量 → 新建:变量名 OLLAMA_MODELS,变量值 D:\ollama_models
  3. 重启电脑,或终端执行:
bash 复制代码
net stop ollama
net start ollama

验证安装:ollama --version,看到版本号就说明装好了。

Linux/macOS 用户用脚本安装:

bash 复制代码
curl -fsSL https://ollama.com/install.sh | sh

macOS 还可以用 Homebrew。

② Ollama 快速部署与模型调用

拉取模型

以 Llama 3.1 8B 为例(目前性价比很高的模型):

bash 复制代码
ollama pull llama3.1:8b

国内网络慢的话可以多试几次,或者换镜像源。下载完成后验证:

bash 复制代码
ollama list

能看到 llama3.1:8b 就代表成功了。

其他常用模型:

bash 复制代码
ollama pull qwen3.5:7b      # 通义千问
ollama pull deepseek-r1:7b  # DeepSeek
ollama pull phi-3:mini      # 微软小模型,资源要求低

跑起来

bash 复制代码
ollama run llama3.1:8b

输入问题就能对话,输入 /bye 退出。

API 调用

Ollama 默认在 http://localhost:11434 提供 API,兼容 OpenAI 格式:

python 复制代码
import requests

response = requests.post(
    "http://localhost:11434/api/generate",
    json={"model": "llama3.1:8b", "prompt": "你好,请介绍一下自己", "stream": False}
)
print(response.json()["response"])

多模型管理

bash 复制代码
ollama list              # 查看已下载的模型
ollama rm <模型名>        # 删除不需要的模型
ollama show <模型名>      # 查看模型详情

③ vLLM 高性能服务搭建步骤

Ollama 适合个人用,但如果要建服务、处理高并发,得上 vLLM。

安装

用 pip 直接装:

bash 复制代码
pip install vllm

指定版本:

bash 复制代码
pip install vllm==0.6.0

需要 CUDA 11.8 或 12.1 环境。验证 CUDA 是否可用:

python 复制代码
python -c "import torch; print(torch.cuda.is_available())"

返回 True 就 OK。

启动服务

bash 复制代码
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-3.1-8B \
    --port 8000 \
    --max-model-len 4096

服务启动后,在 http://localhost:8000/v1 提供 OpenAI 兼容接口。

调用 vLLM 服务

python 复制代码
from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="empty"  # vLLM 默认不校验 key
)

response = client.chat.completions.create(
    model="meta-llama/Llama-3.1-8B",
    messages=[{"role": "user", "content": "你好"}]
)
print(response.choices[0].message.content)

Ollama vs vLLM 怎么选

维度 Ollama vLLM
上手难度 极低,一条命令 中等,需配置
吞吐量 中(约 850 tokens/s) 高(约 1200 tokens/s)
显存效率 一般 高(PagedAttention 可降 30% 内存)
适用场景 个人开发、实验 生产服务、高并发

新手先用 Ollama 跑通流程,需要上生产再切 vLLM。

④ 基础推理测试与结果验证

部署完后,先做几个基础测试,确认模型工作正常。

测试 1:基础问答

bash 复制代码
ollama run llama3.1:8b
>>> 1+1等于几?
2
>>> 用一句话介绍什么是机器学习
机器学习是让计算机从数据中学习规律而不需要显式编程的技术。

回答合理、没有乱码,说明模型基本正常。

测试 2:中文能力

Ollama 默认模型大多支持中文。输入中文问题,看输出是否通顺、有没有中英文混杂。

测试 3:响应速度

bash 复制代码
time ollama run llama3.1:8b "写一首五言绝句"

首 token 延迟通常在 100-300ms 之间。如果明显更慢,检查一下 GPU 是否在工作:

bash 复制代码
nvidia-smi

看 GPU 利用率是不是上去了。如果利用率接近 0%,说明在跑 CPU,需要检查 CUDA 环境。

测试 4:连续对话

多轮对话看模型是否"失忆":

复制代码
>>> 我叫小明
好的,小明,有什么我可以帮你的?
>>> 我叫什么名字?
你叫小明。

能记住上文信息,说明上下文窗口工作正常。

⑤ 轻量级微调数据准备方法

微调的第一步是准备数据,数据质量直接决定微调效果。

数据格式

最通用的是 JSONL 格式(每行一个 JSON 对象):

json 复制代码
{"instruction": "公司的主打产品是什么?", "output": "我们主要生产智能家居设备,包括智能音箱、智能门锁和扫地机器人。"}
{"instruction": "如何申请售后服务?", "output": "1. 登录官网 → 2. 提交工单 → 3. 客服会在24小时内联系您。"}
{"instruction": "你们的退货政策是什么?", "output": "签收后7天内无理由退货,需保持商品完好。"}

一行一个问答对,用记事本就能编辑。

如果是多轮对话场景,可以用这种格式:

json 复制代码
{"conversations": [{"from": "user", "value": "你好"}, {"from": "assistant", "value": "你好!有什么可以帮助你的?"}, {"from": "user", "value": "推荐一本书"}, {"from": "assistant", "value": "我推荐《三体》"}]}

数据量

新手入门不用太多,几百条高质量数据就能看到效果。建议从 200-500 条开始试。

数据清洗

几个关键步骤:

  1. 去重:删掉重复的问答对
  2. 清理特殊字符:去掉乱码、多余空格
  3. 长度控制:每条 instruction 控制在 50-200 字,output 控制在 100-500 字
  4. 检查格式:确保 JSON 格式正确(逗号、引号不能错)

可以用 Python 快速检查:

python 复制代码
import json

with open("data.jsonl", "r", encoding="utf-8") as f:
    for i, line in enumerate(f):
        try:
            data = json.loads(line)
            assert "instruction" in data and "output" in data
        except Exception as e:
            print(f"第 {i+1} 行有问题: {e}")

数据来源

  • 客服对话记录
  • 产品文档、FAQ
  • 自己手写问答对
  • 用大模型生成种子数据后人工校对

⑥ 使用 LLaMA-Factory 进行微调实操

LLaMA-Factory 是目前对新手最友好的微调工具,封装了 LoRA、QLoRA 等多种高效微调方法。

环境安装

bash 复制代码
# 创建虚拟环境
conda create -n llama_factory python=3.10
conda activate llama_factory

# 安装 PyTorch(根据 CUDA 版本选择)
pip install torch==2.0.1 --index-url https://download.pytorch.org/whl/cu118

# 安装 LLaMA-Factory
pip install llama-factory

# 或从源码安装(最新功能)
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e .

验证环境:

python 复制代码
python -c "import torch; print(torch.cuda.is_available())"  # 应返回 True

准备配置文件

在 LLaMA-Factory 目录下新建 train_config.yaml

yaml 复制代码
model_name_or_path: meta-llama/Llama-3.1-8B  # 或者本地模型路径
dataset: data.jsonl                          # 你的数据文件
template: llama3                             # 模型模板
finetuning_type: lora                        # 微调方式
lora_rank: 16                                # LoRA 秩
lora_target: all                             # 目标模块

output_dir: ./output                         # 输出目录
per_device_train_batch_size: 2               # 批次大小(显存小就设 1)
gradient_accumulation_steps: 4               # 梯度累积
learning_rate: 3e-5                          # 学习率
num_train_epochs: 3                          # 训练轮数
max_length: 2048                             # 最大序列长度
logging_steps: 10                            # 日志间隔
save_steps: 100                              # 保存间隔

启动训练

命令行方式:

bash 复制代码
llama_factory_train \
    --model_name_or_path meta-llama/Llama-3.1-8B \
    --dataset data.jsonl \
    --output_dir ./output \
    --num_train_epochs 3 \
    --per_device_train_batch_size 2 \
    --learning_rate 3e-5

或者用 Web UI(推荐新手):

bash 复制代码
CUDA_VISIBLE_DEVICES=0 python src/train_web.py

浏览器打开 http://localhost:7860,填参数点按钮就行。

训练监控

训练时注意看几个东西:

  1. Loss 曲线:应该逐步下降。从 2.x 降到 1.x 甚至更低。
  2. 显存占用nvidia-smi 看,保持在 80% 以下比较稳。
  3. 训练速度:7B 模型用 LoRA,几百条数据通常 30-60 分钟能跑完。

合并与导出

训练完会生成 LoRA 适配器(adapter_model.bin),需要和基座模型合并才能用:

bash 复制代码
python src/export_model.py \
    --model_name_or_path meta-llama/Llama-3.1-8B \
    --adapter_name_or_path ./output \
    --export_dir ./merged_model \
    --export_size 4 \
    --export_legacy_format False

⑦ 微调后模型效果评估流程

评估 1:定性对比

准备一组测试问题,分别问基座模型和微调后的模型,对比回答质量。

测试问题示例:

  • 领域内专业问题(5-10 个)
  • 通用问题(看模型能力有没有"遗忘")
  • 边界问题(看会不会乱答)

人工打分:1-5 分,看微调后平均分有没有提升。

评估 2:Loss 曲线

训练日志里的 Loss 曲线:

  • 稳定下降 → 正常
  • 突然飙升 → 学习率太大或数据有问题
  • 不降反升 → 过拟合了,减少训练轮数

评估 3:BLEU / ROUGE(可选)

如果有标准答案,可以算 BLEU 和 ROUGE 分数:

python 复制代码
from datasets import load_metric

bleu = load_metric("bleu")
rouge = load_metric("rouge")

# 对比模型输出和标准答案

评估 4:实际场景测试

把模型接进真实业务流程跑几天,看:

  • 回答准确率(人工抽检)
  • 用户满意度
  • 有没有出现"幻觉"(编造事实)

⑧ 显存不足常见报错解决方案

报错:"CUDA out of memory"

最常见的问题。几个解决方案按优先级排列:

方案 1:换量化版本

同一个模型,Q4_K_M 版本只占约 4GB,Q8 要占约 8GB。用 Ollama 拉取时自动是量化版,如果用 Hugging Face 原版需要自己量化。

方案 2:减小 batch size

训练时把 per_device_train_batch_size 从 4 降到 2 甚至 1。

方案 3:启用梯度检查点

yaml 复制代码
gradient_checkpointing: true

用时间换显存。

方案 4:使用 QLoRA

QLoRA 比 LoRA 更省显存,在 LLaMA-Factory 里设置 quantization_bit: 4

方案 5:减小上下文长度

yaml 复制代码
max_length: 1024  # 从 2048 降到 1024

上下文大小直接影响 KV Cache 占用。

方案 6:纯 CPU 推理

没显卡也能跑,只是慢:

bash 复制代码
ollama run llama3.1:8b --no-gpu

报错:"Model not found"

模型名写错了,或者没下载。先 ollama list 确认已下载的模型列表。

报错:"Connection refused"

Ollama 服务没启动:

bash 复制代码
ollama serve

保持这个窗口开着,别关。

⑨ 模型加载失败与依赖冲突排查

问题 1:CUDA 版本不兼容

典型表现:libcudart.so 加载失败。

解决

  1. nvidia-smi 查看当前驱动支持的 CUDA 版本
  2. 安装对应版本的 PyTorch:
bash 复制代码
# CUDA 11.8
pip install torch==2.0.1 --index-url https://download.pytorch.org/whl/cu118
# CUDA 12.1
pip install torch==2.1.0 --index-url https://download.pytorch.org/whl/cu121

问题 2:模型下载卡在 99%

网络问题:

bash 复制代码
Ctrl+C 取消下载
ollama pull <模型名>  # 重新拉取,会断点续传

问题 3:Ollama 覆盖安装后崩溃

旧版本残留文件冲突。删干净重装:

bash 复制代码
# Windows: 删除 C:\Users\<用户名>\.ollama 目录
# 然后重装 Ollama

问题 4:vLLM 模型导入失败

通常是依赖缺失或版本不匹配:

bash 复制代码
pip install --upgrade vllm transformers

通用排查技巧

  1. 看日志:错误信息里通常有线索
  2. 用虚拟环境:conda 或 venv 隔离不同项目依赖
  3. 容器化:用 Docker 部署,环境一致性最好

⑩ 提升推理速度与节省资源技巧

技巧 1:选对量化版本

量化是把双刃剑------省显存但可能损失一点精度。

量化级别 显存占用 质量 推荐场景
Q2_K 最低 较差 极限省显存
Q4_K_M 适中 较好 通用首选
Q5_K_M 较高 对质量要求高
Q8 最好 有显存富余

Ollama 拉取的模型默认就是量化版,直接用就行。

技巧 2:控制上下文长度

上下文越长,KV Cache 占用越大。

bash 复制代码
ollama run llama3.1:8b --num-ctx 2048  # 默认 4096,改成 2048 省显存

技巧 3:GPU 利用率调优

vLLM 可以调 gpu_memory_utilization 参数:

bash 复制代码
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-3.1-8B \
    --gpu-memory-utilization 0.9  # 默认 0.9,可调高到 0.95

技巧 4:使用 vLLM 的 PagedAttention

vLLM 的分页注意力机制可将 70B 模型的 KV Cache 占用降低 35%。如果跑大模型,优先用 vLLM。

技巧 5:CUDA 图优化

vLLM 支持 CUDA 图,在固定输入模式下可提升 15% 吞吐量:

bash 复制代码
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-3.1-8B \
    --enforce-eager  # 禁用 CUDA 图(调试用)

技巧 6:系统级优化

  • 关闭非必要后台程序(浏览器、IDE 等)
  • 电源管理设为"高性能"模式
  • 虚拟内存手动设 8-16GB
  • 有线网络比 Wi-Fi 稳定

技巧 7:量化微调(QLoRA)

微调时用 QLoRA 代替 LoRA,显存占用可降到传统全量微调的 1/8 甚至 1/16。LLaMA-Factory 里设置 quantization_bit: 4 即可。

WEB项目地址:演示地址

安卓APP下载地址:演示地址

总结:新手路线图

  1. 先跑通:Ollama 装好,拉一个 7B 模型,能对话
  2. 再调优:调整量化版本、上下文长度,让模型在你的机器上跑得最顺
  3. 后微调:准备 200-500 条数据,用 LLaMA-Factory 跑一遍 LoRA
  4. 最后上线:评估效果,切到 vLLM 提供 API 服务

每一步都有明确的产出,卡住了就回头看对应的章节。本地部署大模型没有想象中那么难------选对工具、用对方法,普通开发者的电脑完全够用。