| 214 | } |
| 215 | |
| 216 | static ggml_backend_t create_backend(const rpc_server_params & params) { |
| 217 | ggml_backend_t backend = nullptr; |
| 218 | |
| 219 | if (!params.device.empty()) { |
| 220 | ggml_backend_dev_t dev = ggml_backend_dev_by_name(params.device.c_str()); |
| 221 | if (dev) { |
| 222 | backend = ggml_backend_dev_init(dev, nullptr); |
| 223 | if (!backend) { |
| 224 | fprintf(stderr, "Failed to create backend for device %s\n", params.device.c_str()); |
| 225 | return nullptr; |
| 226 | } |
| 227 | } |
| 228 | } |
| 229 | |
| 230 | // try to initialize a GPU backend first |
| 231 | if (!backend) { |
| 232 | backend = ggml_backend_init_by_type(GGML_BACKEND_DEVICE_TYPE_GPU, nullptr); |
| 233 | } |
| 234 | |
| 235 | // if there aren't GPU backends fallback to CPU backend |
| 236 | if (!backend) { |
| 237 | backend = ggml_backend_init_by_type(GGML_BACKEND_DEVICE_TYPE_CPU, nullptr); |
| 238 | } |
| 239 | |
| 240 | if (backend) { |
| 241 | fprintf(stderr, "%s: using %s backend\n", __func__, ggml_backend_name(backend)); |
| 242 | |
| 243 | // set the number of threads |
| 244 | ggml_backend_dev_t dev = ggml_backend_get_device(backend); |
| 245 | ggml_backend_reg_t reg = dev ? ggml_backend_dev_backend_reg(dev) : nullptr; |
| 246 | if (reg) { |
| 247 | auto ggml_backend_set_n_threads_fn = (ggml_backend_set_n_threads_t) ggml_backend_reg_get_proc_address(reg, "ggml_backend_set_n_threads"); |
| 248 | if (ggml_backend_set_n_threads_fn) { |
| 249 | ggml_backend_set_n_threads_fn(backend, params.n_threads); |
| 250 | } |
| 251 | } |
| 252 | } |
| 253 | |
| 254 | return backend; |
| 255 | } |
| 256 | |
| 257 | static void get_backend_memory(ggml_backend_t backend, size_t * free_mem, size_t * total_mem) { |
| 258 | ggml_backend_dev_t dev = ggml_backend_get_device(backend); |
no test coverage detected