
函数计算、AI、运行时、云——这四个词放在一起正好是过去两年我反复琢磨的问题AI 应用到底跑在什么载体上才算跑得对、跑得稳、还不烧钱过去一年我经手了好几个 AI 项目的后端改造从最开始无脑租 GPU 服务器到后来把核心服务全部迁到函数计算之上过程里踩了不少坑也亲眼看着函数计算这个“老同学”是怎么一步步进化成 AI 应用运行时的。这篇就聊聊我的理解、实操方法和踩坑记录。适合谁看呢如果你正要为 AI 应用选型基础设施或者已经把服务跑在服务器上、却天天为闲置成本和弹性扩容头疼这篇文章应该对你有参考价值。我会把为什么、怎么做以及哪些配置参数会坑你都尽量讲透。1. 为什么 AI 应用需要重新思考“运行时”1.1 传统应用与 AI 应用的本质差异先从一个最直接的差异说起。传统 Web 应用无论电商、内容站还是管理后台它的核心特征是请求-响应模型客户端发来一个请求服务端查个库、算个逻辑然后返回一段 JSON 或 HTML。整个链路的计算量是相对可控的瓶颈通常出现在数据库或缓存而不是 CPU 本身。AI 应用则完全不一样。它至少有三个传统 Web 场景很少出现的特征。第一个是长耗时。一次大模型推理调用动辄几秒甚至几十秒。这还只是单次推理如果做 RAG要先检索向量库、拼 Prompt、再调用模型如果做 Agent模型可能要循环多轮调用工具、汇总结果。整个过程可能持续几十秒到几分钟传统框架下这种请求会把线程池占死超时配置也容易炸。第二个是GPU 依赖。模型推理、微调、Embedding 生成都需要 GPU 算力。GPU 是稀缺资源也是按小时计费最贵的资源。传统模式下为了应对流量峰值准备一批 GPU 机器低谷期全在空转成本相当难看。第三个是状态与数据流的复杂性。AI 应用不只有一个模型接口通常包含向量库、对象存储、消息队列、缓存等多个组件还要管理模型版本、Prompt 模板、会话上下文。这些东西组合起来已经不是一个“处理请求”的软件而是一个分布式数据流系统。这三条加起来对运行时就提出了完全不同的要求要能扛住长任务、要能动态调配异构算力、要能跟一堆云组件无缝协作。传统的 ECS 加负载均衡方案能解决前两条但解决不了“成本”和“弹性”这两个更致命的问题。1.2 AI 工作负载对基础设施的三个“不友好”很多做 AI 的同学应该都有过这种经历模型在本地跑得好好的一上服务器就开始折腾环境。Python 版本、CUDA 版本、cuDNN、依赖库、系统库……每一样都要对齐否则模型要么加载失败要么推理结果对不上。这就是 AI 工作负载对基础设施的第一个不友好环境强绑定。模型文件动辄几个 GB运行库版本敏感GPU 驱动还得跟 CUDA 严格匹配。容器技术解决了部分问题但容器镜像构建和版本更新依然是一件费时费力的事。第二个不友好是流量不可预测。AI 应用一旦被接进业务线流量形态就很难预估。白天内部的 AI 助手可能没人用晚上一个运营活动上线几千人同时发起请求。何况很多 AI 任务来自事件驱动——上游系统丢一个文件过来就要立刻触发一轮推理。这种突发性如果靠人工扩容基本来不及。第三个不友好是成本构成复杂。算力费用、存储费用、网络流量费用、模型服务费用每一块都在涨。如果基础设施不能做到“用多少付多少”很容易月底一算账发现一半的钱花在了闲置资源上。这些“不友好”正好都是函数计算这种产品形态擅长处理的。函数计算的本质是事件驱动的弹性计算有事件来就执行执行完就释放按实际调用量和资源使用量计费。这个模型跟 AI 负载的长尾、突发、异构特性有种天然的契合。2. 函数计算的底层逻辑它凭什么能吃下 AI 工作负载2.1 事件驱动、自动弹性与按量计费AI 场景的“三件套”要理解函数计算为什么能承接 AI 工作负载得先看它的几个核心机制。事件驱动是函数计算的第一性原理。所谓事件可以是一个 HTTP 请求、一个消息队列里的消息、一个文件上传事件也可以是一个定时触发。函数计算的运行时框架拿到事件后会帮你初始化执行环境、运行代码、返回结果然后收尾。这种模型的优势在于它不是先有资源再有流量而是先有流量再分配资源。流量小的时候实例数趋近于零流量大的时候自动扩容到几百个实例。这个过程对业务代码基本透明不需要人肉参与。自动弹性则解决了上一节说的流量不可预测问题。函数计算平台内置了伸缩策略会根据请求量、并发数、排队长度等指标自动调整实例数。AI 场景下最常见的突发比如运营活动推了一个新功能或者一批数据集中入库触发批量推理函数计算的弹性模型都能兜住。按量计费可能是对 AI 团队最有吸引力的一点。函数计算的计费通常由三个维度组成调用次数、资源单价、执行时长。这意味着在业务低谷期你的成本几乎为零高峰期成本随流量自然上升。对比买一批固定 GPU 服务器这个模型在成本弹性上有本质区别。不过这里也要说清楚函数计算的自动弹性有一个前提请求要无状态。如果业务代码里有本地状态、有持久连接就会被自动弹性“坑”。设计成无状态、事件驱动才能把弹性的红利吃满。2.2 从短任务到长时运行函数计算的能力进化早期的函数计算确实不太适合 AI。原因很简单超时限制。最早的 Serverless 平台对单次请求的执行时间限制通常在几秒到几分钟而模型推理动辄十几秒甚至几分钟跑的稍微久一点就被平台杀掉这谁受得了过去几年函数计算的运行时做了几件非常重要的事。首先是超时上限大幅提高。主流云平台的函数计算已经把单次执行时长扩展到几小时甚至更久这为 AI 推理、数据处理、视频渲染等长时间任务打开了空间。我最早把推理服务迁到函数计算时最担心的就是超时后来实测跑一个完整的 RAG 链路从向量检索到模型生成大约需要 30 到 60 秒新的超时上限完全没有压力。其次是实例模式的多样化。过去的函数实例是一次调用一个实例用完就销毁对长连接、WebSocket、状态保持非常不友好。现在不少平台支持 WebSocket 函数、自定义运行时、以及保留实例预置并发等模式。你可以把函数计算理解成一个“能自动伸缩的容器集群”只不过运维层面的东西平台帮你管了。第三是依赖与环境的容器化。平台普遍支持用自定义容器镜像来打包函数这意味着你可以把 Python 环境、CUDA 库、模型依赖全部打进镜像里。函数计算不再是只能写几个小函数的玩具而是可以承载完整 AI 服务的正式平台。2.3 异构算力和 GPU 的接入AI 运行时的最后一块拼图CPU 场景解决了GPU 场景才是 AI 应用真正的主战场。函数计算要成为 AI 运行时必须能调度 GPU 资源否则推理任务只能退回服务器方案。现在主流的云平台都已经支持 GPU 类型的函数实例。你可以为函数指定 GPU 规格比如 A10、T4 甚至更高型号平台会像分配 CPU 一样自动分配 GPU 资源并按 GPU 使用时长计费。实际用下来GPU 函数有两个很关键的体验。第一冷启动时 GPU 驱动的初始化时间比 CPU 长得多。加载 CUDA 库、初始化 cuDNN context整个过程需要几十秒。为了缓解这个问题平台提供了“预置并发”能力可以让一批 GPU 实例常驻把冷启动时间提前消化掉。第二GPU 函数更适合推理不适合训练。虽然技术上能用函数计算跑训练任务但训练通常需要长时间占用一批 GPU 做分布式协作这跟函数计算按事件调度的模型并不匹配。我的建议是训练留在训练平台上推理和批处理放到函数计算上各司其职。3. 在函数计算上跑 AI 应用三种典型架构3.1 RAG 服务函数编排 向量检索RAG检索增强生成是目前落地最广泛的 AI 应用范式。它的核心流程是用户提问 - 向量检索 - 组装上下文 - 调用大模型 - 返回答案。这个流程天然适合函数计算。我把 RAG 服务拆成两个函数一个是 HTTP 接入函数负责接收请求、调用向量库做检索另一个是推理函数负责拼 Prompt、调用大模型、返回结果。两个函数之间通过内部调用串联各自独立扩容。这么做的好处非常明显。检索函数是 CPU 密集型并发可能很高独立扩容后不会跟推理函数抢资源推理函数是 GPU 密集型独立设定 GPU 规格和预置并发不会被检索流量干扰。成本方面RAG 服务的调用量波动往往很大。内部工具在工作日白天的调用量是晚上的几十倍如果用固定服务器需要按峰值预留资源低谷期白烧钱。上了函数计算之后成本跟调用量走实测费用下降大约百分之六十。3.2 AI Agent 与多轮对话可重入函数设计AI Agent 是比 RAG 更复杂的场景。一个 Agent 要经历多轮“推理-工具调用-再推理”的循环过程中还需要保持会话状态。跑在函数计算上Agent 服务需要换个思路设计。因为函数实例可能随时被释放你不能把会话上下文存在内存里。我的做法是把会话状态推到外部存储比如 Redis 或数据库每次函数调用时从存储里重新加载上下文处理完一轮再写回去。这其实就是无状态设计。核心原则是每一轮触发都是一次全新的事件函数的输入除了用户消息还要带上会话 ID。函数从外部存储读取历史消息拼进上下文调用模型再把新的消息和结果写回。下一轮继续重复这个流程。这种方式还有一个额外的好处——天然支持断点继续和水平扩展。用户重新打开页面会话还在流量高峰来了同一会话的多次请求可以分散到不同实例处理不依赖任何单点。3.3 批量推理与异步任务事件驱动的正确打开方式很多 AI 应用场景不是实时问答而是批处理。例如每天定时把一批图片跑一遍识别模型、把一批文档批量向量化入库、或者对新上传的文件做一轮内容质检。这类任务用固定服务器处理最大的问题是资源利用不均。任务堆积时一台机器跑不完任务清空时机器又闲在那里。函数计算配合消息队列可以把这个流程理顺任务进队列函数消费消息并执行推理结果写回存储整个过程完全事件驱动。我在一个文档向量化项目中就是用的这种架构。上游文档上传到对象存储后触发函数函数把文档切分成块、生成 Embedding、写入向量库。高峰期每天要处理几万份文档函数计算自动扩容到几十个实例并行处理处理完自动缩容到零真正做到了按实际负载付费。4. 从服务器迁移到函数计算的实操路径4.1 资源配置该怎么定内存、GPU、超时、并发迁移项目里最常被问的问题是函数实例的规格怎么选CPU 核数、内存大小、GPU 型号、超时时间、并发上限每一项都影响性能和成本选错了后果很直接。我一般按这个顺序来定内存决定 CPU。很多平台的内存和 CPU 是配套的内存越大配的 CPU 越强。先看你服务的常驻内存占用再加一些余量如果代码里有模型加载内存需求要按模型大小算。模型文件和运行库被加载到内存后至少占几个 GB直接选大内存规格反而省钱因为小规格会导致频繁 OOM 或 GC。GPU 规格按模型复杂度定。轻量模型百亿参数以内用入门级 GPU 就够了实测吞吐和延迟都还行大模型或并发要求高的场景上更高规格的 GPU不要硬塞小型号否则排队严重体验反而更差。超时时间按业务链路算。单函数内部如果有循环超时要留足余量。我习惯设成预计耗时的两到三倍。并发上限要刻意控制。函数计算的并发上限默认值往往很乐观但下游的数据库、向量库、模型服务不一定扛得住。我遇到过一次事故一个推理函数在流量高峰自动扩容到 100 个实例直接把下游的向量库打挂了。现在我在所有 AI 函数的配置里都会给下游组件留出保护性并发限制。4.2 一次真实迁移复盘从 8 台服务器到 3 个函数拿我最近做的一个智能客服项目举例。改造前服务部署在 8 台 8 核 16G 的 ECS 上其中 4 台挂了 GPU跑着推理服务另外 4 台跑 Web 服务和检索逻辑。业务高峰期 GPU 机器 CPU 飙到 80%低谷期整体资源利用率不到 10%。迁移后的架构是三个函数第一个 Web 接入函数CPU 规格负责请求接入和会话管理第二个检索函数负责向量检索和排序第三个推理函数GPU 规格带预置并发。三个函数之间用内部调用串联消息队列处理异步任务。整个迁移花了两周。第一周做容器镜像和代码改造第二周做压测和参数调优。最终结果资源成本降了大约一半高峰期的响应时间反而比改造前更快了因为在高峰期函数计算真的把实例数顶了上去不像以前要等运维手动加机器。那次复盘给我的最大感悟是迁移到函数计算不是一个简单的部署方式变化而是一次架构思维的转变。你得重新梳理状态、重新设计调用链、重新考虑故障边界。但一旦理清了收益是实打实的。5. 常见问题与排查技巧实录5.1 冷启动到底怎么治冷启动是函数计算被吐槽最多的问题。所谓冷启动就是请求来了才发现需要新起一个实例从环境初始化到代码加载整个过程要几秒甚至几十秒。AI 场景因为涉及模型加载和 GPU 初始化冷启动时间比普通 Web 函数长得多。对付冷启动我试过几种办法。最有效的是预置并发也就是让平台提前拉起一批实例常驻等待请求。代价是这些实例会一直计费所以数量要谨慎我一般只给推理函数配预置并发其他函数保持默认。还有一种思路是减少初始化工作量。把模型加载放到函数初始化阶段而不是请求处理阶段依赖包尽量精简容器镜像做小。再有就是用自定义运行时或镜像预热把最耗时的初始化提前做掉一部分。现在的主流平台还支持实例级的生命周期回调也就是 Initializer 机制。这个机制允许你在收到第一个请求之前先执行一段初始化代码把模型加载、连接池建立这类耗时操作放在这里能显著缩短真实请求的响应时间。5.2 默认参数背后的陷阱很多人在函数计算上踩坑不是功能不行而是没有理解默认参数的含义。最常见的是默认同步调用的超时时间。如果你用的是某个云平台函数计算的默认配置超时可能只有几秒。模型推理一旦超过这个时间函数直接失败。我自己就因为这个原因排查了一晚上最后只是把超时调大问题立刻消失。另一个容易踩的是函数并发上限。平台默认的并发上限通常按“每个函数 100 实例”起步听起来不少但 AI 场景的单个请求耗时长100 个实例能承载的并发请求数其实有限。如果上游突然打来几千个并发请求没有合理设置排队策略一部分请求会直接报错。再一个是默认日志级别。AI 函数的日志量通常很大因为中间要打很多调试信息。默认保留全量日志不仅浪费成本还会拖慢日志查询。建议在生产函数里调高日志级别只保留必要的信息。表格总结一下几个关键参数的经验值参数推荐做法常见坑超时时间按实际链路耗时的2-3倍设置默认值太小长任务直接被掐断并发上限结合下游组件的承受能力放得太松下游数据库被打挂预置并发只给推理等关键函数配置配置太多闲时成本高日志级别生产环境调高保留错误日志全量日志导致成本暴涨GPU规格按模型参数量和并发需求选贪大浪费贪小排队严重5.3 连接数打满与内存泄漏把 AI 服务迁到函数计算之后一个很隐蔽的问题是连接数管理。函数实例会因为弹性伸缩频繁创建和销毁如果每次创建都新建数据库连接池不跟实例生命周期绑定连接数很快会打满数据库或向量库的上限。解决办法是复用连接。把连接池的初始化放到函数实例的初始化阶段也就是 Initializer 或全局变量里让它跨多次调用复用。同时要记得设置空闲连接超时避免实例被销毁时连接泄露。内存泄漏则是另一个麻烦。AI 函数的常驻内存消耗包括模型文件、缓存、运行库。如果代码里每次请求都加载一次模型内存会迅速增长如果加载后不释放实例很快会被 OOM 杀掉。我养成了一个习惯每次压测之后都要看一眼函数的内存监控曲线。正常情况下内存应该是一条平稳的线如果呈现阶梯上升说明有泄漏需要查代码里的全局对象和缓存清理逻辑。函数计算的弹性自动伸缩能掩盖很多问题但掩盖不代表解决性能问题早晚会暴露。6. 函数计算的下一站AI 原生运行时6.1 运行时层的能力下沉函数计算这几年的进化路径本质上是一条从“函数执行环境”到“AI 应用运行时”的路径。早期平台只负责拉起代码、执行、回收现在平台已经更多地介入到 AI 应用的整体生命周期管理包括 GPU 调度、模型预加载、长连接维护、状态存储甚至向量检索和模型网关的集成。我判断接下来还会有几个方向加速变化。第一个是更智能的冷启动预测。平台会根据历史流量和调用规律主动预热可能需要的实例规格而不是被动等待请求。对 AI 场景这意味着模型可以提前加载好用户请求过来就直接推理几乎无感。第二个是GPU 资源池化。现在不少平台的 GPU 函数已经是按秒计费下一步会做到更细粒度的算力共享把碎片化的 GPU 资源整合起来让每个任务的成本进一步下降。第三个是运行时框架的 AI 化。比如函数内置模型推理的钩子、内置模型版本切换的机制、内置 Prompt 模板管理。未来的函数计算可能不是一个单纯的计算引擎而是一个可以直接承载 AI 业务逻辑的分布式运行时。6.2 我们该怎么跟上这场进化作为一个长期跑在函数计算上的 AI 项目开发者我的体会是基础设施的进化速度远比你想象得快关键是不要用老眼光看待这些平台。早期我自己也很抵触函数计算觉得它能做的事太少限制太多。真正深入用下来才明白限制的存在是因为平台做了取舍——它把通用的、可运维的部分全部抽象掉了留下来的正是业务代码最核心的逻辑。对 AI 应用来说这恰好是好事因为模型服务和业务逻辑本来就是两回事。我的建议是如果现在要新起一个 AI 项目可以认真考虑函数计算作为默认选项。哪怕一开始用不太上也先按“事件驱动、无状态、可重入”的方式设计业务代码。这样将来要迁移到函数计算或者要接入其他云服务成本会非常低。另外多关注平台更新的小版本功能。很多看起来不起眼的更新比如新的实例类型、新的生命周期钩子、新的计费模式可能刚好就能解决你手头最头疼的问题。我就是因为注意到某次更新支持了 GPU 函数的预置并发才彻底解决了推理服务的冷启动困扰。最后分享一个小技巧用两套函数配置跑同一套代码。一套小规格做日常开发调试一套大规格做生产发布。这样既能节省开发成本又能在需要验证完整链路时不至于手忙脚乱。函数计算的配置是可以通过基础设施工具管理的把配置代码化环境之间的切换就变得非常轻量这也是它作为一个“运行时”相比传统服务器最难替代的价值。