ARTICLE DETAIL

资讯详情

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

从零开始做AI工程:基础设施到模型服务的完整链路

从零开始做AI工程:基础设施到模型服务的完整链路 我见过太多从零起步的AI项目死法都出奇一致代码在笔记本上跑通了demo演示很顺利一上生产环境就崩。崩溃的原因几乎从来不是模型不够聪明而是整个工程体系根本撑不住真实的数据流、并发请求和迭代节奏。这几年我一直跟团队强调一个观点——AI工程AI Engineering的本质不是从零训练一个模型而是从零搭出基础设施—数据—训练—部署—监控—迭代这条完整的链路。今天这篇就把我从零做AI工程的完整思路摊开来讲。内容包括算力选型、数据工程、训练调优、模型服务化、成本控制这些绕不开的环节也会穿插一些只有亲手踩过坑才总结得出来的经验。适合正准备启动第一个系统级AI项目的工程师、想从算法岗往工程侧延伸的朋友也包括那些已经跑通过几个demo、但始终上不了线的创业团队。如果你是第一次接触这个概念我建议从头读如果你已经在某个环节里挣扎可以直接跳到对应章节。1. 先对齐认知AI工程是系统工程不是训练模型1.1 模型只占20%剩下的80%是什么很多人对AI工程的理解是把PyTorch写熟把模型训到收敛然后把权重文件丢给后端。这是把AI工程窄化成模型训练了。实际情况是一个AI系统从立项到稳定运行模型算法部分通常只占到20%左右的工作量剩下80%都花在数据治理、训练平台、部署链路、监控反馈、成本控制这些不显眼但决定成败的地方。打个比方。你要开一家餐厅菜谱和主厨手艺是核心竞争力但真正决定餐厅能不能持续营业的是供应链、后厨动线、出餐流程、服务团队和财务模型。AI模型就是那道招牌菜AI工程则是整个餐厅的经营体系。菜再好供应链断了、出餐太慢、顾客排队半小时一样关门。所以我在这篇文章开头想先做一件事帮你把AI工程到底在解什么题的坐标系建立起来。如果你带着调参炼丹的预期来读后面很多内容会显得啰嗦如果你认同让模型稳定交付价值才是核心目标那这篇文章的每一个章节都是你迟早要面对的问题。1.2 从零到生产的人工智能工程链路从零开始做一个AI工程链路大致是业务定义 → 数据获取与清洗 → 标注与划分 → 基线模型 → 训练迭代 → 评估与选择 → 模型导出 → 服务化部署 → 线上监控 → 反馈回流 → 再次迭代。这个链路呈飞轮状不是一次走完就算结束的。其中容易被新手忽略的是两端的环节。前端业务定义决定你要解决什么问题、用什么指标衡量成功。很多项目败在对齐不到位模型团队追求loss下降业务方关心用户留存两边聊不到一块。后端反馈回流决定系统能不能随着数据分布变化持续进化。一次成功上线只是起点之后会有数据漂移、badcase回流、模型版本管理等一系列问题等着你。这篇文章的章节排序就是按照这条链路从零到一展开的。你不需要一次性读完再动手完全可以边做边回头查阅但至少在大脑里要清楚任何一个环节出问题整个系统都会卡住。2. 从零起步的算力与基础设施选型2.1 自建机房、云GPU、抢占式实例怎么选算力是AI工程里最花钱也最容易选错的第一站。我见过有人一上来就采购了一整台8卡服务器结果项目做了三个月就停在那吃灰也见过创业团队只靠云上按需实例撑过了从零到十万用户的全过程。选型的核心逻辑不是哪种最好而是你现在处在什么阶段。我自己常用的判断框架是这样的单人开发、还在验证想法阶段优先云GPU按需实例小时计费随时释放避免沉没成本。团队有稳定训练需求、每天都要跑实验可以用包月或预留实例配合抢占式实例跑非关键实验。卡常年满负荷、算力占比稳定超过70%这时候才需要考虑自建或托管机房。有一个容易被忽略的点除了GPU本身还要算上存储和带宽。很多团队卡在数据加载上数据集几十个GB放在普通云盘上每轮训练光读数据就浪费四分之一的时间。SSD云盘和更高的内网带宽虽然单价贵一点但折算到训练时间上往往是划算的。另外算力一旦规模化分配问题就会浮现。谁在用哪张卡、某个实验实际消耗了多少GPU小时、账单怎么拆分这些在只有一两个人的时候无所谓但到了七八个人的团队就会变成管理灾难。建议从第一天就养成记录GPU使用率的习惯后面会轻松很多。2.2 框架选型不是玄学框架选型这个问题每半年就有人拿出来吵一轮。我的结论很简单从零开始的AI工程默认选PyTorch除非你有明确到无法忽视的理由去选别的。PyTorch的优势在于动态图调试友好出错时的堆栈信息贴近源码社区生态几乎覆盖了训练的每个环节——预训练模型库、数据集工具、分布式训练方案都是现成的。你遇到的大多数问题在社区里都能搜到解法。TensorFlow/Keras的优势在生产部署链路成熟如果你所在团队的历史存量都在这个生态里没必要强行迁移。JAX在科学计算和研究场景有优势但工程配套相对需要自己拼装从零起步的团队不推荐拿它当主力。比框架选择更重要的是固定版本。我一度在同一个项目里见过torch 1.13、2.0、2.1三个版本跑不同模块复现一个线上问题要折腾半天。正确的做法是把CUDA版本、PyTorch版本、主要依赖库的精确版本号锁进环境配置文件里任何人拉下来都能还原出完全一致的环境。2.3 环境一致性是团队协作的第一道坎本地能跑服务器崩是我听过最多的求助。原因是绝大多数人把环境配置写在记忆里而不是写进代码里。从零开始我建议至少做到三步第一用容器把训练和推理环境固化第二requirements锁定精确版本不要用范围符号第三基础镜像固定tag不要用latest。这三步听起来简单真正做到位的团队比例比我预想的低很多。容器化还有一个隐藏好处它强制你把代码、数据路径、依赖关系显式化。当模型可以在一套全新环境中30分钟内从零跑起来你的项目就具备了复现能力这是后面所有工程化动作的地基。3. 数据工程才是真正的护城河3.1 先解决数据从哪来能不能用数据获取看起来最简单实际上坑最多。从零起步时你首先要想清楚数据来源的合法边界公开数据集要看协议是否允许商用爬取数据要评估是否涉及个人信息和版权保护的内容企业内部数据要注意脱敏。这些不是法务部门的事一线工程师必须自己有意识地建立红线意识否则项目上线前会让团队陷入被动。数据来源通常有三条路公开数据集、业务埋点、人工采集。公开数据集上手快但往往和真实场景有偏差业务埋点是最佳数据源但前期没有用户量就积累不出规模人工采集质量高但成本大。一个务实策略是先用公开数据集把流程跑通同时开始设计和埋点采集逐步用真实数据替换公共数据。千万别迷信数据越多越好。脏数据带来的负面影响一定大于数据量增加的正面收益。我见过一个文本分类项目加了十万条爬虫数据后效果反而下降查下来发现这些数据里有大量重复、错别字和标签错位模型学到的是噪声不是规律。3.2 清洗与去重的实战一次惨痛教训说一个我自己经历过的案例。早年间做评论情感分析从某平台爬了几万条评论做了简单的字符串去重就开始训练。loss下降很漂亮验证集表现也不错一上线就露馅大量相似评论被判断错用户投诉量飙升。排查了很久最后发现根因是数据去重不到位。字符串完全一样的评论确实去掉了但很多用户把同一句话复制后微调几个字或者在不同话题下发布语义完全相同的评论这些在训练集里以看似不同、实则同源的形式反复出现导致模型对这部分高频模式严重过拟合。从那之后我的数据流水线里必做两步去重精确去重用哈希语义去重用向量化加聚类。具体做法是把每条文本转成embedding向量计算向量之间的相似度把相似度高于阈值比如0.85的样本聚到一起每组只保留一条代表样本。文本领域这个方案效果非常可靠如果是图片或视频数据也可以采用感知哈希加特征向量相似度的组合。数据质量差一个点模型效果可能掉五个点这句话一点不夸张。3.3 标注规范、质检与一致性监督学习绕不开人工标注。很多项目把标注当作外包出去就完事的工作结果数据集里充满了标注员的个人理解偏差同一类样本在不同标注员手里可能被分到不同类别模型在这种混乱标签上训练性能自然上不去。我建议从零开始就建立一套轻量级的标注质量管理流程。第一写清楚标注规范规范里必须有明确的定义、正反例、边界情况和判定规则最好配上可视化示例。第二设置质检抽检环节一般是5%到10%抽检出的错误反馈给标注员修正。第三定期计算标注一致性指标比如Cohens Kappa低于阈值就要回头培训和统一标准。这套流程可能让标注周期变长20%但它给你带来的是干净可靠的训练信号。从工程角度讲先把标注统一性做到健康值再谈模型优化。3.4 给数据集建模版本、血缘与划分很多人对数据集的保管方式就是硬盘里放一个文件夹今天改一版明天再改一版最后根本分不清哪个版本对应哪次训练。代码有版本管理数据集也必须要有。我的实践习惯是在项目内规划一个标准化的数据目录原始数据放raw目录永远只读清洗后放processed目录划分好的训练、验证、测试集放split目录。每次生成数据集时记录生成脚本、数据来源、数据量、标签分布写进一个数据清单文件。这样任何一个时间点你都能回溯出这次模型是用什么数据训出来的对排查线上问题和复现实验结果帮助极大。同时要保留一套固定的测试集用来做不同版本模型的对比评估。这套测试集可以定期更新但要避免用测试集去做训练时的early stopping否则就污染了评估的独立性。测试集是你的底线底裤不能乱动。4. 模型训练与迭代从能跑通到收敛体面4.1 第一个目标不是指标而是链路通畅新手拿到数据后的第一反应通常是直接上大模型、满怀期待地等loss下降。但我的建议正好相反第一次训练要刻意用一个小模型、小批量、极短的epoch数目标只有一个——确认整条训练链路是通的数据加载没有Bug标签和输入对得上损失函数能正常计算梯度能正常回传显存没有泄漏。这个阶段花不了多少时间但能把很多隐患提前暴露。我见过太多人花两小时调了一个大模型结果第500步才发现训练循环把标签写错位了整个实验直接作废。小模型快速冒烟测试成本极低收益率却极高。冒烟测试通过后再切到正式模型和全量数据训练。这时候也不要急着锁定参数先观察前几百步的loss曲线是否在缓慢下降、学习率是否导致loss发散。这些信号是后续调参的起点。4.2 训练日志里到底要记录哪些值我见过不少团队的训练日志只有一行loss其他全靠脑补。排查问题的时候只能靠猜效率极低。我自己训练时一定会记录下面这些字段字段作用train loss确认模型在训练集上是否在学val loss / val metric确认泛化能力防止只看训练loss陷入乐观learning rate确认学习率调度是否正确生效gradient norm判断是否梯度爆炸或消失GPU显存占用判断显存分配是否稳定、是否需要调整batch size每epoch耗时预测整体训练时间、判断是否遇到效率瓶颈token/s或样本/s数据加载、计算之间是否存在瓶颈这些指标全部写入结构化日志配合实验管理工具你才能在不同实验之间做横向对比。光针对loss调参数就像蒙着眼睛开车偶然而又危险。4.3 从过拟合到欠拟合调整顺序怎么排模型训练常见的病有两种欠拟合train loss降不下去和过拟合train loss很低但val loss很高。很多人在调参时没有顺序想到什么调什么效果自然忽好忽坏。我常用的排查顺序是先看train loss是否正常下降。如果train loss根本不降或降得极慢优先检查学习率太高会发散太低会滞涩调参时可以用学习率扫描从1e-4到1e-2间隔几个数量级试一遍。如果train loss降了但val loss高那就是过拟合处理顺序是先增加数据增强或正则化再考虑减小模型容量最后才动网络结构。还要留意loss震荡和不稳定。如果训练过程loss一直在剧烈波动常见诱因是batch size太小或学习率太高。batch size小意味着梯度估计噪声大损失面就波动大此时可以加大batch size、降低学习率或者引入梯度裁剪。从零开始调模型不要指望一步到位。把每一次实验当成一个有记录的观测逐步缩小参数空间最终得到的不是某个参数值而是一个对问题空间的稳定理解。4.4 显存不足与训练加速的几个管用套路显存不够是训练阶段出现频率最高的报错。最快的解法是减小batch size但单纯减小batch size会影响训练稳定性。工程上更成熟的几个方案是梯度累积小batch前向计算、反向累积梯度攒到等效大batch再更新参数。效果上等价于大batch训练显存占用却很小。混合精度训练用FP16计算、FP32存储权重显存占用直接减半多亏GPU架构对半精度的优化训练速度通常还能提升。梯度检查点用重计算换显存训练速度会略降但在超大模型场景下是保命手段。分布式训练是另一个话题。单机多卡用数据并行通常最容易落地模型大到单卡放不下再考虑张量并行、流水线并行。我的建议是先把上面三个单卡时代的技巧用好再考虑分布式。过早引入分布式会让调试复杂度成倍上升得不偿失。5. 模型部署与服务化最后一公里最考验工程力5.1 从checkpoint到可推理的模型训练得到的checkpoint并不能直接扔给后端中间还有模型导出这一步。常见路径是PyTorch模型先转成TorchScript或ONNX格式再由推理框架加载。导出过程中最容易踩的坑是动态形状问题。很多模型在训练时输入是固定的(batch, seq_len, dim)但上线后请求长度各不相同。如果导出时没有声明动态轴推理框架会强制所有输入对齐到固定形状要么报错要么浪费算力。导出前一定要确认模型能处理动态输入或者在服务层做长度分桶。如果追求极致推理性能可以再走一步TensorRT之类的深度优化它会在你的GPU型号上做算子融合和内存复用。但要注意TensorRT的优化结果和硬件型号强绑定换卡就要重新优化。前期建议先用ONNX配合推理框架跑通性能不够时再做深度优化。5.2 API服务化的常见形态同步、异步与批处理模型服务化最朴素的形态是同步请求用户请求进来模型前向推理返回结果。但真实场景里同步推理往往会成为性能瓶颈。GPU最擅长的是批量计算单条请求进去GPU利用率很低延迟高还浪费算力。我在实际项目中通常这样设计在线推理接口做成同步式适合交互延迟敏感的场景离线批量任务用异步队列请求先入队后台批量攒够一定量或等待时间达到阈值再统一推理显著提升吞吐量。还有一条重要原则模型服务要和Web框架解耦。GPU推理进程和Web框架进程分开部署Web层负责鉴权、限流、参数校验GPU层专注推理这样单点故障的影响面才可控。有个真实教训。早期做的一个文本生成服务直接把大模型和前端的HTTP框架揉在一个进程里上线第一天被用户请求打爆GPU显存直接OOM服务一度崩溃。后来改成请求排队加动态batch把单请求OOM变成了稳定的批量流式推理同样的硬件条件下QPS涨了接近五倍。5.3 模型上线前必须想清楚的灰度与兼容模型上线不是把新权重一换就完事。新模型哪怕离线指标更好线上出现badcase的概率依然存在所以必须有灰度发布机制。比较稳妥的做法是新模型先以shadow流量模式跑一段时间复制流量喂给新模型但返回结果不实际影响用户用旧模型的结果做对照评估新模型在真实输入上的表现确认无误后再逐步放开流量。同时要保证历史版本的API兼容模型输出的字段不能突然变化如果确有升级必要API要提供版本字段并给旧版本留出足够的过渡期。回滚预案同样重要。灰度过程中一旦发现问题要能在几分钟内切回旧版本。这就要求模型服务本身是无状态的权重文件、配置、代码分离管理版本切换只是换一个加载路径。5.4 线上监控与反馈闭环模型上线后真正的挑战才刚刚开始。现实世界的数据分布不是静止的用户的用语习惯会变、业务策略会变、季节和热点都会影响输入分布曾经的优秀模型可能悄悄退化。线上监控至少要覆盖这几层推理延迟的p50/p99、请求错误率、GPU利用率和显存水位。比这些更关键的是预测分布漂移。比如一个分类模型原来A类占比40%某天开始A类占比慢慢涨到70%这往往是输入分布已经变了。此时需要用最近一段线上数据重新做评估并把badcase回流到标注和训练循环里。很多团队的AI项目死就死在模型上线即结束。正确的心态是上线是模型服务生命周期的开始永久反馈闭环是它活下去的条件。没有反馈闭环的AI工程就像一块无源之水迟早会干涸。6. 成本控制与团队协作把AI工程变成可持续的事6.1 一张实验账单提前算清楚很多从零开始做AI的团队直到月底收到云账单才意识到成本失控但那时已经晚了。成本控制的第一步是建立一次实验多少钱的心算能力。估算公式很简单单次训练成本 GPU租赁单价 × GPU数量 × 单次实验时长。再乘以你一周要跑的实验次数就能算出两周的技术验证预算。我在规划一个项目时会先把所有预设实验列出来估算总GPU小时数再看预算是否匹配。如果超了优先砍掉的是重复实验和探索性实验而不是砍数据质量。养成这个习惯还有个额外好处它会倒逼你认真设计实验——每次跑之前想清楚验证什么、为什么非跑不可。很多团队跑了大量实验但收获寥寥正是因为实验设计太随意。6.2 用实验管理找回时间和心智从零起步时靠Excel记录实验信息还勉强够用但实验量一旦超过几十组人的记忆和表格都会开始出错上次那个效果最好的模型用的是哪个版本的数据哪次跑出来loss最低但val崩溃当时超参是什么如果不记录下来回头找答案可能要花一整天。我强烈建议即使是小团队也要尽早引入实验管理工具。用MLflow或者轻量的实验记录脚本把每次实验的数据版本、代码commit、超参配置、训练日志、模型产物自动记录下来。这个积少成多的过程会在一个月后把你从翻聊天记录找参数的泥潭中拯救出来。6.3 小团队别急着上大平台先把三件事做对我观察到一种误区团队才三四个人就开始讨论要不要上完整的MLOps平台和复杂流水线。我的建议是小团队从零开始先把三件最基础的事做对第一代码和环境的可复现性容器化加版本锁定第二每次实验有完整记录数据和代码可溯源到同一commit第三一份简洁的部署和回滚文档确保任何一个成员在半小时内能把服务跑起来或切回旧版本。这三件事做到了你的团队已经比大多数项目扎实。至于平台化和自动化流水线等业务复杂度真正上来了再逐步推进才顺理成章。我在实际操作中最深的体会是AI工程和传统软件开发有一个本质差异——前者每一步的结果都有随机性模型不是写完就结束而是需要持续喂养和维护的活系统。从零开始做AI工程最先要接受的就是这种不确定性和迭代节奏然后围绕它设计你的工程体系。很多团队败在没有管理好这种不确定性而不是模型技术不够先进。如果你现在就准备从零起步先把数据、实验记录和反馈闭环这三件事扎扎实实做出来后面的路会好走得多。
返回列表