ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从零搭建AI工程能力:模型部署、推理优化与持续迭代实战

从零搭建AI工程能力:模型部署、推理优化与持续迭代实战 从零搭建AI工程能力这件事我前前后后折腾了差不多两年。最早的时候我也走过弯路——买了一堆讲Transformer推导的书把注意力机制的公式背得滚瓜烂熟结果真到要上线一个文本分类服务的时候连推理延迟怎么压、显存怎么省、模型版本怎么管都搞不清楚。后来我才慢慢想明白一件事AI工程不是机器学习理论的延伸它是一门独立的工程学科核心矛盾在于“研究态的模型”和“生产态的系统”之间那道巨大的鸿沟。这篇内容就是把我踩过的坑、试过的方案、以及最终沉淀下来的一套从零构建AI工程能力的路径完整地摊开来讲。不管你是刚转方向的算法同学还是想从后端切进AI领域的工程师或者带团队做AI落地的技术负责人应该都能从中找到能直接抄作业的部分。1. 先搞清楚AI工程到底在解决什么问题1.1 模型能跑通和系统能上线之间隔着什么很多人对AI工程的第一个误解是把它等同于“调模型”。我在早期也这么想过觉得只要模型精度够高剩下的都是常规后端活儿。但实际情况是一个在notebook里F1跑到0.92的模型直接搬到线上可能连0.7都保不住甚至根本跑不起来。这中间的差距就是AI工程要填的坑。我把它拆成几个层面来看。第一层是数据层面的一致性训练时用的特征管道和线上推理时的特征管道如果实现方式不同就会出现训练-服务偏差training-serving skew。我见过一个推荐场景离线AUC 0.85上线后CTR几乎没涨排查了两周才发现是线上某个特征做了截断而离线没有。第二层是性能层面训练可以慢慢跑推理不行用户等不了。一个7B参数的模型如果不做量化、不做批处理、不做KV Cache优化单条推理可能要几百毫秒甚至上秒QPS根本上不去。第三层是运维层面模型不是部署完就完事了数据分布会漂移模型会退化你需要监控、需要回滚、需要灰度。所以AI工程的核心命题其实是把不确定性极高的模型包装成一个确定性可用的服务。这句话听起来简单但每一个字背后都是一堆工程决策。1.2 一个合格的AI工程师需要哪几块能力拼图我观察身边做得好的AI工程师能力结构其实相当复合。纯算法出身的人往往在系统设计上偏弱纯后端出身的人又容易低估数据和模型的特异性。我总结下来大概需要这么几块拼图。数据处理与特征工程不是会用pandas就行而是要理解数据管道怎么设计才能保证离线和线上一致特征怎么存储和读取才能兼顾训练吞吐和推理延迟。模型训练与微调知道什么场景该从头训、什么场景该微调、什么场景直接调API就够了。不是所有问题都值得训一个模型。推理优化量化、蒸馏、批处理、缓存、算子融合这些是让模型真正能扛住线上流量的关键。服务化与部署模型怎么打包、怎么版本管理、怎么灰度发布、怎么A/B测试。监控与迭代上线只是开始数据漂移检测、模型性能监控、badcase回流、持续再训练这套闭环才是长期战斗力。这五块拼图里我认为最容易被人忽视的是第一块和第五块。大家往往把注意力放在模型本身但真正决定一个AI系统能不能长期稳定跑的恰恰是数据和监控这两端。1.3 为什么“从零”这个路径反而更适合大多数人市面上讲AI的课程和文章大多是从理论出发的先讲线性回归再讲神经网络再讲Transformer最后提一句部署。但我自己的经验是从工程问题出发倒推着学效率高得多。原因很简单当你带着一个具体问题去学的时候知识的留存率完全不一样。比如你要做一个图片分类服务你会被迫去搞清楚输入图片怎么预处理、模型怎么导出成通用格式、推理引擎怎么选、并发怎么处理。这些问题会倒逼你去理解模型输入输出的形状、算子的兼容性、内存的分配方式。这些理解比单纯看论文推导要扎实得多。“从零”还有一层意思是不依赖重型框架的封装。我建议在早期至少手动实现一遍最核心的流程比如手写一个简单的推理循环、手动管理一次模型版本切换。这样你才知道那些框架帮你做了什么出问题的时候才有排查的方向。等你理解了底层再去用那些高度封装的平台就是如虎添翼而不是被黑盒牵着走。2. 数据管道AI工程里最不性感但最要命的部分2.1 训练-服务偏差是怎么产生的我先讲一个真实踩过的坑。之前做一个文本意图分类的服务离线评估准确率0.91上线后一周监控发现准确率掉到0.78。排查过程很痛苦因为模型没变、代码没变唯一变的是数据来源。最后定位到问题离线训练时文本清洗用的是某个正则表达式把连续空格合并成一个而线上服务在预处理时用的是另一个库的默认分词器它对空格的处理方式不同。就这么一个细节导致线上输入的特征分布和训练时不一致。这就是典型的训练-服务偏差。它的根源在于离线和线上用了两套代码路径来处理同一份数据。要根治这个问题核心原则是特征计算逻辑必须只有一份实现。具体怎么做我推荐两种方案。第一种是特征存储Feature Store把特征计算逻辑统一封装离线和线上都调用同一个接口。第二种更轻量是把预处理逻辑固化进模型本身比如用可以序列化的预处理层让模型文件自带预处理能力。小团队我建议先用第二种成本低、见效快。2.2 特征存储到底该不该上Feature Store这个概念这几年很火但我得说句实话不是所有团队都需要它。我见过一些团队业务量不大硬上了一套Feature Store结果维护成本比收益还高。判断要不要上我一般看三个信号。第一特征复用率高不高。如果多个模型都在用同一批特征那统一管理就有价值。第二团队规模。如果只有一两个人做特征口头对齐就够了没必要上系统。第三实时性要求。如果需要在线实时计算特征且延迟要求严格那Feature Store的在线存储部分就有意义。对于大多数中小团队我的建议是先用约定代码规范的方式过渡所有特征计算逻辑放在一个独立的包里离线和线上都从这个包导入配合单元测试保证一致性。等业务复杂到一定程度再考虑上专门的系统。2.3 数据版本管理别让“这次用的是哪版数据”成为玄学数据版本管理是另一个容易被忽视的点。模型有版本代码有版本但数据往往没有。结果就是三个月后你想复现一个实验结果发现根本不知道当时用的是哪份数据。我的做法是给每次训练用的数据集打上内容哈希而不是简单的日期或序号。因为日期会重复序号会混乱只有内容哈希能唯一标识一份数据。具体操作上可以在数据加载完成后计算一个校验和把它记录到训练配置里。这样任何时候都能通过哈希反查到具体的数据快照。另外原始数据永远不要覆盖。我习惯把原始数据、清洗后数据、特征数据分层存储每一层都保留版本。清洗和特征计算都是可重放的纯函数这样即使中间某一步出了问题也能从原始数据重新跑一遍。2.4 数据质量监控的几个实用指标数据管道上线后必须有监控。我常用的几个指标包括空值率、数值特征的分布偏移比如用PSI或KL散度衡量、类别特征的取值集合变化、样本量突变。其中分布偏移最值得关注。我的经验是当某个关键特征的PSI超过0.2时就要警惕了可能意味着上游数据源发生了变化或者用户行为模式发生了迁移。这时候不一定要立刻重训模型但至少要拉个告警让人去看一眼。提示数据监控的阈值不要拍脑袋定最好基于历史数据的波动范围来设定。我一般会先跑两周只观察不告警看看正常波动有多大再定阈值。3. 模型训练与微调什么时候该自己动手3.1 调用API、微调、从头训练的三层决策这是我在实际项目里被问得最多的问题之一。我的决策框架很简单按成本和需求两个维度来。方案适用场景成本数据需求调用现成API通用任务、快速验证、数据量少最低几乎不需要微调开源模型垂直领域、有标注数据、对延迟和成本敏感中等几百到几万条从头训练有独特架构需求、数据量极大、有充足算力最高百万级以上我的建议是永远从最便宜的方案开始验证。先用API跑通业务闭环确认这个AI能力真的能带来价值再考虑往下走。很多团队一上来就要训自己的模型结果业务还没验证清楚算力和人力已经烧了一大半。3.2 微调时最容易翻车的几个细节微调看起来简单但坑不少。我挑几个最典型的讲。学习率设置。微调的学习率通常要比从头训练小一到两个数量级。我一般从1e-5开始试如果loss不降再往上调。用太大的学习率很容易把预训练学到的知识冲掉出现灾难性遗忘。数据配比。如果你只用自己的领域数据微调模型可能会过拟合到你的数据分布上通用能力下降。我的做法是混入一定比例的通用数据比例大概在10%到30%之间具体看领域数据的规模。这样能在保持领域能力的同时不至于把通用能力丢光。评估集的设计。很多人微调时只看训练loss这是大忌。必须有一个独立的、和训练数据同分布但不同来源的验证集。我甚至建议再准备一个通用能力测试集用来监控微调后通用能力有没有明显退化。序列长度。这个细节容易被忽略。如果你的领域数据普遍很长而预训练模型的默认上下文窗口较短直接微调会导致长样本被截断。要么调整窗口要么做数据切分不能不管。3.3 小样本场景下的几条实用策略现实中很多场景标注数据就是很少几百条甚至几十条。这种情况下硬微调效果往往不好。我常用的策略有几个。第一是提示工程少样本示例。如果用的是支持上下文学习的模型直接在提示里放几个示例往往能拿到不错的效果成本几乎为零。第二是数据增强。文本场景可以用回译、同义词替换、句式改写图像场景可以用裁剪、旋转、颜色抖动。但要注意增强后的数据分布不能偏离真实分布太远。第三是参数高效微调比如只训练一小部分参数或者加低秩适配层。这种方式在数据量少的时候更不容易过拟合而且训练成本低适合快速迭代。第四是主动学习。先用一个基础模型跑一遍未标注数据挑出模型最不确定的样本让人标注这样能用最少的标注量拿到最大的效果提升。我在一个项目里用这个方法只标了300条就把准确率从0.72提到了0.86。3.4 训练过程的可复现性怎么保证可复现性是工程化的基础。我要求自己团队的每次训练都必须满足几个条件随机种子固定、依赖版本锁定、数据版本记录、超参数完整保存、环境用容器固化。其中依赖版本锁定最容易被忽视。Python生态里一个小版本升级就可能改变数值计算结果。我一般用锁文件把整个依赖树固定下来配合容器镜像保证任何时候都能重建出一模一样的环境。随机种子这块要注意不只是Python的random和numpy的seed深度学习框架自己的seed也要设而且如果用了GPU还要考虑CUDA的确定性设置。有些算子默认是非确定性的需要显式开启确定性模式代价是可能慢一点。4. 推理优化让模型真正扛得住线上流量4.1 量化精度和速度的平衡点在哪量化是我认为性价比最高的推理优化手段。它把模型参数从高精度浮点降到低精度整数直接减少内存占用和计算量。常见的方案有几种。量化方案精度损失速度提升适用场景动态量化较小中等CPU推理、快速验证静态量化中等较大对延迟敏感的CPU场景训练后量化中等较大GPU推理、通用场景量化感知训练最小较大对精度要求极高的场景我的经验是大多数场景用训练后量化就够了精度损失通常在1%以内但推理速度能提升2到4倍显存占用能降一半以上。如果量化后精度掉得厉害再考虑量化感知训练但那个成本高不少。有一个细节要注意量化不是万能的。有些模型对量化特别敏感尤其是参数量小的模型量化后精度可能崩掉。所以量化后一定要在验证集上重新评估不能想当然。4.2 批处理与并发吞吐和延迟的取舍批处理是提升吞吐的利器但会增加单条请求的延迟。因为要等一批请求凑齐才能一起推理。这个取舍怎么定取决于业务场景。如果是离线批处理任务那批越大越好吞吐优先。如果是在线实时服务就要控制批的大小和等待时间。我常用的做法是设置一个最大等待窗口比如10毫秒窗口内凑到多少就处理多少窗口结束就立即处理。这样在延迟和吞吐之间取一个平衡。并发方面要注意推理引擎本身的线程模型。有些引擎内部已经做了多线程你再在外面套一层多进程反而会因为资源竞争导致性能下降。我一般会先压测找到最优的并发配置而不是拍脑袋设。4.3 缓存策略哪些请求值得缓存缓存是另一个提升有效吞吐的手段。但不是所有请求都值得缓存。我的判断标准是请求的重复率高不高且结果对时间不敏感。比如一个FAQ问答服务用户问的问题高度重复那缓存命中率就很高效果显著。但如果是一个个性化推荐每个用户的请求都不一样缓存就没意义。缓存还要注意失效策略。模型更新后旧缓存必须清掉否则会返回过期结果。我一般用模型版本号作为缓存key的一部分模型一更新key就变了自然失效。4.4 推理引擎选型的几个考量维度推理引擎的选择直接影响性能和开发效率。我一般从几个维度考量硬件支持、模型格式兼容性、社区活跃度、部署复杂度、性能表现。对于GPU场景主流的引擎在性能上差距其实没有想象中那么大更多是生态和易用性的差异。对于CPU场景不同引擎的优化程度差别就比较明显了需要实际压测。我的建议是不要过早锁定引擎。先把模型导出成通用的中间格式这样可以在不同引擎之间切换。等业务稳定了再针对性地做深度优化。注意推理引擎的版本和模型格式的版本要匹配。我踩过一次坑引擎升级后旧模型加载失败排查了半天才发现是格式版本不兼容。所以升级引擎前一定要在测试环境验证。5. 服务化与部署把模型变成可靠的服务5.1 模型服务的基本架构长什么样一个典型的模型服务我一般会拆成几层。最底层是推理运行时负责加载模型、执行推理。往上是服务层处理请求解析、批处理、超时控制。再往上是路由层负责版本管理、灰度、负载均衡。最外面是网关层处理鉴权、限流、日志。这个分层的好处是职责清晰便于独立扩展。比如推理运行时是计算密集型的可以单独扩容网关层是IO密集型的可以独立部署。对于小团队我建议先用单体架构快速上线把模型和HTTP服务打包在一起。等流量上来了再把推理部分拆出来做独立服务。不要一上来就搞微服务维护成本太高。5.2 模型版本管理与灰度发布模型版本管理我坚持一个原则任何一次模型更新都必须可回滚。具体做法是每个模型版本都有唯一标识部署时新版本和旧版本并存通过路由规则控制流量分配。灰度发布我一般分几步走。先内部测试用真实流量的一小部分比如1%验证。观察一段时间没问题后逐步放量到10%、50%、100%。每一步都要有明确的观察指标和回滚条件。回滚条件要提前定好不能等出问题了再临时决定。我常用的回滚触发条件包括错误率超过阈值、延迟超过阈值、核心业务指标下降超过阈值。一旦触发自动回滚不需要人工介入。5.3 A/B测试在AI服务里的特殊之处A/B测试在普通后端服务里很成熟但在AI服务里有几个特殊点。第一模型效果有延迟性。比如推荐模型用户点了没点可能要过一段时间才能观察到。所以A/B测试的观察窗口要足够长。第二模型之间有相互影响。如果两个模型共享底层特征或资源一个模型的变化可能影响另一个。所以实验设计要考虑隔离性。第三冷启动问题。新模型上线初期可能因为没积累够数据而表现不佳这时候不能急着下结论。我一般会设置一个预热期预热期内的数据不纳入评估。5.4 资源调度与成本控制AI服务的成本大头在算力。控制成本的手段有几个。弹性伸缩是最直接的根据流量自动调整实例数。但要注意冷启动时间模型加载慢的话扩容跟不上流量突增。混合部署是另一个思路把不同优先级的任务混在一起跑提高资源利用率。比如在线推理和离线批处理共享GPU离线任务用低优先级在线任务来了就抢占。模型分级也有效。不是所有请求都需要大模型简单的请求用小模型处理复杂的才走大模型。这样能显著降低平均成本。6. 监控与持续迭代上线只是开始6.1 模型性能监控该看哪些指标模型上线后监控分两个层面。系统层面看QPS、延迟、错误率、资源利用率这些和普通服务一样。模型层面要看预测分布的偏移、置信度的变化、以及业务指标的变化。预测分布偏移是我最看重的指标。如果模型输出的类别分布突然变化往往意味着输入数据变了或者模型出了问题。我一般会监控输出分布的KL散度超过阈值就告警。置信度也值得关注。如果模型平均置信度持续下降说明它遇到的样本越来越“陌生”可能需要重新训练了。6.2 数据漂移检测的落地方法数据漂移检测我一般从输入特征和输出预测两头做。输入侧对每个关键特征计算分布统计量和训练时的基准分布对比。数值特征用PSI或KS检验类别特征用新出现的取值比例。输出侧监控预测类别的分布变化。检测频率上离线服务可以每天跑一次在线服务可以按小时甚至更细粒度。但要注意漂移不一定是坏事也可能是业务正常变化。所以检测到漂移后要结合业务判断而不是无脑重训。6.3 Badcase回流与再训练闭环Badcase是模型迭代最宝贵的资源。我要求团队建立一套自动化的badcase收集机制线上预测置信度低的、用户反馈错误的、人工抽检发现问题的都自动进入badcase池。然后定期对badcase做分析归类问题类型。是数据问题、模型问题、还是业务理解问题。针对性地补充标注数据加入下一轮训练。这个闭环跑起来后模型迭代就有了持续的动力。我见过做得好的团队每周都能跑一轮小迭代模型效果稳步提升。6.4 从监控到自动再训练的完整链路再往上一层是把监控和训练打通做自动再训练。当漂移检测触发、或者badcase积累到一定量、或者定时周期到了自动触发训练流程。但自动再训练有几个前提。训练流程必须完全自动化从数据拉取到模型评估到部署不能有人工环节。评估必须严格新模型要在多个维度上不劣于旧模型才能上线。回滚必须可靠一旦新模型表现不好能快速切回旧版本。我建议自动再训练先从半自动开始训练自动跑但上线前人工确认。等流程稳定了再逐步放开。7. 我在这条路上踩过的几个印象深刻的坑7.1 一个特征不一致导致的线上事故前面提过训练-服务偏差这里展开讲一个具体案例。当时做一个风控模型离线评估各项指标都很好。上线后第一天就发现误杀率异常高。排查了整整三天最后发现是时间特征的时区问题。离线数据用的是UTC时间线上服务用的是本地时间差了8小时。结果模型看到的“凌晨交易”特征在线上变成了“白天交易”判断逻辑完全错乱。这个坑的教训是任何涉及时间、编码、单位的特征都要在离线和线上做一致性校验。我后来养成了一个习惯上线前会写一个脚本用同一批样本分别跑离线和线上的特征计算逐字段对比不一致就报错。7.2 模型加载慢导致的扩容失效还有一次服务流量突增自动扩容触发了但新实例迟迟起不来。查下来是模型文件太大加载要几分钟。扩容的速度赶不上流量增长的速度结果服务被打挂了。后来我做了几个改进。一是模型文件做精简去掉训练相关的冗余信息。二是预热机制新实例启动后先加载模型再接入流量。三是预留缓冲实例平时就多留一两个实例应对突发流量。7.3 过度依赖单一评估指标的教训早期我特别迷信准确率觉得准确率高就是好模型。后来做一个类别极不平衡的场景正样本只占1%模型全预测负类准确率99%但完全没用。从那以后我评估模型一定看多个指标精确率、召回率、F1、AUC还要看混淆矩阵和分桶表现。特别是分桶能发现模型在某些子群体上表现特别差的问题这在整体指标上是看不出来的。7.4 忽略推理成本导致的预算超支有一次做图像识别服务模型选了个精度最高的没太考虑推理成本。结果上线后GPU账单远超预算。后来做了量化、换了更轻量的模型架构、加了缓存成本降了七成多精度只掉了不到一个点。这件事让我明白AI工程里精度不是唯一目标成本、延迟、精度要一起权衡。很多时候牺牲一点点精度换取大幅的成本下降是完全值得的。8. 给不同阶段从业者的进阶建议8.1 刚入门的人应该先补哪块如果你刚进入这个领域我建议先把一个完整的服务跑通哪怕模型很简单。从数据准备、模型训练、导出、部署、到监控完整走一遍。这个过程会让你对全貌有认知知道每个环节大概在干什么。然后挑一个环节深入。我建议从推理优化入手因为这块最工程化也最容易看到效果。把量化、批处理、缓存这几个手段玩熟你对模型和硬件的理解会上一个台阶。8.2 有一定基础后如何突破瓶颈如果你已经能独立完成AI服务的搭建想再往上走我建议往系统设计和成本优化两个方向发力。系统设计方面多思考高可用、可扩展、可观测这三个词在AI场景下的具体含义。比如模型服务怎么做多活、怎么做流量调度、怎么做故障隔离。成本优化方面深入理解硬件特性和模型特性的匹配。什么模型适合什么硬件怎么压榨硬件性能怎么在精度和成本之间找最优解。这块做得好能给团队省下真金白银。8.3 团队负责人该关注哪些工程能力建设如果你是带团队的我建议重点建设三样东西。一是标准化的流程从数据到训练到部署每个环节都有规范减少人为失误。二是自动化的工具链把重复劳动自动化让工程师专注在创造性工作上。三是可观测的体系让问题能被及时发现和定位。还有一点很重要培养团队的工程审美。什么叫好的AI工程不是用了多新的技术而是系统稳定、迭代高效、成本可控。这个价值观要自上而下地传递。8.4 这个领域未来值得关注的方向从工程角度看我觉得几个方向值得关注。一是推理效率的持续优化硬件和算法都在快速演进这块空间还很大。二是AI系统的可观测性随着模型越来越复杂怎么理解和调试模型行为是个大问题。三是端侧部署把AI能力放到终端设备上对隐私和延迟都有好处但工程挑战也不小。不管方向怎么变扎实的工程基本功永远是立身之本。数据管道、服务架构、性能优化、监控体系这些底层能力不会过时。最后分享一个我自己的习惯每做完一个项目我都会写一份复盘文档记录当时的技术选型理由、遇到的问题、以及如果重来会怎么做。这份文档过一段时间再看往往会有新的收获。AI工程这个领域变化快但很多底层的工程原则是相通的把这些原则沉淀下来比追逐每一个新技术更重要。
返回列表