| 246 | } |
| 247 | |
| 248 | static std::vector<ggml_backend_dev_t> get_devices(const rpc_server_params & params) { |
| 249 | std::vector<ggml_backend_dev_t> devices; |
| 250 | if (!params.devices.empty()) { |
| 251 | for (auto device : params.devices) { |
| 252 | ggml_backend_dev_t dev = ggml_backend_dev_by_name(device.c_str()); |
| 253 | if (dev) { |
| 254 | devices.push_back(dev); |
| 255 | } else { |
| 256 | fprintf(stderr, "error: unknown device: %s\n", device.c_str()); |
| 257 | fprintf(stderr, "available devices:\n"); |
| 258 | for (size_t i = 0; i < ggml_backend_dev_count(); i++) { |
| 259 | auto * dev = ggml_backend_dev_get(i); |
| 260 | size_t free, total; |
| 261 | ggml_backend_dev_memory(dev, &free, &total); |
| 262 | printf(" %s: %s (%zu MiB, %zu MiB free)\n", ggml_backend_dev_name(dev), ggml_backend_dev_description(dev), total / 1024 / 1024, free / 1024 / 1024); |
| 263 | } |
| 264 | return {}; |
| 265 | } |
| 266 | } |
| 267 | } |
| 268 | |
| 269 | // Try non-CPU devices first |
| 270 | if (devices.empty()) { |
| 271 | for (size_t i = 0; i < ggml_backend_dev_count(); i++) { |
| 272 | ggml_backend_dev_t dev = ggml_backend_dev_get(i); |
| 273 | if (ggml_backend_dev_type(dev) != GGML_BACKEND_DEVICE_TYPE_CPU) { |
| 274 | devices.push_back(dev); |
| 275 | } |
| 276 | } |
| 277 | } |
| 278 | |
| 279 | // If there are no accelerators, fallback to CPU device |
| 280 | if (devices.empty()) { |
| 281 | ggml_backend_dev_t dev = ggml_backend_dev_by_type(GGML_BACKEND_DEVICE_TYPE_CPU); |
| 282 | if (dev) { |
| 283 | devices.push_back(dev); |
| 284 | } |
| 285 | } |
| 286 | |
| 287 | return devices; |
| 288 | } |
| 289 | |
| 290 | int main(int argc, char * argv[]) { |
| 291 | std::setlocale(LC_NUMERIC, "C"); |
no test coverage detected