ARTICLE DETAIL

资讯详情

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

从零搭建AI工程体系:技术选型、数据管线与部署实践全记录

从零搭建AI工程体系:技术选型、数据管线与部署实践全记录 从零搭建一套AI工程体系我走过的路和踩过的坑先说说这个标题的来历。很多人看到“AI工程”第一反应是“又要学一堆算法模型”但我在一线做项目的体会是AI工程真正难的不是模型而是把模型做成一个稳定、可靠、可维护的系统。这个“from scratch”意味着你完全没有历史包袱从环境搭建、数据管线、模型训练、评估调优到部署上线每一环都得自己动手搭一遍。这篇博文就是把我从零开始搭建整套AI工程体系的完整过程、设计思路和踩坑记录写下来适合正在做技术选型或者准备从算法转向工程的开发者参考。这篇文章能帮你解决的核心问题是面对一个从零开始的AI项目你该怎么规划技术栈、怎么设计数据流转、怎么把模型推进到生产环境以及上线之后那些文档里不会告诉你的坑在哪里。我默认读者有Python基础和基本的机器学习概念但如果你刚入门跟着文中的步骤走也能跑通一个端到端的小项目。1. 先把AI工程的边界画清楚1.1 它和“调模型”完全是两码事我见过太多人在这一步栽跟头。刚接触AI时以为核心工作在模型结构、调参、刷精度但实际进了工程化阶段才发现模型代码往往只占整个系统代码量的20%都不到。一个典型的生产级AI系统里数据采集清洗、特征工程、训练验证、模型打包、灰度发布、监控告警、反馈闭环这些工程部分才是真正耗时耗力的地方。拿一个我实际做过的中文文本分类系统来说。算法同学用BERT微调一个模型离线测试F1做到92%看起来很不错。但真要部署到线上服务几万用户时问题一个接一个冒出来模型推理延迟忽高忽低、新语料进来分布偏移导致准确率掉了十个百分点、上游数据偶尔缺字段导致推理直接报错、GPU显存泄露跑两天就崩。这些都不是模型结构能解决的而是AI工程的范畴。所以如果你想从零搭建这套体系第一步不是急着训练模型而是把整个链路的边界画清楚。在我看来AI工程至少覆盖五层基础设施层计算资源、存储、网络、数据层采集、清洗、标注、版本管理、模型层训练、调优、评估、注册、服务层API封装、推理优化、版本管理、运维层监控、告警、日志、资源伸缩。每一层你都得有对应的工具和规范缺一环后面都会找补回来。1.2 工程师视角和算法视角的思维差异做AI工程和做算法研究的思维方式差别很大。算法研究追求的是在一个固定数据集上把指标刷到最高允许你反复尝试、人为调参、甚至对验证集过拟合一点点也没什么大不了。但工程化追求的是在真实数据分布、真实流量下让系统稳定运行、可复现、可回滚。这就要求你从第一天起就有版本管理的意识、容错的设计、以及全链路的可观测性。举一个很具体的例子。算法同学训练模型时通常固定一个随机种子只要复现出同样的精度就算成功。但工程化时你怎么保证今天训练出来的模型和昨天训练出来的模型行为一致怎么保证A/B测试时新旧模型之间对比是公平的这些都要靠工程手段来解决比如固定依赖版本、统一数据快照、代码配置分离、实验记录可追溯。我的建议是从零搭建时直接把“可复现性”当作一等公民来对待。哪怕现在只是单人项目每个训练任务都要记录代码commit号、数据集版本、超参数、环境依赖、随机种子。现在主流方案是配合MLflow或者WandB来做后面我会详细讲选型对比。2. 技术栈选型从零开始应该怎么选2.1 语言与核心框架选择逻辑这个话题在网上吵得很凶我直接给出自己的结论主语言用Python核心框架用PyTorch。不要一上来就考虑JAX或者TensorFlow除非你有极其特殊的需求。原因有三社区的生态积累最厚遇到问题搜得到答案与部署方案的兼容性最好从TorchScript到ONNX再到TensorRT的链路成熟团队招人招聘也最容易。但Python有它的短板尤其是性能和多线程并发上所以工程上需要分层设计。数据密集型或者高并发的服务部分初期可以用FastAPI做异步接口后面如果单机吞吐不够再把性能热点用Go或者Rust重写。这个策略的好处是初期不引入过多语言复杂度聚焦把链路跑通等真正遇到瓶颈再做局部优化。需要特别提醒的是不要迷信“全链路都用Python”。我在实践中见过很多团队用Python写了大量数据清洗的脚本跑几亿条数据时慢得让人崩溃最后还得用Spark或者Flink重写。所以从一开始你就要有意识地区分“交互式探索”代码和“生产级调度”代码前者在Notebook里随意后者要追求性能和稳定性。2.2 四个必装的核心工程组件对比除了深度学习框架本身从零搭建AI工程体系必须有几类基础组件。我按实际项目中的重要程度排个序实验追踪、数据版本管理、模型注册、CI/CD管道。下面是各方案的核心对比表是我在选型时实际调研的信息汇总。功能类别推荐方案替代方案我的选型理由实验追踪与元数据MLflowWandB、Neptune开源可自托管追踪接口简单配套模型注册表数据版本管理DVCLakeFS、Delta LakeGit友好的设计小团队上手成本低模型注册与部署MLflow Models FastAPITriton、Ray Serve初期轻量支持多框架配合Docker部署方便工作流编排AirflowPrefect、Dagster生态成熟、调度稳定适合批处理场景监控与告警Prometheus GrafanaELK、Seldon AlibiCNCF标准组合社区资料多可扩展性强这五个组件构成了我在生产环境中实际使用过的最小可用组合。注意我特意没有提Kubeflow这种重型平台原因很简单如果团队没有专职的运维工程师Kubernetes加Kubeflow的维护成本会吞掉你所有开发时间。从零开始先保证功能闭环再逐步演进到容器编排。2.3 为什么我强烈建议自托管而不是全用云服务这里要说明白一个趋势。现在很多云厂商提供全托管的AI平台比如AWS SageMaker、阿里云PAI用起来确实方便点几下就能训练模型、部署端点。但如果你是从零开始学习AI工程我不建议一开始就依赖这些封闭平台。原因不复杂全托管平台把太多关键细节封装掉了你训练完模型拿不到日志你会慌部署失败不知道是代码问题还是平台问题。一旦脱离该平台你等于什么都不会。更好的路径是先用开源组件把整套链路在本地或者一台服务器上跑通理解每一环的原理和最佳实践。等你真正理解了这套东西怎么运作再上云平台迁移或者使用托管的数据库、对象存储会轻松很多。我在面试候选人时通常会先问“你能否从裸机开始部署一套模型服务”能答上来的人基本都是真正搞懂了AI工程而不是只会点鼠标。3. 数据管线的设计与实现3.1 从原始数据到可用数据集的完整流转数据是整个AI工程的地基但我发现很多从零开始的人在这个阶段最容易犯的错误是“拿到一份CSV就开始训练”。真实场景里数据是分散在各处的数据库里的用户行为日志、文件服务器上的图片、第三方接口返回的文本甚至还有人工标注的产物。把这些统一收集起来、清洗干净、规范化格式就是数据管线要做的事。以我做过的一个电商评论情感分析项目为例。原始数据包括MySQL里的订单表、MongoDB里的评论集合、每日几百MB的访问日志。我需要把这三类数据关联起来提取出“下单用户评论内容商品ID评论时间”的结构化信息然后进行清洗、去重、过滤无效评论最后生成标注任务分发给人工标注。整个流程如果用脚本硬跑每天重复执行时会有一堆边界问题所以我最终用Airflow搭了一个定时调度的DAG来完成。数据流转中容易被忽视的是schema校验。源头表字段变更、日志格式调整、新版本接口返回不同结构这些都会在下游造成难以排查的故障。我在管线的每个关键节点都加了pydantic或者Great Expectations的验证逻辑一旦数据格式不符合预期就告警暂停绝不让坏数据流到训练任务。3.2 DVC做数据版本管理模型训练的可复现性很大程度靠数据版本管理来保证。最早我尝试把数据直接放在Git仓库里但数据量上到几GB之后Git就完全不可用了。后来我用DVC管理数据的版本它的核心思路是把元数据指针对真实数据的指针放在Git里真实数据存在本地或者S3、OSS之类的对象存储中。实际操作起来的流程是在项目根目录执行dvc init然后把原始数据集目录加入DVC管理每次有新的数据快照就执行dvc add data/raw生成对应的.dvc元数据文件并提交到Git。这样不同的模型实验可以对到不同的数据版本回滚也特别方便——只要切换Git commitDVC会自动拉取对应的数据快照。一个实际的坑是DVC默认的缓存目录会占用很大磁盘空间。如果你频繁切换数据集版本老版本数据会一直留在缓存里。解决方案是定期执行dvc gc清理无用缓存或者把缓存目录软链到大容量磁盘上。另外团队协作时共享数据存储需要大家有同样的权限建议初期就直接把DVC的远程存储配置好避免每个人本地各存一份造成混乱。3.3 数据标注环节的工程化思路标注是很多从零开始的开发者完全忽略的环节。真实项目里标注质量直接决定模型上限。我见过不少项目为了省事直接找非专业人士标注几万条数据结果训练出来的模型灌水严重上线后准确率一塌糊涂。工程化的标注方案至少要做到几点标注规范文档先行把边界案例写清楚标注平台要支持多人协作和冲突检测每个标注任务要有抽样质检机制。开源方案里我推荐Label Studio功能足够且支持自定义标注界面可以对接对象存储和导出多种格式。自研微调也行但如果标注类型不算特别复杂没必要浪费时间自己造轮子。另外要做好标注数据的版本对应关系。我习惯对每一批标注数据打上批次号和标注规范版本号因为如果后期标注规范调整了旧规范下标注的数据可能就需要重新清洗或者标记。这个细节不处理好后期模型迭代时数据一致性会非常痛苦。4. 模型训练与迭代的工程化细节4.1 训练工程的目录结构设计真正从零搭建AI工程时代码组织方式决定了你后期迭代的效率。我见过很多人的项目全是Notebook和零散脚本堆在一起两个月后自己都找不到之前的实验在哪里。这里分享一个我实践比较成熟的训练工程目录project/ ├── configs/ # 所有实验的配置文件 │ ├── baseline.yaml │ └── experiment_v2.yaml ├── data/ │ ├── raw/ # 原始数据 │ ├── processed/ # 清洗后数据 │ └── features/ # 特征工程产物 ├── src/ │ ├── data/ # 数据加载与预处理代码 │ ├── models/ # 模型定义 │ ├── trainers/ # 训练逻辑 │ └── utils/ # 工具函数 ├── tests/ # 单元测试与集成测试 ├── scripts/ # 命令行入口 ├── experiments/ # 实验输出目录按时间戳命名 │ └── 20250101_1200/ │ ├── checkpoints/ │ ├── logs/ │ └── metrics.json ├── requirements.txt └── README.md这个结构最大的好处是职责清晰配置和代码分离不同实验的输出隔离训练脚本通过命令行参数读取配置文件。我要求所有实验必须通过,yaml配置来描述而不是硬编码在代码里。这样每次实验的差异一目了然回溯问题时少了很多纠结。4.2 训练脚本中必须埋的“探针”训练不是光跑起来就行你得在训练过程中时刻知道模型的状态。很多新手只会打印一个loss但实际工程里需要更系统的观测。我通常在训练脚本里加入以下监控指标每一百步记录loss、学习率、当前batch的吞吐样本/秒、GPU显存占用、数据加载耗时每个epoch结束记录验证集的loss、精确率、召回率、F1等核心指标周期性做一次梯度范数统计观察有没有梯度爆炸或消失的趋势关键指标写入MLflow方便和历史的实验结果做对比GPU利用率也是一个常被忽视的指标。训练速度慢不一定是你模型算得慢很可能是数据加载瓶颈导致GPU空闲等待。我在训练脚本里用torch.profiler定期分析耗时分布发现很多项目的瓶颈在数据预处理和磁盘读取上。解决办法通常是多进程数据加载、使用内存映射、或者提前把数据转换成更紧凑的二进制格式。4.3 超参数调优的工程方法从零搭建AI工程时超参数搜索是最容易变得“野路子”的环节。我早期做调优就是改一两个参数反复跑效率低还容易出偏差。后来规范化的做法是先用小数据量快速跑通确定方向然后使用Optuna做贝叶斯搜索通过配置文件限定搜索空间。这里给一个Optuna配合MLflow使用的简化逻辑import optuna import mlflow def objective(trial): lr trial.suggest_float(lr, 1e-5, 1e-3, logTrue) batch_size trial.suggest_categorical(batch_size, [16, 32, 64]) with mlflow.start_run(): # 训练函数内部记录指标到mlflow metric train_and_evaluate(lrlr, batch_sizebatch_size) mlflow.log_params({lr: lr, batch_size: batch_size}) mlflow.log_metric(val_f1, metric) return metric study optuna.create_study(directionmaximize) study.optimize(objective, n_trials50)有个细节经验贝叶斯优化的早期阶段可以先跑十几个随机采样找到一个大致靠谱的区域再开始精细搜索。另外搜索空间如果包含学习率和batch_size最好在log尺度上采样否则学习率的低数量级区域很难被覆盖到。5. 模型部署与上线从离线到在线的最后一公里5.1 模型格式转换与推理优化模型训练好只是开始真正上线前你还需要把模型格式转换到适合线上推理的形式。PyTorch的torch.save保存的ckpt文件里包含整个模型结构和参数但它不适合直接用于线上服务。我常用的转换路径是先把pytorch模型转成TorchScript通过torch.jit.trace或者torch.jit.script来获得静态计算图这样可以在C环境里直接加载推理速度比Python模式快不少。如果只是用CPU推理也可以考虑ONNX Runtime它对不同硬件平台都有优化而且可以进一步量化到int8降低延迟。如果要上GPUTensorRT通常是性能天花板最高的方案但转换过程偏复杂对算子也有不少限制建议等前面两条路优化得差不多了再考虑。我踩过的一个大坑是TorchScript的追踪模式有个隐性问题如果你的模型里有条件分支或者动态shapetrace得到的图可能在接收新输入时出错。解决办法是在trace时提供不同形状的示例输入或者改用script模式让它动态构建图。总体原则是转换之后必须用一批线上真实的边界输入样例做一致性验证偏差点位超过阈值就说明转换过程有问题。5.2 FastAPI封装模型服务的完整示例模型服务化我用FastAPI比较多它对异步支持和数据验证都做得很好。这里给一个最小可用的服务端示例import torch from fastapi import FastAPI, HTTPException from pydantic import BaseModel class TextInput(BaseModel): text: str class PredictionOutput(BaseModel): label: str confidence: float app FastAPI() # 加载模型启动时只加载一次避免每次请求都重新加载 model torch.jit.load(model.pt, map_locationcpu) model.eval() def preprocess(text: str): # 实际项目这里会使用分词器和截断逻辑 tokens text.lower().split() ids [vocab.get(t, 1) for t in tokens] # 固定长度截断或padding return torch.tensor([ids[:256] [0] * (256 - len(ids[:256]))]) app.post(/predict, response_modelPredictionOutput) async def predict(item: TextInput): try: input_tensor preprocess(item.text) with torch.no_grad(): logits model(input_tensor) prob torch.softmax(logits, dim-1) label positive if prob.argmax().item() 1 else negative confidence prob.max().item() return PredictionOutput(labellabel, confidenceconfidence) except Exception as e: raise HTTPException(status_code500, detailstr(e))这段代码里隐含了几个工程细节模型在应用启动时只加载一次而不是在第一个请求时初始化输入校验用pydantic完成异常要兜底返回明确错误信息。实际部署时建议再加一个/health健康检查接口方便负载均衡器做存活探针。5.3 Docker镜像构建与版本管理模型服务的部署我始终坚持容器化这是保证线上环境和训练环境一致性的最省心办法。我实践下来有几个经验基础镜像不要选最新的Python版本尽量和其他服务保持一致减少依赖编译成本。依赖锁定要精确到小版本千万别只写torch1.13这样否则几周后重新构建镜像很可能跑出和你训练时不同的行为。模型文件不要打进代码镜像里应该挂载出来或者在容器启动时从对象存储拉取。这样模型更新不需要重新构建整个镜像。镜像标签要包含可读的版本信息和时间戳比如text-classifier-v1.3.0-20250115。如果团队规模小、还在起步阶段可以先不用上Kubernetes这类重型编排系统直接用Docker Compose或systemd管理单个容器配合Nginx做反向代理就够了。我见过很多小团队一上来就铺开Kubernetes结果部署、网络、存储问题一堆反而拖慢了上线速度。5.4 模型灰度发布的策略发布新模型到线上时全量上线是大忌。我用过比较稳妥的三阶段策略首先是离线评估阶段用历史数据做回放对比新旧模型在同一批数据上的指标确认新模型没有明显退化。其次是影子部署阶段新旧模型同时接收线上真实请求但只让旧模型的结果返回给用户新模型的输出只记录日志用于对比。最后才是灰度流量阶段把比如10%的流量切到新模型观察一小段时间的延迟、错误率以及关键业务指标确认无误再逐步放大到50%、100%。这套流程看起来繁琐但它能帮你避免很多上线事故。我印象很深的一次教训是新模型离线测试效果好全量上线后发现它在某些边缘输入上输出异常导致一小部分用户看到完全错误的预测结果最后还得紧急回滚。灰度发布配合监控告警起码能让你在上线早期就发现问题把影响面控制在最小范围。6. 上线后的监控与持续迭代闭环6.1 需要监控的核心指标AI系统的监控和普通Web服务不太一样除了常规的延迟、错误率、QPS这些基础设施指标你还要关注模型自身的行为指标。我把监控分成三层第一层是系统层包括CPU、内存、GPU利用率、请求延迟、GPU显存使用趋势。第二层是服务层包括推理成功率、输入数据大小分布、超时请求比例。第三层是模型行为层包括预测类别的分布、平均置信度、触发特定规则的频次。第三层最容易被人忽略但它恰恰是发现数据漂移和模型老化的关键。我此前遇到过线上模型的预测结果分布越来越偏向某一个类别最后定位原因是上游策略调整导致输入数据的分布变了模型没有跟着更新预测开始失真。如果没有类别分布的监控这个问题可能要过很久才会被用户反馈暴露。6.2 数据漂移的检测与应对方案数据漂移是AI系统在生产环境中最隐蔽的杀手。检测的方法有不少简单实用的一个思路是定期对线上真实输入做统计分布和训练时的分布做对比用KS检验或者PSI群体稳定性指标来量化差异。我通常对数值特征和分类特征的分布都设置告警阈值一旦PSI超过0.2就触发预警。应对漂移有几个常见方案。最简单直接的是定期用新数据重新训练模型这也是为什么前面强调必须有数据版本管理和自动化的训练管道。进阶方案是给系统加上主动学习的闭环当模型对某个输入样本的置信度低于阈值时把这个样本送出去人工标注积累到一定量再触发增量训练。这里要强调一下很多团队没有把模型更新机制固化下来等到效果崩了才想起来重新训练这时候已经晚了。建议从一开始就设计好“定期重训”的节奏比如每两周自动跑一次数据统计和训练流水线如果发现漂移指标超限就自动告警这比靠人工发现靠谱得多。6.3 日志、链路追踪与告警的最佳实践模型推理服务要做好可观测性日志必须结构化。我统一使用JSON格式输出日志包含时间戳、请求ID、模型版本、输入长度、预测标签、置信度、推理耗时这些字段。这样后续排查问题时可以直接在日志平台里按请求ID或者模型版本过滤效率特别高。链路追踪在微服务架构下几乎是必需品。一个请求可能经过网关、鉴权服务、模型服务、缓存、数据库好几个节点如果没有trace_id贯穿出问题时你根本不知道是在哪个环节变慢或者失败。我用的是OpenTelemetry的标准协议配合Jaeger做可视化查询接入成本不算高但排查问题的效率提升是几倍的。告警规则我建议宁精勿滥。太多没用的告警会让人麻木最终真正重要的告警反而被淹没。我目前长期保留的告警就几条模型服务5分钟错误率超过1%、p99延迟超过阈值、模型预测类别分布发生显著变化、数据漂移指标超限。每条告警都要绑定相应的负责人和排查文档确保收到告警的人知道该怎么处理。7. 实际项目演练从零构建一个情感分析服务7.1 项目需求梳理与目标拆解纸上谈兵这么久我带你完整走一遍从零搭建一个中文评论情感分析服务的全过程。这个项目虽然不大但五脏俱全里面几乎包含了AI工程的所有核心环节。项目需求很简单输入一段中文商品评论输出情感倾向好评/差评并且提供置信度。性能要求是单机QPS不低于50p99延迟不超过500毫秒。数据方面准备了约5万条评论样本其中4万条带人工标注。我按AI工程的思路把需求拆解成了几个子任务数据清洗与标注检查、模型选型与训练、模型转换与打包、FastAPI服务开发、Docker镜像构建、部署上线、监控接入。每一步对应一个里程碑方便控制进度和质量。7.2 数据处理、训练、打包的代码级还原数据处理部分的简化流程如下读取原始CSV、过滤空评论和过短文本、用jieba分词并构建词表、统一截断到128个token以内、划分训练验证测试集。import pandas as pd from sklearn.model_selection import train_test_split df pd.read_csv(raw_comments.csv) df df.dropna(subset[content, label]) df df[df[content].str.len() 2] # 分词并构建词表 from collections import Counter token_counter Counter() for text in df[content]: token_counter.update(jieba.lcut(text)) vocab {word: i 2 for i, (word, _) in enumerate(token_counter.most_common(20000))} # 将文本转为id序列 def encode(text, max_len128): ids [vocab.get(w, 1) for w in jieba.lcut(text)] if len(ids) max_len: ids ids[:max_len] else: ids ids [0] * (max_len - len(ids)) return ids df[encoded] df[content].apply(encode) train_df, val_df train_test_split(df, test_size0.1, stratifydf[label])模型方面我用的是一个简单TextCNN加词向量虽然BERT更好但这个小项目里TextCNN已经能满足性能要求且推理速度更快。训练时用Adam优化器学习率设为2e-4batch size为64前几个epoch先用热身的策略。训练完成后保存checkpoint然后按前面讲的方法转成TorchScript格式。scripted_model torch.jit.script(model) scripted_model.save(sentiment_model.pt)打包后写了个简单的加载测试确认脚本化后的模型和原始PyTorch模型的输出误差在1e-4以内这一步是上线前的基本保障。7.3 部署上线与压测验证部署我用Docker Compose管理服务跑在宿主机8080端口Nginx统一对外提供HTTPS访问。压测我用的wrk工具来模拟真实流量结果在并发50的情况下QPS稳定在80左右p99延迟在400毫秒以内符合需求。压测中还发现一个问题并发请求刚升高时模型服务偶尔会报出OOM错误。排查下来是因为每个请求都做了一次相同的词表查询和padding操作浪费内存又不稳定。修复方式是提前把词表预加载到全局变量里并且在服务启动时做一次预热推理让相关资源提前分配好。上线后接入了Prometheus和Grafana把请求延迟、错误率、推理耗时这些指标都以直方图的形式采集展示同时配置了我在前面提到的几条核心告警。最后在监控面板上能看到预测标签分布的实时变化一旦漂移就能提前感知。8. 从0到1落地过程中最常见的坑与排查思路8.1 环境与依赖层面从零施工时环境问题可以说是第一批拦路虎。我遇到过最麻烦的几个问题Python版本不一致导致编译失败、CUDA和PyTorch版本不匹配导致模型无法跑GPU、某些依赖包之间有隐式的版本冲突。我的经验是项目一开始就使用pyenv或conda锁定Python大版本比如3.10系列然后用requirements.txt锁死全部的小版本。如果要用GPU先把CUDA、cuDNN、PyTorch的版本匹配关系搞明白再装别盲目安装最新版。一个稳妥的做法是先建一个干净的测试环境从零安装一遍所有依赖并跑通一个最小训练任务这个过程本身就能帮助你发现很多环境问题。8.2 数据与特征层面前面提到过数据漂移问题这里再说一个常见的坑训练和测试数据分布不同。很多人在做数据切分时喜欢直接随机shuffle但如果原始数据里有时间先后顺序直接随机切分会让模型在对未来数据进行预测时表现偏差因为训练集已经“偷看”了未来信息。正确的做法是按时间顺序切分用前80%时间段的数据训练后20%时间段的数据验证。特别是业务数据有趋势变化的场景这个细节直接影响你对模型泛化能力的判断。另一个常见坑是数据泄漏特征工程时如果不小心用了未来的信息比如整条记录的统计值模型在离线测试时表现虚高上线后立刻现原形。排查数据泄漏的一个简单方法是检查特征是否与label存在不合理的高相关性一旦发现可疑就重新审视特征工程逻辑。8.3 服务稳定性层面服务上线后最怕遇到“看起来活着但实际已经不可用”的状态。我踩过的典型例子是GPU显存泄漏。PyTorch推理时代码写得不严谨比如在循环中反复创建张量又没有及时释放显存占用会随着请求量增长缓慢上升最后触发OOM。排查方法很简单持续压测时观察显存曲线如果曲线不平稳而是持续上升基本就是哪里的张量没有释放。还有一类问题是超时设置不合理。模型首次加载需要时间冷启动时往往比较慢如果网关超时设置太短请求就会大量失败。我的做法是给模型服务设置一个较长的启动超时和就绪探针等模型真正加载完成后再开始接收流量。同时针对单次推理设置合理的超时上限避免极端输入导致服务卡死。8.4 团队协作与流程规范层面最后一个坑是技术之外的但破坏力极大团队协作没有规范。我见过一支小团队做AI项目代码到处是Notebook、脚本、临时改动的混合体没有统一的Git工作流也没有代码评审最终进度混乱、线上出现问题都找不到是哪个改动引发的。从零搭建AI工程时我强烈建议一开始就建立几个基本规范所有代码进Git遵循一个简单的分支模型比如main加feature分支配置文件和代码分离不允许在代码里写死路径和参数所有训练任务都必须有实验记录至少写清数据集版本、模型结构、超参数、结果指标。这些规范看起来繁琐但一旦形成习惯长期维护成本会大幅降低。9. 后续演进方向与个人经验总结项目上线稳定运行一段时间后我陆续做了一些演进。首先是推理性能优化对模型的卷积层和全连接层做了int8量化QPS从80提升到了150左右虽然精度掉了约1个百分点但业务上完全可接受。其次是把日志系统从纯文本切到了Loki配合Grafana做日志查询和指标关联排查效率再提升一截。再往后规划的方向是把训练流程完全自动化通过数据版本变化或者定期定时任务触发自动重训再自动跑评估、自动构建镜像、自动发布到灰度环境。这套链路目前已经有雏形但离完全无人值守还有距离主要难点在自动评估环节如何平衡多个指标和线上反馈。最后分享一个我个人在多次实战中体会最深的经验AI工程不是某一个单项技术有多牛而是把数据、模型、服务、监控这四大环节串成一个闭环让系统能持续迭代演进。从零搭建时不要追求一次性就把所有环节做到极致先跑通最小闭环再逐步补强每一环的深度和自动化水平。如果你正在从零起步我建议你就按这篇文章的框架动手做一遍不一定要用完全相同的技术栈但一定要把数据版本管理、实验追踪、模型服务化、监控告警这几个环节都亲手实现一次。踩过的坑会成为你最值钱的工程经验。
返回列表