ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Rust正在重塑AI基础设施:从数据处理到向量检索的三重信号

Rust正在重塑AI基础设施:从数据处理到向量检索的三重信号

去年有一段时间,我们团队的数据管线莫名其妙地变慢,模型还没开始训练,光是数据预处理和特征拼接就占掉一个多小时。当时我花了好几个晚上排查,最后发现瓶颈居然不在GPU,也不在模型结构,而是卡在几个不起眼的数据转换环节上。那段时间我第一次认真把Rust当成AI基建的地基材料来研究,然后陆陆续续观察到一些很有意思的变化。

如果单看日常开发,大家还是习惯在Python里写模型、写训练逻辑,AI算法岗位的技术栈好像没怎么变。但往底层看,情况完全不同:越来越多承担“地基”角色的组件——数据处理、特征工程、向量检索、模型调度、在线推理服务——正在从C++或者Python全面转向Rust。这篇文章我不打算讲空泛的“Rust很好很强大”,而是把我看得比较清楚的三个信号拆开来说:它们分别出现在哪些层面、背后的驱动力究竟是什么、以及作为普通开发者你应该怎么应对这轮转向。如果你正在做AI基础设施或者打算转这个方向,这篇内容应该能帮你把技术栈趋势看明白。

1. 先看清AI基建的“地基”原来是分两层的

要理解Rust为什么会在AI基建里崛起,得先明白一件事:AI技术栈从来不是单一语言,而是长期维持“上层Python、下层C++”的双层结构。

上层是算法工程师每天接触的那一层:模型定义、训练脚本、数据处理流程、接口调用。这些几乎全是Python的地盘。原因很直白——Python开发效率高,第三方库多,生态完善,迭代一个实验可能只需要几个小时。第二层是真正承压的“地基层”:数据存储引擎、列式文件格式、分布式调度器、向量索引、推理引擎、模型服务框架。这一层的共同特点是:面向高并发、低延迟、长时间稳定运行,每多花一毫秒都可能变成线上真金白银的损失。过去几十年,这一层基本被C++和Java占据,其中又以C++最根深蒂固——很多极致性能组件从底层就是C++写的,Python只是一个薄薄的封装壳。

这种双层结构本身没什么不好,它符合软件工程的正常分工。但问题在于,AI基础设施建设者们越来越难受:一方面,C++本身的安全性和开发效率问题被放大了。C++允许几乎所有形式的内存操作,也就意味着几乎无法避免内存泄漏、悬垂指针、数据竞争。AI基建又是典型的并发密集型场景——请求并发、数据并发、多卡并发,这些恰恰是C++最吃经验、最容易翻车的地方。另一方面,Python在性能上先天不足,全局解释器锁让它在多线程场景里非常憋屈,而靠C扩展模块打补丁的做法又让构建、调试、跨平台发布变得异常痛苦。

我见过很多团队为了解决一个并发下的偶发崩溃,在C++代码里反复加日志、压测、复现,一搞就是好几周。这种“用时间换安全”的模式,在AI模型迭代越来越快的今天已经不可持续了。于是,一个既能提供接近C++性能,又能从编译器层面把一大类内存问题直接拦截掉的语言,天然就会被人盯上。Rust也就是在这个时间窗口里,从“系统编程圈的玩具”变成了“AI基建的可选材料”。

两层结构决定了转向不会是整体替换,而是从“地基层”开始,一块砖一块砖地换。这也解释了为什么我们观察到Rust的渗透是从数据处理组件、向量检索这些基础设施层开始的——那里才是痛感最强的地方。

2. 信号一:数据处理组件以“原生引擎+Python壳”的方式大规模Rust化

第一个信号,也是最明显的一个,发生在AI数据链路的中间地带——tokenization、数据清洗、DataFrame操作、列式存储格式读写这一类组件上。

拿数据处理来说,过去几年我身边只要做AI应用的团队,几乎都在用一个知名度极高的tokenization库作为标准配置。它的Python版本跑起来不算慢,但在处理超长文本、大批量请求时,CPU消耗和内存占用一直很扎眼。2021年之后,这个库的核心被用Rust重写,Python版本只剩下一层薄薄的绑定壳。重写之后的性能提升不是百分之几十,而是几个数量级——之前需要跑好几秒的批次任务,现在几百毫秒就能完成。而且内存占用曲线变得非常平稳,不再动不动就吃满几个GB。同样的故事还发生在DataFrame类工具和列式存储格式的实现中:底层查询引擎和文件读写层改成Rust实现,对外接口不变,Python用户几乎无感知地获得了性能升级。

