tch-rs

GitHub
5.3k 419 较难 1 次阅读 昨天Apache-2.0开发框架
AI 解读 由 AI 自动生成,仅供参考

tch-rs 是连接 Rust 编程语言与 PyTorch 深度学习框架的桥梁。它通过封装 PyTorch 的 C++ 接口(libtorch),让开发者能够直接在 Rust 项目中调用强大的 PyTorch 功能,如张量运算、神经网络构建及模型训练。

这一工具主要解决了 Rust 生态中缺乏原生、高性能深度学习支持的痛点。以往开发者若想在 Rust 中使用 PyTorch,往往需要复杂的跨语言调用或牺牲性能,而 tch-rs 提供了近乎零开销的绑定,既保留了 PyTorch 完整的 API 能力,又发挥了 Rust 在内存安全和并发处理上的优势。

tch-rs 特别适合系统程序员、AI 工程师及研究人员使用,尤其是那些希望将深度学习模型部署到对性能和稳定性要求极高的生产环境,或致力于开发高性能 AI 基础设施的团队。

其技术亮点在于设计理念的“原汁原味”:它尽可能贴近 PyTorch 原始的 C++ API 行为,确保功能同步更新,同时为未来构建更符合 Rust 习惯的高级封装打下坚实基础。此外,它支持灵活的 libtorch 集成方式,包括自动下载预编译二进制文件、复用现有 Python 环境或直接链接系统库,并针对 Windows 平台提供了详细的兼容性指引,大大降低了配置门槛。

使用场景

某自动驾驶初创团队需要将基于 PyTorch 训练的感知模型部署到车载边缘计算单元,该单元对内存安全和执行延迟有极高要求。

没有 tch-rs 时

  • 团队被迫使用 Python 运行时加载模型,导致启动慢且内存占用高,难以满足车规级系统的实时性标准。
  • 为了追求性能尝试用 C++ 重写推理逻辑,但手动管理 LibTorch 的指针和内存极易引发段错误,调试过程痛苦且耗时。
  • 核心算法逻辑分散在 Python 训练脚本和 C++ 推理引擎中,语言隔阂导致代码复用率低,迭代新功能时需反复跨语言对齐接口。
  • 缺乏 Rust 的编译期类型检查,许多张量维度不匹配或设备(CPU/GPU)放置错误的 Bug 只能在运行时暴露,增加了路测风险。

使用 tch-rs 后

  • 直接利用 tch-rs 在纯 Rust 环境中加载并运行 LibTorch 模型,去除了 Python 解释器开销,显著降低延迟并提升内存安全性。
  • tch-rs 提供了贴近 C++ API 的薄封装,让开发者能在享受 Rust 所有权机制自动管理内存的同时,无缝调用底层高性能算子。
  • 训练后的模型权重可直接由 Rust 程序加载,实现了从数据预处理、模型推理到后处理的全链路 Rust 化,统一了技术栈。
  • 借助 Rust 强大的类型系统,大部分张量操作错误在编译阶段即被拦截,确保了车载软件在复杂路况下的运行稳定性。

tch-rs 成功 bridging 了 PyTorch 生态与 Rust 系统级编程优势,让高性能 AI 推理既安全又高效。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU
  • 非必需
  • 支持 CPU 默认运行
  • 若需 GPU 加速,需安装对应 CUDA 版本的 libtorch(例如通过设置 TORCH_CUDA_VERSION=cu117 下载预编译二进制),具体显卡型号和显存大小取决于所运行的 PyTorch 模型需求,README 未指定硬性指标
内存

未说明

依赖
notes1. 核心依赖是 C++ 版的 PyTorch (libtorch) v2.11.0。2. Windows 用户强烈建议使用 MSVC Rust 工具链而非 MinGW,且需注意 Debug 和 Release 版本的 ABI 不兼容问题。3. 可通过环境变量 LIBTORCH 手动指定路径,或启用 download-libtorch 特性自动下载(默认 CPU 版)。4. 若需静态链接,需手动编译 libtorch。5. 支持加载 SafeTensors 格式的预训练权重。
python非必需。仅在设置 LIBTORCH_USE_PYTORCH=1 使用 Python PyTorch 安装模式时需要系统中已安装 Python 及 torch 包,否则可独立使用 C++ libtorch。
libtorch (v2.11.0)
Rust toolchain (推荐 MSVC for Windows)
tch-rs hero image

快速开始

tch-rs

