很多人已经按教程把 DeepSeek 在本机或内网跑通了,一问「怎么接着训练」就卡住:不知道是继续预训练、做微调,还是干脆只做知识库;也不清楚自己的卡到底能训多大的模型。这篇不重复部署步骤,只把「部署完之后到真正训出一版能用的权重」之间那段路拆成可执行动作,并给出判断标准和什么时候该放弃本地训练。
环境准备:在能跑推理的基础上再补什么
很多人本地推理跑得挺顺,一上来就想直接开训,结果第一步就卡住。原因是推理和训练对环境的胃口不一样:推理只要权重能加载、显存放得下就行,训练还要额外装微调框架、盯紧 CUDA 和显卡驱动是否对得上。先把这条线捋清楚,后面才不会反复返工。
| 环节 | 谁负责 | 要确认什么 |
|---|---|---|
| 把训好的权重跑起来 | Ollama 这类推理工具 | 权重格式能不能直接加载 |
| 真正做微调 | 专门的微调框架 | 框架与 CUDA、驱动版本是否匹配 |
| 训完合并权重 | 合并脚本或框架自带命令 | 训练产物存在哪、合并哪一份 |
- 推理工具和微调框架是接力关系,不是二选一:前者负责跑,后者负责训,别指望一个工具全包
- 先跑通一个最小样例,再上真数据,样例过了才说明环境真的可用
- 确认模型存储路径,训练输出和原始权重往往不在同一个目录
- 确认权重格式,不同框架吃进去和吐出来的格式可能不一样
- 把显卡驱动版本和 CUDA 版本记下来,换了就重新对一遍
- 第一步:确认推理已跑通先保证基础权重能被推理工具加载并出结果,这一步不通过就先别碰训练,说明基础环境还没稳
- 第二步:装微调框架并对版本选一个微调框架装上,重点核对它要求的 CUDA 与你的显卡驱动是否匹配,对不上就调驱动或换框架版本
- 第三步:跑最小样例用极小的一小份样本跑通一次完整训练流程,看它能不能正常开始、正常结束、正常产出文件
- 第四步:确认路径与格式记下训练产物落在哪个目录、是什么格式,再回头确认合并时该拿哪一份权重去合
这里有个常见坑:训练输出目录和原始权重目录不在一起,训完想合并时满盘找权重。建议在动手前就把「原始权重在哪、训练产物在哪、合并读哪一份」三个路径写在一张纸上。具体的权重格式对照和目录约定,可以到站内模型资料库核对当时的说明,别凭记忆猜。
下一步环境通了再谈数据,接着看训练数据怎么准备和切分,避免样例跑通、数据一上就崩→先算账再动手:显存和卡数怎么估
动手买卡之前,先把账算清楚。要回答的问题只有两个:显存够不够放模型和优化器,卡数够不够把训练时间压到你能接受的范围。这两件事经常被混在一起,其实得分开看——显存决定「能不能跑起来」,卡数决定「要等多久」。先按下面这张对照表把两件事拆开,再往下算数字。
| 看什么 | 决定的是 | 不够时会怎样 | 估算依据 |
|---|---|---|---|
| 显存容量 | 能不能训起来 | 直接报错或只能降到小模型 | 参数量、训练方式、精度、上下文长度 |
| 卡的数量 | 训得快不快 | 能跑完,但时间成倍拉长 | 要处理的数据量、单步耗时、目标轮数 |
| 显存带宽/互联 | 多卡效率 | 卡多了也跑不满,时间没那么短 | 卡间通信量、并行策略 |
| 数据与存储 | 能不能持续喂上 | 显卡空转等数据 | 单样本大小、读取速度、预处理方式 |
- 全量微调
- 模型所有参数都参与更新,优化器还要为每个参数存状态,显存开销通常远大于模型本身。
- 参数高效微调
- 只训练一小部分新增或选定的参数,优化器状态大幅减少,本地起步一般优先看这类方式。
- 量化档位
- 把权重压到更低位宽存放,省显存,代价是精度和速度上的一些折中,档位不同结果差很多。
- 上下文长度
- 单条样本越长,激活值占用越大,长上下文会把显存需求往上顶一截。
- 先定训练方式优先按 LoRA 这类只训小部分参数的路线来估,确认目标效果能接受再考虑全量微调;如果非要全量,显存预算要按数量级往上加。
- 把四个输入量摆齐参数量、量化档位、上下文长度、批大小。这四个一变,结论全变,所以别只报一个参数量就问「几张卡够」。
- 用站内工具对一遍到 /compute/sizing 按参数量、量化档位和上下文长度把口径对一遍,先看它给出的显存需求落在哪个区间。
- 再估时长拿工具给的显存结论,反过来判断卡数够不够:显存刚好够但只有单卡时,训练时间会很可观,先想清楚你能接受多长的等待。
- 留出余量再下单按估算值留一点余量,别贴着上限配;贴着上限跑,换数据、加长度或者放宽批大小都会立刻卡住。
- 只看显存不看时间,结果配出来的机器要跑很久,中途只能中断或者加卡。
- 只报参数量不报量化档位和上下文长度,估算结果没有参考价值。
- 把全量微调的显存需求套到 LoRA 上,会严重高估,白白多花钱。
- 单卡能跑通就以为多卡线性加速,实际受通信和数据读取拖累,提速没那么理想。
- 估完不复核,训到一半才发现显存不够或者时间超出预期,返工成本很高。
数据准备:比模型选择更容易翻车的一步
很多人把精力全花在挑模型和调参上,结果训完发现输出还是一股怪味:要么答非所问,要么格式忽好忽坏。追根究底,问题八成出在数据这一步。原始材料不先洗干净、不统一格式,模型学到的就是一堆互相打架的样式,最后反映到你的输出里就是不稳定。
- 统一格式
- 先定死一种样本结构,比如指令-回答或问答对,全库都照这个来
- 字段名
- 同一含义的列只用一个名字,别一半叫 question 一半叫 input
- 标点与换行
- 全角半角、句末符号、多空行都要清成一致,否则输出跟着乱
- 清洗优先级
- 先做格式统一再谈数量,格式乱的样本宁缺毋滥
格式这块最容易被忽略。你可以先随便抽几十条,人工看一遍,把不统一的地方记下来,再写脚本批量处理。判断标准很简单:把两条不同来源的样本并排放在一起,肉眼分不出处理痕迹,就算过关。做不到就继续改脚本,别急着开训。
- 定模板先确定一种样本结构,例如指令-回答或字段抽取样本,把字段名和顺序写进一个小文档,后面所有处理都对照它
- 批量转换用脚本把原始材料转成模板格式,统一标点、去多余空行、裁掉首尾空白,转换后随机抽几十条人工核对
- 划分三份按大致比例切成训练、验证、测试三份,划分时打乱顺序再切,避免同一来源整段落进同一份
- 封存测试集测试集单独存好,训练和调参期间不碰它,只在最后验收时打开看一次
| 改动目标 | 大致需要的数据量 | 说明 |
|---|---|---|
| 只调输出风格、语气、句式 | 几百到上千条 | 样本干净且格式统一时,往往就能看出变化 |
| 灌入一个全新领域的知识 | 量级完全不同 | 需要覆盖该领域多种问法和边界情况,具体口径到站内页面核对 |
| 只是想修正少量固定错答 | 几十到几百条 | 针对性强,但要注意别把其他正常回答带偏 |
还有一点:验证集和测试集别混用。验证集的作用是告诉你什么时候该停下训练,测试集只在最后看一次,用来判断这套东西能不能交付。如果拿同一批数据既调参又验收,你看到的分数就是自欺欺人。什么情况下不适用?当你的数据总量实在太小、连三份都切不出来时,可以先用交叉验证顶一下,但验收时仍要留出一批没参与过任何调整的样本。
训练执行:参数怎么设、什么时候停
训练参数没有一套放之四海皆准的数,只有一条主线:先让模型「动起来」,再观察它有没有往坏的方向走。学习率和训练轮次是两个最容易翻车的旋钮。学习率太大,模型会在几步之内把原有能力冲掉,表现出来就是回答变得前言不搭后语,或者只会重复;学习率太小,损失曲线几十步看不出变化,容易让人误以为代码写错了。稳妥做法是先跑一个很小的规模试跑,确认曲线有下降趋势,再放大到正式训练。
| 观察项 | 正常表现 | 危险信号 | 随手动作 |
|---|---|---|---|
| 验证损失 | 前几轮持续下降后趋稳 | 连续多轮回升 | 停止这一轮,回退到回升前保存的检查点 |
| 训练损失 | 单调下降但速度逐渐变慢 | 一直陡降且验证损失不降 | 说明开始死记硬背,考虑减轮次或加数据 |
| 显存占用 | 稳定在某条线附近,有少量余量 | 逐步爬升直到接近上限 | 降批大小或缩短序列长度,再重跑 |
| 单步耗时 | 波动在一个小范围内 | 突然变长或忽长忽短 | 查数据加载、查是否有其他进程抢显存 |
- 每轮结束都把验证集结果记下来,和训练损失并排看,不要只看一个数
- 验证损失出现回升就停,哪怕训练损失还在往下掉
- 保存检查点时按验证表现命名,不要只按轮次编号,方便回头挑
- 试跑阶段先把轮次设小,确认流程通了再拉长,不要一上来就设很大
- 日志里同时记录显存峰值和单步耗时,两项突变往往比损失更早暴露问题
- 小步试跑用很小的一批数据和少量轮次先跑通,确认损失有下降趋势、显存没顶到上限。这一步只验证流程,不追求效果。
- 放大参数把学习率在试跑值附近做小范围调整跑几组,选验证损失下降最稳的那一组,而不是下降最快的那一组。
- 盯日志三件事看显存是否接近上限、单步耗时是否稳定、有没有梯度异常告警。任意一项出问题先停下排查,别硬着头皮往下训。
- 按验证损失决定停点每轮记录验证表现,出现连续回升就停,回退到回升前的检查点作为交付版本。
训练完怎么接回本地服务
训练跑完不等于服务就换了脑子。微调产物多数是「补丁」性质:只存了训练时改动的那部分权重,推理工具读的是完整的模型结构,直接丢进去往往报结构不匹配,或者勉强加载了却一点变化没有。正确顺序是先合并,再转格式,最后对比验证。
- 合并权重按你用的训练框架文档,把微调产物和训练时用的那份基座权重合并成一份完整的模型目录。验证方式是合并后目录里的文件数量和体积应接近原始基座,而不是只剩几个小文件。
- 转换格式看看你本地推理工具认哪种格式,再用对应转换脚本转一次。别跳过这步,格式不对时工具可能不报错、直接静默用回旧权重。转换完用工具自己的加载日志确认读的是新目录。
- 固定题对比准备一批同样的问题,分别问旧权重和新权重,人工看回答差异。重点看改动方向对不对,同时抽几道通用问题,确认模型没有整体变笨。
- 留档可回退新权重单独放一个目录,旧版本原样保留,用配置或软链接切换。发现效果不对时能立刻切回去,不用重新训练。
| 现象 | 常见原因 | 先查什么 |
|---|---|---|
| 加载报错,提示结构不匹配 | 补丁权重没和基座合并 | 合并步骤是否真的执行并覆盖了目标目录 |
| 能启动但回答和以前一样 | 格式没转,或配置仍指向旧路径 | 推理工具的模型路径和加载日志 |
| 回答风格变了但能力变差 | 训练数据或轮次过头 | 拿固定题对比新旧版本,看是哪类问题退化 |
| 只有部分场景生效 | 合并时基座版本选错 | 训练时用的基座和现在合并的是不是同一份 |
- 合并和转换都做在副本上,原始基座权重不要动
- 固定题要提前写死、每次用同一批,否则前后对比没有意义
- 新权重目录命名带上训练批次或用途,别用「new」「test」这种名字
- 切换新旧版本尽量靠配置或软链接,别反复覆盖同一个目录
- 上线前多跑几轮日常问题,固定题看不出长尾场景的退化
验收与止损:怎么判断这一版值不值得留
这一节只解决一个问题:训完一版之后,怎么冷静判断它到底该留还是该扔。先说清一个前提,下面这套判断只适用于你对训练数据有掌控、且下游有固定调用方的情况;如果只是自己玩票、没有明确用场景,那验收线可以宽松很多,甚至不设。
验收不能只看「感觉变聪明了」,那多半是过拟合的错觉。稳妥做法是固定三类指标同时看,缺一类都会误判。三类指标各自看什么、怎么算,可以先看下面这张对照表,具体阈值和当前同类任务的基线,去站内模型资料库里核对当时的口径。
| 指标 | 看什么 | 怎么取样本 | 不适用的情况 |
|---|---|---|---|
| 格式合规率 | 输出能否被程序直接解析(JSON、固定字段、标签) | 从验证集里随机抽一批,跑一遍解析器,统计失败条数 | 输出本身是自由文本、没有下游解析需求 |
| 领域准确率 | 在你关心的那批问题上,答案对不对 | 人工盲判,别让训模型的人自己判,容易自证 | 领域边界模糊、对错本身没有共识 |
| 通用能力 | 闲聊、常识、指令跟随这些没训过的能力有没有变差 | 拿训之前存的基线回答,同一批问题再问一次 | 你本来就不要通用能力,纯工具型模型 |
三项里最容易翻车的是通用能力。微调最常见的副作用就是「领域变强、别的全忘」,模型把参数都押到你的领域数据上,原本会答的题开始胡言乱语或答非所问。所以训练前一定要存一份基线回答,训完拿同一批问题再问,哪怕不做详细打分,肉眼扫一遍也能看出退化。
- 训练前留基线把通用问题、格式样例、领域抽题各存一份,连同当时的回答一起归档,这是后面所有对比的参照物,没有它验收就是拍脑袋。
- 训完先跑格式用解析脚本批量过一遍,格式合规率不达标就别往下看了,先回去改数据格式,而不是改超参。
- 人工抽样判领域从领域题里抽一批,让不参与训练的人盲判对错,记录错误类型,是知识错还是格式错,两类问题的修法完全不同。
- 回头测通用能力用基线那批问题重测,明显退步就说明代价太大,别急着继续调参。
如果三项都达标,那就留下、打标签归档;如果只是领域涨、通用崩,那就要算一笔账:模型变好的那部分,值不值它变差的那部分。多数时候不值,尤其是你的领域问题本来就能靠提示词或检索兜住的时候,退回原方案反而更省事、更好维护。判断这笔账划不划算,可以到站内指南中心看同类任务的经验口径,别自己硬扛。
- 先定验收线再开训,别训完才想及格线在哪
- 止损点写死:训到第几版还达不到验收线,就停,回到提示词或检索方案
- 连续两版指标没有实质变化,就说明调参到头了,继续只会烧时间
- 领域提升但通用明显退步的版本,默认不留,除非通用退化对你的场景真的无所谓
- 每一版的指标都单独记一行,别只留最后一版,否则回溯时等于白训
成本与合规别漏算
很多人算自建训练的账,第一反应就是「一张卡多少钱」。但真正烧钱的往往是卡以外的东西:电费、散热、机位租金、以及被训练任务长期占住、没法干别的活的那台机器。这几项加起来,三年下来可能比卡本身还贵。
- 算力总拥有成本(TCO)
- 把硬件、电、散热、机位、运维、折旧摊到几年里一起算,而不是只看采购价
- 机会成本
- 训练任务占住机器时,这台机器本来能跑推理或接别的活,少赚的那部分也算钱
- 单项对比陷阱
- 只比单卡价格,会忽略功耗和散热差异,长期账可能反过来
- 电费:按满载功率 × 每天训练小时 × 电价估,别看闲时功耗
- 散热与机位:家用环境要额外算空调和噪音处理,托管要算机位与带宽
- 机器占用:训练期间这台机器基本不能同时做别的事,要么排队要么加机器
- 折旧与故障:卡和电源、硬盘都有寿命,留一笔更换预算
- 运维时间:调环境、盯任务、处理掉卡,都是人力成本
| 成本项 | 怎么估 | 容易漏在哪 |
|---|---|---|
| 硬件采购 | 按整机而非单卡算,含电源、机箱、存储 | 只记显卡,忘了配套 |
| 电力 | 满载功耗 × 训练时长 × 当地电价 | 按闲时功耗估,偏低 |
| 散热与场地 | 空调电费、噪音处理或托管机位费 | 默认家里免费 |
| 机器占用 | 训练小时 × 该机器可产生的其他收益 | 当作零成本 |
| 折旧维护 | 按使用年限摊,预留易损件更换 | 一次性买完就不管 |
数据合规:训练前先把授权范围翻出来
拿客户资料、内部文档、聊天记录去训练之前,先确认三件事:你是否有权把这些数据用于训练、里面是否混进了个人信息、训完的产物会不会间接带出这些内容。授权范围通常写在合同或用户协议里,不是「我能访问」就等于「我能拿来训」。什么情况下不适用:如果数据完全由你自己合成、且不含任何真实个人与第三方内容,这一层压力会小很多,但仍要留记录。
- 列数据来源清单把准备喂进去的每类数据写下来:来源、归属方、获取方式。来源不明的先剔出去。
- 核对授权条款翻合同或协议里关于「使用目的」「二次利用」「模型训练」的措辞,看是否明确允许;没写清楚的按不允许处理。
- 标记个人信息筛查姓名、联系方式、身份标识等字段,能去标识化就去,去不掉就评估是否必须用。
- 留存处理记录记下每批数据的授权依据和处理动作,将来对外提供服务时能拿出来说明。
许可证边界:权重能怎么用,读清楚再上线
不同开源权重的商用条件不一样:有的允许商用但要求保留声明,有的对月活或营收设门槛,有的明确限制某些用途。训完之后如果要对外提供服务,先回到权重自带的许可证条款逐条确认,别默认「开源就等于随便用」。拿不准时,优先选条款更宽松的权重,或把服务范围控制在许可允许的用途内。
| 要确认的点 | 看哪里 | 不适用的情况 |
|---|---|---|
| 能否商用 | 权重附带的许可证正文 | 纯内部自用、不对外提供服务 |
| 是否需要保留声明 | 许可证里的署名与通知条款 | 完全不分发、不对外 |
| 是否有规模门槛 | 许可证中关于用户量或营收的限定 | 规模远低于门槛时影响较小 |
| 衍生模型怎么算 | 许可证对衍生与再分发的定义 | 只自用、不发布衍生权重 |
什么情况下不该在本地训
本地训练听起来很爽,但很多团队真正需要的其实不是「把知识写进权重」,而是「让模型在回答时能看到这些知识」。这两件事的成本差一个量级。判断要不要训,先别问「能不能训」,先问三个问题:数据够不够多、需求稳不稳定、团队里有没有人能看懂训练日志。三条里只要有一条踩中,优先考虑检索或提示词方案。
| 情况 | 更适合先做 | 为什么 | 什么情况下不适用 |
|---|---|---|---|
| 数据量小,比如只有几百条问答 | 检索库 + 提示词 | 样本太少,训练很容易只记住表面措辞,泛化差 | 数据虽少但格式极统一、任务极窄,且你只追求固定输出 |
| 需求还在频繁变动,每周改规则 | 检索库 + 提示词 | 改文档、改指令几分钟就生效,训练一次要重跑 | 业务规则已冻结数月,且对响应延迟极其敏感 |
| 团队没人懂训练,也没人看loss | 检索库 + 提示词 | 训练出错时容易得到一个「看起来能跑但答非所问」的模型 | 你愿意先花时间补课,并接受前期试错成本 |
- 只是想让模型多知道点事实,比如产品参数、内部流程、常见问题:更新检索库比重新训练便宜得多,改错了直接回滚某一条文档就行。
- 训练出来的模型很难「撤回」某一句话,检索库可以精确删掉某条,责任边界清楚。
- 如果你的算力是租的,先对比两条路的总耗时和总花费,而不是只看卡时单价。
- 团队里没人能判断过拟合、学习率、数据清洗质量时,训练更像是在赌,不是在做工程。
- 先算两笔账把「租卡自训」和「官方接口 + 检索」两条路各自的总耗时列出来:数据清洗、训练、评测、上线、后续每次需求变更的重训时间。总花费也要算上人力,不只是卡钱。
- 再验证检索能覆盖多少把最近一段时间的真实提问整理出来,直接跑一遍检索加提示词方案,看命中率和回答质量。如果大部分问题都能被文档覆盖,就没必要训。
- 最后设一个触发条件只有当检索方案连续出现同一类失败、且这类失败靠加文档解决不了时,再考虑训练。触发条件提前写下来,避免拍脑袋决定。
当然,这不是说本地训练永远不该做。如果你的场景是固定任务、数据量大且质量可控、团队里有人能读懂训练曲线,那训练是合理的。具体到当前各家接口和算力的实际数字,别拿旧印象做决策,到站内的价格与模型资料库核对当时的情况,再按上面的步骤算自己的账。
常见问题
本地部署完之后,不做微调只做检索,算不算训练?
不算。检索是把资料在提问时喂给模型,权重没变;训练会改模型参数。大多数「想让模型懂我们内部资料」的诉求,检索就能解决,而且资料更新后立刻生效,不用重训。
显存不够还能不能微调 DeepSeek?
能,但要换思路:优先选 LoRA 这类只训小部分参数的方式、降低精度、缩短上下文长度,或者干脆只训一个小模型再拿它做特定任务。具体能训多大,用站内部署测算按参数量和精度跑一遍比看别人的配置靠谱。
训完之后效果变差了,怎么排查?
先分方向:如果输出格式对了但内容变笨,多半是学习率太高或轮次太多,把通用能力训没了;如果格式也没对,先回去查数据格式是否统一。建议保留训练前的版本做对照,用同一批固定问题比一遍。
训练数据要多少条才够用?
看目标:只调输出风格和字段格式,几百条高质量样本就能看到变化;要灌入新的领域知识,量级完全不同,而且更依赖数据质量而不是条数。先在验证集上看趋势,别一上来就堆数据。
训完的模型能不能直接换成 Ollama 里跑?
一般要先合并权重再转成对应格式才能被本地推理工具加载。不同框架的导出流程不一样,建议先拿小模型把整条链路(训练-合并-加载-对话)走通一遍,再上大模型。