很多人搜「自己训练模型」,第一反应是打开教程复制训练脚本,结果数据没整理好、显存不够、报错看不懂,跑到一半就停了。这篇不讲概念科普,按真实做事顺序走一遍:先定任务和数据格式,再算自己要多少显存和几张卡,然后训练、评测、量化、部署。每一步给你判断标准和该去站内哪一页核数字。
很多人搜「自己训练模型」,第一反应是打开教程复制训练脚本,结果数据没整理好、显存不够、报错看不懂,跑到一半就停了。这篇文章不讲概念科普,按真实做事顺序走一遍:先定任务和数据格式,再算自己要多少显存和几张卡,然后训练、评测、量化、部署。每一步都给你判断标准和该去站内哪一页核数字。
需要先说明一点:这篇适合「想自己跑通一个具体任务」的开发者,不适合正在做大规模预训练研究的团队。如果你只是想让模型认得自己业务里的几百条样本,或者把开源模型调成能回答特定问题的样子,下面这套流程基本够用。反过来,如果你的目标是从零训练一个通用大模型,那第一关是算力和数据量级,不是写代码,建议先去站内算力页面把账算清再决定要不要走这条路。
第一步不是写代码,是把任务砍到能跑完
新手最容易犯的错,是把「训练一个 AI 模型」当成一个动作。实际上从头预训练和拿开源权重做微调,中间差着好几个量级的 data 和算力。你先要明确自己属于哪一类:如果是要让模型学会一件具体的事,比如判断工单属于哪个部门、从合同里抽金额,那就是微调;如果是要它学会一类语言的通用规律,那才叫预训练,后者基本不是个人开发者能独立跑完的。
- 先分清你要的是从头预训练、还是拿开源权重做微调,两者数据量和算力差好几个量级,新手别一上来就想预训练
- 把任务收敛成一个可判对错的形态:分类、抽取、问答,输出格式先定死,后面数据标注和评测都靠它
- 准备一份 20-50 条的人工小样本作为「金标」,它不参与训练,只用来最后验效果
- 写下两句话:输入长什么样,输出长什么样。写不出来就说明任务还没定清楚,别往下走
- 从头预训练
- 自己定网络结构、自己准备海量文本、自己从随机权重开始训,算法和数据门槛都高,个人一般跑不动
- 微调
- 拿现成的开源权重,用你自己的小数据集继续训练,让它适配某个具体任务,是入门最现实的路径
- 金标小样本
- 一份人工精心标好的、不参与训练的小数据,专门用来最后人工验效果,相当于你的「标准答案」
数据准备:格式、切分和清洗三件事
训练跑不起来,九成问题出在数据这一步,而不是模型结构。格式先对齐训练框架认的样子,比如主流做法是一行一条 JSON,字段名统一成 input 和 output,编码统一成 UTF-8,换行符统一成 \n。这些细节看起来小,但一个中文字符编码不对、一个隐藏的回车符,就能让训练脚本在第一轮就崩掉。
切分要一次切好,别事后从训练集里捞数据去补测试集,那等于漏题。具体切分比例和分层抽样的思路,去 /guides/train-val-test-split-ratio 看当时的说明。清洗优先级是:先去重复样本,再去超长样本。重复样本会让模型背答案而不是学规律;超长样本会直接把显存撑爆,而且往往只占样本总数的很小一部分,删掉几乎不影响效果。
| 检查项 | 合格标准 | 不合格会怎样 |
|---|---|---|
| 字段名 | 和训练脚本里的配置完全一致 | 脚本读不到字段,直接报 KeyError |
| 编码 | 全部 UTF-8,无 BOM | 中文变成乱码,模型学的是乱码而不是文字 |
| 换行符 | 统一成 \n,不混用 \r\n | 解析时多出空行或半个字段,训练数据错位 |
| 重复样本 | 去重后同一条只出现一次 | 模型背答案,测试集上表现虚高 |
| 超长样本 | 按最大长度截断或删除 | 显存溢出,训练直接中断 |
- 统一成训练框架认的格式(比如 jsonl 一行一条),字段名、编码、换行符先对齐,脏数据九成问题出在这一步
- 训练集、验证集、测试集一次切开、别事后漏数据
- 清洗优先丢掉重复样本和超长样本,重复样本会让模型背答案,超长样本直接撑爆显存
- 数据里带版权或个人信息的部分先做脱敏和来源确认,别等训练完再补
- 洗完数据后随机抽几条肉眼过一遍,确认没有明显的标注错误
环境与算力:先用显存倒推,再决定租还是买
别先问「我要买几张卡」,先问「我的模型和批量大小要多少显存」。显存估算的粗略思路是:参数量、精度、批量大小、优化器状态四项相乘,微调比推理吃得多,因为优化器还要存一份状态。具体到你的模型和批量,去 /models/deploy 的部署测算页按当时的数字算一遍,别凭感觉报卡。
算出来显存之后,再决定租还是买。小额试跑、验证流程能不能走通,按量租最划算;如果确定要长期跑同一套任务,再去比较租用和自购的成本。站内 /compute/sizing 和 /compute/gpu-rental 两页有当时的算力规格和租赁对比,按你估算出的卡数去核对,不要直接拿别人教程里的配置抄。
- 固定环境把 Python 版本、CUDA 版本、框架版本写进 requirements 文件,换机器时能一次复现。版本之间不匹配是新手最常见的报错来源。
- 先用小模型跑通数据量不大、只是想验证流程能不能走通,先把模型降到能跑起来的最小规模,确认数据读入、训练、保存、加载这一整条链路都通了,再换大模型。
- 按量租跑首次训练第一次训练用按量租的机器,跑完就释放,成本可控。跑通了、确认需要长期占用,再考虑包月或自购。
- 记录算力账把这次训练用了什么卡、跑了多久、峰值显存多少记下来,下次估同类任务就有参照,而不是重新猜一遍。
训练循环:盯着三条曲线,别盯最终指标
很多人训练时只盯着最终那个数字,涨了就高兴,跌了就慌。实际上真正要盯的是三条曲线:训练损失、验证损失、学习率。训练损失持续下降是正常的;验证损失如果先降后升,那就是过拟合的信号,先考虑加数据或者提前停止,而不是继续跑。学习率太大,损失会震荡甚至发散;太小,下降慢到看不出变化。
批量大小和学习率是一对参数,改一个另一个通常要跟着调。盲目把批量调大会直接显存溢出,把学习率调大可能导致训练发散。新手稳妥的做法是:先用默认值跑通一轮,确认数据没问题,再小幅调其中一个,每次只动一个变量,并记录改动前后的曲线。
- 训练损失、验证损失、学习率三条曲线一起看,验证损失开始回升就是过拟合信号
- 批量大小和学习率是一对,改一个另一个通常要跟着调,盲目调大会直接显存溢出或训练发散
- 日志里固定记录每轮的损失和耗时,方便回看是哪次改动让效果变差
- 训练中途存 checkpoint,按固定间隔存而不是只存最后一版
- 每次只改一个变量,并记录改动前后的曲线,否则出了问题不知道是谁的锅
| 现象 | 最可能的原因 | 先做什么 |
|---|---|---|
| 训练损失不降 | 学习率太小或数据格式错位 | 先随机抽几条数据看模型到底读到了什么 |
| 验证损失回升 | 过拟合 | 加数据、提前停止或加正则化 |
| 损失震荡剧烈 | 学习率太大 | 把学习率降一档再跑一轮 |
| 直接显存溢出 | 批量太大或样本超长 | 降批量,同时检查有没有超长样本 |
评测与排错:先定位是数据问题还是模型问题
训练跑完不等于做完了。先用开头那份金标小样本人工跑一遍,看错例。错例的共性往往指向数据标注不一致,比如同一类问题在不同样本里标成了不同答案,而不是模型本身不行。这一步是很多人省掉的,省掉的结果就是反复换模型、换超参,但问题一直在数据里。
如果训练集表现好、测试集表现差,通常是数据分布不一致或者过拟合。这种「训练集效果好测试集差」的排查思路,去 /guides/train-test-gap-overfitting 看当时的整理。指标没涨的时候,别急着换模型,按「数据 → 超参 → 模型规模」的顺序排查,越靠前越便宜,也越可能是真正的原因。评测口径要固定,每次换模型都用同一套样本和同一套判分规则,否则前后对比没有意义。
- 用开头那份金标小样本跑一遍,人工看错例,错例的共性往往指向数据标注不一致
- 训练集好、测试集差,通常是数据分布不一致或过拟合
- 指标没涨先别换模型,按「数据 -> 超参 -> 模型规模」的顺序排查
- 评测口径要固定,每次换模型都用同一套样本和同一套判分规则
- 把每次评测的样本、判分规则、结果记下来,形成自己的评测台账
量化与导出:把训练结果变成能部署的格式
训练出来的权重,不一定是推理端能直接读的格式。先确定推理端用什么框架,再选导出格式,顺序反了后面部署时还得回炉重做。常见导出格式有通用权重格式和推理引擎专用格式,选哪个取决于你的部署环境支持什么。具体导出命令和框架支持情况,去站内工具目录对应页面看当时的说明。
量化是缩小模型体积、降低推理显存的手段,但不是免费的午餐。量化档位怎么挑,要看质量、显存、吞吐三者的取舍,具体档位差异去 /guides/quantization-tier-choice 对照当时的说明。量化之后必须重跑一遍评测,别默认掉一点可以接受,有些任务对精度很敏感,量化后可能直接不能用。模型文件、配置、分词器和说明文档一起归档,版本号写进文件名,方便回退和排查。
| 决策点 | 怎么判断 | 去哪里核对 |
|---|---|---|
| 导出格式 | 看推理端框架支持什么,不是看训练端方便什么 | 站内工具目录相关页面 |
| 量化档位 | 权衡质量、显存、吞吐,任务越敏感越要保守 | /guides/quantization-tier-choice |
| 是否量化 | 显存够就不量化,显存紧张再考虑 | 用部署测算页按当时数字算 |
| 归档方式 | 模型文件、配置、分词器、说明一起打包 | 自己建版本目录,文件名带版本号 |
量化省的是显存,不是省事;省掉的那次评测,后面会在线上加倍还回来。
部署上线:先跑通单请求,再谈并发
部署前先去 /models/deploy 核对显存和并发的关系。同一张卡,并发数不同,吞吐差很多,不是「能跑起来」就等于「能扛住流量」。先用最简单的接口跑通一次请求,确认输入输出格式和预期一致,再考虑加并发、加缓存、加队列。上线后监控延迟和显存占用,延迟突然变高往往不是请求量涨了,而是被别的东西抢了显存。
记得留一条回退路径:新版本效果不稳时能切换回上一版模型文件。这件事做起来很简单,就是归档时别覆盖旧版本,文件名和目录都带版本号。但如果没做,线上出问题时就只能硬扛到修复为止。
- 单请求跑通用最简单的接口发一条请求,确认返回格式、延迟、显存占用都在预期范围内。这一步不通过,不要往下走。
- 压测找瓶颈逐步加并发,观察延迟和显存变化,找到拐点。拐点之后再加并发,延迟会陡增而不是线性变慢。
- 监控上线上线后盯延迟和显存占用两条线。延迟突然变高时,先查是不是有别的进程占了显存,再查请求量。
- 留回退路径旧版本模型文件不删除,接口层留一个切换开关。新版本效果不稳时能切回上一版,不用重新训练。
整条流程走下来,你会发现最耗时间的不是训练本身,而是数据整理和评测排错。这两个环节做扎实了,训练和部署其实是相对机械的部分。反过来,数据没弄干净、评测口径没固定,后面换多少次模型都是在原地打转。
下一步去站内模型目录核对目标模型的上下文、精度和是否支持微调,再回到部署测算页按你的显存和并发重算一遍。这两页的数字是你决定「租几张卡、跑多大模型」的直接依据,不要凭教程里的旧配置拍脑袋。→常见问题
新手到底该从头训练还是微调?
绝大多数场景是微调。从头训练需要的数据量和算力比微调高一个量级以上,而且你很难拿到足够干净的数据。先用开源权重加自己的数据微调跑通全流程,确认这条路走得通、收益也够,再考虑要不要做更重的训练。
用 Python 训练一个模型,最少要会哪些东西?
要会三件事:把数据整理成框架认的格式、看懂训练循环里那几个参数的作用、能读懂报错并定位是数据还是环境问题。框架 API 本身查文档就行,真正卡人的都是数据格式和显存这两类问题。
数据要准备多少才够?
没有通用答案,取决于任务难度和你是微调还是从头训练。实用的做法是先拿几百条跑一轮,看验证集效果和错例类型,再决定是补数据还是改任务定义。补数据前先确认错例是「量不够」还是「标注不一致」。
训练到一半显存不够怎么办?
按顺序试:调小批量大小、开梯度累积、缩短输入长度、上量化或参数高效微调。这几招对效果的损失依次递增,先动最前面那个。如果连第一步都救不回来,说明模型规模和卡不匹配,得换更小的模型或更多卡。
部署时该选哪个推理框架?
看你的场景:单机自己用、要简单省事,轻量框架就够;要多并发、要高吞吐,就得换成面向服务的框架。先用最省事的跑通,等真的压不住再换,别一上来就折腾复杂方案。