ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零开始AI工程:数据、建模、训练到部署的完整实战路线

从零开始AI工程:数据、建模、训练到部署的完整实战路线 1. 先搞清楚从零开始意味着什么不是让你手写Transformer我和不少想转AI工程的朋友聊过大家第一反应几乎都是同一个问题那我是不是得先把Transformer的源码手写一遍这个想法不能算错但它非常容易把真正该做的事带偏。我自己从最早拿开源模型跑Demo到后来独立负责一条从数据采集、模型训练到线上服务的完整链路最大的感悟是AI-engineering-from-scratch这件事不是让你重复造轮子而是让你在没有现成答案的前提下依然能把一个AI系统搭起来、跑起来、坏掉了还能修好。这篇文章就是想把这条路上的关键节点、真实坑位和决策逻辑摊开来讲清楚适合那些准备认真进入AI工程领域、但还没形成完整路线图的人。1.1 从零开始其实有三个层次大部分人卡在第一个我观察下来从零开始至少可以拆成三个层次。第一层是复现层从线性代数和反向传播开始手动实现逻辑回归、MLP再到手写一个简化版Transformer的训练过程。这个层次的价值主要在理解原理搞明白梯度从哪来、到哪去但如果你把它当成日常工作的主要方式效率会低到让人崩溃。第二层是组装层也是绝大多数AI工程实际在做的事情用成熟的数据处理工具清洗语料用PyTorch或TensorFlow训练已有架构用HuggingFace上的开源模型做微调用Ray或Celery搭推理服务。这个层次需要的能力不再是从0到1发明算法而是判断在什么场景下用什么组件出了问题能在哪里排查。第三层是设计层当你足够熟悉前两个层次之后才有资格针对特定业务场景去设计自己的数据处理策略、模型结构变体和评估指标。前三层没有严格的先后顺序但大多数人卡在第一层下不来总觉得原理没学透就不配动手。我见过太多人花两个月手写反向传播却连一个真实的数据集都没跑通过。1.2 AI工程师和算法工程师的边界你要对系统负责这里想纠正一个常见的岗位认知偏差。算法工程师的核心交付物往往是模型效果目标是在离线评测集上把指标做到某个阈值。而AI工程师的核心交付物是系统稳定性你要回答的问题是数据变了模型会不会崩请求高峰时推理延迟会不会抖动坏样本进来之后兜底逻辑能不能接住换句话说AI工程师更像是一个把算法变成靠谱服务的角色。两年前我接手一个文本分类项目时离线F1已经做到了0.93看起来很不错。结果上线第一周就事故频发线上流量里混进了大量表情符号乱码和超长文本预处理管线没有兜底直接把模型输入维度撑爆服务进程一个接一个地OOM。那一刻我才意识到模型只占整个系统的一小部分真正的工程含量全在那些没人注意的地方。2. 数据工程最容易被跳过的地基决定了你后面所有工作的上限很多人一说AI工程就想到模型结构、训练技巧但在真实项目里数据工程往往吃掉60%以上的时间。这听起来不酷却是一个AI系统成败的分水岭。我见过一个团队花了三个月调模型最后发现问题根源是训练数据和评估数据来自同一个采集管道连脏数据的分布都一模一样——模型看起来很好一到新环境就全面崩塌。2.1 数据收集与清洗先定规则再写代码数据收集的第一步不是写爬虫或者拉API而是想清楚我要解决什么问题问题需要什么样的数据。举个例子如果你要做一个电商评论的情感分类模型那你的语料至少要覆盖不同商品类目、不同评价星级、不同表达风格好评、差评、阴阳怪气的中评最好还要包含不同长度的文本。在这个阶段我最常用的方法是一边人工浏览500到1000条样本一边记录观察到的pattern。这不是浪费时间这些pattern会直接变成后续清洗规则和标注规范的基础。清洗阶段有几个容易踩的坑我逐一说明。去重要去到语义级。普通的字符串去重只能去掉完全相同的文本但电商评论里大量存在同一用户在不同商品下复制粘贴同一段话的行为。我当时用了一个简单方案先做归一化去掉标点、全角转半角、统一数字和英文大小写再对归一化后的文本计算SimHash海明距离小于3的视为重复效果比严格去重好得多。长度过滤要有下限更要有上限。过短的文本少于5个字符往往信息量不足过长的文本超过512个token在后续建模时要么被截断要么需要特殊处理。与其在模型层头疼不如在清洗阶段就定好边界。语言识别不能忽略。中文项目里的数据经常混入英文、日文甚至乱码。用fastText的language identification做一个粗过滤能省掉很多下游麻烦。2.2 标注体系宁可慢也要先建立一致的标注规范数据标注是另一块容易被低估的工作。第一次带标注项目时我犯过一个经典错误直接拉来三个人开标每人标了500条之后一看两两之间的一致率只有68%。这意味着模型的所谓真实标签本身就包含了大量噪声。后来我学到一个有效但看起来低效的做法先让所有人一起标50条逐条讨论分歧点把标注规范写成一页纸的标准文档。比如讽刺语气算正面还是负面这是一个常见的模糊点必须提前约定。达成一致后再进入正式标注环节同时从已标注数据中随机抽取10%进行双人重标用Cohens Kappa监控一致性。经验准则是Kappa低于0.8时先别急着进入训练阶段回去补规范。我习惯在标注数据里故意插入5%的已知答案样本作为陷阱题如果标注员的正确率低于95%说明标注质量不稳定需要沟通或换人。这个办法虽然简单但特别管用。数据管线的目标应该是模型训练时你不需要怀疑数据是错的线上出问题时你的第一反应不是怀疑数据管线的某个环节是不是有bug。能让团队达到这种信任状态数据工程就算及格了。3. 建模路线先建立最小可行基线再去追大模型建模阶段最常见的误区是一上来就选中一个超大参数量的模型仿佛模型越大效果越好。其实一个AI项目的建模节奏应该是从最简单的基线开始明确效果的上界和下界再用更复杂的模型去替换需要提升的那一部分。这套逻辑不是保守而是能让你清楚地知道效果提升到底来自模型、数据还是运气。3.1 跑通一个最简基线追求能跑不追求好用一个文本分类项目最简基线通常包含三样东西词向量或者干脆用TF-IDF、一个逻辑回归分类器、一段几百行的训练脚本。我为什么推荐这个组合因为它训练速度快几百条数据几十秒完事、可解释性强每个词对应的权重可以直接查出来、几乎没有调试负担。更重要的一点是基线的存在能让后续所有改动都有参照系。如果TF-IDF加逻辑回归在评测集上F1只有0.72你换一个BERT模型跑到了0.85这是一个可解释、可信赖的提升。但如果没有基线你很难判断一个0.85到底是模型的功劳还是评测集本身太简单。跑基线时的几个实用细节用交叉验证而不是固定切分来评估每次实验固定随机种子否则你无法分辨效果波动是因为模型变好还是因为运气变好训练脚本里把评价指标、数据版本、代码版本一并输出养成实验可追溯的习惯。这些习惯看着不起眼但当你一天跑20组实验的时候有没有它们就是正常工作和一团乱麻的区别。3.2 什么时候该引入预训练模型和微调当基线逻辑回归已经无法带来有效提升你就该考虑引入预训练模型了。选择开源模型这件事我在实践中逐渐形成了一套判断标准按优先级排序是社区活跃度遇到的问题能不能搜到解决方案、显存占用你手里的GPU能不能跑得起、推理延迟线上业务能不能接受这个速度最后才是榜单分数。很多人选了榜单第一名的超大模型结果手里的A100只能跑batch size 1线上延迟还超了3倍最后又灰溜溜换回小模型白白浪费了两周。微调阶段我强烈建议用LoRA这样的参数高效微调方案。它的原理是冻结预训练权重只训练一小部分低秩适配参数显存占用和训练时间都大幅下降。我自己的项目里用LoRA微调一个7B参数模型做意图识别显存从原来全参数微调的40GB以上降到了16GB左右效果差距在评测集上只有不到0.5个点。对绝大多数场景来说这个代价完全值得。另外微调不是过一遍数据那么简单。学习率设置很关键我一般用1e-4到2e-4这个区间起步比预训练阶段的学习率低一到两个数量级避免破坏已学到的知识。数据epoch数控制在1到3之间过多会导致灾难性遗忘——也就是模型学会了新任务却把通用能力忘光了。4. 训练工程显存、损失函数与训练稳定性的实用细节训练工程可能是整个AI工程里经验值含量最高的一部分。很多问题书上写得很清楚但只有真实跑过一次大规模训练你才知道坑在哪。这一节我把自己在训练环节里反复用到的经验和判断依据整理出来。4.1 显存估算不要等OOM了才想起来算显存爆掉是训练阶段最常见的报错之一但很多人处理这个问题的方式是调小batch size再试一次while循环式地碰运气。实际上显存占用是可以提前估算的。一个粗略的计算思路模型参数量为P以fp16存储时每个参数占2字节模型本身占用约2P字节梯度再占2P字节优化器状态如果是AdamW每个参数需要额外的4字节fp32的动量项和方差项加起来又是4P字节。所以一块80GB的A100理论能装下训练状态的参数量上限大约是80 / (2 2 4) ≈ 10B参数。这只是模型参数还没算激活值激活值跟batch size和序列长度直接相关。当你的模型超出单卡显存时优化的优先级应该是先开混合精度amp再考虑梯度累积把大batch拆成小batch分步更新然后才是模型并行策略。梯度累积很容易实现但要注意有效batch size变大了之后学习率也需要相应调整否则收敛速度会异常。我在用梯度累积时一般把学习率随有效batch size线性放大比如单batch更新时学习率是2e-4四倍累积后就试8e-4。4.2 训练不收敛的排查顺序先别急着改模型训练loss不降、指标不动这种问题几乎每个AI工程师都遇到过。我的排查顺序是固定的从最可能是低级错误的地方查起第一步检查数据是否真的进入了模型。很多人以为Loss挂在零附近是好事其实可能是数据没加载对、模型输出恒为常数。我会在训练前打印一个batch的input_ids和对应文本肉眼确认数据和标签对齐。第二步检查标签是否错位。做文本分类时shuffle后的数据如果同步逻辑写错了模型会在随机标签上训练loss会掉得很慢或者根本不掉。这个问题有个明显的特征验证集指标也在原地抖动没有一点点上升趋势。第三步检查损失函数数值是否溢出。用fp16混合精度时logits很大可能导致交叉熵损失出现inf特别是类别数特别多的时候。做法是可以开启loss scaling或者先切成fp32跑100步确认一切正常后再切回混合精度。最后一步才是调学习率、换优化器。学习率如果设得太大loss会一开始就冲上去后面震荡无法收敛太小则loss像乌龟一样蠕动。我习惯在训练最开始跑50步打印学习率-损失曲线如果损失乱跳优先把学习率调小一个数量级如果损失非常平滑地低位徘徊可以适当调大学习率加速收敛。5. 评测闭环没有评估指标的迭代都是自嗨训练完模型很多人就急着部署上线。这是AI工程里最容易翻车的一步。没有一套能真实反映线上表现的评估方法你在离线环境里的所有高指标都可能是幻觉。评测体系要从业务目标反推出来而不是随便找一个人手切出来的数据集测一测了事。5.1 评测集怎么建才不是自欺欺人评测集的质量直接决定你对模型的判断。我见过有人用训练集的切片做评测然后得到99%的准确率这种快乐只持续一天——上线后被真实用户教做人。评测集的建设有几个原则分布要对齐线上真实情况。线上会有多少种长短文本分布、多少口语化表达、多少异常输入评测集里就应该有相应比例的样本。困难样本要有足够占比。如果你的评测集里全是简单句子模型很容易得高分但真正考验模型能力的是那些边界case。我习惯在评测集里加入人工筛选的困难模式子集单独统计分数。评测集一旦确定就不要频繁改动。评测集是衡量模型迭代的标尺标尺总是变来变去你永远不知道这次提升是模型变强了还是标尺变松了。5.2 离线和线上指标不一致最常见的三个原因离线指标很漂亮线上指标一塌糊涂这个问题几乎人人都遇到过。根据我的经验最可能的原因有三个第一线上输入的预处理和训练时不一致。训练数据里你做了繁简体转换、URL移除、emoji处理但线上服务代码里少写了一步模型看到的信息就跟训练时对不上。这个问题的排查方法是把线上真实日志抽样下来用和训练一样的预处理跑一遍看输出跟预想是否一致。第二评测集本身有泄漏。如果训练数据和评测数据存在相同的用户或相同的来源模型学习到的可能是记住这段文本而不是学会分类。查泄漏的办法是算训练集和评测集之间的文本重叠率重叠率超过5%就要认真考虑评测结果的真实性了。第三线上会遇见训练时完全没见过的输入类型。例如训练时全是没有标签噪声的干净文本线上会出现大量带链接的推广文案。这种时候单纯的模型优化解决不了问题需要在系统层做兜底设计——比如构造一个低置信度拒识分支置信度低于阈值的请求直接走人工或默认策略。这个兜底设计在实际项目中通常比换模型更能稳住线上效果。我自己搭建评测闭环时最后还会加一个回归测试步骤每次模型更新都跑一遍历史评测集和历史困难子集确保新模型没有在修复某个问题的同时把另一个能力弄坏了。听起来很简单但大幅减少了线上事故。6. 我踩过的具体坑和现在会走的路线一些实在的经验这一节不讲方法论就讲我实际踩过的坑以及如果让我重新再来一次我会怎么走。每个坑背后都有对应的调整策略你可以拿来做路径规划参考。一个非常典型的错误是刚接触AI工程时用公开数据集训练完一个模型就当项目结束了完全没想过这个模型要运行在什么环境里的问题。我做的第一个小项目就是在Jupyter Notebook里跑通了一个情感分析模型当时的得意劲儿持续到部署环节就没了——写推理服务、做并发控制、处理模型版本更新和回滚这一整套工程能力完全空白。现在的我会把能部署上线作为模型训练完成的真正标准而不是loss降到一个数就算完事。第二个典型错误是只关注模型效果优化忽视了数据漂移监控。上线一段时间后线上数据的分布会随着时间、季节、热点事件变化模型的准确率也会随之浮动。我现在做AI工程的标配是每天用KL散度对比线上输入和训练数据分布的差异一旦漂移超过阈值就自动预警。这个机制救过我很多次因为大部分模型性能下降都不是突发的而是慢慢滑落的等人肉眼发现的时候效果已经烂很久了。第三个错误是把大量时间花在优化一个用户根本没感知的指标上。比如一个文本分类任务的线上反馈其实只跟关键分类是否出错相关我个人却花了一周时间把非关键类别的F1从0.90提到0.93。后来做用户调研才发现这部分效果差异用户完全无感。做工程要以用户可感知的价值为焦点指标的优化顺序应该从影响用户体验最大的项目开始。如果现在让我为真正想从零进入AI工程的人规划一条实际的路径我的建议是第一阶段用1到2周跑通一个最小的端到端项目。选择公开数据集做数据清洗、训练逻辑回归基线、写一个简单的HTTP推理服务把它完整地部署到一台云服务器上哪怕只支撑一个测试请求。这个阶段的目的是打通全链路。第二阶段把模型换成预训练模型微调。体会一下数据规模、显存限制、训练时间、推理延迟这些工程约束是怎么相互作用、又怎么倒逼你做取舍的。第三阶段给自己造一个线上事故。故意在输入数据里加入噪声、模拟突发流量、或者让数据分布突然偏移然后练习排查和修复。这种高压训练能让你的工程手感在短时间内获得质的飞跃。AI工程这条路没有捷径但也不该被手写Transformer这种执念困住。先把系统跑起来再把系统弄明白最后再去深究每一个模块背后的原理。技术会过时但这种从系统视角出发去构建和解决问题的能力才是真正吃香的本事。
返回列表