
文章目录前言1. 先给你们看看最终成品1.1 四个核心产物1.2 先把定位说清楚2. 我的本地环境家底2.1 硬件软件配置2.2 文件存放思路3. 整个流程就是一条流水线3.1 四个核心脚本3.2 完整数据流4. 数据清洗先定好模型该学啥4.1 原始数据啥成色4.2 我是怎么筛数据的4.3 两个不能省的细节5. LoRA微调花小钱办大事5.1 LoRA到底是啥逻辑5.2 我的参数配置6. 训练参数是怎么琢磨出来的6.1 核心配置拆解6.2 为啥要这么设6.3 为啥只训不到半个epoch7. 训练结果到底咋样7.1 耗时和指标7.2 实际效果啥水平8. 为啥要把LoRA合并进去8.1 LoRA文件不能单独跑8.2 合并就是一步到位9. 转成GGUF格式干啥用9.1 GGUF有啥好处9.2 转换过程很简单10. 怎么塞进Ollama里10.1 先写个Modelfile10.2 注册模型就完事11. Docker部署是怎么玩的11.1 卷映射是核心技巧11.2 端口和GPU配置12. Open WebUI怎么接上去12.1 配置有个小坑12.2 完整访问链路13. 踩过的那些坑说多了都是泪13.1 Docker路径格式坑13.2 上下文Token莫名暴涨13.3 上下文长度的隐形坑13.4 最容易踩的认知坑14. 折腾完这一圈我真正收获了啥14.1 值钱的不是模型是链路14.2 给新手的真心话建议15. 接下来打算咋迭代15.1 先把数据质量提上去15.2 扩充能力慢慢迭代P.S. 无意间发现了一个巨牛的人工智能教程非常通俗易懂对AI感兴趣的朋友强烈推荐去看看 传送门https://blog.csdn.net/qq_34419312前言最近手痒想完整走一遍大模型从训练到部署的全流程。不是调个API那种过家家也不是下个模型跑两下就完事是从数据清洗到Docker部署一条龙全给它跑通。选了中医领域试水拿Qwen3-0.6B搞了个试点模型。先把丑话说在前头这就是个纯学习用的模型不能看病开药方别回头有人拿着输出的方子去药店抓药再来找我报销医药费我这显卡钱还没赚回来呢。1. 先给你们看看最终成品1.1 四个核心产物折腾完一圈手里攥着四个东西各有各的用处。第一个是LoRA适配器就40.4兆相当于给原模型打了个中医补丁只存了参数差值不能脱离底座单独跑。第二个是合并后的完整Hugging Face模型1.2G左右把补丁和底座焊死在了一起。第三个是BF16格式的GGUF文件专门给本地推理工具用的单文件便携得很。最后一个是注册好的Ollama模型叫wo-x-tcm:pilot配个网页界面就能直接聊天。1.2 先把定位说清楚这不是从零训出来的基础大模型说准确点是基于Qwen3-0.6B的中医领域LoRA指令微调模型。说白了就是给通用模型补了点中医专业课不是从头培养个老中医。只能用来学习中医文献但凡涉及医疗决策一律靠边站别拿它当在线问诊用。2. 我的本地环境家底2.1 硬件软件配置操作系统是Windows靠Docker Desktop跑Linux容器。显卡是RTX 5070说不上顶配但折腾个0.6B的小模型完全够用。总不能为了个试点项目直接上旗舰卡吧钱包第一个不同意。Python单独开了个conda环境PyTorch 2.13.0配CUDA 13.0Transformers、PEFT、TRL这些常用库都拉到了对应版本避免版本不兼容踩坑。2.2 文件存放思路所有大体积文件全塞D盘C盘那点空间装个系统都够呛再塞模型分分钟红盘给你看。分了四个文件夹各司其职数据集放一起模型文件放一起项目代码放一起conda环境单独放。分门别类省得找文件找半小时训练还没开始先给自己整emo了。3. 整个流程就是一条流水线3.1 四个核心脚本整个项目核心就四个Python文件各司其职一点不乱。prepare_data.py管数据清洗整理train_lora.py负责微调训练evaluate.py做效果对比merge_lora.py用来合并权重。就像工厂流水线一个环节接一个环节哪个环节出问题直接定位到对应脚本不用到处瞎找。3.2 完整数据流整条链路顺下来特别清晰原始数据洗干净划分成训练验证测试集丢给底座模型加LoRA训练产出适配器合并成全量模型转成GGUF格式最后塞进Ollama用Docker部署配个网页交互界面。跟搭乐高似的一块一块往上拼拼完还能拆下来调整灵活得很。4. 数据清洗先定好模型该学啥4.1 原始数据啥成色原始数据用的是公开的Baize TCM V3一共十五万七千多条记录看着量挺大其实水分不小。就跟你买了一大包零食拆开一看一半都是包装袋真正能吃的没多少。4.2 我是怎么筛数据的第一步先卡长度太短太长的都直接pass。第二步筛领域明显不是中医内容的直接踢出去一下就干掉了七万多条。第三步最关键但凡涉及开药、处方、剂量、选穴位这种行动性医疗问题全给过滤掉。我可不想训出个上来就给人开药方的“江湖郎中”模型第一步先学理论别上来就想着行医。最后再去重十五万多条洗下来只剩三万九出头的合格数据。首轮实验我也没贪多就挑了两千条训练两百条验证五十条测试。先跑通流程比啥都强。4.3 两个不能省的细节所有合格数据统一转成聊天格式系统提示词加用户问题加助手回答模型就照着这个结构学知道看到问题该输出啥。随机种子必须固定死。不然每次训练数据集划分都不一样结果根本没法对比就跟考试每次换题库你根本不知道自己进步没进步一样。5. LoRA微调花小钱办大事5.1 LoRA到底是啥逻辑要是全量微调所有参数都要算梯度存状态大模型直接能把显存干冒烟。LoRA就聪明多了原模型参数全冻住不动只训练两组低秩小矩阵。相当于给模型打补丁改动小见效快显存占用还低典型的四两拨千斤。5.2 我的参数配置秩设了16lora_alpha设32dropout0.05注意力层和前馈网络的全量模块都加上了LoRA。算下来可训练参数才一千万出头只占总参数的1.6%左右这点参数对显卡来说完全没压力。这次用的是普通BF16精度没上QLoRA。毕竟模型小显卡扛得住没必要搞量化徒增麻烦。6. 训练参数是怎么琢磨出来的6.1 核心配置拆解核心训练参数我给你们列一下都是踩坑踩出来的经验。最大训练步数120步单卡批次大小1梯度累积步数8算下来有效批次大小是8。学习率1e-4用余弦调度最大序列长度512。打开了assistant_only_loss也开了梯度检查点BF16混合精度也安排上。6.2 为啥要这么设批次大小设1纯粹是为了省显存靠梯度累积凑有效批次属于是显存不够步数来凑。只算助手回答的损失更合理总不能让模型学着复述用户的问题吧那不成复读机了。梯度检查点就是用计算换显存反正显卡闲着也是闲着多算点总比显存溢出强。整套配置下来峰值显存才2.3G离谱的省。6.3 为啥只训不到半个epoch两千条训练数据有效批次8完整跑一遍要250步。我就训了120步算下来才0.48个epoch连半圈都没跑完。没办法这就是个试点版本先验证整条流程能不能跑通。总不能第一次就训个几天几夜最后发现部署环节出问题那可真是竹篮打水一场空。7. 训练结果到底咋样7.1 耗时和指标整个训练跑下来花了不到7分钟喝杯茶的功夫就完事了速度比我预想的快多了。训练损失从最开始的2.38降到了1.96验证损失也稳步往下走没出现发散的情况。说明训练没崩模型确实在学东西。7.2 实际效果啥水平拿同一批问题分别测了原始模型和微调后的模型差别还是挺明显的。微调后的模型说话确实更有中医那味儿专业术语用得也到位风格一下就对齐了。但冷门知识点还是会胡说八道也就是大家常说的幻觉。说白了就是你问它基础理论它能跟你头头是道唠半天你要是问个偏门的草药学名它可能当场就给你现编一个跟酒桌上吹牛皮的人似的不懂也能给你说的跟真的一样。所以说少量SFT只能改个说话风格真要知识靠谱还得靠可靠知识库和专家审核。别以为损失降了就是模型学会了它可能只是学会了怎么装得像学会了。8. 为啥要把LoRA合并进去8.1 LoRA文件不能单独跑训出来的LoRA适配器就40兆看着小巧便携但它不能脱离底座模型自己运行。就像游戏补丁不能脱离游戏本体玩一样你总不能拿着个补丁文件到处跑到哪都得先装个底座模型太麻烦。8.2 合并就是一步到位把LoRA学到的参数变化合并到底座模型里就生成了一个完整的独立模型。后续转换格式、部署都方便不用每次都额外加载适配器。代码也简单几行调用就搞定合并完直接保存成标准的Hugging Face格式。9. 转成GGUF格式干啥用9.1 GGUF有啥好处Hugging Face格式是一堆零散文件权重、配置、分词器分开装传起来、部署起来都麻烦。GGUF就不一样了一个文件把所有东西都装进去了模型张量、结构元数据、词表、聊天模板应有尽有。特别适合llama.cpp、Ollama这类本地推理工具拎包就能用。9.2 转换过程很简单用llama.cpp自带的转换脚本一行命令的事。指定好输入的模型目录和输出文件精度选BF16就行。这次没做量化压缩先保持完整精度等后续再慢慢对比不同量化级别的速度和效果差异。10. 怎么塞进Ollama里10.1 先写个ModelfileOllama靠Modelfile来定义模型。里面要写清楚GGUF文件的路径设置生成参数温度0.3top_p 0.8重复惩罚1.05上下文长度拉到8192。最后再写上系统提示词给模型定好规矩明确它只能用来学习文献不能做医疗建议。就跟给模型写个员工手册似的告诉它该怎么干活什么不能干。10.2 注册模型就完事写好Modelfile一条ollama create命令就搞定注册给模型起个名字绑定好配置。注意啊这一步不是重新训练模型就是给模型登个记上户口以后调用名字就能直接用。很多新手以为这步会训模型站那等半天纯纯浪费时间。11. Docker部署是怎么玩的11.1 卷映射是核心技巧很多人用Docker跑Ollama上来就想把模型拷进容器里那多傻啊。直接用卷映射把Windows本地的目录映射到容器内部容器直接读本地文件不用复制来复制去省时间还省空间。我一开始差点犯傻想把1个多G的模型拷进容器后来才反应过来白瞎我差点等半天传输进度。GGUF目录和Ollama模型目录分别映射只读权限给模型文件安全得很。11.2 端口和GPU配置GPU必须直通给容器不然纯CPU推理能急死人说句话等半分钟。端口也做了映射本地原生Ollama用11434Docker版用11435互不干扰想用哪个用哪个。12. Open WebUI怎么接上去12.1 配置有个小坑Open WebUI也直接跑在Docker里不用单独装特别省事。配置的时候要注意环境变量里的Ollama地址得写Docker内部的服务名不能写127.0.0.1。不然它找的是自己容器里的地址根本连不上Ollama。很多人第一次配都栽在这。12.2 完整访问链路浏览器访问本地3000端口就能打开界面。请求链路也很清晰浏览器发请求给Open WebUI它通过Docker内部网络转发给Ollama最后交给显卡推理结果再原路返回。用起来跟在线大模型没啥区别但是所有数据全在本地安全感直接拉满。13. 踩过的那些坑说多了都是泪13.1 Docker路径格式坑Windows的路径是反斜杠容器里是Linux的正斜杠同一个文件两边的路径写法完全不一样。我一开始图省事直接把Windows的路径写进Docker用的Modelfile里结果死活找不到文件排查了半天才反应过来。合着俩系统路径格式不一样白折腾半天。13.2 上下文Token莫名暴涨有次我就输了“咽喉痛吃什么”五个字结果界面显示输入快六千Token。我当时都懵了难道我输入的是无字天书后来才发现是Open WebUI偷偷给我塞了一堆内置工具的定义知识库、搜索、日历、笔记啥的全算进上下文里了。合着我聊个天后台还带了个工具人团队是吧我没叫它们啊自己就跑进来占位置了。解决办法也简单给模型建个专属预设把内置工具关了瞬间就清净了。13.3 上下文长度的隐形坑Qwen3-0.6B本身支持四万多Token的上下文但Ollama默认只给4096。一开始我输入长点的内容就报错还以为模型不行后来才发现是配置没改。把Modelfile里的num_ctx调到8192重新注册模型立马就好了。这个参数藏得深很多人容易忽略。13.4 最容易踩的认知坑很多人觉得训练损失一直降模型就越来越厉害。大错特错损失下降只能说明模型越来越会模仿训练数据里的回答不代表答案就是对的。训练数据里要是有错的模型学的比谁都快。就跟学生背题一样答案背得滚瓜烂熟你换个题型他就不会了甚至错题他也照背不误。所以别光看损失曲线好看就自我感动真要靠谱还得专家评测。14. 折腾完这一圈我真正收获了啥14.1 值钱的不是模型是链路说实话这个模型本身没啥大不了的就是个试点玩具能力有限。真正值钱的是我把从数据处理到模型训练再到格式转换、容器部署、问题排查的整条工程链路完完整整跑通了一遍。每个环节是干啥的会出啥问题怎么解决门儿清了。14.2 给新手的真心话建议要是你也想从零学本地大模型别上来就整7B、14B的大模型纯纯给自己找罪受。先整个0.5B到1B的小模型把全流程跑通再说。能跑通、能复现、能评测比一开始就追求大参数重要多了。不然上来就整个大模型显存不够报错部署也不会最后打击信心得不偿失。15. 接下来打算咋迭代15.1 先把数据质量提上去现在的数据都是公开的没经过人工审核质量参差不齐。下一步打算人工抽检修订样本再加一些安全相关的内容比如儿童、孕产妇用药禁忌这些。安全永远是第一位的尤其是和医疗沾边的东西马虎不得。15.2 扩充能力慢慢迭代打算建一个完全隔离的专家测试集再加个中医古籍RAG知识库弥补模型知识不准的问题。训练数据也打算扩到一万条以上再试试继续预训练的效果。后面也会对比下LoRA、QLoRA不同方式还有不同量化格式的差异慢慢优化。反正路已经走通了剩下的就是慢慢填内容了。最后给想动手的朋友提个醒整个项目的核心文件顺序就是数据准备脚本、训练脚本、评测脚本、合并脚本再加上Modelfile和compose配置文件。顺着这个顺序看就能把整个流程摸得明明白白。踩坑不可怕踩过一次下次就会了动手试试比看十篇教程都管用。P.S. 无意间发现了一个巨牛的人工智能教程非常通俗易懂对AI感兴趣的朋友强烈推荐去看看传送门https://blog.csdn.net/qq_34419312