这里有个细节值得关注:这些Rust重写的组件,绝大多数采用“原生引擎+Python壳”的方式落地,不是让Python开发者去写Rust。什么意思?就是底层用Rust写一个高性能、内存安全的引擎,提供C接口或直接的Python绑定,上层继续用Python调用。这种模式非常聪明——它没有破坏AI开发者已有的编程习惯,只是在看不见的地方替换了发动机。对团队来说,这几乎是零迁移成本的性能升级;对Rust生态来说,这意味着它没有和Python正面对抗,而是先在下沉层站稳了脚跟。

为什么偏偏是Rust来做这件事,而不是继续用C++优化?我在一个实际项目中对比过两种方案。当时的任务是重构特征拼接模块,数据量大、逻辑比较复杂。用C++重写的话,光是环境配置和跨平台编译就要折腾掉不少时间,而且中间有一段涉及多线程安全,需要手工加锁、仔细推理所有权关系——逻辑上稍微绕一点,很容易就出现难以排查的数据竞争。同样的需求换到Rust,编译器会在编译阶段直接把数据竞争和内存安全问题拦住,我不用花大量时间来猜“这段代码到底有没有问题”,省下来的精力全花在逻辑设计上。这个体验,直接决定了团队愿意选哪条路。

另外一个很少有人提的点是跨平台发布。Rust编译出来是单一静态二进制,不像C++在Linux、macOS、Windows上各自有各自的ABI和依赖地狱。AI组件常常要跑在各种环境的服务器上,Rust的构建产物在部署层面省了太多事。我甚至可以这么说:数据组件的Rust化,其实不只是性能竞赛,更是工程效率竞赛。当一个Rust实现和一个C++实现在性能上相差不多时,后者因为构建、调试、跨平台负担更重,实际上已经输了。

所以信号一的核心判断是:在AI数据链路的性能敏感节点上,Rust已经完成了从“可选”到“默认”的转变。这一层现在到处是Rust的影子,只是大多藏在Python壳底下,不刻意去翻底层很难注意到。但作为趋势,它的覆盖面已经相当可观。

3. 信号二:在线推理与向量检索进入“延迟敏感、内存安全优先”的重写窗口

如果说数据预处理还算“离线场景”,对稳定性要求没那么极端,那在线推理和向量检索就是另一个量级的挑战——毫秒级延迟、极高并发、7x24小时不能断。第二个信号正是发生在这里。

向量检索这几年成了AI基建里最拥挤的赛道。随便打开一个行业会议,都有人在讲RAG架构、相似度检索、向量数据库。这个赛道的底层竞争,核心比的就是索引构建速度、查询延迟、并发吞吐和资源占用。早年的向量索引实现几乎都是C++写的,因为性能要求太苛刻。但近两年,新立项的向量数据库和检索中间件越来越多地直接采用Rust——这不是个别团队的偏好,而是成了一个现象级的选择。我去看过几个新项目的架构设计,理由高度一致:第一,Rust在并发场景下能提供跟C++同级别的性能,但程序员写出数据竞争的概率大幅下降;第二,向量检索服务通常要驻留大量索引数据在内存里,内存安全问题一旦触发就是线上事故,Rust的内存安全保证对运维来说实在是太香了。

我举一个自己接触过的真实场景。某公司的文本向量检索服务,早期用C++写核心索引,Java写上层接口。开发过程中,每隔一段时间就会冒出一些偶发性的段错误或者内存泄漏,每次排查都要靠核心开发老师傅手动翻代码。后来新架构改用Rust重写索引层,编译期的所有权检查直接堵住了悬垂引用和一大部分内存问题;运行时就算出问题,通常也是明确的panic堆栈,而不是那种完全不可复现的内存错乱。整个团队的信心和迭代速度,完全不一样。

在线推理服务同样在发生变化。模型部署以后,真正承受并发压力的是推理运行时、请求调度器、批处理组件、网关代理这一串东西。传统方案里,Python负责快速实现功能,C++负责榨干性能,但两者之间的胶水层往往成为事故高发区。Rust在这里的优势,准确地说是“可预测的低延迟”。跟Go相比,Rust没有垃圾回收器,不会在某个不可控的时刻突然触发Stop the World;跟C++相比,它在内存安全上又强出一个维度。推理服务每增加一个微小的GC停顿或锁竞争,都可能反映到用户可感知的延迟上。对于在线推理这种“每一毫秒都是成本”的场景,Rust几乎是为它量身定做的。

