From 4bc5709e58e727f5d58c4f466b3cbc2ab619df61 Mon Sep 17 00:00:00 2001 From: hlhr202 Date: Tue, 7 May 2024 00:52:33 +0800 Subject: [PATCH 1/5] fix: metal --- .gitignore | 1 + src/whisper_sys_log.rs | 9 ++++++++- src/whisper_sys_tracing.rs | 9 ++++++++- sys/build.rs | 23 +++++++++++++++++++++-- 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index c3e612d..4f72f63 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ **/target **/Cargo.lock /.idea +/.vscode \ No newline at end of file diff --git a/src/whisper_sys_log.rs b/src/whisper_sys_log.rs index 9b5be22..5e58239 100644 --- a/src/whisper_sys_log.rs +++ b/src/whisper_sys_log.rs @@ -37,6 +37,13 @@ unsafe extern "C" fn whisper_cpp_log_trampoline( /// You should only call this once (subsequent calls have no ill effect). pub fn install_whisper_log_trampoline() { crate::LOG_TRAMPOLINE_INSTALL.call_once(|| unsafe { - whisper_rs_sys::whisper_log_set(Some(whisper_cpp_log_trampoline), std::ptr::null_mut()) + whisper_rs_sys::whisper_log_set(Some(whisper_cpp_log_trampoline), std::ptr::null_mut()); + #[cfg(feature = "metal")] + { + whisper_rs_sys::ggml_metal_log_set_callback( + Some(whisper_cpp_log_trampoline), + std::ptr::null_mut(), + ); + } }); } diff --git a/src/whisper_sys_tracing.rs b/src/whisper_sys_tracing.rs index 6c6d316..eeae123 100644 --- a/src/whisper_sys_tracing.rs +++ b/src/whisper_sys_tracing.rs @@ -37,6 +37,13 @@ unsafe extern "C" fn whisper_cpp_tracing_trampoline( /// You should only call this once (subsequent calls have no effect). pub fn install_whisper_tracing_trampoline() { crate::LOG_TRAMPOLINE_INSTALL.call_once(|| unsafe { - whisper_rs_sys::whisper_log_set(Some(whisper_cpp_tracing_trampoline), std::ptr::null_mut()) + whisper_rs_sys::whisper_log_set(Some(whisper_cpp_tracing_trampoline), std::ptr::null_mut()); + #[cfg(feature = "metal")] + { + whisper_rs_sys::ggml_metal_log_set_callback( + Some(whisper_cpp_tracing_trampoline), + std::ptr::null_mut(), + ); + } }); } diff --git a/sys/build.rs b/sys/build.rs index 0535637..354e93b 100644 --- a/sys/build.rs +++ b/sys/build.rs @@ -77,8 +77,13 @@ fn main() { .expect("Failed to copy bindings.rs"); } else { let bindings = bindgen::Builder::default() - .header("wrapper.h") - .clang_arg("-I./whisper.cpp") + .header("wrapper.h"); + + + #[cfg(feature = "metal")] + let bindings = bindings.header("whisper.cpp/ggml-metal.h"); + + let bindings = bindings.clang_arg("-I./whisper.cpp") .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) .generate(); @@ -160,6 +165,20 @@ fn main() { // for whatever reason this file is generated during build and triggers cargo complaining _ = std::fs::remove_file("bindings/javascript/package.json"); + + if cfg!(feature = "metal") { + // copy metal shader to the root of the crate + let _ = std::fs::copy( + out.join("whisper.cpp").join("ggml-metal.metal"), + out.parent() + .unwrap() + .parent() + .unwrap() + .parent() + .unwrap() + .join("ggml-metal.metal"), + ); + } } // From https://github.com/alexcrichton/cc-rs/blob/fba7feded71ee4f63cfe885673ead6d7b4f2f454/src/lib.rs#L2462 From a440e7cb6f35c644d10be31d179a931313412a68 Mon Sep 17 00:00:00 2001 From: hlhr202 Date: Tue, 7 May 2024 01:14:26 +0800 Subject: [PATCH 2/5] try fix metal log --- src/standalone.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/standalone.rs b/src/standalone.rs index eb49751..fb8072d 100644 --- a/src/standalone.rs +++ b/src/standalone.rs @@ -81,7 +81,13 @@ pub unsafe fn set_log_callback( log_callback: crate::WhisperLogCallback, user_data: *mut std::ffi::c_void, ) { - unsafe { whisper_rs_sys::whisper_log_set(log_callback, user_data) } + unsafe { + whisper_rs_sys::whisper_log_set(log_callback, user_data); + #[cfg(feature = "metal")] + { + whisper_rs_sys::ggml_metal_log_set_callback(log_callback, user_data); + } + } } /// Print system information. From cd6a633fc56dabae19e6bb14ead33a89af9ccb69 Mon Sep 17 00:00:00 2001 From: hlhr202 Date: Tue, 7 May 2024 01:26:42 +0800 Subject: [PATCH 3/5] try fix metal log --- sys/build.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/sys/build.rs b/sys/build.rs index 354e93b..c647037 100644 --- a/sys/build.rs +++ b/sys/build.rs @@ -139,6 +139,7 @@ fn main() { if cfg!(feature = "metal") { config.define("WHISPER_METAL", "ON"); + config.define("WHISPER_METAL_NDEBUG", "ON"); } else { // Metal is enabled by default, so we need to explicitly disable it config.define("WHISPER_METAL", "OFF"); From bf5a08dd1d52e1cc264c118d5827f56318a4a65c Mon Sep 17 00:00:00 2001 From: hlhr202 Date: Thu, 16 May 2024 14:10:03 +0800 Subject: [PATCH 4/5] fix: fmt --- src/standalone.rs | 2 +- sys/build.rs | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/standalone.rs b/src/standalone.rs index fb8072d..459f198 100644 --- a/src/standalone.rs +++ b/src/standalone.rs @@ -81,7 +81,7 @@ pub unsafe fn set_log_callback( log_callback: crate::WhisperLogCallback, user_data: *mut std::ffi::c_void, ) { - unsafe { + unsafe { whisper_rs_sys::whisper_log_set(log_callback, user_data); #[cfg(feature = "metal")] { diff --git a/sys/build.rs b/sys/build.rs index c647037..31e7156 100644 --- a/sys/build.rs +++ b/sys/build.rs @@ -76,14 +76,13 @@ fn main() { let _: u64 = std::fs::copy("src/bindings.rs", out.join("bindings.rs")) .expect("Failed to copy bindings.rs"); } else { - let bindings = bindgen::Builder::default() - .header("wrapper.h"); + let bindings = bindgen::Builder::default().header("wrapper.h"); - #[cfg(feature = "metal")] let bindings = bindings.header("whisper.cpp/ggml-metal.h"); - let bindings = bindings.clang_arg("-I./whisper.cpp") + let bindings = bindings + .clang_arg("-I./whisper.cpp") .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) .generate(); From 8872109d0464f8c2e71ed12a1ff0ed2ba6d70991 Mon Sep 17 00:00:00 2001 From: hlhr202 Date: Wed, 29 May 2024 10:42:25 +0800 Subject: [PATCH 5/5] optim: use build config instead of copying metal file to target folder --- src/standalone.rs | 2 +- src/whisper_sys_log.rs | 2 +- src/whisper_sys_tracing.rs | 2 +- sys/build.rs | 15 +-------------- 4 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/standalone.rs b/src/standalone.rs index c1f3913..73b68b1 100644 --- a/src/standalone.rs +++ b/src/standalone.rs @@ -85,7 +85,7 @@ pub unsafe fn set_log_callback( whisper_rs_sys::whisper_log_set(log_callback, user_data); #[cfg(feature = "metal")] { - whisper_rs_sys::ggml_metal_log_set_callback(log_callback, user_data); + whisper_rs_sys::ggml_backend_metal_log_set_callback(log_callback, user_data); } } } diff --git a/src/whisper_sys_log.rs b/src/whisper_sys_log.rs index 5e58239..ba2e51d 100644 --- a/src/whisper_sys_log.rs +++ b/src/whisper_sys_log.rs @@ -40,7 +40,7 @@ pub fn install_whisper_log_trampoline() { whisper_rs_sys::whisper_log_set(Some(whisper_cpp_log_trampoline), std::ptr::null_mut()); #[cfg(feature = "metal")] { - whisper_rs_sys::ggml_metal_log_set_callback( + whisper_rs_sys::ggml_backend_metal_log_set_callback( Some(whisper_cpp_log_trampoline), std::ptr::null_mut(), ); diff --git a/src/whisper_sys_tracing.rs b/src/whisper_sys_tracing.rs index eeae123..ea24b54 100644 --- a/src/whisper_sys_tracing.rs +++ b/src/whisper_sys_tracing.rs @@ -40,7 +40,7 @@ pub fn install_whisper_tracing_trampoline() { whisper_rs_sys::whisper_log_set(Some(whisper_cpp_tracing_trampoline), std::ptr::null_mut()); #[cfg(feature = "metal")] { - whisper_rs_sys::ggml_metal_log_set_callback( + whisper_rs_sys::ggml_backend_metal_log_set_callback( Some(whisper_cpp_tracing_trampoline), std::ptr::null_mut(), ); diff --git a/sys/build.rs b/sys/build.rs index 05ae8b2..73576c5 100644 --- a/sys/build.rs +++ b/sys/build.rs @@ -141,6 +141,7 @@ fn main() { if cfg!(feature = "metal") { config.define("WHISPER_METAL", "ON"); config.define("WHISPER_METAL_NDEBUG", "ON"); + config.define("WHISPER_METAL_EMBED_LIBRARY", "ON"); } else { // Metal is enabled by default, so we need to explicitly disable it config.define("WHISPER_METAL", "OFF"); @@ -174,20 +175,6 @@ fn main() { // for whatever reason this file is generated during build and triggers cargo complaining _ = std::fs::remove_file("bindings/javascript/package.json"); - - if cfg!(feature = "metal") { - // copy metal shader to the root of the crate - let _ = std::fs::copy( - out.join("whisper.cpp").join("ggml-metal.metal"), - out.parent() - .unwrap() - .parent() - .unwrap() - .parent() - .unwrap() - .join("ggml-metal.metal"), - ); - } } // From https://github.com/alexcrichton/cc-rs/blob/fba7feded71ee4f63cfe885673ead6d7b4f2f454/src/lib.rs#L2462