| 19 | // |
| 20 | |
| 21 | llama_context::llama_context( |
| 22 | const llama_model & model, |
| 23 | llama_context_params params) : |
| 24 | model(model), |
| 25 | balloc(std::make_unique<llama_batch_allocr>(model.hparams.n_pos_per_embd())) { |
| 26 | // TODO warning when creating llama_context with awkward ctx size that is not a power of 2, |
| 27 | // may need to be backend-dependent |
| 28 | LLAMA_LOG_INFO("%s: constructing llama_context\n", __func__); |
| 29 | |
| 30 | t_start_us = model.t_start_us; |
| 31 | t_load_us = model.t_load_us; |
| 32 | |
| 33 | const auto & hparams = model.hparams; |
| 34 | |
| 35 | cparams.n_seq_max = std::max(1u, params.n_seq_max); |
| 36 | if (cparams.n_seq_max > LLAMA_MAX_SEQ) { |
| 37 | throw std::runtime_error("n_seq_max must be <= " + std::to_string(LLAMA_MAX_SEQ)); |
| 38 | } |
| 39 | |
| 40 | cparams.n_threads = params.n_threads; |
| 41 | cparams.n_threads_batch = params.n_threads_batch; |
| 42 | cparams.yarn_ext_factor = params.yarn_ext_factor >= 0.0f ? params.yarn_ext_factor : hparams.yarn_ext_factor; |
| 43 | cparams.yarn_attn_factor = params.yarn_attn_factor >= 0.0f ? params.yarn_attn_factor : hparams.yarn_attn_factor; |
| 44 | cparams.yarn_beta_fast = params.yarn_beta_fast >= 0.0f ? params.yarn_beta_fast : hparams.yarn_beta_fast; |
| 45 | cparams.yarn_beta_slow = params.yarn_beta_slow >= 0.0f ? params.yarn_beta_slow : hparams.yarn_beta_slow; |
| 46 | cparams.embeddings = params.embeddings; |
| 47 | cparams.offload_kqv = params.offload_kqv; |
| 48 | cparams.no_perf = params.no_perf; |
| 49 | cparams.pooling_type = params.pooling_type; |
| 50 | cparams.warmup = false; |
| 51 | |
| 52 | cparams.n_ctx = params.n_ctx == 0 ? hparams.n_ctx_train : params.n_ctx; |
| 53 | cparams.rope_freq_base = params.rope_freq_base == 0.0f ? hparams.rope_freq_base_train : params.rope_freq_base; |
| 54 | cparams.rope_freq_scale = params.rope_freq_scale == 0.0f ? hparams.rope_freq_scale_train : params.rope_freq_scale; |
| 55 | |
| 56 | cparams.n_ctx_orig_yarn = params.yarn_orig_ctx != 0 ? params.yarn_orig_ctx : |
| 57 | hparams.n_ctx_orig_yarn != 0 ? hparams.n_ctx_orig_yarn : |
| 58 | hparams.n_ctx_train; |
| 59 | |
| 60 | cparams.cb_eval = params.cb_eval; |
| 61 | cparams.cb_eval_user_data = params.cb_eval_user_data; |
| 62 | |
| 63 | // Initialize backend samplers here so they are part of the sampling graph |
| 64 | // before the reserve passes run later in this function. This avoids a later |
| 65 | // re-reserve when graph nodes change. |
| 66 | if (params.samplers != nullptr && params.n_samplers > 0) { |
| 67 | for (size_t i = 0; i < params.n_samplers; ++i) { |
| 68 | const auto & config = params.samplers[i]; |
| 69 | |
| 70 | if (llama_sampler_chain_get(config.sampler, -1) == nullptr) { |
| 71 | throw std::runtime_error("the backend samplers must be of type llama_sampler_chain"); |
| 72 | } |
| 73 | |
| 74 | if (set_sampler(config.seq_id, config.sampler)) { |
| 75 | const int n_samplers = llama_sampler_chain_n(config.sampler); |
| 76 | |
| 77 | LLAMA_LOG_INFO("%s: setting backend sampler for seq_id %d (n = %d)\n", __func__, config.seq_id, n_samplers); |
| 78 | } |
nothing calls this directly
no test coverage detected