在一条典型 AI 服务链路中,真正消耗 GPU 的通常只有模型推理本身,而请求接入、身份认证、租户限流、Prompt 预处理、Tokenizer、模型路由、输出过滤、日志计量和审计等环节,往往运行在请求主路径上。围绕这些调用频繁、边界清晰、需要隔离且对延迟敏感的模块,Rust 与 WASI Preview 2 正在成为 AI 基础设施讨论的新焦点。
先改造边界组件,而不是整套技术栈
Rust 进入 AI 基础设施,并不意味着要替代整个 AI 技术栈。更现实的路径,是把高频调用、边界复杂、需要隔离且对延迟敏感的基础组件优先迁移到 Rust。
Rust 的价值也不只是“比 Python 快”。它将内存安全检查前移到编译期,并通过所有权模型减少悬垂指针、数据竞争和手动释放错误。对于 Tokenizer、JSON 转换、规则过滤、协议适配这类 CPU 密集且边界清晰的任务,收益比直接重写训练框架更直接。
素材中提到,Hugging Face 的 tokenizers 就提供 Rust 实现,并可被 Python、Node.js 等语言调用。它没有取代 Python 的模型编排,而是把性能敏感的底层工作下沉到 Rust。
同时,适用边界也很清楚:如果瓶颈在 GPU kernel、模型并行或 CUDA 通信,Rust 不能凭空消除 GPU 瓶颈;如果业务逻辑仍在快速试验,过早重写也可能降低迭代速度。因此,Rust 更适合成为 AI 基础设施中的高性能控制层,而不是包揽全部环节。
WASI Preview 2给插件设定能力边界
传统 WebAssembly 模块通常通过线性内存和导出函数交互,接口容易退化为“传入指针 + 长度”和“返回指针 + 长度”。这要求宿主和模块共同约定内存布局,字符串、列表、错误处理都需要自行编码。
组件模型试图解决这一问题。它通过 WIT 描述语言无关的接口,使 string、record、option 等类型不再需要调用方手动解释指针。WASI Preview 2 则是基于组件模型的一套标准化接口集合,当前关键能力包括文件、网络、随机数、时钟等资源访问。
在工具链上,Rust 可以使用 wasm32-wasip2 目标构建组件,Wasmtime 是常见的服务端执行运行时。WASI Preview 2 的主要价值并不是“让 Wasm 更快”,而是为插件提供稳定的能力边界。
- 输出过滤插件只需要读取请求内容和配置,不应拥有任意网络访问权。
- 模型路由插件可能需要读取模型目录,但不应拥有宿主机写权限。
- 策略组件可以通过 WIT 定义输入输出,例如返回是否允许以及原因。
在工程实现中,Rust 组件通常由 wit-bindgen 或 cargo-component 根据 WIT 生成绑定代码。构建时可以使用 wasm32-wasip2 目标,但不能仅因为文件后缀是 .wasm,就认为它已经是符合 WIT 接口的组件。工程中应使用相应工具检查产物是否为组件。
安全不来自文件格式,而来自宿主限制
一个常见误区是:把第三方组件放进 Wasmtime,就认为它不会影响服务。实际上,Wasm 插件的安全性并不来自文件格式,而来自宿主对能力和资源的主动限制。
如果宿主开放了完整文件系统、任意网络和无限内存,那么组件模型并不能自动替代安全策略。Wasm 解决的是执行边界,身份认证、制品签名、依赖审计和租户隔离仍需要平台完成。
素材给出的治理思路可以拆成多个层次:
- 接口层:限制输入长度、字段数量与版本范围。
- 运行时:配置燃料、内存、表和实例数量上限。
- 能力层:只注入必要的文件、网络和时钟接口。
- 生命周期:按请求或租户决定实例是否复用。
- 供应链:锁定依赖、校验哈希、签名验证。
- 观测层:记录调用耗时、拒绝原因和资源峰值。
这里还需要区分“计算限制”和“时间限制”。Wasm 的指令燃料可以帮助限制执行量,但外部 I/O、宿主函数调用和等待操作仍然需要超时与取消机制。只配置燃料而没有请求级取消,不能解决所有卡死问题。
推理架构的分层与治理成本
从架构角度看,更合理的方式是把性能、隔离和迭代速度拆开处理,而不是要求一种语言承担所有职责。一个可参考的分层是:
- Python 或 TypeScript 负责实验、工作流与模型调用。
- Rust 原生服务负责网关、调度、Token 处理、连接池。
- WASI Preview 2 组件负责租户策略、内容过滤、格式转换和路由插件。
- GPU 推理服务负责模型执行与显存管理。
落地时,可以先选择输入输出清晰、无需 GPU 的模块,例如策略过滤、Prompt 检查或数据清洗。随后测量 P50、P95 延迟、内存峰值、失败率和部署复杂度,避免只比较单次函数执行速度。
接口设计也比语言选择更重要。WIT 需要明确输入、输出和错误语义,并建立兼容规则:新增字段默认可选;删除字段至少跨一个兼容周期;改变语义升级接口包版本;错误处理禁止用空字符串代替失败。接口稳定比语言选择更重要,WIT 设计不清楚,换成组件后只会把问题更早固定下来。
在工具选择上,运行时可以使用 Wasmtime,构建阶段可以使用 Rust 1.82+ 的 wasm32-wasip2 目标,并检查产物是否为组件。每类插件还应定义能力清单,例如策略插件只接收请求数据和时钟,不开放网络和文件系统;路由插件可读取模型元数据和只读配置,并保留有限网络访问。
AI 本身也在改变这一过程。代码助手可以降低 Rust 的学习门槛,帮助解释生命周期、生成错误处理骨架、补全 WIT 接口和测试用例,但生成代码仍需经过 cargo check、cargo clippy、单元测试和运行时测试。AI 也可能让插件数量增长更快,从而提高平台对制品签名、版本兼容、沙箱策略和可观测性的要求。
对平台团队来说,真正需要回答的问题不是“是否要把 AI 系统全部改成 Rust”,而是先固定接口、限制能力、测量资源,再决定哪些边界组件适合组件化。
原创文章,作者:点点,如若转载,请注明出处:https://www.dian8dian.com/ai-tui-li-ping-tai-zou-xiang-zu-jian-hua-rust-yu-wasi