我特意确认过一个细节:这些重写项目很少是从零开始放弃已有C++代码的,更多是在新增组件或高并发瓶颈模块上优先用Rust,老代码继续跑,新模块用Rust补位。这是一种很务实的渐进式替换策略。但它的意义很明确——C++在这个领域“理所当然”的位置,正在被一项一项地抢走。如果说数据处理层的Rust化是“锦上添花”,那么在线服务层的Rust化就是“雪中送炭”,因为稳定性和延迟指标直接决定了服务能不能上线。

4. 信号三:新一代AI基建项目从立项第一天就选择“Rust优先”

前两个信号说的是存量组件的替换,第三个信号更根本——新一代AI基建项目在立项之初,就直接把Rust定为第一语言。这不是修修补补,而是从一开始就按Rust的思维去设计整个系统。

过去一个新AI基础设施项目诞生时,开发者的默认思路通常是:核心逻辑用C++或Java,然后给Python封装一层接口,因为“AI开发者只会用Python”。现在这个默认值正在被推翻。我看到越来越多的新项目在技术选型文档里直接写“Rust优先”,也就是核心模块、CLI工具、网络框架、运行时全部用Rust实现,Python只作为显式绑定的外部接口存在。随之而来的变化是:招聘要求里对Rust的需求变多了,团队的技术分享主题从“如何用C++优化性能”变成“如何用Rust构建安全的高性能服务”,甚至在一些技术社区的AI基建板块,Rust相关内容的讨论热度已经超过了不少传统系统编程语言。

为什么Rust优先会成为一种设计哲学,而不仅仅是技术偏好?我参加过一次某模型调度系统架构评审,项目的早期原型用的是Python,能跑通但撑不住高并发。评审时大家争论要不要用Go,最后拍板用了Rust。核心逻辑就两条:第一,调度系统里存在大量并发任务队列、状态共享、超时控制,这些正是数据竞争的温床,Rust可以在编译期把这类问题挡掉一大半;第二,整个团队希望用一套语言统一“编译型核心+周边工具链”,而不是像以前那样核心用C++、工具脚本用Python、部署脚本用Shell,三套语言三个心智负担。Rust的cargo工作空间统一管理依赖和构建,让整套工具链变得异常干净。

Rust优先还有一个很实际的好处——它迫使团队在前期就认真设计边界。Rust不像Python那么随意,也不像C++那么自由,它强迫你把每个数据的所有权、每个接口的契约想清楚。这种“麻烦”在初期确实拖慢速度,但一个AI基建项目通常要运营好几年,前期的设计成本会在后续维护里以十倍甚至百倍的效率回报回来。我见过的一些纯Python快速堆出来的基建项目,到了中期重构时几乎寸步难行;而Rust优先的项目,因为模块边界严格,后续演进反而非常顺畅。

当然,Rust优先不是说这项目里就不出现Python了。恰恰相反,新一代AI基建项目通常比老项目更重视Python接口体验,因为模型生态还在Python手里。区别在于:过去Python是“主”,C++是“仆”;现在Rust是“主”,Python变成“客”。这里面的地位翻转,带来的不仅是技术栈变化,更是整个项目的文化变化——你不再是到处给C++代码打补丁,而是从一开始就站在一个安全、高性能的地基上设计系统。

这三重信号叠加起来,结论已经很清楚了:Rust进入AI基建,已经不再是某个小圈子里的实验性尝试,而是在多个关键节点同时落地的大趋势。

5. 为什么是Rust而不是Go、不是改良过的C++:转向背后的三个共同驱动力

看完三个信号,你可能会问:凭什么偏偏是Rust?Go也有很多人在用,C++也在不断加新标准试图自救。这里我想把底层原因说透,三个驱动力分别对应三个不同层面的需求。

第一个驱动力,也是最根本的:AI基建正在从“能用”走向“必须稳定可靠”。早期AI系统大部分是离线跑批,训练脑崩了重跑就是,没那么大影响。现在AI服务大规模线上化,用户量动辄几十万上百万,一次内存泄漏或者偶然的数据竞争,都可能变成大面积线上事故。Rust的内存安全模型——所有权、借用检查、生命周期——让开发者没法写出传统C++里最常见的那类bug。这不是靠程序员更细心,而是靠编译器从机制上保证。对于线上服务来说,这种“机制级保障”价值巨大。

第二个驱动力是并发模型和性能可预测性。AI基建服务天然是并发密集的:同时处理无数请求、同时在多线程上执行数据任务、同时调度多块GPU。Rust的并发模型非常激进,它把“不可变共享、可变独占”这些原则写进了类型系统里。你不需要像在C++里那样靠经验和约定来避免数据竞争,编译器会直接告诉你哪里不安全。而跟Go相比,Rust没有GC暂停,性能曲线更平滑,这一点在延迟敏感的在线场景里尤其重要。说白了,Rust在性能上可以摸到C++的天花板,在安全性上又提供了一个中间层语言给不了的保障——这正是“既要性能又要稳定”的AI基建最需要的组合。