PyTorch C++ API 的 Rust 绑定。tch crate 的目标是为 PyTorch 的 C++ API(即 libtorch)提供一些轻量级的封装。它力求尽可能贴近原始的 C++ API,以便在此基础上进一步开发更符合 Rust 习惯的绑定。相关文档可在 docs.rs 上找到。

构建状态 最新版本 文档 依赖状态 许可证 变更日志

基于 libtorch 的 C API 代码生成部分源自 ocaml-torch

快速入门

本 crate 需要系统中已安装 v2.11.0 版本的 PyTorch C++ 库(libtorch)。您可以选择以下方式之一:

  • 使用系统全局的 libtorch 安装(默认)。
  • 手动安装 libtorch,并通过 LIBTORCH 环境变量告知构建脚本其位置。
  • 使用 Python 安装的 PyTorch,为此设置 LIBTORCH_USE_PYTORCH=1
  • 如果无法找到系统全局的 libtorch 且未设置 LIBTORCH,构建脚本可以通过启用 download-libtorch 功能下载预编译的 libtorch 二进制文件。默认使用 CPU 版本;可通过设置 TORCH_CUDA_VERSION 环境变量为 cu117 来获取使用 CUDA 11.7 的预编译二进制文件。

系统全局的 Libtorch

在 Linux 平台上,构建脚本会在 /usr/lib/libtorch.so 中查找系统全局的 libtorch 库。

Python PyTorch 安装

如果设置了 LIBTORCH_USE_PYTORCH 环境变量,则会调用当前激活的 Python 解释器来获取 torch Python 包的相关信息,并链接到该版本。

手动安装 Libtorch

  • PyTorch 官网的下载页面 获取 libtorch,并解压 ZIP 文件。
  • 对于 Linux 和 macOS 用户,在 .bashrc 或等效配置文件中添加以下内容,其中 /path/to/libtorch 是解压后创建的目录路径:
export LIBTORCH=/path/to/libtorch

还可以分别指定头文件和共享库的位置:

# LIBTORCH_INCLUDE 必须包含 `include` 目录。
export LIBTORCH_INCLUDE=/path/to/libtorch/
# LIBTORCH_LIB 必须包含 `lib` 目录。
export LIBTORCH_LIB=/path/to/libtorch/
  • 对于 Windows 用户,假设 X:\path\to\libtorch 是解压后的 libtorch 目录:

    • 打开控制面板 -> 查看高级系统设置 -> 环境变量。
    • 创建 LIBTORCH 变量并将其设置为 X:\path\to\libtorch
    • X:\path\to\libtorch\lib 追加到 Path 变量中。

    如果您希望临时设置环境变量,可以在 PowerShell 中运行:

$Env:LIBTORCH = "X:\path\to\libtorch"
$Env:Path += ";X:\path\to\libtorch\lib"
  • 此时您应该可以运行一些示例,例如 cargo run --example basics

Windows 特别说明

根据 PyTorch 文档,Windows 下的 Debug 和 Release 构建不兼容 ABI。如果使用了错误版本的 libtorch,可能会导致段错误。

建议使用 MSVC Rust 工具链(例如通过 rustup install stable-x86_64-pc-windows-msvc 安装),而不是基于 MinGW 的工具链,因为 PyTorch 与 MinGW 存在兼容性问题。

静态链接

当设置环境变量 LIBTORCH_STATIC=1 时,将静态链接 libtorch,而非使用动态库。预编译的工件默认不包含 libtorch.a,因此需要手动编译,例如:

git clone -b v2.11.0 --recurse-submodule https://github.com/pytorch/pytorch.git pytorch-static --depth 1
cd pytorch-static
USE_CUDA=OFF BUILD_SHARED_LIBS=OFF python setup.py build
# 将 LIBTORCH 导出指向 pytorch-static 中的构建目录。

示例

基本张量操作

本 crate 提供了一个包装 PyTorch 张量的 Tensor 类型。以下是一个执行基本张量操作的最小示例。

use tch::Tensor;

fn main() {
    let t = Tensor::from_slice(&[3, 1, 4, 1, 5]);
    let t = t * 2;
    t.print();
}

使用梯度下降训练模型

PyTorch 为其支持的大多数张量运算提供了自动微分功能,这通常用于通过梯度下降训练模型。优化过程是在通过 nn::VarStore 创建的变量上进行的,这些变量需要定义其形状和初始值。

在下面的示例中,my_module 使用两个变量 x1x2,它们的初始值均为 0。前向传播作用于张量 xs 后,返回 xs * x1 + exp(xs) * x2

