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两处链路就能稳定复用。
企业数字化 ERP 产品动态
相关推荐
期刊投稿流程太绕?用 TaoToken 统一 Key 打通 AI 辅助写作与投稿配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 10:07:19
机器码封禁怎么解决?先懂原理再选合规处理方案 后台收到好几条近乎一样的留言,都是问"封电脑机器码怎么解决"。搜索词里"机器码怎么改"的热度也是居高不下。我理解大家真正想问的是:账号没了,能不能通过改电脑机器码,让平台认不出这台机器,然后… · 2026/9/25 10:07:07
Ubuntu 22.04 LTS实战避坑指南:硬件兼容、虚拟化、驱动与开发环境全链路解析 1. 这不是“又一篇Ubuntu安装教程”,而是一份能让你少踩37个坑的22.04 LTS实战手记我从2012年开始在服务器、嵌入式开发板、笔记本、虚拟机上部署Ubuntu,亲手装过超过217台不同配置的22.04 LTS系统——有给金融客户做合规审计环境的,有给高校… · 2026/9/25 10:07:07
代码随想录/hello-algo学习笔记——二叉树 二叉树的基本概念
二叉树是一种非线性的数据结构,由每个节点一分为二引出两个子节点(类似高中生物学到的祖先后代的结构图,但二叉树是一个节点只能有两个子节点)。
基本单元:结点。每个节点包含值和两个引用࿰… · 2026/9/25 10:39:56
A2A供需匹配为什么不能只靠向量相似度 更新说明(2026年9月23日):本文是历史技术方案记录。当前 MapleBridge 用于采购询价、邀请买家已有的供应商联系人与报价比较,不提供供应商搜索、工厂核验或自动撮合。B2B 供需匹配为什么不能只靠向量相似度
最近在做一个 B2B 供需… · 2026/9/25 10:39:56
大模型网关密钥自动分配:MCP协议+CLI驱动的智能调度方案 1. 项目概述:为什么需要一个“自动分配密钥”的大模型网关调用中枢? 你有没有遇到过这样的场景:团队里五个人同时在调试同一个大模型应用,每人手里攥着一份从不同渠道申请来的API密钥——有人用的是Qwen的Key,有人配的… · 2026/9/25 10:39:50
JetBrains Mono 编程字体配置全指南:解决中文、连字与跨平台问题 1. 为什么 JetBrains Mono 是程序员真正需要的“呼吸感”字体JetBrains Mono 不是又一个标榜“等宽”的编程字体,它是 JetBrains 团队花了整整两年时间,盯着成千上万行真实代码、反复调整每一个字形轮廓、甚至为0和O的区分度单独设计视觉权重后ÿ… · 2026/9/25 10:39:50
IDURAR 开源 ERP/CRM 系统技术指南:基于 MERN 技术栈的功能架构、数据模型与部署实践 后端前端企业应用CRM 【免费下载链接】idurar-erp-crm Free Open Source ERP CRM Software Accounting Invoicing | Node.Js React 项目地址: https://gitcode.com/gh_mirrors/id/idurar-erp-crm 点击查看 免费下载 导读
本文以 IDURAR(idurar-erp-crm… · 2026/9/25 10:39:43
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37