用Unsloth+Ollama本地运行微调后的大模型
1. 为什么要在本地跑自己微调的模型?
你有没有试过在网页上和大模型聊天,发现它回答得挺专业,但一问到你公司内部的流程、产品文档或者行业术语,就答得模棱两可?不是模型不够强,而是它没学过你的“方言”。
微调(Fine-tuning)就像给通用型医生做专科进修——不从头学医,只重点补习心内科知识。而Unsloth就是那个高效、省力的进修班:它能让训练速度翻倍,显存占用直降70%。更关键的是,训完的模型能打包成GGUF格式,直接扔进Ollama里本地运行,不依赖网络、不上传数据、不担心隐私泄露。
这篇文章不讲理论推导,不堆参数配置,只聚焦一件事:从镜像启动,到本地跑通一个真正懂你业务的专属模型。无论你是想让AI看懂自家PDF合同、自动写周报、还是给客户生成个性化方案,这套流程都适用。
2. 镜像环境快速验证
别急着写代码,先确认镜像已准备就绪。打开WebShell,三步验证:
2.1 查看conda环境列表
conda env list你会看到类似这样的输出:
# conda environments: # base * /root/miniconda3 unsloth_env /root/miniconda3/envs/unsloth_env只要unsloth_env出现在列表里,说明环境已预装。
2.2 激活Unsloth专用环境
conda activate unsloth_env激活后,命令行提示符前会显示(unsloth_env),这是你进入“微调车间”的入场券。
2.3 检查Unsloth是否可用
python -m unsloth如果看到类似Unsloth v2024.x.x is working correctly!的提示,说明框架已就位。这一步比安装还重要——它验证了CUDA、PyTorch、bitsandbytes等底层依赖全部打通。
注意:不要跳过环境验证。很多“训练失败”问题,其实卡在第一步——环境没激活或路径不对。
3. 微调前的关键认知:什么该做,什么不该做
新手常犯两个错误:要么把微调想得太玄乎,以为要调几百个参数;要么又太随意,拿几条样例就开训。真相在中间——微调是精准投喂,不是暴力灌输。
3.1 明确你的目标:解决具体问题,而非“提升模型能力”
- 正确目标:“让模型能准确解析我司销售合同里的违约金条款”
- ❌ 错误目标:“提升模型的法律理解能力”
前者有明确输入输出标准,后者无法衡量,也容易过拟合。
3.2 数据质量 > 数据数量
Unsloth能在200条高质量样本上训出实用效果。关键在三点:
- 格式统一:所有样本都按“指令+输入+输出”结构组织
- 覆盖典型场景:比如合同解析,要包含正常条款、模糊表述、带附件的复杂条款
- 答案准确权威:由业务专家审核,不是让模型自己编
3.3 不要碰全参数微调
Unsloth默认用LoRA(低秩适配),只更新0.1%的参数。这就像给汽车加装智能导航模块,而不是重造发动机——快、省、稳。强行全参微调,不仅显存爆掉,还容易把原模型的通用能力搞丢了。
4. 本地微调实战:以医疗问答为例
我们用中文医疗数据集演示全流程。所有操作都在镜像内完成,无需Colab中转。
4.1 加载基础模型与分词器
from unsloth import FastLanguageModel import torch max_seq_length = 2048 dtype = None load_in_4bit = True model, tokenizer = FastLanguageModel.from_pretrained( model_name = "unsloth/DeepSeek-R1-Distill-Llama-8B", max_seq_length = max_seq_length, dtype = dtype, load_in_4bit = load_in_4bit, )这段代码做了三件事:
① 选了一个8B参数、专为中文优化的Llama变体;
② 启用4位量化,让模型仅占约5GB显存;
③ 自动适配你的GPU(A10/A100/V100都支持)。
4.2 构建你的专属提示模板
别让模型猜你要什么。用清晰模板框定它的思考路径:
prompt_style = """你是一位三甲医院主治医师,请根据以下问题给出专业、简洁、可执行的医疗建议。 ### 问题: {} ### 回答: """注意这个设计:
- 开头定义角色(主治医师),比“AI助手”更聚焦;
- 要求“专业、简洁、可执行”,直接约束输出风格;
- 空行分隔问题与回答,避免模型混淆。
4.3 格式化训练数据
我们用shibing624/medical数据集的200条样本。核心是把原始数据“翻译”成模型能学的格式:
from datasets import load_dataset dataset = load_dataset("shibing624/medical", 'finetune', split="train[0:200]") def formatting_prompts_func(examples): texts = [] for i in range(len(examples["instruction"])): text = prompt_style.format(examples["instruction"][i]) + \ examples["output"][i] + tokenizer.eos_token texts.append(text) return {"text": texts} dataset = dataset.map(formatting_prompts_func, batched=True)关键点:
examples["instruction"]是问题,examples["output"]是专家答案;- 每条数据拼成“模板+问题+答案+结束符”,模型一看就懂这是“学习范本”;
tokenizer.eos_token告诉模型“这里结束”,避免生成拖沓。
4.4 配置LoRA并启动训练
from unsloth import is_bfloat16_supported from trl import SFTTrainer from transformers import TrainingArguments FastLanguageModel.for_training(model) model = FastLanguageModel.get_peft_model( model, r = 16, target_modules = ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], lora_alpha = 16, lora_dropout = 0, bias = "none", use_gradient_checkpointing = "unsloth", ) trainer = SFTTrainer( model = model, tokenizer = tokenizer, train_dataset = dataset, dataset_text_field = "text", max_seq_length = max_seq_length, dataset_num_proc = 2, packing = False, args = TrainingArguments( per_device_train_batch_size = 2, gradient_accumulation_steps = 4, warmup_steps = 5, max_steps = 75, learning_rate = 2e-4, fp16 = not is_bfloat16_supported(), bf16 = is_bfloat16_supported(), logging_steps = 1, optim = "adamw_8bit", weight_decay = 0.01, lr_scheduler_type = "linear", seed = 3407, output_dir = "outputs", report_to = "none", ), ) trainer.train()训练时你会看到实时loss下降。75步约耗时15分钟(A10 GPU)。不用等完整训练结束,随时可测试效果。
4.5 训练中实时验证:别等最后才看结果
在训练目录下新建一个测试脚本:
# test_during_training.py FastLanguageModel.for_inference(model) question = "高血压患者突然头晕,可能是什么原因?" inputs = tokenizer([prompt_style.format(question)], return_tensors="pt").to("cuda") outputs = model.generate( input_ids = inputs.input_ids, attention_mask = inputs.attention_mask, max_new_tokens = 512, use_cache = True, ) print(tokenizer.decode(outputs[0], skip_special_tokens=True))每训完10步就跑一次。你会发现:
- 第10步:回答泛泛而谈,“可能是多种原因…”
- 第30步:开始引用具体指标,“收缩压>180mmHg时…”
- 第75步:给出可操作建议,“建议立即测量血压,若>180/110mmHg,需急诊就诊”
这就是微调在“生长”的证据。
5. 导出为GGUF:让模型脱离Python环境
训好的模型还在PyTorch生态里,要让它被Ollama识别,必须转成GGUF格式——一种纯二进制、跨平台、零依赖的模型封装。
5.1 一键导出(8位量化,平衡速度与精度)
model.save_pretrained_gguf("medical_llm", tokenizer)执行后生成medical_llm/文件夹,内含:
ggml-model-Q8_0.gguf:主模型文件(约4.2GB)tokenizer.model:分词器(几十KB)config.json:模型元信息
为什么选Q8_0?
Q4_K_M(约2.1GB)虽小,但医疗文本对数值精度敏感;Q8_0在保持专业术语准确性的前提下,加载速度比Q4快30%,是本地部署的黄金选择。
5.2 手动验证GGUF文件
别信“导出成功”就完事。用Ollama命令行检查:
ollama show --modelfile medical_llm/ggml-model-Q8_0.gguf应返回模型基本信息,如parameter count: 8.0B。若报错“invalid format”,说明导出过程出错,需回溯检查save_pretrained_gguf调用。
6. Ollama本地运行:三步走通
6.1 创建Ollama模型文件(Modelfile)
在medical_llm/同级目录创建文件Modelfile:
FROM ./medical_llm/ggml-model-Q8_0.gguf # 设置系统提示,强化医疗角色 SYSTEM """ 你是一位三甲医院主治医师,只回答医疗相关问题。 回答必须基于循证医学,不猜测、不编造。 若问题超出医疗范畴,回复"我专注于医疗健康领域,请问其他健康问题?" """ # 设置默认参数 PARAMETER num_ctx 2048 PARAMETER stop "<|eot_id|>" PARAMETER temperature 0.3这个Modelfile做了三件事:
①FROM指定GGUF文件路径;
②SYSTEM注入角色指令,比每次提问都加前缀更可靠;
③PARAMETER控制生成行为,temperature 0.3让回答更稳定(医疗不容天马行空)。
6.2 构建Ollama模型
ollama create medical-doctor -f Modelfile终端显示creating new model...后,几秒即完成。用ollama list可看到新模型medical-doctor。
6.3 本地对话测试
ollama run medical-doctor >>> 高血压患者能吃柚子吗?你会得到类似这样的回答:
“可以适量食用。柚子富含钾,有助于平衡钠摄入,对控制血压有益。但需注意:若正在服用硝苯地平、非洛地平等钙通道阻滞剂,柚子中的呋喃香豆素会抑制肝脏代谢,导致药物血药浓度升高,增加低血压风险。建议服药期间避免大量食用。”
这才是微调的价值——答案里有依据、有边界、有提醒。
7. 进阶技巧:让本地模型更懂你
7.1 快速迭代:不重训,只换数据
当你发现模型对某类问题回答不准(如“儿童用药剂量”),不必从头训练。只需:
① 新增20条高质量儿童用药样本;
② 用dataset.map()追加到原数据集;
③ 修改max_steps=20,重新trainer.train()。
整个过程5分钟内完成,显存占用不变。
7.2 多模型协同:用Ollama组合能力
Ollama支持ollama run链式调用。例如:
- 先用
medical-doctor解析病历; - 再用
llama3将专业结论转成患者能懂的大白话。
通过简单脚本串联,就能做出“医生+健康顾问”双角色AI。
7.3 隐私保护实操
所有操作均在本地完成:
- 训练数据不离开你的机器;
- GGUF文件不联网;
- Ollama默认离线运行。
若需分享模型,只发布GGUF文件(不含原始数据),彻底规避隐私风险。
8. 总结:你已掌握一条完整技术链
回顾一下,我们完成了什么:
在预装镜像中验证环境,跳过90%的环境配置坑;
用200条数据微调出领域专家模型,全程15分钟;
将PyTorch模型转为Ollama可运行的GGUF格式;
通过Modelfile注入角色指令,让模型“记得自己是谁”;
本地运行,零延迟、零隐私泄露、零网络依赖。
这条路的价值不在技术多炫酷,而在把AI从“玩具”变成“工具”。下次当业务部门说“能不能让AI读懂我们的招标文件”,你不再需要申请GPU资源、等待排期、协调数据团队——打开镜像,加载数据,15分钟后,一个专属模型已在你电脑上待命。
技术终将退场,解决问题才是主角。而你,已经拿到了那把钥匙。
--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。