模型生成后,创建一个 nn::Sgd 优化器。在训练循环的每一步中:

  • 对一个小批量数据应用前向传播。
  • 计算损失,即模型输出与小批量真实标签之间的均方误差。
  • 最后执行一次优化步骤:计算梯度,并相应地更新 VarStore 中的变量。
use tch::nn::{Module, OptimizerConfig};
use tch::{kind, nn, Device, Tensor};

fn my_module(p: nn::Path, dim: i64) -> impl nn::Module {
    let x1 = p.zeros("x1", &[dim]);
    let x2 = p.zeros("x2", &[dim]);
    nn::func(move |xs| xs * &x1 + xs.exp() * &x2)
}

fn gradient_descent() {
    let vs = nn::VarStore::new(Device::Cpu);
    let my_module = my_module(vs.root(), 7);
    let mut opt = nn::Sgd::default().build(&vs, 1e-2).unwrap();
    for _idx in 1..50 {
        // 由零组成的虚拟小批量。
        let xs = Tensor::zeros(&[7], kind::FLOAT_CPU);
        let ys = Tensor::zeros(&[7], kind::FLOAT_CPU);
        let loss = (my_module.forward(&xs) - ys).pow_tensor_scalar(2).sum(kind::Kind::Float);
        opt.backward_step(&loss);
    }
}

编写一个简单的神经网络

nn API 可以用于构建神经网络架构。例如,以下代码定义了一个包含一个隐藏层的简单模型,并使用 Adam 优化器在 MNIST 数据集上对其进行训练。

use anyhow::Result;
use tch::{nn, nn::Module, nn::OptimizerConfig, Device};

const IMAGE_DIM: i64 = 784;
const HIDDEN_NODES: i64 = 128;
const LABELS: i64 = 10;

fn net(vs: &nn::Path) -> impl Module {
    nn::seq()
        .add(nn::linear(
            vs / "layer1",
            IMAGE_DIM,
            HIDDEN_NODES,
            Default::default(),
        ))
        .add_fn(|xs| xs.relu())
        .add(nn::linear(vs, HIDDEN_NODES, LABELS, Default::default()))
}

pub fn run() -> Result<()> {
    let m = tch::vision::mnist::load_dir("data")?;
    let vs = nn::VarStore::new(Device::Cpu);
    let net = net(&vs.root());
    let mut opt = nn::Adam::default().build(&vs, 1e-3)?;
    for epoch in 1..200 {
        let loss = net
            .forward(&m.train_images)
            .cross_entropy_for_logits(&m.train_labels);
        opt.backward_step(&loss);
        let test_accuracy = net
            .forward(&m.test_images)
            .accuracy_for_logits(&m.test_labels);
        println!(
            "epoch: {:4} train loss: {:8.5} test acc: {:5.2}%",
            epoch,
            f64::from(&loss),
            100. * f64::from(&test_accuracy),
        );
    }
    Ok(())
}

有关训练循环的更多详细信息,请参阅详细教程

使用预训练模型

pretrained-models 示例展示了如何在图像上使用一些预训练的计算机视觉模型。这些权重是从 PyTorch 实现中提取的,可以在这里下载:resnet18.otresnet34.ot

然后可以通过以下命令运行该示例:

cargo run --example pretrained-models -- resnet18.ot tiger.jpg

这将打印出图像对应的 ImageNet 前 5 类别及其概率。该示例的代码非常简单。

    // 首先加载图像并将其调整为 224x224 大小。
    let image = imagenet::load_image_and_resize(image_file)?;

    // 创建一个变量存储来保存模型参数。
    let vs = tch::nn::VarStore::new(tch::Device::Cpu);

    // 然后在此变量存储上构建模型,并加载权重。
    let resnet18 = tch::vision::resnet::resnet18(vs.root(), imagenet::CLASS_COUNT);
    vs.load(weight_file)?;

    // 对模型执行前向传播以获得 logits,并通过 softmax 将其转换为概率。
    let output = resnet18
        .forward_t(&image.unsqueeze(0), /*train=*/ false)
        .softmax(-1);

    // 最后打印出前 5 类别及其对应的概率。
    for (probability, class) in imagenet::top(&output, 5).iter() {
        println!("{:50} {:5.2}%", class, 100.0 * probability)
    }

使用 SafeTensors 从 PyTorch 导入预训练权重

