| 27 | }; |
| 28 | |
| 29 | static std::vector<llama_device_memory_data> common_get_device_memory_data( |
| 30 | const char * path_model, |
| 31 | const llama_model_params * mparams, |
| 32 | const llama_context_params * cparams, |
| 33 | std::vector<ggml_backend_dev_t> & devs, |
| 34 | uint32_t & hp_ngl, |
| 35 | uint32_t & hp_n_ctx_train, |
| 36 | uint32_t & hp_n_expert, |
| 37 | ggml_log_level log_level) { |
| 38 | struct user_data_t { |
| 39 | struct { |
| 40 | ggml_log_callback callback; |
| 41 | void * user_data; |
| 42 | } original_logger; |
| 43 | ggml_log_level min_level; // prints below this log level go to debug log |
| 44 | }; |
| 45 | user_data_t ud; |
| 46 | llama_log_get(&ud.original_logger.callback, &ud.original_logger.user_data); |
| 47 | ud.min_level = log_level; |
| 48 | |
| 49 | llama_log_set([](ggml_log_level level, const char * text, void * user_data) { |
| 50 | const user_data_t * ud = (const user_data_t *) user_data; |
| 51 | const ggml_log_level level_eff = level >= ud->min_level ? level : GGML_LOG_LEVEL_DEBUG; |
| 52 | ud->original_logger.callback(level_eff, text, ud->original_logger.user_data); |
| 53 | }, &ud); |
| 54 | |
| 55 | llama_model_params mparams_copy = *mparams; |
| 56 | mparams_copy.no_alloc = true; |
| 57 | mparams_copy.use_mmap = false; |
| 58 | mparams_copy.use_mlock = false; |
| 59 | |
| 60 | llama_model * model = llama_model_load_from_file(path_model, mparams_copy); |
| 61 | if (model == nullptr) { |
| 62 | llama_log_set(ud.original_logger.callback, ud.original_logger.user_data); |
| 63 | throw std::runtime_error("failed to load model"); |
| 64 | } |
| 65 | |
| 66 | llama_context * ctx = llama_init_from_model(model, *cparams); |
| 67 | if (ctx == nullptr) { |
| 68 | llama_model_free(model); |
| 69 | llama_log_set(ud.original_logger.callback, ud.original_logger.user_data); |
| 70 | throw std::runtime_error("failed to create llama_context from model"); |
| 71 | } |
| 72 | |
| 73 | const size_t nd = llama_model_n_devices(model); |
| 74 | std::vector<llama_device_memory_data> ret(nd + 1); |
| 75 | |
| 76 | llama_memory_breakdown memory_breakdown = llama_get_memory_breakdown(ctx); |
| 77 | |
| 78 | for (const auto & [buft, mb] : memory_breakdown) { |
| 79 | if (ggml_backend_buft_is_host(buft)) { |
| 80 | ret.back().mb.model += mb.model; |
| 81 | ret.back().mb.context += mb.context; |
| 82 | ret.back().mb.compute += mb.compute; |
| 83 | continue; |
| 84 | } |
| 85 | |
| 86 | ggml_backend_dev_t dev = ggml_backend_buft_get_device(buft); |
no test coverage detected