尧图精选

从零搭建AI工程体系:数据管道、特征工程与模型部署全链路实践

🕒 发布时间:2026/10/2 10:35:00 📁 来源:尧图网络
1. 从零搭建AI工程体系为什么我劝你别一上来就搞模型ai-engineering-from-scratch这个标题乍一看像是又一份从零手搓大模型的教程。但我做了十多年一线工程见过太多团队在这条路上摔跟头所以先把话说在前头从零构建AI工程能力核心不是从零训练一个模型而是从零搭起一套能持续产出、持续迭代、持续兜底的工程体系。这两件事的难度差着数量级搞混了方向团队半年的人力就打了水漂。这个项目标题真正指向的是一个完整的AI工程能力建设路径从数据管道、特征处理、模型训练、评估验证到部署上线、监控告警、迭代回滚。它解决的是团队想用AI但不知道怎么系统性地落地这个问题适合三类人参考一是刚接手AI项目的后端或算法工程师二是想给团队搭建AI基础设施的技术负责人三是想搞清楚AI工程全貌、避免只会在Notebook里跑demo的开发者。我自己带过三个从零起步的AI项目踩过的坑足够写一本小册子。这篇就把从零搭建AI工程体系这件事拆开揉碎讲清楚每一步为什么这么做、怎么做、哪里最容易翻车。全文基于常见工程实践补充了大量细节你可以直接拿去对照自己的项目。2. 整体架构设计先想清楚数据怎么流再谈模型怎么训2.1 为什么从零不等于从模型开始很多人对AI工程的想象是这样的拿到数据选个模型训练上线完事。真实情况是模型训练在整个工程链路里占的时间可能不到20%剩下80%全花在数据准备、特征工程、评估体系、部署运维上。我见过一个团队算法工程师花了两个月调模型把准确率从88%提到91%结果上线后发现线上数据分布和训练数据完全对不上实际效果还不如一个简单的规则系统。所以从零搭建的第一原则是先把数据链路和评估体系搭起来模型是最后一步。数据链路决定了你能拿到什么质量的输入评估体系决定了你能不能判断模型到底行不行。这两样没有模型训得再好也是空中楼阁。具体来说一个完整的AI工程体系应该包含这几层数据层数据采集、清洗、标注、版本管理、存储特征层特征提取、特征存储、特征服务、线上线下一致性训练层实验管理、超参调优、分布式训练、模型版本管理评估层离线评估、在线A/B测试、业务指标对齐服务层模型部署、推理优化、流量管理、灰度发布监控层数据漂移检测、模型性能监控、告警、自动回滚这六层里数据层和评估层是最容易被低估的。我个人的经验是如果预算和人力有限优先把数据层和评估层做扎实训练层可以用现成框架快速搭服务层可以用成熟方案先跑起来。2.2 技术选型的取舍逻辑从零搭建不意味着所有东西都自己写。我见过有团队非要自己实现一个特征存储结果做了三个月还不如直接用开源方案改。选型的核心逻辑是通用能力用成熟方案业务特有逻辑自己写。拿几个关键组件举例组件推荐方案自研场景踩坑提示数据版本管理DVC、LakeFS数据量极大且有特殊合规要求小文件多时DVC性能会崩特征存储Feast、FeastRedis特征逻辑高度业务化线上线下一致性是最大坑实验管理MLflow、WB需要深度集成内部系统元数据存储别用SQLite模型服务Triton、TorchServe有极致性能要求批处理配置要压测监控PrometheusGrafana需要自定义漂移检测指标基数别爆炸这个表里的方案是我实际用过觉得靠谱的但选型没有银弹。比如特征存储如果你的特征逻辑很简单直接用数据库表加缓存就够了上Feast反而是负担。我一般建议团队先用手写方案跑通流程等痛点明确了再引入专门组件。2.3 从零搭建的阶段性目标从零搭建最怕的是一上来就追求大而全。我的建议是分三个阶段第一阶段1-2个月跑通最小闭环。数据能进来、能清洗、能训练一个baseline模型、能部署成一个API、能有基本的监控。这个阶段不要追求性能追求的是能跑通。第二阶段2-4个月补齐工程能力。加上数据版本管理、实验管理、特征存储、A/B测试、自动回滚。这个阶段的目标是能迭代。第三阶段持续优化和规模化。推理性能优化、成本优化、多模型管理、自动化训练流水线。目标是能规模化。我见过太多团队卡在第一阶段就想做第三阶段的事结果什么都没做成。先把闭环跑通哪怕丑一点、慢一点都比画大饼强。3. 数据层搭建AI工程的地基90%的问题出在这里3.1 数据采集与清洗的实操要点数据采集听起来简单做起来全是细节。我拿一个推荐系统的场景举例你需要采集用户行为数据包括曝光、点击、停留时长、购买等。这里第一个坑就是埋点规范。如果埋点字段没有统一规范后面清洗的时候你会面对十几种不同的时间格式、七八种事件命名方式。我的做法是在采集之前先定义一份数据契约Data Contract明确每个字段的名称、类型、取值范围、是否必填。这份契约要写进代码里做校验采集端不符合契约的数据直接拒掉或者打标。这样能保证进入管道的数据至少格式是统一的。清洗环节的常见操作包括去重按业务主键去重注意时间窗口的选择缺失值处理区分真缺失和默认值别一刀切填充异常值处理用分位数或业务规则识别别直接删时间对齐统一时区统一时间粒度注意清洗规则一定要版本化。我踩过的坑是改了清洗逻辑但没记录导致新旧数据混在一起模型效果莫名其妙下降排查了两周才发现是清洗规则变了。3.2 数据版本管理别再用文件名区分数据集了data_v2_final_真的最终版.csv这种命名方式我敢说每个团队都出现过。数据版本管理的核心是让每一次数据变更都可追溯、可复现。DVC是我用得比较多的方案它的思路是用Git管理代码和元数据用对象存储管理实际数据。基本操作流程# 初始化 dvc init # 添加数据 dvc add data/raw/train.csv # 提交元数据 git add data/raw/train.csv.dvc data/raw/.gitignore git commit -m add training data v1 # 推送数据到远程存储 dvc remote add -d storage s3://my-bucket/dvc-store dvc push这样每次数据变更都会生成一个新的.dvc文件和代码版本一一对应。想复现某个实验checkout对应的代码版本dvc pull就能拿到当时的数据。但DVC有个坑小文件多的时候性能极差。如果你的数据是几万个图片文件DVC的add操作会慢到让你怀疑人生。这种情况我建议用LakeFS或者直接上对象存储加清单文件的方式。3.3 数据质量监控上线前必须做的检查数据质量监控是很多团队忽略的环节直到线上出问题才想起来。我一般会在数据管道里加这几类检查完整性检查关键字段的空值率是否超过阈值分布检查数值特征的均值、方差是否在预期范围一致性检查关联表的记录数是否匹配时效性检查数据是否按时到达延迟是否在容忍范围这些检查用Great Expectations或者自己写脚本都行关键是要有告警。我习惯把检查结果写进一个监控表用Grafana做可视化这样一眼就能看出哪天数据有问题。实操心得数据质量检查的阈值不要设得太死。我一开始把空值率阈值设成0.1%结果每天告警几十次后来发现是某个低频字段的正常波动。阈值要根据历史数据的分位数来定比如用P99作为告警线。4. 特征工程与训练体系让模型迭代有章可循4.1 特征存储解决的核心问题特征工程最大的痛点是线上线下不一致。离线训练时用Python算的特征和线上服务时用Java算的特征逻辑稍微有点差异模型效果就会打折扣。特征存储就是来解决这个问题的。Feast是常用的开源方案核心概念是特征视图Feature View和特征服务Feature Service。你定义一次特征计算逻辑离线和在线都用同一份代码。离线用批处理生成历史特征在线用Redis等存储提供低延迟查询。from feast import FeatureView, Field, FileSource from feast.types import Float32, Int64 driver_stats FileSource( pathdata/driver_stats.parquet, timestamp_fieldevent_timestamp, ) driver_stats_fv FeatureView( namedriver_stats, entities[driver_id], ttltimedelta(days1), schema[ Field(nameconv_rate, dtypeFloat32), Field(nameacc_rate, dtypeFloat32), Field(nameavg_daily_trips, dtypeInt64), ], sourcedriver_stats, )但Feast不是万能的。如果你的特征逻辑特别复杂涉及多表join和窗口计算Feast的表达能力可能不够。这种情况我建议用Spark或Flink做特征计算把结果写进特征存储Feast只负责服务层。4.2 实验管理与可复现性模型训练最怕的是这个结果怎么来的不知道。实验管理的目标是让每一次训练都可复现、可对比。MLflow是我用得最多的方案它跟踪四样东西参数、指标、产物、代码版本。每次训练自动记录想对比哪两次实验直接看UI就行。import mlflow mlflow.set_experiment(recommendation-model) with mlflow.start_run(): mlflow.log_params({learning_rate: 0.001, batch_size: 256}) # 训练代码... mlflow.log_metrics({auc: 0.85, loss: 0.32}) mlflow.sklearn.log_model(model, model)这里的关键是记录要全。我见过团队只记录准确率不记录数据版本和超参结果想复现最好的那次实验时发现什么都对不上。我的习惯是除了框架自动记录的还要手动记录数据版本、特征版本、环境依赖版本。注意MLflow的元数据存储别用SQLite。小规模测试没问题一旦多人协作或者实验多了SQLite的并发问题会让你崩溃。直接上PostgreSQL一步到位。4.3 训练流水线的自动化当模型需要定期重训时手动跑脚本就不现实了。训练流水线要解决的是数据更新后自动触发训练、训练完自动评估、评估通过自动部署。我一般用Airflow或者Kubeflow Pipelines来编排。一个典型的训练DAG包含这些步骤数据校验检查新数据质量特征生成计算训练特征模型训练跑训练脚本模型评估在验证集上评估模型对比和当前线上模型对比模型注册通过则注册到模型仓库部署触发通知部署系统每一步都要有失败重试和告警。我踩过的坑是训练任务失败了但没告警结果一周后才发现模型还是旧的。5. 部署、监控与迭代让模型真正产生价值5.1 模型服务化的几种方案对比模型训练出来只是开始怎么把它变成线上服务才是关键。常见的方案有几种方案适用场景优点缺点直接嵌入应用模型小、调用少简单、无网络开销更新要重启应用独立API服务通用场景解耦、易更新网络延迟模型服务器高性能要求批处理、多模型配置复杂Serverless低频调用按需付费冷启动延迟我一般推荐独立API服务起步用FastAPI或Flask包一层模型加载在启动时完成。等性能有要求了再上Triton这类专门的模型服务器。Triton的配置示例# config.pbtxt name: recommendation_model platform: pytorch_libtorch max_batch_size: 128 input [ { name: input_ids data_type: TYPE_INT64 dims: [128] } ] output [ { name: scores data_type: TYPE_FP32 dims: [100] } ]max_batch_size的设置很关键。设太小浪费GPU设太大延迟高。我的经验是先用小batch压测找到延迟和吞吐的平衡点一般设在32到256之间。5.2 监控体系模型上线不是终点模型上线后最怕的是静默失效——模型还在跑但效果已经不行了。监控体系要覆盖三个层面系统层监控QPS、延迟、错误率、资源使用率。这些用PrometheusGrafana标配。数据层监控输入特征的分布是否漂移。常用PSIPopulation Stability Index或KL散度来衡量。PSI超过0.2一般就要警惕了。业务层监控模型的业务指标比如点击率、转化率。这个要和A/B测试结合对比实验组和对照组。我踩过最深的坑是只监控了系统层模型延迟正常、错误率为零但业务指标悄悄掉了15%等发现时已经损失了两周。后来我加了一条规则业务指标连续两小时低于基线就告警。5.3 迭代与回滚机制模型迭代要有节奏不能今天改一版明天改一版。我的做法是灰度发布新模型先接1%流量观察24小时A/B测试灰度没问题后扩到10%做A/B测试跑够统计显著性全量发布A/B测试通过后全量自动回滚监控到业务指标异常自动切回旧模型回滚机制一定要自动化。我见过团队回滚要手动改配置、重启服务等回滚完成用户已经跑光了。自动回滚的触发条件要提前定好比如业务指标5分钟内下降超过10%就触发。实操心得模型版本要保留至少三个。有时候新模型有问题回滚到上一个版本发现上一个版本也有问题这时候还能回到更早的版本。保留三个版本的成本很低但关键时刻能救命。6. 常见问题与排查技巧实录6.1 线上线下效果不一致的排查思路这是AI工程里最经典的问题。排查顺序我一般是这样检查特征一致性拿同一批样本分别走离线和在线特征计算对比结果。差异超过1%就要查。检查数据分布线上数据的分布和训练数据是否一致。用PSI或KS检验。检查预处理逻辑归一化、分桶这些操作线上线下是否用同一套参数。检查模型版本线上加载的模型是不是你以为的那个版本。检查推理代码有没有在推理时做了训练时没做的操作。我遇到过一次排查了三天发现是线上特征计算时把某个类别特征的默认值填错了离线填0线上填-1。这种问题只能靠一致性检查发现。6.2 训练不收敛的常见原因训练不收敛的原因很多我整理了一个速查表现象可能原因排查方法loss不下降学习率太小调大学习率试loss震荡学习率太大调小或加warmuploss变NaN梯度爆炸加梯度裁剪训练集好验证集差过拟合加正则、加数据训练集也差欠拟合加模型容量效果随机波动数据顺序问题打乱数据学习率是最常调的超参。我的经验是从1e-3开始如果loss不降就试1e-2如果震荡就试1e-4。warmup对Transformer类模型特别重要一般设总步数的5%到10%。6.3 推理性能优化的几个方向推理性能直接影响成本和用户体验。优化方向按性价比排序批处理把多个请求攒成一批推理GPU利用率能提升好几倍。但要注意延迟和吞吐的平衡。量化FP32转FP16或INT8速度提升明显精度损失可控。INT8需要校准。模型剪枝去掉不重要的权重模型变小速度变快。算子融合把多个算子合并成一个减少内存访问。缓存对重复请求缓存结果适合推荐这类场景。批处理是最容易见效的。我做过一个实验单条推理延迟20msbatch32时单条平均延迟降到5ms吞吐提升4倍。但batch不能无限大要压测找到拐点。6.4 成本控制的实操经验AI工程的成本主要在GPU和存储上。控制成本的手段GPU利用率监控GPU利用率低于30%就是浪费。用批处理或模型并行提升。存储分层热数据用SSD冷数据用对象存储。训练数据用完就归档。按需训练不是所有模型都需要每天重训。低频模型可以每周或每月。Spot实例训练任务用Spot实例成本能降60%以上但要处理中断。我用Spot实例跑训练配合checkpoint机制中断了从最近的checkpoint恢复。这样成本降了一半多代价是偶尔要重跑。7. 从零搭建的团队协作与工程规范7.1 代码规范与目录结构从零搭建时代码规范要一开始就定好后面改成本很高。我推荐的项目结构project/ ├── data/ # 数据相关 │ ├── raw/ # 原始数据 │ ├── processed/ # 处理后数据 │ └── features/ # 特征定义 ├── src/ │ ├── data/ # 数据处理代码 │ ├── features/ # 特征工程代码 │ ├── models/ # 模型定义 │ ├── training/ # 训练代码 │ ├── evaluation/ # 评估代码 │ └── serving/ # 服务代码 ├── configs/ # 配置文件 ├── tests/ # 测试 ├── notebooks/ # 探索性分析 └── pipelines/ # 流水线定义关键原则是训练和服务代码共享特征逻辑。特征计算代码放在features目录训练和服务都import同一份代码这样能最大程度保证一致性。7.2 环境管理环境不一致是复现失败的主要原因之一。我的做法是用Docker固定基础环境用poetry或conda锁定依赖版本记录CUDA和驱动版本训练和服务用同一套镜像FROM nvidia/cuda:11.8.0-runtime-ubuntu22.04 RUN pip install torch2.0.1 --index-url https://download.pytorch.org/whl/cu118 COPY requirements.txt . RUN pip install -r requirements.txt注意requirements.txt要锁死版本用pip freeze生成。我踩过的坑是没锁版本某天某个依赖自动升级训练结果全变了。7.3 文档与知识沉淀从零搭建的团队文档是命脉。我要求每个模块必须有README模块做什么、怎么用、依赖什么数据字典每个字段的含义、来源、更新频率实验记录每次重要实验的配置和结论故障记录出过什么问题、怎么解决的故障记录特别重要。我维护了一个坑库每次出问题就记一条包括现象、原因、解决方案。新人来了先读坑库能避免80%的重复问题。8. 一些个人体会从零搭建AI工程体系这件事我做了三次每次都有新的教训。最大的体会是工程能力比算法能力更稀缺。能把模型训到SOTA的人不少但能把模型稳定跑在线上、持续迭代、不出事故的人很少。另一个体会是不要追求一步到位。我见过团队花半年搭了一套完美的架构结果业务需求变了架构全废。小步快跑、按需演进才是正道。先跑通闭环再逐步优化每一步都解决当下的真实痛点。最后分享一个我常用的判断标准如果你能在一天内从零复现出线上模型的训练过程并且结果一致那你的AI工程体系就算及格了。这个标准听起来简单但能做到的团队不多。数据版本、特征逻辑、环境依赖、随机种子任何一个环节没管好都复现不出来。把这个标准当成目标你的工程体系会越来越扎实。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →