1 复读幻觉成因与治理路线
层级 | 关键点 | 常见症状 |
---|
解码层 | 采样温度太低、repeat_penalty 为 1 | “打人、打人、打人” 连环输出 |
数据层 | 训练集本身出现多次同句 | 暴力 / 色情词条反复 |
RL 策略层 | 奖励模型只关心“相关”忽略“冗余” | 越回答越长、越跑越偏 |
上下文层 | KV‑cache 误对齐或窗口截断 | 末尾整段复制粘贴 |
治理路线:
采样参数止血 ─► 数据去重 ─► RLHF/DPO 反复读奖励 ─►
长上下文微调(位置 & Flash‑Attention) ─► 监控报警
2 采样参数全景图 & 代码示例
目标 | 参数 | 默认 | 建议区间 |
---|
抑制复读 | repeat_penalty | 1.0 | 1.1 – 1.5 |
| repeat_last_n | 64 | 64 – 256 |
控制创造性 | temperature | 0.8 | 0.4 – 0.9 |
多样性 | top_p | 0.9 | 0.7 – 0.95 |
| top_k | 40 | 30 – 100 |
软停符 | stop | – | "\n\n" , "</end>" |
长度惩罚 | length_penalty | 1.0 | 0.8 – 1.2 |
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3-8B-Instruct")
model = AutoModelForCausalLM.from_pretrained("meta-llama/…", device_map="auto")out = model.generate(**tok("解释量子纠缠:", return_tensors="pt").to(model.device),temperature=0.7,top_p=0.9,repetition_penalty=1.2,repeat_last_n=128,no_repeat_ngram_size=3,max_new_tokens=256,
)
print(tok.decode(out[0], skip_special_tokens=True))
3 Ollama 调参 4 大入口
场景 | 操作 | 适用版本 |
---|
交互会话 | /set parameter repeat_penalty 1.2 | ≥ v0.4.6 |
CLI | ollama run llama3 --temperature 0.7 … | ≥ v0.5.0 citeturn0search1 |
REST API | "options": { "temperature": 0.7, "repeat_penalty": 1.2 } | 全版本 |
Modelfile | PARAMETER repeat_penalty 1.2 + ollama create | 永久固化 |
技巧:在 systemctl edit ollama
里写 Environment="OLLAMA_…"
,一次性给所有模型注入默认值,升级也不会丢。
4 性能提速全链路
4.1 硬件层
- GPU > CPU:
ollama ps
中 Processor=GPU
说明整模进显存;否则是 CPU/GPU 混合。 - 多 GPU 切片:单卡放不下时自动分层;显存够时集中单卡反而更快。
4.2 模型层
手段 | 提速 | 质量 |
---|
‑q4_0 / ‑q5_1 量化 | × 1.8 – 2.2 | ‑2 ∼ ‑3 BLEU |
KV Cache q8_0 | 显存 ‑50 % | 无感 |
LoRA 增量 | 参数量 ‑90 % | 取决于 LoRA |
4.3 运行时层
# /etc/systemd/system/ollama.service.d/override.conf
[Service]
Environment="OLLAMA_FLASH_ATTENTION=1"
Environment="OLLAMA_KV_CACHE_TYPE=q8_0"
Environment="OLLAMA_NUM_PARALLEL=4"
Environment="OLLAMA_KEEP_ALIVE=-1"
- Flash Attention≈ +20 – 40 %
num_thread
控制单请求 CPU 线程:最佳≈物理核数
4.4 并发层
变量 | 说明 | 典型值 |
---|
OLLAMA_NUM_PARALLEL | 同模型并行请求 | 4 – 8 |
num_thread | 每流 CPU 线程 | 核心数 |
OLLAMA_KEEP_ALIVE | ‑1 = 模型常驻显存 | 生产建议开启 |
5 线上运维
5.1 Ubuntu (systemd)
sudo systemctl daemon-reload
sudo systemctl restart ollama
journalctl -u ollama -f
5.2 Docker NVIDIA GPU
docker run --gpus all -e OLLAMA_FLASH_ATTENTION=1 \-e OLLAMA_NUM_PARALLEL=4 -e OLLAMA_KEEP_ALIVE=-1 \-p 11434:11434 ollama/ollama
5.3 Windows 服务化
- 安装 nssm / winsw 把
ollama serve
注册为服务 - 环境变量写在服务的 Environment 字段,可与 Modelfile 叠加
6 端到端示例 & Benchmark
步骤 | 工具 | 关键代码 |
---|
① 语料清洗 | Python + regex | 过滤连续重复 > 2 次 token;Moses 去重 |
② LoRA 微调 | PEFT / LoRA | merge_weights=False 节省显存 |
③ 反复读 DPO | trl‑x | reward = ‑λ · 重复率 |
④ Ollama 部署 | Modelfile | 量化 + 参数固化 |
⑤ 负载测试 | wrk + WebSocket | 每秒 > 1000 token |
效果(Llama‑3‑8B‑Instruct,4090 × 1,128 token prompt):
- 原始 FP16 → 13 tok/s
‑q5_1
+ Flash Attention → 26 tok/s- 再调
num_thread 24
+ OLLAMA_NUM_PARALLEL 4
→ 39 tok/s
7 常见坑 FAQ
问题 | 排查 & 解决 |
---|
只用半数 CPU | 默认一核一线程,改 num_thread 或 Modelfile |
OLLAMA_NUM_PARALLEL 不生效 | 需在 服务器启动前 设置;Python 里 os.environ 改完要重新 serve |
GPU 占用低于 40 % | 并发流不够 / CPU 瓶颈;调高 num_thread 和 NUM_PARALLEL |
Flash Attention 报 LoRA 不兼容 | 关闭 FA 或先 merge LoRA 权重再量化 |
模型升级后参数丢失 | 用 systemctl edit 生成 override.conf;升级不覆写 |
交互 /set 参数退出后失效 | /set 只对当前进程;持久化请改 Modelfile |
8 结语
- 复读治理:采样止血 → 数据去重 → RLHF 负奖励
- 性能提速:GPU + Flash Attention + 低比特量化 = 黄金三件套
- 并发稳态:
num_thread × OLLAMA_NUM_PARALLEL
≈ 吞吐上限 - 运维:全部配置写进 systemd override;
daemon‑reload + restart
万事大吉
按本文 Checklist 逐层落地,你的 Ollama 实例将 不复复读、跑得飞快、线上稳如老狗。Have fun hacking!