多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

从FaaS到AI运行时:函数计算如何扛起大模型推理

从FaaS到AI运行时:函数计算如何扛起大模型推理 函数计算这个话题我在过去一年里实践了很多从最早拿它跑定时任务、处理异步消息到后来被迫把大模型推理服务塞进去整个过程像是重新认识了一个老朋友。很多人把函数计算等同于“弹性执行小函数”但在AI应用落地的压力下它的角色已经悄悄变了——不再是那个只管拉起销毁的FaaS平台而是开始承担起AI应用“运行时”的职责。这篇文章就聊聊我看到的、踩过的、以及实测过的那些进化细节。1. 函数计算为什么在AI时代突然“不够用”了1.1 传统FaaS的底层假设短、频、快、无状态我最早用函数计算的时候认知很单纯写一个函数配好触发器和依赖剩下的交给平台。它帮你处理并发、帮你扩容、按调用次数计费核心卖点就是“你不用管服务器”。这套设计背后的假设非常清晰——函数是短周期的一次执行几秒到几分钟函数是事件驱动的上游准备好数据你消费完就结束函数是无状态的实例可以随便杀下次调用重新拉起。这些假设在小规模Webhook、数据处理、自动化脚本里完全成立。我当年用它处理图片压缩、文件转码、消息过滤体验非常顺滑几乎感觉不到底层实例的存在。但AI应用把这一切都打破了。1.2 AI负载的四个不匹配长、重、有状态、要GPU先说最直观的差异——执行时长。我当时在函数计算里部署一个基于Transformer的文本分类模型时单次请求在GPU上推理只要80毫秒但算上模型加载、上下文初始化、环境依赖装配整个请求生命周期就被拖到了秒级。这还没完如果是一个会话制的AI应用用户和机器人来回对话每次请求需要携带历史上下文这就直接冲撞了“无状态”的设计前提。再往后做大模型相关的东西问题更尖锐了。一个7B参数量的量化模型权重文件奔着4到5GB去用函数计算默认的那种“按需拉起”模式冷启动就要拉模型光这一步的IO开销就是几十秒。平台层面如果不做专门优化用户等到的就是一个又一个超时错误。这不是简单调调超时时间就能糊弄过去的是整个调度、计费、扩容逻辑都要重构。四个不匹配总结下来就是执行时长从秒级走向分钟级甚至长连接场景要持续几十分钟负载从CPU走向GPU需要异构资源调度和显存管理状态从无状态走向有状态会话、向量索引、推理缓存都需要跨请求复用网络模式从一次性请求响应走向WebSocket、流式输出这类长连接形态。所以你会发现不是函数计算本身做错了什么而是AI负载的物理特征逼着这个运行时要重新定义自己的能力边界。1.3 “够用”和“好用”之间隔着一条冷启动的鸿沟很多人会说函数计算能跑AI推理啊你配一个GPU实例把镜像打大一点不就行了。理论上是这样但实际你跑一遍就明白了——冷启动延迟从毫秒级被拉到了分钟级。这里有个概念要先说清楚“冷启动”在传统FaaS里指的是拉起一个轻量沙箱或进程在AI函数计算里冷启动分三段容器或微虚拟机启动、运行时环境初始化、模型加载到显存。前两段平台还能通过镜像预热、实例缓存优化第三段是模型权重本身的IO和反序列化开销硬性成本跑不掉。我自己实测过一个场景用单卡A1024GB显存加载一个4.5GB的量化模型从对象存储拉取到显存完成预热全程大约需要40秒。40秒意味着什么意味着如果平台没有常驻实例池第一个用户请求一定会等上小半分钟才能开始推理这在交互式AI场景里直接就是不可用。所以这一步就筛掉了大量“只会用传统FaaS思维”的团队。2. AI推理负载的特殊性模型加载、GPU冷启动与生命周期管理2.1 模型加载为什么这么慢以及怎么优化模型加载慢的核心原因其实不在“读文件”而在“反序列化和权重初始化”。以PyTorch生态为例加载一个模型通常有两步第一步是把权重文件从存储读进内存这一步受存储带宽和网络影响几个GB的文件在良好网络下也就几秒第二步是把内存里的权重数据反序列化为模型状态字典再通过model.to(cuda)拷贝到显存这一步涉及大量张量的形状重建、参数绑定、内存分配CPU到GPU的拷贝带宽反而成了瓶颈。实测下来第二步的耗时和第一步几乎一样多甚至更多。这里就引出了第一个优化思路——不要每次冷启动都做完整的模型加载而是把加载完成后的显存状态做快照下次直接恢复。类似于C语言的fork()之后写时复制或者虚拟机的内存快照恢复。平台层面如果有“实例快照”能力冷启动时间可以从40秒直接压到2到3秒。我在实践中还发现一个更朴素的优化把模型文件放到和函数实例同区域的NAS或专用缓存盘上不要每次从对象存储拉冷数据。对象存储适合存大文件但不适合高吞吐随机读模型加载需要的块级连续读正是它的弱项。这个区别看起来不起眼但真的能差出20%到30%的加载耗时。2.2 GPU实例的弹性伸缩远比CPU实例复杂传统FaaS扩容很暴力请求多了多拉起几个实例就完事。CPU内存是纯资源新实例从启动到服务基本秒级。但GPU实例有两个额外的维度需要管理——显存和驱动。显存的管理挑战很直接一张卡就那几个GB你的模型放不下就是放不下。平台要做GPU资源池化就要在“整卡分配”和“显存分片”之间做取舍。整卡分配简单可靠但浪费严重显存分片能提升资源利用率但隔离性和稳定性都要打折扣。对我这种使用者来说我根本不关心平台怎么分片我只关心我的模型会不会因显存不足被OOM杀掉。但平台方必须做这些脏活才能让上层用户“无感”使用异构资源。驱动和CUDA版本兼容则是另一个暗坑。你镜像里用的CUDA版本和你分配到的物理机驱动版本必须在一个兼容范围内。这不难理解但很烦人——因为实例池里不同批次的机器驱动可能不一样你的函数就能在这台机器上稳定跑在另一台上启动报错。这个问题我遇到过不止一次最终解决方式要么固定实例规格约束调度要么在镜像里做驱动兼容层但平台不会默认帮你处理。2.3 生命周期管理从“用完即焚”到“驻留复用”传统FaaS里“用完即焚”是优点——省资源省成本。但AI推理负载里实例销毁意味着显存里的模型白加载了下次请求又得从头来。这成本谁受得了所以进化方向上出现了几个关键变化实例空闲时不立即销毁保留一段时间等待复用通常平台会有5到15分钟的空闲回收窗口提供“预置并发”或“弹性预留”能力让用户提前把模型加载好放在那儿请求来了直接打进去引入更精细的版本管理模型升级时新老实例平滑切换而不是粗暴地杀一批再拉一批。我自己的使用体验是预置并发这东西在传统应用里是锦上添花在AI推理里就是必需品。没有它你的函数在网络上就像一个永远在“加载中”的页面客户不会给你第二次机会。3. 从“弹性执行”到“智能运行时”函数计算架构的自我重构3.1 自定义运行时让函数变成“任意程序的宿主”传统FaaS支持的语言是固定的那几样Node.js、Python、Java、Go。但在AI领域你往往不是“写一个函数”而是要“跑一个服务”。可能是一个封装了推理逻辑的FastAPI应用可能是一个基于Triton的推理服务甚至可能是一个完整的LangChain Agent。这时候自定义运行时Custom Runtime就变得极其重要。它允许你把自己想要的任何可执行文件、脚本、甚至整个服务框架打包进函数。函数计算在这里的角色已经从一个“脚本执行器”进化成“进程管理器”——它负责把你的程序拉起来、给足资源、监控健康检查、按流量调度你只需要保证你的程序监听在指定端口上。这个进化是决定性的。它意味着函数计算的运行时层开始接管传统容器编排平台比如K8s的部分职责但又保留了FaaS的弹性体验。对我而言最大的好处是我可以把一套复杂的AI服务不拆不剪地塞进去而不是为了迁就平台的限制把业务逻辑碎尸万段。3.2 流式输出与长连接AI应用给运行时出的新难题如果你只是做一个分类或Embedding接口传统的HTTP请求响应模型完全够用。但ChatBot和Agent场景需要的是流式输出——用户要看到token一个一个蹦出来而不是等十几秒后一次性收到完整回答。这就逼着函数计算运行时必须支持HTTP响应分块传输chunked encodingWebSocket双向长连接基于SSEServer-Sent Events的推送通道。在我的实践里最折磨人的是API网关层。通常请求先到网关再到函数实例如果网关默认开启了响应缓冲buffering那么流式输出就变成了“等函数跑完再一口气把整个响应转发给客户端”流式效果直接没了。排查这个问题的过程很痛苦因为函数本身没问题跑本地测试也是流式的但部署到云上就变成了“哑巴式响应”。最终的解法通常是在网关注销缓冲或者给函数配置专门的流式调用协议让数据从函数实例直接推给下游。但这些能力不是传统FaaS天生就有的得平台方在运行时层实打实地做改造。3.3 状态与记忆运行时开始管理和存储前面说了传统FaaS假设“无状态”但AI应用天然是要有记忆的——会话上下文、用户偏好、推理历史、向量数据库里的知识切片这些都需要跨请求保留。我不能说函数计算已经完美解决了这个问题但架构上的进化方向很明显运行时开始提供更完善的状态协同能力。具体来说有三个层次第一层实例内状态缓存。同一实例处理同一会话的连续请求上下文直接留在内存里不走外部存储延迟最低。这要求调度器尽量把同一会话的请求路由到同一实例其实就是亲和性调度。第二层持久化状态的外部化。会话数据放到Redis、向量库、NAS里函数实例可以随时重建而数据不丢。这个不算函数计算的专有能力但运行时需要提供便捷的访问通道和低延迟的网络。第三层分布式状态协调。多个函数实例协作处理一个复杂任务比如多个Agent分工干活这时候需要分布式锁、任务队列、共享存储的配合。函数计算平台通常会和消息队列、事件总线的产品深度绑定把编排工作下沉到平台层。4. 我在生产环境落地函数计算推理服务的实操记录4.1 从零部署一个LLM推理函数的关键步骤不藏私直接把我验证过的一套部署路径写出来。假设你已经有一个打包好的推理服务镜像里面是一个基于FastAPI的接口监听8080端口支持OpenAI兼容的/v1/chat/completions接口。第一步选实例规格。我做的是7B模型的量化推理单实例选了16核CPU加24GB显存的GPU实例。这里有个容易忽略的点是CPU核数不要配太少因为推理服务的Tokenize、采样、前后处理这些步骤全在CPU上跑CPU弱了GPU再强也跑不满。第二步配环境变量和存储挂载。模型文件不要打进镜像里镜像动辄十几个GB不说发布更新也慢。我建议把模型放在独立的文件存储NAS或专用缓存盘运行时通过环境变量传入模型路径。这样做还有个额外好处模型版本可以通过路径切换不需要重建镜像。第三步设置预置并发和实例范围。这是我踩过坑后才学会的。最开始我没设预留结果高峰期实例被拉起来一堆每个都要现场加载模型冷启动时间集体爆炸。后来设置了两个预置实例模型常驻显存请求进来直接能打峰值时按需扩容新实例扩容出来的实例虽然在冷启动但有预置实例先扛着用户感知不到明显抖动。第四步配好探活机制。健康检查接口要单独写一个不做推理只返回存活状态。千万别直接把推理接口当健康检查用否则每次探活都消耗一次GPU推理实例还没扩起来先把GPU资源烧完了。4.2 实测数据冷启动、RT、吞吐和成本我把我线上一个真实的配置数据放出来供大家参考。模型是量化后的7B Chat模型单实例规格为16C24GGPU A10预置并发2最大并发6。这个配置下的实测表现指标数值说明冷启动耗时无快照约42秒含模型加载不可接受但可预置规避冷启动耗时开启快照约4秒平台快照恢复实用价值很高预置实例常规P95延迟约480ms已包含推理时间处于正常范围单实例吞吐约8 QPS并发4到6时达到再高延迟会劣化费用估算单实例每小时约XX元GPU实例费用高于CPU实例但远低于自建GPU集群有一个数据特别值得说开了快照恢复之后冷启动虽然压到了4秒左右但首请求的实际体验有时还是偏慢原因是快照所对应的显存状态要到真正推理时才会写时复制copy-on-write第一请求反而比后请求更慢。这个现象平台文档里不会重点提醒但线上用户会感知到。所以我的经验是预置并发负责“稳定打底”快照负责“快速扩容”两者不冲突但别混为一谈。如果预算允许预置并发比快照更能保障一致性的体验。4.3 我踩过的三个坑值得你绕开走第一个坑并发设置过高显存OOM。我把单实例的并发上限调到8想着反正请求来了排队就排队结果并发一起来多个请求的KV Cache和中间激活值把显存撑爆了实例直接被OOM Killer干掉。后来我把“单实例并发”和“健康水位”分开设单实例并发控制在4多出来的流量走实例扩容而不是硬塞给一个实例。第二个坑流式输出被网关缓冲。前面提过一次这里再强调下发生机制。函数计算平台通常有自己的API网关网关为了稳定性默认会缓冲整个响应。你本地测流式一切正常一上云就变全量返回。排查时要先在函数侧确认响应是chunked的然后才能去网关注销缓冲或改用原生流式协议。第三个坑模型文件放对象存储加载慢到怀疑人生。早期我图省事把模型放对象存储结果并发扩容时几个实例同时拉同一个文件对象存储的连接池被打满加载时间成倍上升。后来把模型放在NAS共享存储上才解决并发拉取和随机读性能的问题。就事论事NAS比对象存储更适合这个场景。5. AI Agent与多工具协作场景运行时层要解决的新命题5.1 Agent不是“一个大函数”而是一组函数的协作网络前面聊的都是单函数承载单模型推理这其实是“函数计算 AI”的第一阶段还算在舒适区里。真正把函数计算逼到极限的是最近一年特别火的Agent应用。一个Agent要干活链路通常是这样用户输入进来Agent决定调用哪些工具每个工具可能对应一个函数——有的负责检索知识库、有的负责查外部API、有的负责一段代码执行、有的负责调一次模型推理。结果汇总后Agent还要决定下一步动作可能再调一轮工具直到最后给出完整答复。这个模式用传统的“一个函数处理一个请求”来理解就太窄了。它本质上是一组函数的动态编排和协作。运行时层要解决的问题变成了每个工具函数应该怎么隔离、怎么计费、怎么追踪调用链Agent中枢函数怎么和工具函数进行低延迟通信多轮工具调用中中间状态放在哪里如果某个工具函数挂了Agent是重试还是降级5.2 从“同步调用”到“异步编排”工作流引擎成为运行时的一部分单个工具函数可以用同步调用的方式拉起但Agent的整体流程几乎必然是异步和带状态的。你不能让一个函数实例在内存里等一个外部API返回几十秒那样计费、弹性、稳定性都会出问题。更好的模式是把Agent流程拆成事件驱动的步骤用一个工作流引擎把这些步骤串起来。函数计算的运行时层面对这种工作流的支持越强Agent开发者就越轻松。我看到的一个明显趋势是平台开始内置“步骤编排”“条件分支”“并行执行”这类能力不再要求开发者自己搞一套状态机。坦白讲这个方向目前还远没有成熟各家实现差异也很大。但大方向我是认可的——函数计算的定位会从“提供一个执行环境”进一步进化为“提供一个带编排能力的运行时”后者才是AI应用真正需要的底座。5.3 我对未来运行时的三个判断基于这段时间的实践我说三个自己的判断不保证全对但都是真实想法。第一GPU资源的池化和调度会是未来一到两年最核心的竞争点。谁能把“冷实例快速变热”和“空闲GPU低成本保留”这两个问题解决好谁就能在AI推理和Agent场景里占据主动。第二运行时会越来越“重”。传统的轻量沙箱模式对AI场景不够用基于微型虚拟机的强隔离、GPU直通以及对长生命周期实例的管理会成为标配。轻量是幸福感但不是AI场景的必需品稳定才是。第三状态协同能力会成为分水岭。AI应用就是带记忆的应用运行时如果不提供状态亲和、分布式上下文、跨函数会话管理这些能力开发者就会被逼着自己搭建一套复杂的配套系统这会让函数计算退回到“只是裸容器”的价值水平。我个人在实际操作中的体会是函数计算这次进化的本质不是某个平台增加了一两个新功能而是整个运行时从“为短生命周期事件服务”转向“为长生命周期智能服务”。这个转变并不容易我踩过坑、也见过别人踩坑但方向是明确的。接下来如果你也要把AI应用放到函数计算上我的建议很朴素先把模型加载这一环做到极致再谈弹性和成本先把预置并发和快照调明白再上生产先保证流式体验再考虑复杂编排。这些基础的东西做扎实了云端AI应用的运行时才能真正成为你想要的那个样子。
返回列表