第三个驱动力比较务实:Rust的工程化工具链,在系统编程这个层面是代差级的体验。它的包管理、依赖版本管理、单元测试、交叉编译,这些体验比C++那一套老旧的构建体系好出太多。我这么说吧,C++世界里光是把一个项目在不同系统上编出可执行文件,常常就要花掉半天时间配置环境;Rust里一个命令搞定,依赖锁定、版本语义全都给你安排好。对一个长期维护的大型基建项目来说,这种工程效率差异会不断积累,最后变成“用了就回不去”的粘性。

那为什么不是“改良过的C++”?C++的新标准确实带来了不少改进,但问题在于它背负了几十年的兼容包袱,语言复杂度已经高到离谱,一个团队很难保证所有成员都能写出安全代码。Rust是一张白纸重新设计,复杂度虽然也不低,但它的编译器错误提示和包管理体验,让新手入门的摩擦大大降低。对团队管理者来说,招一批能写安全C++的工程师,远比招一批能写Rust的工程师难得多——这个现实因素在技术选型里往往比光看性能还重要。

6. 普通团队落地时最容易踩的坑,以及我的渐进式采用建议

讲了这么多趋势,最后聊点实操层面的东西。Rust进入AI基建虽然是明确方向,但这不代表你可以无脑上Rust。我在接触不少采用Rust的团队后,发现有几个坑非常典型,几乎每个团队都会踩。

第一个坑是盲目追求零拷贝和极致手写优化。Rust的unsafe字段给了开发者绕过安全检查的出口,于是有些人一到热点代码,就急着用unsafe去手动操作裸指针。结果往往是代码变得很难维护,而且unsafe用得越多,编译器能帮你保证的东西就越少,最后不安全的概率甚至可能比C++还高。我见过一个团队为了解决一个简单复制开销,把好几个模块全部改成unsafe手动管理内存,后来排查线上问题时几乎无从下手。正确的策略应该是:先写安全的Rust,用性能分析工具找到真正瓶颈,再针对极小范围的热点代码谨慎使用unsafe,并且用严格注释说明不变量。

第二个坑是过度把GPU侧逻辑搬到Rust。Rust再强,也不能替代CUDA和GPU驱动。在训练和推理环节,最核心的计算依然要跑在GPU上,而GPU生态的语言边界仍然牢牢控制在C++/CUDA手里。有些团队为了让技术栈显得“统一”,硬要用Rust重写GPU算子,这种投入产出比极低。我建议的做法是:Rust负责CPU端的所有控制面——调度、批处理、数据预取、接口服务;GPU内部的计算逻辑继续用CUDA或第三方算子库。两者的边界就在PCIe或者统一内存接口处,不要越界。

第三个坑,也是最常见的,是**“要么全上、要么不上”的心态**。团队一拍脑袋说要用Rust,然后立刻把整个项目推翻重写。这种激进策略几乎都会出问题:Rust学习曲线陡峭,团队经验和生态磨合需要时间,全面重写期间业务又停不下来,最后项目往往烂尾。更务实的路径是“边缘切入,渐进替换”:先选一个模块边界清晰、性能瓶颈明确、跟主链路耦合度低的组件用Rust重写,比如数据校验、日志处理、配置解析、特征拼接这类功能;跑稳之后,再逐步向查询引擎、调度器、推理服务核心渗透。这样每一步都有明确的验证点,风险可控,团队也能在真实项目中完成技能成长。

我在自己负责的系统上就是这么做的。第一次用Rust,只重写了一个日志聚合和指标上报模块,数据量巨大但逻辑简单。压测结果很好,编译级的安全检查也让我很安心。有了这一次成功经验,后来才敢把更核心的特征拼接和向量检索路由逐步迁移过来。现在回头看,如果当初一上来就想重构整个推理链路,多半会被团队不熟悉、生态不完善、调试困难这些问题磨掉信心。

最后再分享一点观察:Rust不会取代Python,也不该取代Python。Python在AI生态的上层优势太明显——模型研究、数据分析、快速验证,这些场景没有对手。但正如我们看到的三个信号指向的那样,AI基建的“地基”确实在挪动,Rust正在成为新的默认基础设施语言。对做AI工程化和基础设施的开发者来说,现在开始接触Rust,不是追热点,而是为一个确定性较高的未来做准备。学习曲线的确不轻松,但它换来的回报——安全性、性能、工程体验——恰好正是AI基建那层地基最需要的东西。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进