ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Ollama创建微调模型:用LLaMA-Factory与Modelfile打通本地部署链路

Ollama创建微调模型:用LLaMA-Factory与Modelfile打通本地部署链路 1. 微调完却跑不起来卡在 GGUF 与 Modelfile 的那段路如果你已经用 LLaMA-Factory 跑完了 SFToutput_dir里躺着 LoRA adapter 或者合并后的全量权重但一打开 Ollama 就不知道下一步该干嘛——这篇就是写给你的。核心链路其实就四步微调产出 → 合并/导出 → 转 GGUF → 写 Modelfile 并ollama create。听起来简单但真正动手时convert.py和convert-hf-to-gguf.py到底用哪个、FROM后面该写.bin还是.gguf、TEMPLATE 抄谁的、跑起来报signal: aborted怎么退版本每一步都能卡半天。我自己第一次把 Qwen 系列微调模型塞进 Ollama 时光在格式转换上就来回折腾了一晚上。这篇按可复现的顺序把命令、参数、Modelfile 骨架和排障都列清楚你照着敲就能把微调模型在本地ollama run起来。适合人群已经跑通 LLaMA-Factory 训练、手里有 LoRA 或全量权重、想用 Ollama 做本地推理的开发者。推理侧如果还要接统一 Key/API 通道我也会在最后给出用 TaoToken 管理调用配置的做法保证同一套微调模型在本地和远端都能复现。2. 前置准备LLaMA-Factory 产出与 Ollama 环境2.1 确认微调产出形态LLaMA-Factory 训练完通常有两种产物处理方式不同LoRA 微调output_dir里是adapter_model.safetensorsadapter_config.json需要先和基座合并成完整权重。全量微调output_dir里直接是config.json、model.safetensors可能分片、tokenizer.json等可直接进入转换。LoRA 合并用 LLaMA-Factory 自带的 export 即可关键是--finetuning_type lora和--export_dir指向一个新目录合并后你会得到一个和全量微调结构一致的 HF 格式目录。这一步别偷懒直接在 adapter 上转 GGUFllama.cpp 的转换脚本认的是完整权重。2.2 拉取 Ollama 仓库与 llama.cpp 子模块Ollama 的转换工具链其实来自它内置的 llama.cpp 子模块所以要先把它拉全git clone gitgithub.com:ollama/ollama.git ollama cd ollama git submodule init git submodule update llm/llama.cpp然后建虚拟环境装依赖避免污染系统 Pythonpython3 -m venv llm/llama.cpp/.venv source llm/llama.cpp/.venv/bin/activate pip install -r llm/llama.cpp/requirements.txt如果你后面要做量化顺手把 quantize 工具编译出来make -C llm/llama.cpp quantize注意convert-hf-to-gguf.py对transformers、sentencepiece版本比较敏感requirements 里锁的版本尽量别乱升否则会出现 tokenizer 解析失败。2.3 用 TaoToken 统一推理侧 Key/API 通道本地 Ollama 跑通后很多场景还要把同一套微调模型接到远端或统一网关做对比、做 Agent 调用。这时候如果每个环境都散着配 Key复现性会很差。我的做法是用 TaoToken 把推理侧的 Key 和 API 通道统一管理起来本地 Ollama 走http://localhost:11434远端或需要统一计费/路由的调用走 TaoToken 的 API 入口两边用同一套模型命名和参数切换只改 base_url。TaoToken 的 API 入口是https://taotoken.net/apiKey 在控制台生成接入文档里有 OpenAI 兼容格式的说明。这样你在本地验证完微调模型后把base_url一换就能复用到远端链路不用重写调用代码。具体入口我放在文末 CTA 里按你的场景选。3. 可复制配置从 HF 权重到 GGUF 再到 Modelfile3.1 选择转换脚本并执行llm/llama.cpp下有两个脚本convert.py和convert-hf-to-gguf.py。官方没有明确说哪个模型用哪个实测下来Llama3 8B、Qwen 7B 这类较新的 HF 格式模型都要用convert-hf-to-gguf.pyconvert.py更适合老式 LLaMA 结构。一个不行就换另一个这是最省事的判断方式。以convert-hf-to-gguf.py为例假设合并后的权重在/root/save/qwen/full/sft_qwen8python llm/llama.cpp/convert-hf-to-gguf.py \ /root/save/qwen/full/sft_qwen8 \ --outtype f16 \ --outfile /root/models/qwen8-f16.gguf--outtype可选f16、f32、q8_0等先出 f16 再量化是更稳的流程。转换成功会打印出 tensor 数量和输出路径看到Model successfully exported就对了。3.2 可选量化把体积压下来f16 的 7B 模型大概 14GB 左右本地跑如果显存吃紧就量化。用刚才编译的 quantizellm/llama.cpp/quantize \ /root/models/qwen8-f16.gguf \ /root/models/qwen8-q4_0.gguf \ q4_0q4_0是官方推荐的 4bit 量化精度损失可接受体积能压到 4GB 上下。如果你对精度敏感可以跳过这步直接用 f16 的 gguf。量化选项还有q4_k_m、q5_k_m等按需选。3.3 写 Modelfile抄官方再改 FROMModelfile 是 Ollama 的模型蓝图指定权重、参数、提示模板。官方最简模板就两行FROM /root/models/qwen8-q4_0.gguf TEMPLATE [INST] {{ .Prompt }} [/INST]但这个通用模板对微调模型往往不对因为微调时用的 chat template 和它不一致会导致输出格式乱。更靠谱的做法是找同系列官方模型把它的 Modelfile 导出来改。以 llama3 为例ollama show llama3:latest --modelfile finetunedllama3.modelfile打开这个文件你会看到完整的TEMPLATE、PARAMETER、SYSTEM等。重点改两处FROM换成你自己的 gguf 路径TEMPLATE如果微调时用了自定义 template比如 LLaMA-Factory 里注册的qwen或llama3要和训练时保持一致否则问答格式会错位。一个改好的骨架大概长这样FROM /root/models/qwen8-q4_0.gguf TEMPLATE {{ if .System }}|im_start|system {{ .System }}|im_end| {{ end }}{{ if .Prompt }}|im_start|user {{ .Prompt }}|im_end| {{ end }}|im_start|assistant PARAMETER stop |im_end| PARAMETER temperature 0.7 PARAMETER top_p 0.9注意TEMPLATE里的{{ .System }}、{{ .Prompt }}是 Ollama 的占位符别写成训练时的{{content}}那是 LLaMA-Factory 的格式两者不通用。3.4 创建并运行模型ollama create qwen8-ft -f Modelfile ollama list ollama run qwen8-ftollama create会读取 Modelfile、拷贝权重、注册模型。ollama list能看到qwen8-ft就说明创建成功。ollama run进去后随便问一句看输出格式是否符合预期。4. 验证请求确认微调模型真的在跑4.1 命令行快速验证最直接的方式是ollama run交互测试ollama run qwen8-ft 用一句话解释什么是 LoRA 微调如果输出连贯、格式正常说明 TEMPLATE 和权重都对上了。如果输出里混着|im_start|之类的特殊 token说明 TEMPLATE 或 stop 参数没配对回去检查 Modelfile。4.2 API 方式验证Ollama 默认在11434端口提供 API用 curl 测curl http://localhost:11434/api/generate -d { model: qwen8-ft, prompt: 你好介绍一下你自己, stream: false }返回 JSON 里的response字段就是模型输出。这一步能过说明本地推理链路完整。4.3 通过 TaoToken 统一通道验证如果你要把这个微调模型接到统一网关把请求指向 TaoToken 的 API 入口即可OpenAI 兼容格式curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: qwen8-ft, messages: [{role: user, content: 你好}] }Key 在 TaoToken 控制台的 API Keys 页面生成接入文档里有完整的参数说明。这样本地和远端用同一套模型名和调用格式复现性最好。5. 本篇常见错排查5.1Error: llama runner process has terminated: signal: aborted (core dumped)这是导入模型后最常见的报错多半是 llama.cpp 转换脚本版本和 Ollama 内置运行时对不上。解决办法是退回一个已知可用的 commitcd llm/llama.cpp git reset --hard 46e12c4692a37bdd31a0432fc5153d7d22bc7f72然后回到转换那一步重新跑一遍convert-hf-to-gguf.py再ollama create。这个 commit 在 Ollama 的 issue 里被多次验证可用。5.2 转换脚本报 tokenizer 相关错误通常是transformers版本太新或太旧。先确认虚拟环境激活了再按 requirements 重装pip install -r llm/llama.cpp/requirements.txt --force-reinstall如果还不行检查微调产出的tokenizer.json是否完整LoRA 合并时有没有漏掉 tokenizer 文件。5.3 模型输出格式错乱、带特殊 token九成是 TEMPLATE 和训练时不一致。回去看 LLaMA-Factory 训练脚本里的--template参数比如qwen、llama3然后在 Modelfile 里用对应的模板。stop 参数也要和训练时的stop_words对齐否则模型不会在正确位置停。5.4ollama create报找不到 FROM 文件Modelfile 里FROM的路径必须是绝对路径或相对于 Modelfile 的路径且文件要真实存在。用ls -lh确认 gguf 文件在权限可读。路径里有空格或中文也可能出问题尽量用纯英文路径。5.5 一行命令直接导入失败Ollama 支持ollama create --quantize q4_0 -f Modelfile my-model一步到位但仅支持部分模型且FROM要指向模型目录而非单个文件。如果失败老老实实走「转换 → 量化 → 写 Modelfile → create」的分步流程可控性更高。6. 把链路固定下来本地验证 统一通道微调模型能不能复现关键不在训练本身而在「产出 → 转换 → 加载 → 调用」这条链路上每一步都有明确命令和参数。我的建议是本地用 Ollama 把ollama run和11434API 验证通过确认 TEMPLATE、stop、量化选项都对了再把同一套模型名和参数接到 TaoToken 的统一通道上做远端或 Agent 场景的调用。具体入口按你的场景选需要生成 Key、管理调用通道API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入参数和 OpenAI 兼容格式说明接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite想先在网页里对比微调模型和基座模型效果模型对话https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite长期做编码或 Agent 调用、需要稳定额度Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite把 Modelfile 和转换命令存进版本库下次换模型只改FROM和TEMPLATE两处链路就能稳定复用。
返回列表