feat: load all backends from a user-provided search path

This commit is contained in:
Gilad S 2024-12-07 02:01:35 +02:00
parent c5ede3849f
commit 318600fbcb
2 changed files with 24 additions and 13 deletions

View file

@ -228,6 +228,7 @@ extern "C" {
GGML_API void ggml_backend_unload(ggml_backend_reg_t reg); GGML_API void ggml_backend_unload(ggml_backend_reg_t reg);
// Load all known backends from dynamic libraries // Load all known backends from dynamic libraries
GGML_API void ggml_backend_load_all(void); GGML_API void ggml_backend_load_all(void);
GGML_API void ggml_backend_load_all_in_search_path(const char * search_path);
// //
// Backend scheduler // Backend scheduler

View file

@ -449,11 +449,17 @@ static std::string backend_filename_suffix() {
#endif #endif
} }
static ggml_backend_reg_t ggml_backend_load_best(const char * name, bool silent) { static ggml_backend_reg_t ggml_backend_load_best(const char * name, bool silent, const char * user_search_path) {
// enumerate all the files that match [lib]ggml-name-*.[so|dll] in the search paths // enumerate all the files that match [lib]ggml-name-*.[so|dll] in the search paths
// TODO: search system paths // TODO: search system paths
std::vector<std::string> search_paths = { "./", get_executable_path() };
std::string file_prefix = backend_filename_prefix() + name + "-"; std::string file_prefix = backend_filename_prefix() + name + "-";
std::vector<std::string> search_paths;
if (user_search_path == NULL) {
search_paths.push_back("./");
search_paths.push_back(get_executable_path());
} else {
search_paths.push_back(std::string(user_search_path) + "/");
}
int best_score = 0; int best_score = 0;
std::string best_path; std::string best_path;
@ -509,21 +515,25 @@ static ggml_backend_reg_t ggml_backend_load_best(const char * name, bool silent)
} }
void ggml_backend_load_all() { void ggml_backend_load_all() {
ggml_backend_load_all_in_search_path(NULL);
}
void ggml_backend_load_all_in_search_path(const char * search_path) {
#ifdef NDEBUG #ifdef NDEBUG
bool silent = true; bool silent = true;
#else #else
bool silent = false; bool silent = false;
#endif #endif
ggml_backend_load_best("blas", silent); ggml_backend_load_best("blas", silent, search_path);
ggml_backend_load_best("cann", silent); ggml_backend_load_best("cann", silent, search_path);
ggml_backend_load_best("cuda", silent); ggml_backend_load_best("cuda", silent, search_path);
ggml_backend_load_best("hip", silent); ggml_backend_load_best("hip", silent, search_path);
ggml_backend_load_best("kompute", silent); ggml_backend_load_best("kompute", silent, search_path);
ggml_backend_load_best("metal", silent); ggml_backend_load_best("metal", silent, search_path);
ggml_backend_load_best("rpc", silent); ggml_backend_load_best("rpc", silent, search_path);
ggml_backend_load_best("sycl", silent); ggml_backend_load_best("sycl", silent, search_path);
ggml_backend_load_best("vulkan", silent); ggml_backend_load_best("vulkan", silent, search_path);
ggml_backend_load_best("musa", silent); ggml_backend_load_best("musa", silent, search_path);
ggml_backend_load_best("cpu", silent); ggml_backend_load_best("cpu", silent, search_path);
} }