ARTICLE DETAIL

资讯详情

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

AI工程能力从零到上线:模型之外的完整流水线

AI工程能力从零到上线:模型之外的完整流水线 去年团队招人的时候我面了不少自称会AI的候选人。简历上都写着精通PyTorch熟悉Transformer问到项目细节大多能讲清楚模型结构、损失函数怎么调的。但只要追问一句你的模型上线之后数据分布变了怎么办大部分人就开始含糊。那一刻我意识到很多人理解的AI其实只是AI工程里最表层的那一层——训练模型。而真实世界里从零开始做一个AI系统真正的功夫全在那条看不见的流水线上。这篇文章想聊的就是从零开始建立AI工程能力的完整路径。不讲抽象理论只讲我这些年带队做AI项目时一个新人从什么都不会到能独立上线一个AI服务到底需要学什么、做什么、踩哪些坑。适合两类人看一类是想转行做AI工程但不知道从哪入手的初学者另一类是已经在做算法、但总觉得工程能力拖后腿的研发同学。1. AI工程和会训练模型之间隔着一整条流水线1.1 为什么准确率95%的模型上不了线我见过太多这样的场景算法同学花了两周训练一个模型离线测试集上准确率95%兴冲冲要部署上线。结果一接入真实流量准确率直接掉到70%。不是模型过拟合那么简单而是模型在离线环境里的舒服和在线环境里的真实之间隔着一整套没人搭起来的基础设施。准确率这个数字本身就有迷惑性。它只回答了模型在固定数据集上表现如何这一个问题。但线上系统的追问是数据分布变了怎么办、单条请求延迟能不能控制在100毫秒以内、模型服务挂了有没有降级方案、特征和训练时对不上要怎么报警。这些问题训练脚本里一个都回答不了。所以我对AI工程的定义很简单它是让模型从能跑变成持续稳定地跑的全部工作。这里面包括了数据处理、实验管理、训练调度、模型评估、推理优化、服务部署、监控告警、数据回流甚至还有成本控制。训练模型只是其中一环而且往往不是最难的一环。1.2 AI工程师的核心职责边界现在行业里对AI工程师的定义其实很混乱。有的公司把它当算法工程师用有的公司把它当后端工程师用还有的期望一个人全栈。以我个人的经验一个合格的AI工程师需要同时具备三种视角算法视角能读懂模型结构的含义知道哪些超参对效果影响大能设计合理的评估方案。不需要你会发明新模型但要能改造和调试现有模型。工程视角能写出干净、可维护、可测试的代码懂得如何把训练和推理流程做成自动化的管线能用工程手段保证系统的稳定性和可复现性。产品视角能判断哪些地方需要AI、哪些地方用规则就够了。AI不是万能的浪费大量算力去做一个简单规则就能解决的问题是对工程资源的犯罪。这三条边界就是AI工程的核心能力地图。接下来所有从零起步的学习安排本质上都是在往这张地图上填充能力。2. 从零起步的第一课先把工程基本功磨利2.1 Python工程能力是最低门槛不是会写for循环就行很多零基础的人学Python学到能跑通MNIST就觉得自己会了。但真正的AI工程对Python的要求远远不止于此。你需要掌握的不只是语法而是用Python构建可靠系统的能力。我个人建议在碰任何深度学习框架之前先用两周时间把这几件事练熟虚拟环境和依赖管理用uv或poetry而不是裸pip。Python依赖地狱是真实存在的AI项目依赖尤其多torch、numpy、transformers这些库之间的版本互相掐架是家常便饭。类型注解写函数时标清楚参数和返回值的类型。AI代码里张量的维度最容易出错类型注解配合IDE的静态检查能在跑模型之前就拦截掉大量低级错误。调试技巧会用pdb和ipdb设置断点会看traceback定位问题而不是到处print。尤其是当你调试一个挂在数据加载环节的bug时断点调试比print高效得多。面向对象编程不需要精通设计模式但要理解类、继承、抽象这几个基本概念。真实的AI工程代码里模型、数据集、训练器都是类看不懂就寸步难行。我把这部分叫做枯燥的必修课。它不性感但决定了你后续能走多快。我见过太多人跳过这一步直接去调模型结果被各种环境问题、依赖冲突、代码结构混乱折磨到怀疑人生。2.2 数据和实验的版本管理你的后悔药模型训练最闹心的问题不是模型不收敛而是所有可能影响结果的因素都在随时间变化。这周跑的结果下周复现不出来换了数据、改了代码、调了超参哪一步导致的效果变化如果没有版本管理你只能靠记忆而人类的记忆在调试AI系统的过程中极其不可靠。所以从零开始学AI工程第二周就应该建立两个习惯。第一个是数据版本管理。Git能管理代码但不擅长管理大文件更不擅长追踪数据集的变化。工具上推荐DVCData Version Control它把数据集、模型文件这些大对象存到远端存储本地硬盘、S3、OSS都行在Git里只保存一个元信息文件。这样你每次实验用的是哪份数据Git记录里一清二楚。# 初始化DVC dvc init # 添加数据目录并跟踪 dvc add data/raw_dataset # 生成.dvc文件并提交到git git add data/raw_dataset.dvc git commit -m feat: add raw dataset version 1.0 # 后续切换数据版本 git checkout commit_hash dvc checkout第二个是实验追踪。推荐MLflow它和框架无关PyTorch、XGBoost、sklearn都能用。每一轮实验记录下来超参是什么、用的哪份数据、代码commit版本、最终指标。坚持记录一个月之后回头看你会发现自己对实验的理解深度完全不同。import mlflow mlflow.set_experiment(sentiment-analysis) with mlflow.start_run(): mlflow.log_param(learning_rate, 1e-4) mlflow.log_param(batch_size, 32) mlflow.log_param(model, bert-base-chinese) # 训练代码... mlflow.log_metric(val_acc, 0.912) mlflow.log_artifact(model.bin)2.3 用GNU Make或Taskfile把流程串起来AI项目的复现不应该靠人肉敲命令更不应该靠先跑这个脚本再跑那个脚本。我见过太多项目复现流程全靠README里一段模糊的描述新人来了根本跑不起来。解决这个问题的最简单办法是用Makefile或Taskfile把整个流程定义成可执行的命令。setup: python -m venv .venv .venv/bin/pip install -r requirements.txt preprocess: python src/preprocess.py --config configs/preprocess.yaml train: python src/train.py --config configs/train.yaml evaluate: python src/evaluate.py --config configs/evaluate.yaml serve: uvicorn src.serve:app --host 0.0.0.0 --port 8000这样做有三个直接好处新人上手成本低、流程自动化和人工干预解耦、每个步骤的参数都固化在配置里而不是记在人脑里。很多从零开始的人会忽略这类工程基建总觉得直接写模型代码才是正经事。但恰恰是这些基建决定了你在项目后期是轻松还是焦头烂额。3. 一张技术栈全景图从数据管线到模型服务3.1 训练侧的标配选型技术栈的选择没有标准答案但有相对稳妥的默认组合。对于从零开始学的人我建议直接在一个主流组合上深耕而不是什么都去试一遍。我的常用组合是这个环节推荐工具理由编程语言PythonAI生态最完善没有之一深度学习框架PyTorch调试友好、生态成熟、业界主流数据处理Pandas PolarsPolars处理大表更快Pandas生态全实验追踪MLflow轻量、易用、自托管没成本数据版本DVC和Git协作自然学习曲线平缓任务编排Docker Makefile本地够用复杂了再上Airflow特征存储Feast训练/线上特征一致性的关键选PyTorch不用纠结现在工业界主流就是它教程多、社区大、什么模型都有官方或非官方的实现。选MLflow做实验管理是因为它没有学习门槛不需要搭集群一条命令就能起服务。工程能力还没成型之前不要给系统引入超过必要程度的复杂度。3.2 推理与部署侧的三个层次模型训练完了怎么让它对外提供服务我把部署方案分成三个层次从零开始的人可以按这个顺序逐步进阶第一层直接把推理逻辑包装成API服务。这是最快能见效果的做法。用FastAPI加载训练好的模型权重暴露一个HTTP接口一个周末就能做出一个能用的demo。缺点是不够稳不支持自动扩缩容适合学习和小型内部工具。第二层容器化部署。把训练好的模型和服务代码打成一个Docker镜像推到容器仓库在服务器上跑起来。Dockerfile写起来并不复杂FROM pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY src/ ./src/ COPY models/ ./models/ EXPOSE 8000 CMD [uvicorn, src.serve:app, --host, 0.0.0.0, --port, 8000]容器化的价值不在于用了新技术而在于环境一致性。你在本地怎么跑的到服务器上就是怎么跑的那些在我机器上能跑啊的扯皮会大大减少。第三层模型服务化框架。当你要追求极致性能比如毫秒级延迟、高吞吐、动态batch就该上Triton Inference Server或vLLM这类专门的推理服务框架了。它们支持多模型管理、GPU优化、动态批处理等能力。这一层是生产级的标配但对于从零开始的人前期不需要碰知道有这个东西、理解它的定位就够了。3.3 可观测性新手最容易忽视的一环AI服务上线之后最糟糕的体验不是准确率低而是系统出了问题你完全不知道。准确率低至少你还知道要优化而系统静默出错才是最可怕的。所以从第一天起就要建立监控意识。核心监控项包括业务指标准确率、召回率、F1这类效果指标。线上真实标签往往有延迟需要用代理指标近似。系统指标延迟、吞吐、GPU利用率、显存占用、QPS。数据质量指标特征缺失率、特征分布偏移程度、请求量的异常波动。这些是模型效果下降的前兆。技术选型上直接用通用的监控体系就好不要自己造轮子。Prometheus负责采集Grafana负责展示告警规则按需配置。AI系统和普通后端服务的差异在于除了监控系统健康还要监控数据分布和模型效果但采集和告警的底层机制是一样的。4. 90天实操路径三个阶段做出可上线的小系统4.1 第1到30天模型要能跑还要能复现第一个30天目标是完成从数据到训练再到评估的完整闭环。选一个不算太大也不算太小的任务比如情感分析、图像分类这些经典入门任务。数据可以从Kaggle或HuggingFace上下载公开数据集不要一上来就碰那些需要自己清洗的商业数据否则你会在数据清理上消耗掉大半时间反而没时间建立核心认知。这30天里要做的事情包括用PyTorch实现一个不需要预训练模型的简单模型比如CNN或LSTM完整跑通训练流程。把训练好的模型存下来torch.save再加载出来做推理。这一步看似简单但很多人到面试时候才发现自己从来没做过模型序列化和反序列化。把整个流程用Makefile固化做到删掉虚拟环境后别人按你的文档能一条命令复现实验结果。每天使用MLflow记录实验。30天之后你会得到一个完整的实验记录表这对理解哪个改动产生了什么效果极其有帮助。这30天里最关键的验收标准就一条关掉电脑睡一觉第二天照着文档能把实验完整复现出来。能复现说明你真正理解了流程不能复现说明你只是碰巧跑通了代码。4.2 第31到60天做一个带完整工程链路的项目第二个30天要拉高难度。目标不只是训练模型而是做一个带API接口、容器包装、基础监控的最小系统。具体做法是基于第一个月训练的模型用FastAPI写一个推理服务然后用Docker打包。如果服务器资源有限本地用Docker Compose或Kubernetes的轻量替代方案比如k3s跑起来也行。添加一个最简单的/health健康检查接口以及一个基础的指标暴露接口。这个阶段你要刻意训练自己处理这些工程细节模型加载放在启动时完成而不是在每个请求里重复加载。推理函数做好batch处理逻辑别让单条请求把GPU利用率拉满。输入数据要做校验和异常处理线上来的数据不会像训练集那么干净。通过环境变量管理配置比如模型路径、GPU编号而不是把路径硬编码在代码里。做完这30天你就拥有了一个麻雀虽小五脏俱全的AI服务。虽然它还很简陋但训练、服务、部署、监控这些最核心的环节你已经全部碰过了。这时候你对AI工程的理解会从一串notebook代码升级成一个系统的概念。4.3 第61到90天接受真实流量的考验最后一个30天建议把系统暴露到真实或近似真实的环境中。如果手头没有业务场景可以直接做一些公开的AI小应用比如部署一个文本生成服务让朋友使用或者接一个公益性质的数据集做实时分类服务。这个阶段核心练三件事第一处理真实输入里的脏数据。你会发现线上来的文本有各种你根本想不到的格式问题全角半角混杂、HTML标签没清干净、用户拿表情符号做输入。你必须给推理服务写足够健壮的预处理逻辑。第二建立评估回流机制。把线上预测的数据记录下来做成一个预测日志库。定期抽样做人工标注统计线上效果和离线评估的差异。这个闭环是后续持续优化的基础也是AI工程和做实验最本质的区别——你有了一条持续迭代的路。第三做性能压测和优化。用locust或hey这类工具对你的API做压力测试看看多少并发下延迟开始恶化。然后针对瓶颈做优化常见手段包括用ONNX导出模型加速推理、开启batch推理、给API加缓存。到这一步你就不再是一个会调模型的人了而是一个能够独立交付AI服务的AI工程师。90天听起来很长但严格执行下来它比漫无目的地刷一年教程要高效得多。5. 上线后才是开始我在生产环境踩过的五个坑5.1 训练与推理行为不一致同一行代码两个结果这是所有AI工程坑里最经典的一个。训练时数据预处理用了一套逻辑部署推理时又写了另一套两者看起来一样实际不一样导致线上效果一塌糊涂。我自己的经历是训练时对文本做了全角转半角但这一步代码藏在训练脚本的数据加载函数里。部署时没有仔细核对直接在上游数据处理里省略了。测试的时候用干净的文本没发现差异一上真实数据效果直接崩掉。排查链路是这样的先是看监控发现线上准确率比离线低15个点然后对比线上和训练时的预处理输出用20条相同的句子分别跑两套代码发现输出果然不一样。最后修复方式很简单——把预处理逻辑抽成独立模块训练和推理共用同一份代码。这个坑的教训不是处理要小心而是架构层面的训练和推理必须共享同一个特征处理代码库。数据科学家写完的特征工程代码不应该在部署时再人工重写一遍。5.2 评估集和线上分布脱节leaderboard满分业务零分这个坑我栽得很惨。当时做一个推荐排序模型离线AUC做到了0.89远超预期。上线后业务指标纹丝不动。后来一查才发现评估集是好几周前的数据线上流量早就因为一次活动变了特征分布。模型在过去的分布上学得很好但现在的数据长什么样它根本没见过。排查是从业务数据反常开始的。我做了特征分布对比把线上抽样数据和训练集的特征分布画在一起看发现有一个关键特征的分桶分布明显偏移。修复方案分两步走第一步建立定时更新的评估集定期用最新数据重新评估模型第二步在监控面板上把核心特征分布随时间的曲线画出来一旦有偏移趋势就预警。这个坑背后的问题其实是模型新鲜度管理。AI系统不是训练一次就结束的数据在变模型也要跟着变。训练和再训练本身就应该是一个自动化流程要有监控指标告诉你现在该重新训练了。5.3 过期依赖杀死了实验结果AI项目的依赖管理极其痛苦。PyTorch的小版本升级、CUDA版本的匹配、numpy的API变更任何一环出了问题表现出来可能不是报错而是训练结果莫名其妙变差。有段时间我的Wide Deep模型离线指标波动很大同一个commit相同超参两次训练结果差了将近1个点。排到后面发现是因为我换了服务器新环境里numpy被装成了新版而某些操作在新版numpy里精度不同。从那之后我立了两条规矩第一所有实验必须在同一个标准镜像里跑镜像里锁死所有依赖版本用torch2.1.0 numpy1.26.4这种方式写死第二凡是能复现不出结果的实验一律视为数据无效不做分析。5.4 GPU显存泄漏隐蔽的周期性雪崩这个坑特别诡异它不立即报错而是让服务每隔几小时崩溃一次。现象是GPU显存使用率曲线像锯齿一样持续上升到达100%后OOM服务重启然后又开始循环。我排查了一个下午从数据加载检查到推理逻辑最后发现问题出在推理服务里的一个循环引用每个请求都会在内存里保留一个不需要的中间张量由于引用关系未释放导致显存被逐步占满。排查方法其实很简单用nvidia-smi -l 1每秒采样显存曲线再用torch.cuda.memory_summary()查看张量分配情况定位到具体是哪个操作在泄漏。修复就是删掉那个多余的引用关系并显式调用torch.cuda.empty_cache()做防御。这个坑的通用启示是AI服务上线前必须做显存稳定性压测。不是跑几个请求看看正确就完事要连续通宵跑一整天同时监控显存曲线的走势。5.5 模型服务雪崩流量一来延迟变抖最后一个坑是性能层面的。模型推理服务刚上线时一切正常延迟稳定在50毫秒。结果某天业务方做活动流量涨了五倍服务瞬间崩溃表现为请求大量超时、延迟从50毫秒跳到了5秒。看监控能发现这不是单点故障而是级联反应流量增大导致GPU排队严重延迟上升某些依赖上游接口也跟着超时超时重试又加重了负载形成雪崩。修复的核心思路是削峰和隔离。第一个措施是在API层做并发控制semaphore限制同时推理的请求数超过阈值的请求直接返回排队提示或快速失败。第二个措施是给推理服务加最大排队长度满了之后新的请求直接拒绝而不是堵在队列里越积越多。做这两个措施之后系统在最坏情况下也能保证有限的吞吐而不是整体瘫痪。再后来我上了动态batch多个请求拼成一个大batch一次性推理吞吐提了接近一倍。这是Triton这类框架内置能力的价值所在也是为什么生产级部署都推荐用它。老实说这五个坑只是AI工程世界里很小的一部分。但你会发现一个规律每个坑背后的问题都不是模型本身的问题而是系统没有形成闭环。没有数据回流就没有优化依据没有监控就没有发现问题的眼睛没有共享代码库就埋下了训练和推理不一致的种子。如果你打算从零开始走这条路径我想给你一个超出技术层面的建议动手做项目时刻意给自己制造问题。别老是一帆风顺故意把数据弄脏一点、故意把服务暴露在不可靠的网络里、故意不设监控跑几天。这些问题越早遇到你成长的速度越快。我招人的时候比起一个简历上写着精通各种框架的人更愿意要一个能讲清楚我在生产环境里踩过什么坑、后来怎么解决的的人。AI工程不是知识的堆积而是经验的沉淀。希望这些内容能让你真正动手去搭第一套流水线而不是停留在收藏夹里。
返回列表