From b341d0b58b24d69a635bb81cdb907f9369c73dec Mon Sep 17 00:00:00 2001 From: Kawrakow Date: Fri, 31 Jul 2026 07:20:52 +0300 Subject: [PATCH] Fix #2215 (#2217) * Fix #2215 * Don't make a copy when you don't need to --- src/llama.cpp | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/src/llama.cpp b/src/llama.cpp index 0c1ac393..be9214b8 100644 --- a/src/llama.cpp +++ b/src/llama.cpp @@ -180,7 +180,7 @@ static bool llama_env_flag_enabled(const char * name) { } // extract ip and port from RPC[ip:port] for rpc and keep other device names -static std::vector extract_device_from_rpc_device(std::vector devices) { +static std::vector extract_device_from_rpc_device(const std::vector & devices) { std::vector rpc_servers; for (auto & device : devices) { rpc_device rpc; @@ -434,8 +434,8 @@ llama_model::~llama_model() { } } -static size_t llama_get_device_count(const llama_model & model) { - size_t count = 1; +static size_t llama_get_device_count(const llama_model & model, int initial_count = 1) { + size_t count = initial_count; #if defined(GGML_USE_CUDA) count = ggml_backend_cuda_get_device_count(); #elif defined(GGML_USE_SYCL) @@ -452,23 +452,6 @@ static size_t llama_get_device_count(const llama_model & model) { GGML_UNUSED(model); } -static size_t llama_get_device_count_no_cpu() { - size_t count = 0; -#if defined(GGML_USE_CUDA) - count = ggml_backend_cuda_get_device_count(); -#elif defined(GGML_USE_SYCL) - count = ggml_backend_sycl_get_device_count(); -#elif defined(GGML_USE_VULKAN) - count = ggml_backend_vk_get_device_count(); -#elif defined(GGML_USE_CANN) - return ggml_backend_cann_get_device_count(); -#endif -#if defined(GGML_USE_RPC) - count += model.rpc_servers.size(); -#endif - return count; -} - static ggml_backend_buffer_type_t llama_default_buffer_type_offload(const llama_model & model, int gpu) { ggml_backend_buffer_type_t buft = nullptr; @@ -7448,7 +7431,14 @@ struct llama_model * llama_model_load_from_file( struct llama_model_params params) { ggml_time_init(); - auto n_gpu = llama_get_device_count_no_cpu(); + llama_model * model = new llama_model; + + bool has_rpc = params.rpc_servers != nullptr && params.rpc_servers[0] != '\0'; + if (has_rpc) { + model->rpc_servers = extract_device_from_rpc_device(string_split(params.rpc_servers, ",")); + } + + auto n_gpu = llama_get_device_count(*model, 0); if (params.n_gpu_layers < 0) { params.n_gpu_layers = n_gpu > 0 ? 999 : 0; } else if (n_gpu == 0) { @@ -7459,8 +7449,6 @@ struct llama_model * llama_model_load_from_file( params.ncmoe = 0; } - llama_model * model = new llama_model; - unsigned cur_percentage = 0; if (params.progress_callback == NULL) { params.progress_callback_user_data = &cur_percentage; @@ -7490,7 +7478,6 @@ struct llama_model * llama_model_load_from_file( std::map buffer_names; std::vector gpu_names; - bool has_rpc = params.rpc_servers != nullptr && params.rpc_servers[0] != '\0'; int32_t idx = 0; int dev_count = (int)llama_get_device_count(*model); // list all buffer type names @@ -7501,7 +7488,6 @@ struct llama_model * llama_model_load_from_file( gpu_names.push_back(std::string(name)); } if (has_rpc) { - model->rpc_servers = extract_device_from_rpc_device(string_split(params.rpc_servers, ",")); for (auto rpc : model->rpc_servers) { buffer_names.insert({ create_rpc_name(rpc.endpoint, rpc.device), idx}); idx++;