随着 AI 技术的发展,我们可以看到越来越多的 AI 项目使用 Rust 语言。除了模型推理领域的应用之外,也有很多一个面向 LLM 工作流引擎的 AI 系统构建框架。
回到标题,Rust 适合做模型推理吗?
如果是几年前,我的答案是,不适合。 原因是几年前,Rust 在科学运算上的库并不完善,甚至是缺失。也缺乏对 GPU 编程方面的支持。因此使用 Rust 做深度学习方向的工作是比较困难的。
那么现在呢(2025 年)?
可以用,但是要看部署场景。如果是边缘设备部署,就不要指望了,老老实实使用 C++就好。
Rust 在模型推理框架里,最流行的大概有三种选择:
如果是你,要使用 Rust 实现模型的推理,你会如何选择?
”很不幸的是“,这三种方案我都使用过,甚至在一个项目中,有着分别使用这三种方案重新实现过的经历。
tch-rs
tch-rs 是对 libtorch 的包装,因此我们只看 libtorch。libtorch 是 pytorch 的 C++ 接口,它的 API 几乎和 pytorch 保持一致。因此如果你的模型是使用 pytorch 实现的,使用 libtorch 做模型推理学习成本很低,是非常丝滑的。
但是,pytorch 并不是一个纯推理框架。它是一个专注于训练的框架,推理只点很小的部分。因此对于只做推理的项目来说,它实在是太重了。
例如现在 libtorch 2.7.1 cuda12.8 版本,光压缩包它就足足有 3.5GB。
https://download.pytorch.org/libtorch/cu128/libtorch-cxx11-abi-shared-with-deps-2.7.1%2Bcu128.zip
回到 tch-rs 这个项目,由于 libtorch 是 C++ 实现的,对于 Rust 项目来说,集成也有一些小小的挑战,我们需要小心配置好 libtorch c++ 包。
另一个缺点是,集成 tch-rs 会让你在编写项目时 rust-analyzer 每次运行变得缓慢,比较影响开发体验。
candle
candle 是 开源模型社区 huggingface 开源的一个基于 Rust 实现的极简推理框架。Rustacean 们在不了解具体情况下,一定会优先采用 candle 作为首选的推理框架(没错,我也是)。
candle 的优势很大。比如,纯 rust 实现的项目在集成上就要比其他两个项目要简洁得多。甚至它能让模型在 wasm 平台上进行部署,因为 rust 对 wasm 的支持也非常的完善。
它真的这么完美吗?
candle 似乎是为 LLM 大模型准备的推理框架,因此它对 Transformer 模型的支持是比较好的。Transformer 模型只是其中一个小分支。它对传统 CNN 模型,LSTM 模型等支持并不算太好,这可能也和目前 LLM 大模型火热,而传统 CNN 等模型式微有关,鲜少有人为传统模型向 candle 贡献代码,导致 candle 仓库一些算子的缺失或者不完善。
candle 使用 safetensors 文件作为权重格式,safetensors 是Hugging Face 提出的仅包含张量数据(如权重),不包含任何代码逻辑,也不存储模型结构的一种安全的张量存储格式。
这意味着,你使用模型推理前,必须先用 Rust 代码定义好模型结构,才能通过代码加载模型权重。问题是 candle 的接口与 pytorch 接口并不对等,这增加了使用者的使用难度,更致命的是,candle 目前还没有像样的开发文档,或者完整的 pytorch 与 candle 接口对照表。
因此,使用 candle 作为推理框架的话,非常考验使用者的编程水平以及对 pytorch 接口和 candle 接口的熟悉程度。
此外,candle 还有一个问题,就是对硬件的支持度问题。
candle 就连 nvidia 的 GPU 也不是所有设备都支持的。经过测试, Compute Capability 最好要大于等于 8.0 。小于 8.0 的设备都有可能出现下面类似的错误:
DriverError(CUDA_ERROR_INVALID_PTX, \"a PTXJIT compilation failed\')
同时也不支持 Jetson 系列设备。原因是 candle 使用 nvidia-smi 获取设备信息,而 Jetson 系列设备 并不存在 nvidia-smi 这个工具。
Compute Capability 可以看这个列表:
https://developer.nvidia.com/cuda-gpus
虽然 candle-transformers 下实现了许多流行的模型。但是,这些只是整个模型世界的一个小角落。
ort
ort 是 ONNX Runtime Rust 的包装。由于常用的 CNN 网络通常会有比较多的预处理和后处理,因此,配合 ndarray 是必要的。
onnxruntime 的硬件支持,是通过 providers 实现的。里面有支持相当多的硬件后端,比如 cpu、cuda、tensorrt、rocm、甚至还有国产的 Huawei CANN: cann、 Rockchip RKNPU: rknpu。
当然,其实其他 providers 是有一些部署难度的。我们最常用的还是 cpu 和 cuda。
由于 onnx 的格式流行度,ort 总体上要比 candle 易用得多。但是,ort 项目开发并不积极,版本从 1 到 2 升级,足足花了 2 年,目前依然还是 rc 版本。
但是我依然推荐使用 ort v2 版本,它提供了更完善的构建流程,比 v1 版本更加易用。
如何选择
相信 2025 年的今天,绝大部分模型项目都采用 pytorch 进行训练。但是我并不推荐使用 tch-rs,它的包袱实在是太重了。
如果你对 rust 项目有”洁癖“性的要求,想提高 rust 项目纯度,模型结构在 candle-transformers 中有定义并且想在比较新的硬件上部署,可以考虑 candle。
否则,最好选择 ort。
一个事实是,目前云服务器上大量提供的 GPU 硬件,其实性价比高都是 Compute Capability 通常小于 8.0 的型号,比如,NVIDIA T4,或者 QUADRO 系列,或者更老的 Tesla P40 、Tesla P4。