safetensors 是 HuggingFace 推出的一种新的简单张量存储格式。它不依赖于 Python 的 pickle 模块,因此张量不会绑定到保存模型时使用的特定类和确切的目录结构。此外,它是零拷贝的,这意味着读取文件所需的内存与原始文件大小相同。

有关 safetensors 的更多信息,请参阅:https://github.com/huggingface/safetensors

安装 safetensors

您可以通过 pip 包管理器安装 safetensors

pip install safetensors

在 PyTorch 中导出权重

import torchvision
from safetensors import torch as stt

model = torchvision.models.resnet18(pretrained=True)
stt.save_file(model.state_dict(), 'resnet18.safetensors')

注意:导出文件的文件名必须以 .safetensors 为后缀,这样才能被 tch 正确解码。

tch 中导入权重

use anyhow::Result;
use tch::{
	Device,
	Kind,
	nn::VarStore,
	vision::{
		imagenet,
		resnet::resnet18,
	}
};

fn main() -> Result<()> {
	// 创建模型并加载预训练权重
	let mut vs = VarStore::new(Device::cuda_if_available());
	let model = resnet18(&vs.root(), 1000);
	vs.load("resnet18.safetensors")?;
	
	// 加载图像文件,并将其调整为 ImageNet 常用的 224x224 尺寸。
	let image = imagenet::load_image_and_resize224("dog.jpg")?
		.to_device(vs.device());

	// 对模型进行前向传播,得到 logits
	let output = image
		.unsqueeze(0)
		.apply_t(&model, false)
		.softmax(-1, Kind::Float);
	
	// 打印该图像的前 5 类别。
    for (probability, class) in imagenet::top(&output, 5).iter() {
        println!("{:50} {:5.2}%", class, 100.0 * probability)
    }
    
    Ok(())
}

更多示例包括:

  • 一个简化的 char-rnn 示例,展示了使用循环神经网络进行字符级语言建模。
  • 神经风格迁移 使用预训练的 VGG-16 模型,将一张图像转换为另一张图像的风格(预训练权重:vgg16.ot)。
  • 一些在 CIFAR-10 数据集上的 ResNet 示例
  • 一个 教程,演示如何使用 TorchScript JIT 部署和运行由 Python 训练的模型。
  • 一些使用 OpenAI Gym 环境的 强化学习示例,其中包括策略梯度示例以及可在 Atari 游戏上运行的 A2C 实现。
  • 一个 迁移学习教程,展示了如何在一个非常小的数据集上对预训练的 ResNet 模型进行微调。
  • 一个类似于 minGPT 的 简化版 GPT
  • 一个遵循 HuggingFace diffusers 库思路的 Stable Diffusion 实现。

外部资料:

  • 一个 教程,展示如何使用 Torch 计算期权价格和希腊字母。
  • tchrs-opencv-webcam-inference 使用 tch-rsopencv 对基于 mobilenet v3 的 Python 训练模型进行网络摄像头推理。

常见问题解答

从 Python 到 Rust 模型转换的最佳实践是什么?

请参阅 此讨论 以获取详细信息。

如何在 M1/M2 Mac 上运行此代码?

请查看 此问题

编译速度很慢,每次运行 cargo 时似乎都会重新构建 torch-sys。

请参阅 此问题,这可能是由于 rust-analyzer 不了解正确的环境变量(如 LIBTORCHLD_LIBRARY_PATH)所致。

从 Python 调用 Rust/tch 代码。

可以通过 PyO3 从 Python 调用 Rust/tch 代码,tch-ext 提供了一个这样的 Python 扩展示例。

加载共享库时出错。

如果您在运行生成的二进制文件时遇到找不到某些共享库的错误(例如: error while loading shared libraries: libtorch_cpu.so: cannot open shared object file: No such file or directory), 您可以尝试将以下内容添加到您的 .bashrc 文件中,其中 /path/to/libtorch 是您 libtorch 的安装路径。

# 对于 Linux
export LD_LIBRARY_PATH=/path/to/libtorch/lib:$LD_LIBRARY_PATH
# 对于 macOS
export DYLD_LIBRARY_PATH=/path/to/libtorch/lib:$DYLD_LIBRARY_PATH

许可证

tch-rs 根据您的选择,同时采用 MIT 许可证和 Apache 许可证(版本 2.0)进行分发。

有关详细信息,请参阅 LICENSE-APACHELICENSE-MIT

版本历史

mw2022/04/02

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

156.8k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|5天前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|6天前
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架