资讯详情

资讯详情

程序员如何补上AI系统设计这一课:从模型调用到稳定工程系统

1. 为什么程序员需要补上AI系统设计这一课这两年跟同行聊天话题绕来绕去最后总会落到同一个点上模型会调了demo 也跑通了但一旦要把这套东西塞进真实业务里问题就全冒出来了。推理延迟忽高忽低、显存说爆就爆、并发一上来服务直接躺平、成本账单月底一看吓一跳。这些坑本质上都不是“模型本身”的问题而是AI系统设计的问题。我先把话说清楚这里讲的 AI 系统设计不是让你去推导反向传播公式也不是让你从头训一个大模型。它指的是——把一个能跑的 AI 能力变成一个稳定、可扩展、成本可控、能扛住真实流量的工程系统。这中间隔着的是传统后端工程师最熟悉、但 AI 工程师最容易忽略的那一整套东西服务编排、资源调度、缓存策略、降级方案、监控告警、成本核算。为什么程序员现在必须补这一课因为行业分工正在快速变化。以前做 AI 应用会调 API 就能交差现在业务方要的是“这个功能能不能稳定跑一年”“高峰期会不会挂”“一个月烧多少钱”。这些问题纯算法背景的人答不上来纯后端背景的人又不懂模型特性。能同时理解这两端的人才是当下最稀缺的。这篇内容适合三类人一是后端/全栈工程师想切入 AI 方向但不知道从哪下手二是算法工程师模型玩得转但系统一上量就抓瞎三是技术负责人需要判断一个 AI 方案到底靠不靠谱。我会按“整体设计思路 → 核心细节 → 实操落地 → 问题排查”这条线把 AI 系统设计里真正要补的东西讲透尽量给到能直接抄作业的方案。2. AI系统设计的整体思路与方案选型2.1 先想清楚AI系统和传统后端到底差在哪很多人补 AI 系统设计第一反应是去学一堆新框架。我的建议是先别急先把“差异”想明白因为差异决定了设计重心。传统后端系统请求进来、查库、算逻辑、返回整个过程是确定性的同样的输入基本得到同样的输出耗时也相对稳定。AI 系统完全不是这么回事。它的核心计算单元是模型推理而推理有三个天然特性算力密集、显存敏感、输出不确定。算力密集意味着单次请求的成本远高于普通接口你不能像查缓存那样随便放大 QPS显存敏感意味着并发数不是你想开多少就开多少一个模型实例能同时处理多少请求是有硬上限的输出不确定意味着你不能用传统的“结果校验”思路去做质量保障得换一套评估和兜底机制。我见过太多团队栽在这一点上拿传统微服务的思路去套 AI 服务结果压测的时候一切正常一上真实流量就雪崩。原因很简单传统服务的瓶颈通常在 IO 或数据库而 AI 服务的瓶颈在 GPU 利用率和显存两者的扩容逻辑、限流逻辑、降级逻辑完全不同。所以设计 AI 系统的第一步是承认它是个“重资源、慢响应、需兜底”的特殊服务然后围绕这个认知去搭架构。2.2 分层设计把系统拆成能各自演进的四层我比较推荐的分层方式是这样的从上到下四层每层职责清晰层级核心职责关键考量接入层鉴权、限流、路由、协议转换快速失败保护后端编排层请求预处理、多模型调度、结果后处理业务逻辑集中地推理层模型加载、批处理、显存管理资源利用率核心基础设施层GPU 调度、监控、日志、成本统计稳定性和可观测性这么分的好处是每一层可以独立演进。比如你想换模型只动推理层想加业务规则只动编排层想换云厂商只动基础设施层。耦合度低是 AI 系统能长期维护的前提。我特别想强调接入层和编排层的分离。很多团队图省事把限流、鉴权、业务逻辑全塞在一个服务里结果模型一升级整个服务都得重新部署风险极大。分开之后接入层可以做成无状态的随便扩缩容编排层可以做成有状态的专注业务。2.3 方案选型自建、托管还是混合这是绕不开的问题。我的经验是别一上来就追求全自建也别全托管躺平混合才是大多数团队的答案。自建推理服务的优势是可控、成本在量大时更低、数据不出内网劣势是运维复杂、需要专人、扩容慢。托管服务的优势是开箱即用、弹性好、免运维劣势是成本随量线性上涨、定制能力弱、有供应商依赖。判断标准其实很简单看两个维度调用量和定制需求。调用量小、需求标准直接托管别折腾调用量大、有特殊定制比如特定量化、特定批处理策略自建更划算。中间地带就用混合核心高频模型自建长尾低频模型走托管。我踩过的一个坑是早期为了省钱自建结果调用量没起来GPU 大部分时间闲置反而比托管贵。后来学乖了先用托管跑通业务、验证需求等量稳定了再评估自建。先验证价值再优化成本这个顺序不能反。3. 核心细节解析与实操要点3.1 推理服务的显存与并发计算这一块是 AI 系统设计里最硬核、也最容易出错的地方。很多人配并发全靠拍脑袋结果要么浪费资源要么直接 OOM。我给你一套能算的方法。首先要搞清楚一个模型实例占多少显存。粗略公式是模型权重显存 KV Cache 显存 激活值显存 框架开销。模型权重好算参数量乘以精度字节数比如 7B 模型用 FP16大约 14GB。KV Cache 是变量跟并发数、序列长度强相关公式大致是2 × 层数 × 头数 × 头维度 × 序列长度 × 并发数 × 精度字节。激活值和框架开销一般留 2-4GB 余量。举个实际例子。假设一个 7B 模型FP16 权重 14GB单张 24GB 显存的卡。KV Cache 每并发每 token 大约占几十 KB如果平均序列长度 1024单并发 KV Cache 大概 0.5-1GB。那么留给 KV Cache 的空间是 24 - 14 - 3 7GB理论上能撑 7-14 个并发。但实际要留安全边界我一般按理论值的 60%-70% 配也就是 5-8 个并发比较稳。注意这个计算是估算不同模型架构、不同推理框架差异很大。上线前一定要用真实流量压测别信纸面数字。实操上我建议把并发数做成可配置的配合监控动态调整。显存利用率长期低于 60%说明并发配低了可以往上加一旦出现 OOM 或频繁的显存回收说明配高了得往下调。动态调优比一次性配死要靠谱得多。3.2 批处理策略吞吐和延迟的平衡术批处理是提升 GPU 利用率的核心手段但也是最容易做砸的地方。原理很简单GPU 擅长并行计算一次处理 8 个请求和一次处理 1 个请求耗时可能差不多那吞吐就翻了 8 倍。但问题是你得等这 8 个请求都到齐才能开始算等待本身增加了延迟。这里有个关键参数叫批处理窗口也就是最多等多久凑一批。窗口设太小凑不满批吞吐上不去设太大延迟飙升用户体验差。我的经验值是在线交互场景窗口 10-50ms离线批处理场景可以放到几百毫秒甚至更长。还有一种更聪明的做法叫连续批处理不等整批算完而是哪个请求算完了就立刻塞新请求进去。这样 GPU 几乎不空闲吞吐和延迟都能兼顾。现在主流的推理框架基本都支持强烈建议开启。我实测过一个对比同样硬件不开批处理 QPS 是 3开了固定批处理到 12换成连续批处理能到 20 以上。差距是数量级的所以批处理这块一定要花时间调。3.3 缓存设计省钱和提速的双刃剑AI 系统里缓存特别重要因为每次推理都是真金白银。缓存设计有三个层次我按性价比排序第一层是结果缓存相同输入直接返回缓存结果。适合问答、分类这种确定性强的场景。命中率高的业务成本能降一半以上。但要注意生成类任务比如写文案结果本身有随机性缓存意义不大别硬套。第二层是前缀缓存针对大模型场景如果多个请求共享相同的前缀比如相同的系统提示词可以把这部分 KV Cache 缓存下来复用。这个对多轮对话、固定人设的场景特别有效能显著降低首 token 延迟。第三层是语义缓存把语义相近的问题映射到同一个缓存结果。这个实现复杂容易误命中我一般只在特定场景用而且要配合人工审核。提示缓存一定要设过期时间和容量上限否则内存会被慢慢吃光。我见过缓存没设上限导致服务半夜挂掉的案例。3.4 降级与兜底系统稳定的最后一道防线AI 系统最怕的不是慢是挂。所以降级方案必须提前设计好不能等出事再想。我一般准备三档降级一级降级主模型超时或失败切到更小更快的备用模型。质量降一点但保证有响应。二级降级所有模型都不可用返回预设的兜底话术或缓存结果明确告知用户“当前繁忙”。三级降级整个 AI 能力关闭业务走非 AI 的老逻辑保证核心流程不中断。降级的触发条件要明确比如连续失败 N 次、P99 延迟超过阈值、GPU 利用率持续打满等。触发后要有自动恢复机制别降级了就再也升不回来。我个人的经验是降级逻辑一定要在压测阶段就验证别等真出事才发现降级代码本身有 bug。我们做过一次故障演练故意把主模型打挂结果发现降级切换花了 30 秒用户早就跑光了。后来优化到 2 秒内完成切换才算合格。4. 实操过程与核心环节实现4.1 从零搭一个最小可用的推理服务光讲理论没意思我带你走一遍最小可用服务的搭建过程。这里用 Python 生态里比较通用的方式思路是通用的换框架也一样。第一步确定服务接口。我建议用标准的 HTTP 接口请求体包含输入文本和参数响应体包含结果和耗时。别搞太复杂简单清晰最重要。# 请求体示例 { input: 帮我总结这段话, max_tokens: 256, temperature: 0.7 } # 响应体示例 { output: 总结内容..., latency_ms: 850, model: base-model-v1 }第二步加载模型并做预热。模型加载是慢操作一定要在服务启动时完成别等第一个请求来了才加载。预热就是启动后先跑几个假请求把显存、缓存都激活避免首请求特别慢。# 伪代码示意预热逻辑 def warmup(model, num_rounds3): for _ in range(num_rounds): dummy_input warmup model.generate(dummy_input, max_tokens16) print(warmup done)第三步实现批处理调度。核心是维护一个请求队列凑够一批或超时了就触发推理。这里要注意线程安全多个请求同时进来别把队列搞乱了。第四步加监控埋点。至少记录这几个指标请求量、成功率、P50/P95/P99 延迟、显存占用、GPU 利用率、批处理平均大小。这些数据是后续调优的依据一开始就要埋好。4.2 关键参数的选择与计算过程参数配置是实操里最考验经验的地方。我挑几个最关键的讲。最大序列长度这个直接决定显存占用和单次耗时。设太大浪费资源设太小截断内容。我的做法是统计真实业务里 95% 的请求长度然后留 20% 余量。比如 95% 的请求在 800 token 以内那就设 1024。批处理大小上限不是越大越好。太大容易 OOM而且延迟会明显上升。我一般从 8 开始试逐步加到 16、32观察延迟和吞吐的变化曲线找到拐点。拐点之后吞吐增长放缓但延迟继续涨就不划算了。超时时间要分两段设。单次推理超时和整体请求超时。单次推理超时按 P99 延迟的 1.5 倍设整体请求超时按业务能接受的最长等待设。两个都要有缺一不可。重试次数AI 推理失败重试要谨慎因为重试本身也消耗资源。我一般只对明确的瞬时错误重试 1 次其他情况直接走降级。4.3 部署与扩容的实操记录部署这块我的核心原则是无状态服务 有状态模型分离。服务本身无状态随便扩缩容模型加载在独立的进程或容器里跟着 GPU 走。扩容策略上AI 服务不适合纯 CPU 指标扩容因为瓶颈在 GPU。我一般用队列长度 GPU 利用率双指标。队列持续增长或 GPU 利用率长期高于 80%就触发扩容。缩容要更保守观察窗口拉长避免抖动。冷启动是个大问题。新实例加载模型可能要几十秒甚至几分钟这段时间它没法服务。解决办法是提前扩容 预热别等队列爆了才扩。我一般设置一个水位线到 60% 就开始扩给冷启动留足时间。注意扩容不是万能的。如果瓶颈在单个模型的显存上限加机器也没用得考虑模型切分或换更小的模型。先定位瓶颈再决定扩容方式。5. 常见问题与排查技巧实录5.1 典型问题速查表现象可能原因排查方向解决思路服务突然 OOM并发过高/序列过长/内存泄漏看显存曲线和请求分布降并发、限长度、查泄漏延迟忽高忽低批处理窗口不合理/资源争抢看批大小和 GPU 利用率调窗口、隔离资源吞吐上不去批处理没生效/GPU 没吃满看批大小和利用率开连续批处理、调并发结果质量下降模型切换/参数漂移/缓存误命中对比切换前后输出回滚、校准参数、清缓存成本超预期缓存命中低/无效调用多看调用量和缓存命中率优化缓存、加限流5.2 几个我踩过的坑和独家技巧坑一显存碎片化。长时间运行后显存虽然总量够但因为碎片化导致分配失败。解决办法是定期重启实例或者用支持显存池化的框架。我一般设置每天凌晨低峰期滚动重启一次效果很好。坑二批处理把长请求和短请求混在一起。一个超长请求会把整批的耗时拉高拖累所有短请求。解决办法是做请求分桶长度相近的放一批。这个优化做完P99 延迟能降 30% 以上。坑三监控只看平均值。平均值会掩盖长尾问题。AI 系统一定要看 P95、P99甚至 P999。我见过平均值 200ms 但 P99 到 5 秒的系统用户体验极差但监控上完全看不出来。技巧一给每个请求打标签。记录来源、类型、长度等出问题时能快速定位是哪类请求导致的。这个在排查疑难问题时特别有用。技巧二保留一定比例的“影子流量”。新模型上线前用真实流量的一小部分跑新模型对比效果和性能确认没问题再全量。比离线测试靠谱得多。技巧三成本要按请求维度统计。别只看月度总账单要算到每个请求、每个业务线。这样才能知道钱花在哪哪里可以优化。我们做完这个统计后发现某个低频功能占了 20% 的成本直接下线省了一大笔。5.3 性能调优的排查顺序遇到性能问题别乱试按这个顺序排查效率最高先看监控大盘定位是全局问题还是局部问题。再看 GPU 利用率如果没吃满问题在调度层如果吃满了问题在算力层。然后看批处理统计批大小是否合理窗口是否合适。接着看请求分布是不是有异常长请求或异常高频请求。最后看代码是不是有同步阻塞、锁竞争之类的问题。这个顺序能帮你快速缩小范围避免在错误的方向上浪费时间。我见过有人一上来就改代码结果折腾半天发现是配置问题。6. 工具链与团队协作的补充建议6.1 推理框架怎么选框架选型没有绝对的好坏看你的场景。如果追求开箱即用、社区活跃选主流的那几个通用框架如果追求极致性能、愿意折腾可以考虑针对特定硬件优化的方案如果团队小、想省事直接用云厂商的托管推理服务。我的建议是先用通用框架跑通遇到瓶颈再针对性优化。别一上来就追求极致性能那是本末倒置。业务价值验证之前性能优化都是空谈。6.2 团队协作中的分工AI 系统设计不是一个人的事。我观察下来比较健康的团队分工是这样的算法同学负责模型选型和效果评估工程同学负责服务化和性能优化运维同学负责基础设施和监控。三方要有明确的接口和协作机制。最容易出问题的地方是算法和工程的交接。算法同学交出一个 notebook工程同学不知道怎么落地。解决办法是提前约定好交付标准模型格式、输入输出规范、性能基线、评估方法都要白纸黑字写清楚。6.3 持续迭代的节奏AI 系统不是一次搭好就完事的它需要持续迭代。我一般建议按这个节奏走每周看一次性能指标和成本每月做一次模型效果评估每季度做一次架构复盘。别等到出问题才想起来优化。迭代的时候要小步快跑每次只改一个变量改完观察一段时间再改下一个。同时改多个东西出了问题根本不知道是哪个导致的。这个道理跟传统系统优化是一样的但在 AI 场景下尤其重要因为变量更多、影响更复杂。我个人在实际操作中的体会是AI 系统设计最难的不是某个具体技术点而是建立一套“可观测、可调优、可降级”的工程习惯。技术点可以现学但习惯得靠一次次踩坑养出来。刚开始别追求完美先把最小闭环跑通然后在这个基础上一点点加固。跑得久了你自然就知道哪里该加监控、哪里该留余量、哪里该做兜底。这套东西才是“补 AI 系统设计”真正要补的核心。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →