From 1eb69c0ef18352861b84601734641734b4fb2ee0 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Wed, 28 May 2025 13:54:56 +0200 Subject: [PATCH 1/2] whisper : remove whisper_load_backends function This commit removes the `whisper_load_backends` function, which was used to load all GGML backends. The motivation for this change push the responsibility of loading backends to user applications to give them more control over which backends to load and when. See the references below for more context. Resolves: https://github.com/ggml-org/whisper.cpp/issues/3182 Refs: https://github.com/ggml-org/whisper.cpp/pull/3042#issuecomment-2801778733 Refs: https://github.com/ggml-org/whisper.cpp/pull/3042#issuecomment-2801928990 --- examples/bench/bench.cpp | 2 ++ examples/cli/cli.cpp | 3 ++- examples/command/command.cpp | 2 ++ examples/lsp/lsp.cpp | 2 ++ examples/quantize/quantize.cpp | 3 +++ examples/server/server.cpp | 2 ++ examples/stream/stream.cpp | 2 ++ examples/talk-llama/talk-llama.cpp | 2 ++ examples/vad-speech-segments/speech.cpp | 2 ++ examples/wchess/wchess.cmd/wchess.cmd.cpp | 2 ++ src/whisper.cpp | 15 --------------- 11 files changed, 21 insertions(+), 16 deletions(-) diff --git a/examples/bench/bench.cpp b/examples/bench/bench.cpp index 54f73110d42..979dca8ee47 100644 --- a/examples/bench/bench.cpp +++ b/examples/bench/bench.cpp @@ -156,6 +156,8 @@ static int whisper_bench_full(const whisper_params & params) { } int main(int argc, char ** argv) { + ggml_backend_load_all(); + whisper_params params; if (whisper_params_parse(argc, argv, params) == false) { diff --git a/examples/cli/cli.cpp b/examples/cli/cli.cpp index 2a0f940d5d7..02327ed8365 100644 --- a/examples/cli/cli.cpp +++ b/examples/cli/cli.cpp @@ -909,6 +909,8 @@ static void output_lrc(struct whisper_context * ctx, std::ofstream & fout, const static void cb_log_disable(enum ggml_log_level , const char * , void * ) { } int main(int argc, char ** argv) { + ggml_backend_load_all(); + #if defined(_WIN32) // Set the console output code page to UTF-8, while command line arguments // are still encoded in the system's code page. In this way, we can print @@ -988,7 +990,6 @@ int main(int argc, char ** argv) { } // whisper init - struct whisper_context_params cparams = whisper_context_default_params(); cparams.use_gpu = params.use_gpu; diff --git a/examples/command/command.cpp b/examples/command/command.cpp index 9dc8f629995..63684044a46 100644 --- a/examples/command/command.cpp +++ b/examples/command/command.cpp @@ -678,6 +678,8 @@ static int process_general_transcription(struct whisper_context * ctx, audio_asy } int main(int argc, char ** argv) { + ggml_backend_load_all(); + whisper_params params; if (whisper_params_parse(argc, argv, params) == false) { diff --git a/examples/lsp/lsp.cpp b/examples/lsp/lsp.cpp index a32da511018..cf8b75e7a29 100644 --- a/examples/lsp/lsp.cpp +++ b/examples/lsp/lsp.cpp @@ -424,6 +424,8 @@ static void process_loop(struct whisper_context * ctx, audio_async &audio, const } int main(int argc, char ** argv) { + ggml_backend_load_all(); + whisper_params params; if (whisper_params_parse(argc, argv, params) == false) { return 1; diff --git a/examples/quantize/quantize.cpp b/examples/quantize/quantize.cpp index 176883803b4..4dbae205551 100644 --- a/examples/quantize/quantize.cpp +++ b/examples/quantize/quantize.cpp @@ -1,4 +1,5 @@ #include "ggml.h" +#include "ggml-backend.h" #include "common.h" #include "common-ggml.h" @@ -176,6 +177,8 @@ static bool whisper_model_quantize(const std::string & fname_inp, const std::str } int main(int argc, char ** argv) { + ggml_backend_load_all(); + if (argc != 4) { fprintf(stderr, "usage: %s model-f32.bin model-quant.bin type\n", argv[0]); ggml_print_ftypes(stderr); diff --git a/examples/server/server.cpp b/examples/server/server.cpp index bf81f792e64..8d99ebeeaf3 100644 --- a/examples/server/server.cpp +++ b/examples/server/server.cpp @@ -516,6 +516,8 @@ void get_req_parameters(const Request & req, whisper_params & params) } // namespace int main(int argc, char ** argv) { + ggml_backend_load_all(); + whisper_params params; server_params sparams; diff --git a/examples/stream/stream.cpp b/examples/stream/stream.cpp index 65c6587db92..bc6f13fb267 100644 --- a/examples/stream/stream.cpp +++ b/examples/stream/stream.cpp @@ -116,6 +116,8 @@ void whisper_print_usage(int /*argc*/, char ** argv, const whisper_params & para } int main(int argc, char ** argv) { + ggml_backend_load_all(); + whisper_params params; if (whisper_params_parse(argc, argv, params) == false) { diff --git a/examples/talk-llama/talk-llama.cpp b/examples/talk-llama/talk-llama.cpp index 17ae1c95e11..b4219c29446 100644 --- a/examples/talk-llama/talk-llama.cpp +++ b/examples/talk-llama/talk-llama.cpp @@ -291,6 +291,8 @@ The transcript only includes text, it does not include markup like HTML and Mark {0}{4})"; int main(int argc, char ** argv) { + ggml_backend_load_all(); + whisper_params params; if (whisper_params_parse(argc, argv, params) == false) { diff --git a/examples/vad-speech-segments/speech.cpp b/examples/vad-speech-segments/speech.cpp index 287933bb5e4..26241d950a0 100644 --- a/examples/vad-speech-segments/speech.cpp +++ b/examples/vad-speech-segments/speech.cpp @@ -83,6 +83,8 @@ static bool vad_params_parse(int argc, char ** argv, cli_params & params) { static void cb_log_disable(enum ggml_log_level , const char * , void * ) { } int main(int argc, char ** argv) { + ggml_backend_load_all(); + cli_params cli_params; if (!vad_params_parse(argc, argv, cli_params)) { diff --git a/examples/wchess/wchess.cmd/wchess.cmd.cpp b/examples/wchess/wchess.cmd/wchess.cmd.cpp index 4d049976315..816eb1b3c95 100644 --- a/examples/wchess/wchess.cmd/wchess.cmd.cpp +++ b/examples/wchess/wchess.cmd/wchess.cmd.cpp @@ -168,6 +168,8 @@ bool get_audio(std::vector & pcmf32_cur) { } int main(int argc, char ** argv) { + ggml_backend_load_all(); + whisper_params params; if (whisper_params_parse(argc, argv, params) == false) { diff --git a/src/whisper.cpp b/src/whisper.cpp index cb887d4593b..5c4fc9dff33 100644 --- a/src/whisper.cpp +++ b/src/whisper.cpp @@ -206,15 +206,6 @@ static bool ggml_graph_compute_helper( return t; } -static void whisper_load_backends() { -#ifdef GGML_BACKEND_DL - static std::once_flag flag; - std::call_once(flag, []() { - ggml_backend_load_all(); - }); -#endif -} - // TODO: move these functions to ggml-base with support for ggml-backend? static ggml_tensor * whisper_set_f32(struct ggml_tensor * t, float v) { @@ -1322,8 +1313,6 @@ static size_t aheads_masks_nbytes(struct whisper_aheads_masks & aheads_masks) { static ggml_backend_t whisper_backend_init_gpu(const whisper_context_params & params) { ggml_log_set(g_state.log_callback, g_state.log_callback_user_data); - whisper_load_backends(); - ggml_backend_dev_t dev = nullptr; int cnt = 0; @@ -4335,8 +4324,6 @@ static int whisper_has_openvino(void) { const char * whisper_print_system_info(void) { static std::string s; - whisper_load_backends(); - s = ""; s += "WHISPER : "; s += "COREML = " + std::to_string(whisper_has_coreml()) + " | "; @@ -8154,8 +8141,6 @@ WHISPER_API int whisper_bench_ggml_mul_mat(int n_threads) { } WHISPER_API const char * whisper_bench_ggml_mul_mat_str(int n_threads) { - whisper_load_backends(); - static std::string s; s = ""; char strbuf[256]; From 839ef425e3ae1105514b37ac930eaa82788ff72d Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Wed, 28 May 2025 15:09:21 +0200 Subject: [PATCH 2/2] ruby : add check for rwc is NULL This commit adds a check to ensure that the `rwc` pointer is not NULL before attempting to mark its members in the garbage collector. The motivation for this is an attempt to see if this fixed the CI build as I'm not able to reproduce the issue locally. Refs: https://github.com/ggml-org/whisper.cpp/actions/runs/15299612277/job/43036694928?pr=3196 --- bindings/ruby/ext/ruby_whisper_params.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bindings/ruby/ext/ruby_whisper_params.c b/bindings/ruby/ext/ruby_whisper_params.c index 4a65c92a80d..624e0080156 100644 --- a/bindings/ruby/ext/ruby_whisper_params.c +++ b/bindings/ruby/ext/ruby_whisper_params.c @@ -77,6 +77,8 @@ static ID id_vad_params; static void rb_whisper_callbcack_container_mark(ruby_whisper_callback_container *rwc) { + if (rwc == NULL) return; + rb_gc_mark(rwc->user_data); rb_gc_mark(rwc->callback); rb_gc_mark(rwc->callbacks);