如何将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

