You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将LibTorch(MPS后端)与Rust二进制程序打包?

问题描述

我正在开发面向Apple M芯片的AI聊天桌面应用,使用嵌入模型与重排序模型,选择Rust-Bert是因为它能高效处理这类模型,而它依赖LibTorch的Rust绑定tch。为提升用户体验,我希望把适配MPS(Metal Performance Shaders)后端的LibTorch库和应用打包在一起,避免用户单独安装LibTorch,让应用更易用。但我找不到能通过cargo build.rs直接打包的MPS后端LibTorch预编译二进制文件,需要帮忙寻找合适的二进制文件,或者在构建过程中打包该库的替代方案。

我已经设置了环境变量:

export DYLD_LIBRARY_PATH=/opt/homebrew/Cellar/pytorch/2.2.0_10/lib:$DYLD_LIBRARY_PATH

但编译运行后出现以下错误:

[main][~/Programs/pyano/rust-backend]$ ./target/release/rust-backend

dyld[93114]: Symbol not found: __ZN2at4_ops10layer_norm4callERKNS_6TensorEN3c108ArrayRefINS5_6SymIntEEERKNS5_8optionalIS2_EESC_db
  Referenced from: <1138FCDA-AB1A-3CC6-B540-4DE31C13A6CF> /Users/saurav/Programs/pyano/rust-backend/target/release/rust-backend
  Expected in:     <8F36AFD3-91CB-3828-BD48-4381DB5297F2> /opt/homebrew/Cellar/pytorch/2.2.0_10/libexec/lib/python3.12/site-packages/torch/lib/libtorch_cpu.dylib
解决方案

一、错误原因

你遇到的符号缺失问题,核心是Homebrew安装的PyTorch(带Python绑定)与tch crate依赖的纯LibTorch版本不兼容。Homebrew打包的PyTorch包含Python相关符号,而tch需要的是独立的LibTorch二进制文件,版本、符号命名的细微差异都会导致加载失败。

二、MPS版LibTorch获取与打包方案

1. 下载官方预编译LibTorch

PyTorch官方提供适配Apple Silicon的MPS版LibTorch预编译包:

  • 下载对应版本的LibTorch(选择稳定版、macOS平台、LibTorch、C++/Java架构,指定ARM64)
  • 解压后得到libtorch目录,里面的库已默认支持MPS后端

2. 在build.rs中指定LibTorch路径

修改项目的build.rs,强制tch使用你下载的官方LibTorch,而非系统中的Homebrew版本:

fn main() {
    // 替换为你解压后的libtorch目录绝对路径
    std::env::set_var("LIBTORCH", "/your/path/to/libtorch");
    // 启用MPS后端
    std::env::set_var("TORCH_MPS_HIGH_WATERMARK_RATIO", "0.0");
    tch::build();
}

3. 打包LibTorch到应用

为让应用运行时自动找到LibTorch库,需完成以下步骤:

  • 构建完成后,将libtorch/lib下所有.dylib文件复制到应用包的Contents/Frameworks目录(桌面应用标准结构)
  • 使用install_name_tool修改二进制文件的库加载路径,将绝对路径改为相对路径,避免依赖系统环境:
# 示例:修改libtorch.dylib的加载路径
install_name_tool -change @rpath/libtorch.dylib @executable_path/../Frameworks/libtorch.dylib ./target/release/rust-backend
# 对libtorch_cpu.dylib、libtorch_mps.dylib等所有依赖库重复此操作

4. 替代方案:源码编译LibTorch

若官方预编译包不符合需求,可自行编译带MPS支持的LibTorch:

  • 克隆PyTorch仓库并切换到对应版本分支:
git clone --recursive https://github.com/pytorch/pytorch
git checkout v2.2.0
  • 设置编译参数并构建LibTorch:
export USE_MPS=1
python setup.py build_libtorch
  • 编译完成后,build/lib目录下会生成所需的LibTorch库,后续步骤与预编译包方案一致

三、验证MPS后端生效

运行应用前设置环境变量TORCH_MPS_DEBUG=1,查看日志中是否包含MPS backend enabled相关输出,确认MPS后端正常加载。

内容的提问来源于stack exchange,提问作者GraphicalDot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:45:08