我正在开发一款针对Apple M芯片的AI聊天桌面应用程序。该应用程序利用嵌入模型和重新排序模型,我选择了 Rust-Bert,因为它能够有效地处理此类模型。 Rust-Bert 依赖于 tch,即 LibTorch 的 Rust 绑定。
为了增强用户体验,我想将 LibTorch 库(专门用于 MPS(金属性能着色器)后端)与应用程序捆绑在一起。这将防止用户需要单独安装 LibTorch,使应用程序更加用户友好。
但是,我无法找到 MPS 后端的 LibTorch 预编译二进制文件,这些二进制文件可以通过 Cargo build.rs 文件直接捆绑到应用程序中。我需要帮助找到合适的二进制文件或替代解决方案,以便在构建过程中将库与应用程序捆绑在一起。
这是build.rs文件
use std::env;
use dirs::home_dir;
fn main() {
// Set the minimum macOS version to 11.0 (required for `___isPlatformVersionAtLeast`)
// Link necessary macOS system frameworks
println!("cargo:rustc-link-arg=-framework");
println!("cargo:rustc-link-arg=CoreML");
println!("cargo:rustc-link-arg=-framework");
println!("cargo:rustc-link-arg=Foundation");
println!("cargo:rustc-link-arg=-framework");
println!("cargo:rustc-link-arg=CoreFoundation");
// Optionally, specify any other necessary paths for your libraries (for example, LibTorch)
if let Some(home_dir) = dirs::home_dir() {
let libtorch_path = home_dir.join(".pyano").join("binaries");
let libtorch_path_str = libtorch_path.to_str().expect("Invalid libtorch path");
// Tell cargo to pass the library search path
println!("cargo:rustc-link-search={}", libtorch_path_str);
println!("cargo:rustc-link-arg=-Wl,-rpath,{}", libtorch_path_str);
// Link your LibTorch libraries here if necessary
println!("cargo:rustc-link-lib=dylib=torch_cpu");
println!("cargo:rustc-link-lib=dylib=torch");
println!("cargo:rustc-link-lib=dylib=c10");
}
}
当我为 Arm 架构构建这个时
cargo build --target aarch64-apple-darwin
和我的.cargo/config.toml
[target.aarch64-apple-darwin]
linker = "clang"
rustflags = ["-C", "link-arg=-mmacosx-version-min=11.0"]
我在 Apple M1 芯片机器上构建项目时遇到此错误。
= note: ld: warning: ignoring duplicate libraries: '-lc++', '-lc10', '-liconv', '-ltorch', '-ltorch_cpu'
Undefined symbols for architecture arm64:
"___isPlatformVersionAtLeast", referenced from:
-[CoreMLExecution predict:outputs:getOutputTensorDataFn:] in libort_sys-1d12fa9f293e09c5.rlib[55](model.mm.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
无论我在做什么(在删除整个 build.rs 文件后也尝试过),我都会收到此错误。 我也将 Xcode 更新到了版本 15。
添加:
println!("cargo:rustc-link-arg=Metal"); // Link Metal for MPS
println!("cargo:rustc-link-arg=Accelerate"); // Link Accelerate for hardware acceleration
用于 MPS 后端的预编译 LibTorch 二进制文件未正式适用于非英特尔芯片,因此您可能需要从具有 MPS 支持的源代码构建 LibTorch。
做:
git clone --recursive https://github.com/pytorch/pytorch
cd pytorch
按照源文档中的PyTorch中所述安装 macOS 的依赖项。
MACOSX_DEPLOYMENT_TARGET=11.0 python3 setup.py develop
修改build.rs
if let Some(home_dir) = dirs::home_dir() {
let libtorch_path = home_dir.join(".pyano").join("binaries"); // Change to the right path
let libtorch_path_str = libtorch_path.to_str().expect("Invalid libtorch path");
println!("cargo:rustc-link-search={}", libtorch_path_str);
println!("cargo:rustc-link-arg=-Wl,-rpath,{}", libtorch_path_str);
println!("cargo:rustc-link-lib=dylib=torch_cpu"); // Link built libraries
println!("cargo:rustc-link-lib=dylib=torch");
println!("cargo:rustc-link-lib=dylib=c10");
}