Coverage Report

Created: 2026-03-03 06:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/llama.cpp/common/common.h
Line
Count
Source
1
// Various helper functions and utilities
2
3
#pragma once
4
5
#include "ggml-opt.h"
6
#include "llama-cpp.h"
7
8
#include <set>
9
#include <sstream>
10
#include <string>
11
#include <string_view>
12
#include <vector>
13
#include <map>
14
15
#if defined(_WIN32) && !defined(_WIN32_WINNT)
16
#define _WIN32_WINNT 0x0A00
17
#endif
18
19
#ifdef _WIN32
20
#define DIRECTORY_SEPARATOR '\\'
21
#else
22
0
#define DIRECTORY_SEPARATOR '/'
23
#endif // _WIN32
24
25
#define die(msg)          do { fputs("error: " msg "\n", stderr);                exit(1); } while (0)
26
#define die_fmt(fmt, ...) do { fprintf(stderr, "error: " fmt "\n", __VA_ARGS__); exit(1); } while (0)
27
28
#define print_build_info() do {                                                                     \
29
    fprintf(stderr, "%s: build = %d (%s)\n",      __func__, LLAMA_BUILD_NUMBER, LLAMA_COMMIT);      \
30
    fprintf(stderr, "%s: built with %s for %s\n", __func__, LLAMA_COMPILER, LLAMA_BUILD_TARGET);    \
31
} while(0)
32
33
struct common_time_meas {
34
    common_time_meas(int64_t & t_acc, bool disable = false);
35
    ~common_time_meas();
36
37
    const int64_t t_start_us;
38
39
    int64_t & t_acc;
40
};
41
42
struct common_adapter_lora_info {
43
    std::string path;
44
    float scale;
45
46
    std::string task_name;
47
    std::string prompt_prefix;
48
49
    struct llama_adapter_lora * ptr;
50
};
51
52
using llama_tokens = std::vector<llama_token>;
53
54
// build info
55
extern int LLAMA_BUILD_NUMBER;
56
extern const char * LLAMA_COMMIT;
57
extern const char * LLAMA_COMPILER;
58
extern const char * LLAMA_BUILD_TARGET;
59
60
const static std::string build_info("b" + std::to_string(LLAMA_BUILD_NUMBER) + "-" + LLAMA_COMMIT);
61
62
struct common_control_vector_load_info;
63
64
//
65
// CPU utils
66
//
67
68
struct cpu_params {
69
    int      n_threads                   = -1;
70
    bool     cpumask[GGML_MAX_N_THREADS] = {false}; // CPU affinity mask.
71
    bool     mask_valid                  = false;   // Default: any CPU
72
    enum ggml_sched_priority  priority   = GGML_SCHED_PRIO_NORMAL;  // Scheduling prio : (0 - normal, 1 - medium, 2 - high, 3 - realtime)
73
    bool     strict_cpu                  = false;   // Use strict CPU placement
74
    uint32_t poll                        = 50;      // Polling (busywait) level (0 - no polling, 100 - mostly polling)
75
};
76
77
int32_t cpu_get_num_physical_cores();
78
int32_t cpu_get_num_math();
79
80
//
81
// Common params
82
//
83
84
enum llama_example {
85
    LLAMA_EXAMPLE_BATCHED,
86
    LLAMA_EXAMPLE_DEBUG,
87
    LLAMA_EXAMPLE_COMMON,
88
    LLAMA_EXAMPLE_SPECULATIVE,
89
    LLAMA_EXAMPLE_COMPLETION,
90
    LLAMA_EXAMPLE_CLI,
91
    LLAMA_EXAMPLE_EMBEDDING,
92
    LLAMA_EXAMPLE_PERPLEXITY,
93
    LLAMA_EXAMPLE_RETRIEVAL,
94
    LLAMA_EXAMPLE_PASSKEY,
95
    LLAMA_EXAMPLE_IMATRIX,
96
    LLAMA_EXAMPLE_BENCH,
97
    LLAMA_EXAMPLE_SERVER,
98
    LLAMA_EXAMPLE_CVECTOR_GENERATOR,
99
    LLAMA_EXAMPLE_EXPORT_LORA,
100
    LLAMA_EXAMPLE_MTMD,
101
    LLAMA_EXAMPLE_LOOKUP,
102
    LLAMA_EXAMPLE_PARALLEL,
103
    LLAMA_EXAMPLE_TTS,
104
    LLAMA_EXAMPLE_DIFFUSION,
105
    LLAMA_EXAMPLE_FINETUNE,
106
    LLAMA_EXAMPLE_FIT_PARAMS,
107
108
    LLAMA_EXAMPLE_COUNT,
109
};
110
111
enum common_sampler_type {
112
    COMMON_SAMPLER_TYPE_NONE        = 0,
113
    COMMON_SAMPLER_TYPE_DRY         = 1,
114
    COMMON_SAMPLER_TYPE_TOP_K       = 2,
115
    COMMON_SAMPLER_TYPE_TOP_P       = 3,
116
    COMMON_SAMPLER_TYPE_MIN_P       = 4,
117
  //COMMON_SAMPLER_TYPE_TFS_Z       = 5,
118
    COMMON_SAMPLER_TYPE_TYPICAL_P   = 6,
119
    COMMON_SAMPLER_TYPE_TEMPERATURE = 7,
120
    COMMON_SAMPLER_TYPE_XTC         = 8,
121
    COMMON_SAMPLER_TYPE_INFILL      = 9,
122
    COMMON_SAMPLER_TYPE_PENALTIES   = 10,
123
    COMMON_SAMPLER_TYPE_TOP_N_SIGMA = 11,
124
    COMMON_SAMPLER_TYPE_ADAPTIVE_P  = 12,
125
};
126
127
// dimensionality reduction methods, used by cvector-generator
128
enum dimre_method {
129
    DIMRE_METHOD_PCA,
130
    DIMRE_METHOD_MEAN,
131
};
132
133
enum common_conversation_mode {
134
    COMMON_CONVERSATION_MODE_DISABLED = 0,
135
    COMMON_CONVERSATION_MODE_ENABLED  = 1,
136
    COMMON_CONVERSATION_MODE_AUTO     = 2,
137
};
138
139
enum common_grammar_trigger_type {
140
    COMMON_GRAMMAR_TRIGGER_TYPE_TOKEN,
141
    COMMON_GRAMMAR_TRIGGER_TYPE_WORD,
142
    COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN,
143
    COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN_FULL,
144
};
145
146
struct common_grammar_trigger {
147
    common_grammar_trigger_type type;
148
    std::string value;
149
    llama_token token = LLAMA_TOKEN_NULL;
150
};
151
152
enum common_params_sampling_config : uint64_t {
153
    COMMON_PARAMS_SAMPLING_CONFIG_SAMPLERS        = 1 << 0,
154
    COMMON_PARAMS_SAMPLING_CONFIG_TOP_K           = 1 << 1,
155
    COMMON_PARAMS_SAMPLING_CONFIG_TOP_P           = 1 << 2,
156
    COMMON_PARAMS_SAMPLING_CONFIG_MIN_P           = 1 << 3,
157
    COMMON_PARAMS_SAMPLING_CONFIG_XTC_PROBABILITY = 1 << 4,
158
    COMMON_PARAMS_SAMPLING_CONFIG_XTC_THRESHOLD   = 1 << 5,
159
    COMMON_PARAMS_SAMPLING_CONFIG_TEMP            = 1 << 6,
160
    COMMON_PARAMS_SAMPLING_CONFIG_PENALTY_LAST_N  = 1 << 7,
161
    COMMON_PARAMS_SAMPLING_CONFIG_PENALTY_REPEAT  = 1 << 8,
162
    COMMON_PARAMS_SAMPLING_CONFIG_MIROSTAT        = 1 << 9,
163
    COMMON_PARAMS_SAMPLING_CONFIG_MIROSTAT_TAU    = 1 << 10,
164
    COMMON_PARAMS_SAMPLING_CONFIG_MIROSTAT_ETA    = 1 << 11,
165
};
166
167
enum common_speculative_type {
168
    COMMON_SPECULATIVE_TYPE_NONE,          // no speculative decoding
169
    COMMON_SPECULATIVE_TYPE_DRAFT,         // draft model
170
    COMMON_SPECULATIVE_TYPE_EAGLE3,        // eagle draft model
171
    COMMON_SPECULATIVE_TYPE_NGRAM_SIMPLE,  // simple self-speculative decoding
172
    COMMON_SPECULATIVE_TYPE_NGRAM_MAP_K,   // self-speculative decoding with n-gram keys only
173
    COMMON_SPECULATIVE_TYPE_NGRAM_MAP_K4V, // self-speculative decoding with n-gram keys and 4 m-gram values
174
    COMMON_SPECULATIVE_TYPE_NGRAM_MOD,
175
    COMMON_SPECULATIVE_TYPE_NGRAM_CACHE,   // self-speculative decoding with 3-level n-gram cache
176
    COMMON_SPECULATIVE_TYPE_COUNT          // number of types, unknown type
177
};
178
179
// sampling parameters
180
struct common_params_sampling {
181
    uint32_t seed = LLAMA_DEFAULT_SEED; // the seed used to initialize llama_sampler
182
183
    int32_t n_prev             = 64;     // number of previous tokens to remember
184
    int32_t n_probs            = 0;      // if greater than 0, output the probabilities of top n_probs tokens.
185
    int32_t min_keep           = 0;      // 0 = disabled, otherwise samplers should return at least min_keep tokens
186
    int32_t top_k              = 40;     // <= 0 to use vocab size
187
    float   top_p              = 0.95f;  // 1.0 = disabled
188
    float   min_p              = 0.05f;  // 0.0 = disabled
189
    float   xtc_probability    = 0.00f;  // 0.0 = disabled
190
    float   xtc_threshold      = 0.10f;  // > 0.5 disables XTC
191
    float   typ_p              = 1.00f;  // typical_p, 1.0 = disabled
192
    float   temp               = 0.80f;  // <= 0.0 to sample greedily, 0.0 to not output probabilities
193
    float   dynatemp_range     = 0.00f;  // 0.0 = disabled
194
    float   dynatemp_exponent  = 1.00f;  // controls how entropy maps to temperature in dynamic temperature sampler
195
    int32_t penalty_last_n     = 64;     // last n tokens to penalize (0 = disable penalty, -1 = context size)
196
    float   penalty_repeat     = 1.00f;  // 1.0 = disabled
197
    float   penalty_freq       = 0.00f;  // 0.0 = disabled
198
    float   penalty_present    = 0.00f;  // 0.0 = disabled
199
    float   dry_multiplier     = 0.0f;   // 0.0 = disabled;      DRY repetition penalty for tokens extending repetition:
200
    float   dry_base           = 1.75f;  // 0.0 = disabled;      multiplier * base ^ (length of sequence before token - allowed length)
201
    int32_t dry_allowed_length = 2;      // tokens extending repetitions beyond this receive penalty
202
    int32_t dry_penalty_last_n = -1;     // how many tokens to scan for repetitions (0 = disable penalty, -1 = context size)
203
    float   adaptive_target    = -1.0f;  // select tokens near this probability (valid range 0.0 to 1.0; negative = disabled)
204
    float   adaptive_decay     = 0.90f;  // EMA decay for adaptation; history ≈ 1/(1-decay) tokens (0.0 - 0.99)
205
    int32_t mirostat           = 0;      // 0 = disabled, 1 = mirostat, 2 = mirostat 2.0
206
    float   top_n_sigma        = -1.00f; // -1.0 = disabled
207
    float   mirostat_tau       = 5.00f;  // target entropy
208
    float   mirostat_eta       = 0.10f;  // learning rate
209
    bool    ignore_eos         = false;
210
    bool    no_perf            = false;  // disable performance metrics
211
    bool    timing_per_token   = false;
212
213
    uint64_t user_sampling_config = 0; // bitfield to track user-specified samplers
214
215
    std::vector<std::string> dry_sequence_breakers = {"\n", ":", "\"", "*"};     // default sequence breakers for DRY
216
217
    std::vector<enum common_sampler_type> samplers = {
218
        COMMON_SAMPLER_TYPE_PENALTIES,
219
        COMMON_SAMPLER_TYPE_DRY,
220
        COMMON_SAMPLER_TYPE_TOP_N_SIGMA,
221
        COMMON_SAMPLER_TYPE_TOP_K,
222
        COMMON_SAMPLER_TYPE_TYPICAL_P,
223
        COMMON_SAMPLER_TYPE_TOP_P,
224
        COMMON_SAMPLER_TYPE_MIN_P,
225
        COMMON_SAMPLER_TYPE_XTC,
226
        COMMON_SAMPLER_TYPE_TEMPERATURE,
227
    };
228
229
    std::string                         grammar; // optional BNF-like grammar to constrain sampling
230
    bool                                grammar_lazy = false;
231
    std::vector<common_grammar_trigger> grammar_triggers; // optional triggers (for lazy grammars)
232
    std::set<llama_token>               preserved_tokens;
233
234
    std::vector<llama_logit_bias> logit_bias;     // logit biases to apply
235
    std::vector<llama_logit_bias> logit_bias_eog; // pre-calculated logit biases for EOG tokens
236
237
    bool backend_sampling = false;
238
239
0
    bool has_logit_bias() const {
240
0
        return !logit_bias.empty();
241
0
    }
242
243
    // print the parameters into a string
244
    std::string print() const;
245
};
246
247
struct common_params_model {
248
    std::string path        = ""; // model local path                                       // NOLINT
249
    std::string url         = ""; // model url to download                                  // NOLINT
250
    std::string hf_repo     = ""; // HF repo                                                // NOLINT
251
    std::string hf_file     = ""; // HF file                                                // NOLINT
252
    std::string docker_repo = ""; // Docker repo                                            // NOLINT
253
    std::string name        = ""; // in format <user>/<model>[:<tag>] (tag is optional)     // NOLINT
254
};
255
256
struct common_ngram_mod;
257
258
struct common_params_speculative {
259
    common_speculative_type type = COMMON_SPECULATIVE_TYPE_NONE; // type of speculative decoding
260
261
    // general-purpose speculative decoding parameters
262
263
    int32_t n_max   = 16; // maximum number of tokens to draft during speculative decoding
264
    int32_t n_min   = 0; // minimum number of draft tokens to use for speculative decoding
265
    float   p_split = 0.1f; // speculative decoding split probability
266
    float   p_min   = 0.75f; // minimum speculative decoding probability (greedy)
267
268
    // ngram-based speculative decoding
269
270
    uint16_t ngram_size_n     = 12; // ngram size for lookup
271
    uint16_t ngram_size_m     = 48; // mgram size for speculative tokens
272
    uint16_t ngram_min_hits   =  1; // minimum hits at ngram/mgram lookup for mgram to be proposed
273
274
    std::shared_ptr<common_ngram_mod> ngram_mod;
275
276
    std::string lookup_cache_static;  // path of static ngram cache file for lookup decoding           // NOLINT
277
    std::string lookup_cache_dynamic; // path of dynamic ngram cache file for lookup decoding          // NOLINT
278
279
    // draft-model speculative decoding
280
281
    struct common_params_model mparams_dft;
282
283
    llama_model * model_dft = nullptr; // a llama_model that can be shared by multiple speculative contexts
284
285
    llama_context_params cparams_dft; // these are the parameters for the draft llama_context
286
287
    int32_t n_ctx        = 0;  // draft context size
288
    int32_t n_gpu_layers = -1; // number of layers to store in VRAM for the draft model (-1 - use default)
289
290
    ggml_type cache_type_k = GGML_TYPE_F16; // KV cache data type for the K
291
    ggml_type cache_type_v = GGML_TYPE_F16; // KV cache data type for the V
292
293
    struct cpu_params cpuparams;
294
    struct cpu_params cpuparams_batch;
295
296
    std::vector<ggml_backend_dev_t> devices; // devices to use for offloading
297
298
    std::vector<std::pair<std::string, std::string>> replacements; // main to speculative model replacements
299
    std::vector<llama_model_tensor_buft_override> tensor_buft_overrides;
300
301
0
    bool has_dft() const {
302
0
        return !mparams_dft.path.empty() || !mparams_dft.hf_repo.empty();
303
0
    }
304
};
305
306
struct common_params_vocoder {
307
    struct common_params_model model;
308
309
    std::string speaker_file = ""; // speaker file path                                      // NOLINT
310
311
    bool use_guide_tokens = false; // enable guide tokens to improve TTS accuracy            // NOLINT
312
};
313
314
struct common_params_diffusion {
315
    int32_t steps         = 128;
316
    bool    visual_mode   = false;
317
318
    float   eps           = 0;        // epsilon for timesteps
319
    int32_t block_length  = 0;        // block length for generation
320
321
    int32_t algorithm     = 4;        // default algorithm: low-confidence
322
    float   alg_temp      = 0.0f;     // algorithm temperature
323
324
    float   cfg_scale     = 0;        // classifier-free guidance scale
325
    bool    add_gumbel_noise = false; // add gumbel noise to the logits if temp > 0.0
326
};
327
328
// reasoning API response format (not to be confused as chat template's reasoning format)
329
// only used by server
330
enum common_reasoning_format {
331
    COMMON_REASONING_FORMAT_NONE,
332
    COMMON_REASONING_FORMAT_AUTO,            // Same as deepseek, using `message.reasoning_content`
333
    COMMON_REASONING_FORMAT_DEEPSEEK_LEGACY, // Extract thinking tag contents and return as `message.reasoning_content`, or leave inline in <think> tags in stream mode
334
    COMMON_REASONING_FORMAT_DEEPSEEK,        // Extract thinking tag contents and return as `message.reasoning_content`, including in streaming deltas.
335
    // do not extend this enum unless you absolutely have to
336
    // in most cases, use COMMON_REASONING_FORMAT_AUTO
337
    // see: https://github.com/ggml-org/llama.cpp/pull/15408
338
};
339
340
341
struct lr_opt {
342
    float    lr0          = 1e-5; // learning rate at first epoch
343
    float    lr_min       = -1;
344
    float    decay_epochs = -1;   // if >0, the learning rate starts at lr0 and decays to lr_min after this many epochs
345
    float    scale_epoch  = 0;
346
    float    wd           = 0;
347
    unsigned epochs       = 2;
348
349
    unsigned epoch; // set by optimizer outer (epochs) loop
350
    // learning rate decay - constant LR per epoch only for now
351
    float get_lr(float e) const;
352
0
    float get_lr() const { return get_lr(epoch); }
353
    // must call after arg parse, before get_lr
354
    void init();
355
};
356
357
struct ggml_opt_optimizer_params common_opt_lr_pars(void * userdata);
358
359
struct common_params {
360
    int32_t n_predict             =    -1; // max. number of new tokens to predict, -1 == no limit
361
    int32_t n_ctx                 =     0; // context size, 0 == context the model was trained with
362
    int32_t n_batch               =  2048; // logical batch size for prompt processing (must be >=32 to use BLAS)
363
    int32_t n_ubatch              =   512; // physical batch size for prompt processing (must be >=32 to use BLAS)
364
    int32_t n_keep                =     0; // number of tokens to keep from initial prompt
365
    int32_t n_chunks              =    -1; // max number of chunks to process (-1 = unlimited)
366
    int32_t n_parallel            =     1; // number of parallel sequences to decode
367
    int32_t n_sequences           =     1; // number of sequences to decode
368
    int32_t grp_attn_n            =     1; // group-attention factor
369
    int32_t grp_attn_w            =   512; // group-attention width
370
    int32_t n_print               =    -1; // print token count every n tokens (-1 = disabled)
371
    float   rope_freq_base        =  0.0f; // RoPE base frequency
372
    float   rope_freq_scale       =  0.0f; // RoPE frequency scaling factor
373
    float   yarn_ext_factor       = -1.0f; // YaRN extrapolation mix factor
374
    float   yarn_attn_factor      = -1.0f; // YaRN magnitude scaling factor
375
    float   yarn_beta_fast        = -1.0f; // YaRN low correction dim
376
    float   yarn_beta_slow        = -1.0f; // YaRN high correction dim
377
    int32_t yarn_orig_ctx         =     0; // YaRN original context length
378
379
    // offload params
380
    std::vector<ggml_backend_dev_t> devices; // devices to use for offloading
381
382
    int32_t n_gpu_layers       = -1;   // number of layers to store in VRAM, -1 is auto, <= -2 is all
383
    int32_t main_gpu           = 0;    // the GPU that is used for scratch and small tensors
384
    float   tensor_split[128]  = {0};  // how split tensors should be distributed across GPUs
385
    bool    fit_params         = true; // whether to fit unset model/context parameters to free device memory
386
    int32_t fit_params_min_ctx = 4096; // minimum context size to set when trying to reduce memory use
387
388
    // margin per device in bytes for fitting parameters to free memory:
389
    std::vector<size_t> fit_params_target = std::vector<size_t>(llama_max_devices(), 1024 * 1024*1024);
390
391
    enum llama_split_mode split_mode = LLAMA_SPLIT_MODE_LAYER; // how to split the model across GPUs
392
393
    struct cpu_params cpuparams;
394
    struct cpu_params cpuparams_batch;
395
396
    ggml_backend_sched_eval_callback cb_eval = nullptr;
397
    void * cb_eval_user_data                 = nullptr;
398
399
    ggml_numa_strategy numa = GGML_NUMA_STRATEGY_DISABLED;
400
401
    enum llama_rope_scaling_type rope_scaling_type = LLAMA_ROPE_SCALING_TYPE_UNSPECIFIED;
402
    enum llama_pooling_type      pooling_type      = LLAMA_POOLING_TYPE_UNSPECIFIED; // pooling type for embeddings
403
    enum llama_attention_type    attention_type    = LLAMA_ATTENTION_TYPE_UNSPECIFIED; // attention type for embeddings
404
    enum llama_flash_attn_type   flash_attn_type   = LLAMA_FLASH_ATTN_TYPE_AUTO; // whether to use Flash Attention
405
406
    struct common_params_sampling    sampling;
407
    struct common_params_speculative speculative;
408
    struct common_params_vocoder     vocoder;
409
    struct common_params_diffusion   diffusion;
410
411
    struct common_params_model model;
412
413
    std::set<std::string> model_alias;     // model aliases                                                 // NOLINT
414
    std::set<std::string> model_tags;      // model tags (informational, not used for routing)              // NOLINT
415
    std::string hf_token             = ""; // HF token                                                      // NOLINT
416
    std::string prompt               = "";                                                                  // NOLINT
417
    std::string system_prompt        = "";                                                                  // NOLINT
418
    std::string prompt_file          = ""; // store the external prompt file name                           // NOLINT
419
    std::string path_prompt_cache    = ""; // path to file for saving/loading prompt eval state             // NOLINT
420
    std::string input_prefix         = ""; // string to prefix user inputs with                             // NOLINT
421
    std::string input_suffix         = ""; // string to suffix user inputs with                             // NOLINT
422
    std::string logits_file          = ""; // file for saving *all* logits                                  // NOLINT
423
424
    // llama-debug specific options
425
    std::string logits_output_dir = "data"; // directory for saving logits output files                     // NOLINT
426
    bool        save_logits       = false;  // whether to save logits to files                              // NOLINT
427
    std::vector<std::string> tensor_filter; // filter tensor names for debug output (regex)                 // NOLINT
428
429
    std::vector<std::string> in_files;   // all input files
430
    std::vector<std::string> antiprompt; // strings upon which more user input is prompted (a.k.a. reverse prompts)
431
    std::vector<llama_model_kv_override> kv_overrides;
432
    std::vector<llama_model_tensor_buft_override> tensor_buft_overrides;
433
434
    bool lora_init_without_apply = false; // only load lora to memory, but do not apply it to ctx (user can manually apply lora later using llama_adapter_lora_apply)
435
    std::vector<common_adapter_lora_info> lora_adapters; // lora adapter path with user defined scale
436
437
    std::vector<common_control_vector_load_info> control_vectors; // control vector with user defined scale
438
439
    int32_t verbosity                  = 3;  // LOG_LEVEL_INFO
440
    int32_t control_vector_layer_start = -1; // layer range for control vector
441
    int32_t control_vector_layer_end   = -1; // layer range for control vector
442
    bool    offline                    = false;
443
444
    int32_t ppl_stride      = 0;     // stride for perplexity calculations. If left at 0, the pre-existing approach will be used.
445
    int32_t ppl_output_type = 0;     // = 0 -> ppl output is as usual, = 1 -> ppl output is num_tokens, ppl, one per line
446
                                     //                                       (which is more convenient to use for plotting)
447
                                     //
448
    bool   hellaswag        = false; // compute HellaSwag score over random tasks from datafile supplied in prompt
449
    size_t hellaswag_tasks  = 400;   // number of tasks to use when computing the HellaSwag score
450
451
    bool   winogrande       = false; // compute Winogrande score over random tasks from datafile supplied in prompt
452
    size_t winogrande_tasks = 0;     // number of tasks to use when computing the Winogrande score. If 0, all tasks will be computed
453
454
    bool   multiple_choice  = false;  // compute TruthfulQA score over random tasks from datafile supplied in prompt
455
    size_t multiple_choice_tasks = 0; // number of tasks to use when computing the TruthfulQA score. If 0, all tasks will be computed
456
457
    bool   kl_divergence    = false; // compute KL divergence
458
459
    bool usage             = false; // print usage
460
    bool completion        = false; // print source-able completion script
461
    bool use_color         = false; // use color to distinguish generations and inputs
462
    bool special           = false; // enable special token output
463
    bool interactive       = false; // interactive mode
464
    bool interactive_first = false; // wait for user input immediately
465
    bool prompt_cache_all  = false; // save user input and generations to prompt cache
466
    bool prompt_cache_ro   = false; // open the prompt cache read-only and do not update it
467
468
    bool escape            = true;  // escape "\n", "\r", "\t", "\'", "\"", and "\\"
469
    bool multiline_input   = false; // reverse the usage of `\`
470
    bool simple_io         = false; // improves compatibility with subprocesses and limited consoles
471
    bool cont_batching     = true;  // insert new sequences for decoding on-the-fly
472
    bool no_perf           = false; // disable performance metrics
473
    bool show_timings      = true;  // show timing information on CLI
474
    bool ctx_shift         = false; // context shift on infinite text generation
475
    bool swa_full          = false; // use full-size SWA cache (https://github.com/ggml-org/llama.cpp/pull/13194#issuecomment-2868343055)
476
    bool kv_unified        = false; // enable unified KV cache
477
478
    bool input_prefix_bos  = false; // prefix BOS to user inputs, preceding input_prefix
479
    bool use_mmap          = true;  // enable mmap to use filesystem cache
480
    bool use_direct_io     = false; // read from disk without buffering
481
    bool use_mlock         = false; // use mlock to keep model in memory
482
    bool verbose_prompt    = false; // print prompt tokens before generation
483
    bool display_prompt    = true;  // print prompt before generation
484
    bool no_kv_offload     = false; // disable KV offloading
485
    bool warmup            = true;  // warmup run
486
    bool check_tensors     = false; // validate tensor data
487
    bool no_op_offload     = false; // globally disable offload host tensor operations to device
488
    bool no_extra_bufts    = false; // disable extra buffer types (used for weight repacking)
489
    bool no_host           = false; // bypass host buffer allowing extra buffers to be used
490
491
    bool single_turn       = false; // single turn chat conversation
492
493
    ggml_type cache_type_k = GGML_TYPE_F16; // KV cache data type for the K
494
    ggml_type cache_type_v = GGML_TYPE_F16; // KV cache data type for the V
495
496
    common_conversation_mode conversation_mode = COMMON_CONVERSATION_MODE_AUTO;
497
498
    // multimodal models (see tools/mtmd)
499
    struct common_params_model mmproj;
500
    bool mmproj_use_gpu = true;     // use GPU for multimodal model
501
    bool no_mmproj = false;         // explicitly disable multimodal model
502
    std::vector<std::string> image; // path to image file(s)
503
    int image_min_tokens = -1;
504
    int image_max_tokens = -1;
505
506
    // finetune
507
    struct lr_opt lr;
508
    enum ggml_opt_optimizer_type optimizer = GGML_OPT_OPTIMIZER_TYPE_ADAMW;
509
    float val_split = 0.05f; // fraction of the data used for the validation set
510
511
    // embedding
512
    bool embedding         = false; // get only sentence embedding
513
    int32_t embd_normalize = 2;     // normalisation for embeddings (-1=none, 0=max absolute int16, 1=taxicab, 2=euclidean, >2=p-norm)
514
    std::string embd_out   = "";    // empty = default, "array" = [[],[]...], "json" = openai style, "json+" = same "json" + cosine similarity matrix
515
    std::string embd_sep   = "\n";  // separator of embeddings
516
    std::string cls_sep    = "\t";  // separator of classification sequences
517
518
    // server params
519
    int32_t port              = 8080;         // server listens on this network port
520
    int32_t timeout_read      = 600;          // http read timeout in seconds
521
    int32_t timeout_write     = timeout_read; // http write timeout in seconds
522
    int32_t n_threads_http    = -1;           // number of threads to process HTTP requests (TODO: support threadpool)
523
    int32_t n_cache_reuse     = 0;            // min chunk size to reuse from the cache via KV shifting
524
    bool    cache_prompt      = true;         // whether to enable prompt caching
525
    int32_t n_ctx_checkpoints = 8;            // max number of context checkpoints per slot
526
    int32_t cache_ram_mib     = 8192;         // -1 = no limit, 0 - disable, 1 = 1 MiB, etc.
527
528
    std::string hostname      = "127.0.0.1";
529
    std::string public_path   = "";                                                                         // NOLINT
530
    std::string api_prefix    = "";                                                                         // NOLINT
531
    std::string chat_template = "";                                                                         // NOLINT
532
    bool use_jinja = true;                                                                                  // NOLINT
533
    bool enable_chat_template = true;
534
    common_reasoning_format reasoning_format = COMMON_REASONING_FORMAT_DEEPSEEK;
535
    int reasoning_budget = -1;
536
    bool prefill_assistant = true; // if true, any trailing assistant message will be prefilled into the response
537
    int sleep_idle_seconds = -1;   // if >0, server will sleep after this many seconds of idle time
538
539
    std::vector<std::string> api_keys;
540
541
    std::string ssl_file_key  = "";                                                                         // NOLINT
542
    std::string ssl_file_cert = "";                                                                         // NOLINT
543
544
    std::map<std::string, std::string> default_template_kwargs;
545
546
    // webui configs
547
    bool webui = true;
548
    std::string webui_config_json;
549
550
    // "advanced" endpoints are disabled by default for better security
551
    bool endpoint_slots   = true;
552
    bool endpoint_props   = false; // only control POST requests, not GET
553
    bool endpoint_metrics = false;
554
555
    // router server configs
556
    std::string models_dir    = ""; // directory containing models for the router server
557
    std::string models_preset = ""; // directory containing model presets for the router server
558
    int models_max = 4;             // maximum number of models to load simultaneously
559
    bool models_autoload = true;    // automatically load models when requested via the router server
560
561
    bool log_json = false;
562
563
    std::string slot_save_path;
564
    std::string media_path; // path to directory for loading media files
565
566
    float slot_prompt_similarity = 0.1f;
567
568
    // batched-bench params
569
    bool is_pp_shared   = false;
570
    bool is_tg_separate = false;
571
572
    std::vector<int32_t> n_pp;
573
    std::vector<int32_t> n_tg;
574
    std::vector<int32_t> n_pl;
575
576
    // retrieval params
577
    std::vector<std::string> context_files; // context files to embed
578
579
    int32_t chunk_size = 64; // chunk size for context embedding
580
581
    std::string chunk_separator = "\n"; // chunk separator for context embedding
582
583
    // passkey params
584
    int32_t n_junk = 250; // number of times to repeat the junk text
585
    int32_t i_pos  = -1;  // position of the passkey in the junk text
586
587
    // imatrix params
588
    int32_t n_out_freq  = 10; // output the imatrix every n_out_freq iterations
589
    int32_t n_save_freq =  0; // save the imatrix every n_save_freq iterations
590
    int32_t i_chunk     =  0; // start processing from this chunk
591
    int8_t  imat_dat    =  0; // whether the legacy imatrix.dat format should be output (gguf <= 0 < dat)
592
593
    bool process_output  = false; // collect data for the output tensor
594
    bool compute_ppl     = true;  // whether to compute perplexity
595
    bool show_statistics = false; // show imatrix statistics per tensor
596
    bool parse_special   = false; // whether to parse special tokens during imatrix tokenization
597
598
    // cvector-generator params
599
    int n_pca_batch = 100;
600
    int n_pca_iterations = 1000;
601
    dimre_method cvector_dimre_method = DIMRE_METHOD_PCA;
602
    std::string cvector_positive_file = "tools/cvector-generator/positive.txt";
603
    std::string cvector_negative_file = "tools/cvector-generator/negative.txt";
604
605
    bool spm_infill = false; // suffix/prefix/middle pattern for infill
606
607
    // batched-bench params
608
    bool batched_bench_output_jsonl = false;
609
610
    // common params
611
    std::string out_file; // output filename for all example programs
612
    // optional callback for model loading progress and cancellation:
613
    // called with a progress value between 0.0 and 1.0.
614
    // return false from callback to abort model loading or true to continue
615
    llama_progress_callback load_progress_callback = NULL;
616
    void *                  load_progress_callback_user_data = NULL;
617
};
618
619
// call once at the start of a program if it uses libcommon
620
// initializes the logging system and prints info about the build
621
void common_init();
622
623
std::string common_params_get_system_info(const common_params & params);
624
625
bool parse_cpu_range(const std::string & range, bool(&boolmask)[GGML_MAX_N_THREADS]);
626
bool parse_cpu_mask(const std::string & mask, bool(&boolmask)[GGML_MAX_N_THREADS]);
627
void postprocess_cpu_params(cpu_params & cpuparams, const cpu_params * role_model = nullptr);
628
bool set_process_priority(enum ggml_sched_priority prio);
629
630
//
631
// String utils
632
//
633
634
#ifdef __GNUC__
635
#    if defined(__MINGW32__) && !defined(__clang__)
636
#        define LLAMA_COMMON_ATTRIBUTE_FORMAT(...) __attribute__((format(gnu_printf, __VA_ARGS__)))
637
#    else
638
#        define LLAMA_COMMON_ATTRIBUTE_FORMAT(...) __attribute__((format(printf, __VA_ARGS__)))
639
#    endif
640
#else
641
#    define LLAMA_COMMON_ATTRIBUTE_FORMAT(...)
642
#endif
643
644
LLAMA_COMMON_ATTRIBUTE_FORMAT(1, 2)
645
std::string string_format(const char * fmt, ...);
646
647
std::string string_strip(const std::string & str);
648
std::string string_get_sortable_timestamp();
649
650
std::string string_join(const std::vector<std::string> & values, const std::string & separator);
651
std::vector<std::string> string_split(const std::string & str, const std::string & delimiter);
652
std::string string_repeat(const std::string & str, size_t n);
653
654
void string_replace_all(std::string & s, const std::string & search, const std::string & replace);
655
656
std::string regex_escape(const std::string & s);
657
658
template<class T>
659
static std::vector<T> string_split(const std::string & str, char delim) {
660
    static_assert(!std::is_same<T, std::string>::value, "Please use the specialized version for std::string");
661
    std::vector<T> values;
662
    std::istringstream str_stream(str);
663
    std::string token;
664
    while (std::getline(str_stream, token, delim)) {
665
        T value;
666
        std::istringstream token_stream(token);
667
        token_stream >> value;
668
        values.push_back(value);
669
    }
670
    return values;
671
}
672
673
template<>
674
inline std::vector<std::string> string_split<std::string>(const std::string & str, char delim)
675
0
{
676
0
    std::vector<std::string> parts;
677
0
    size_t begin_pos = 0;
678
0
    size_t delim_pos = str.find(delim);
679
0
    while (delim_pos != std::string::npos) {
680
0
        std::string part = str.substr(begin_pos, delim_pos - begin_pos);
681
0
        parts.emplace_back(part);
682
0
        begin_pos = delim_pos + 1;
683
0
        delim_pos = str.find(delim, begin_pos);
684
0
    }
685
0
    parts.emplace_back(str.substr(begin_pos));
686
0
    return parts;
687
0
}
Unexecuted instantiation: fuzz_inference.cpp:std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > string_split<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char)
Unexecuted instantiation: common.cpp:std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > string_split<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char)
Unexecuted instantiation: log.cpp:std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > string_split<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char)
Unexecuted instantiation: sampling.cpp:std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > string_split<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char)
688
689
// remove when moving to c++20
690
0
inline bool string_starts_with(std::string_view str, std::string_view prefix) {
691
0
    return str.size() >= prefix.size() &&
692
0
           str.compare(0, prefix.size(), prefix) == 0;
693
0
}
694
695
// remove when moving to c++20
696
0
inline bool string_ends_with(std::string_view str, std::string_view suffix) {
697
0
    return str.size() >= suffix.size() &&
698
0
           str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0;
699
0
}
700
701
0
inline bool string_remove_suffix(std::string & str, std::string_view suffix) {
702
0
    if (string_ends_with(str, suffix)) {
703
0
        str.resize(str.size() - suffix.size());
704
0
        return true;
705
0
    }
706
0
    return false;
707
0
}
708
709
0
inline size_t string_find_partial_stop(std::string_view str, std::string_view stop) {
710
0
    if (!str.empty() && !stop.empty()) {
711
0
        const size_t max_len = std::min(str.size(), stop.size());
712
0
        const char last_char = str.back();
713
0
        for (size_t len = max_len; len > 0; --len) {
714
0
            if (stop[len - 1] == last_char) {
715
0
                if (string_ends_with(str, stop.substr(0, len))) {
716
0
                    return str.size() - len;
717
0
                }
718
0
            }
719
0
        }
720
0
    }
721
0
    return std::string::npos;
722
0
}
723
724
bool string_parse_kv_override(const char * data, std::vector<llama_model_kv_override> & overrides);
725
void string_process_escapes(std::string & input);
726
727
std::string string_from(bool value);
728
std::string string_from(const std::vector<int> & values);
729
std::string string_from(const struct llama_context * ctx, const std::vector<llama_token> & tokens);
730
std::string string_from(const struct llama_context * ctx, const struct llama_batch & batch);
731
732
//
733
// Filesystem utils
734
//
735
736
bool fs_validate_filename(const std::string & filename, bool allow_subdirs = false);
737
bool fs_create_directory_with_parents(const std::string & path);
738
bool fs_is_directory(const std::string & path);
739
740
std::string fs_get_cache_directory();
741
std::string fs_get_cache_file(const std::string & filename);
742
743
struct common_file_info {
744
    std::string path;
745
    std::string name;
746
    size_t      size = 0; // in bytes
747
    bool        is_dir = false;
748
};
749
std::vector<common_file_info> fs_list(const std::string & path, bool include_directories);
750
751
//
752
// TTY utils
753
//
754
755
// Auto-detect if colors can be enabled based on terminal and environment
756
bool tty_can_use_colors();
757
758
//
759
// Model utils
760
//
761
762
struct common_sampler;
763
764
// note: defines the model, context, samplers, ets. lifetimes
765
struct common_init_result {
766
    common_init_result(common_params & params);
767
    ~common_init_result();
768
769
    llama_model * model();
770
    llama_context * context();
771
772
    common_sampler * sampler(llama_seq_id seq_id);
773
    void reset_samplers();
774
775
    std::vector<llama_adapter_lora_ptr> & lora();
776
777
private:
778
    struct impl;
779
    std::unique_ptr<impl> pimpl;
780
};
781
782
using common_init_result_ptr = std::unique_ptr<common_init_result>;
783
784
common_init_result_ptr common_init_from_params(common_params & params);
785
786
struct llama_model_params     common_model_params_to_llama  (      common_params & params);
787
struct llama_context_params   common_context_params_to_llama(const common_params & params);
788
struct ggml_threadpool_params ggml_threadpool_params_from_cpu_params(const cpu_params & params);
789
790
// clear LoRA adapters from context, then apply new list of adapters
791
void common_set_adapter_lora(struct llama_context * ctx, std::vector<common_adapter_lora_info> & lora);
792
793
std::string                   get_model_endpoint();
794
795
//
796
// Batch utils
797
//
798
799
void common_batch_clear(struct llama_batch & batch);
800
801
void common_batch_add(
802
                 struct llama_batch & batch,
803
                        llama_token   id,
804
                          llama_pos   pos,
805
    const std::vector<llama_seq_id> & seq_ids,
806
                               bool   logits);
807
808
// decodes a single batch of tokens for a prompt and manages session tokens
809
//
810
// Note: We save state before the last token so that we can replay it to ensure
811
// compatibility with all memory types. Recurrent/hybrid models cannot remove
812
// tokens from memory, so this approach works across all model architectures.
813
bool common_prompt_batch_decode(
814
              struct llama_context * ctx,
815
    const std::vector<llama_token> & embd,
816
                               int & n_past,
817
                               int   n_batch,
818
                  std::string_view   state_path,
819
                              bool   save_state);
820
821
// replays the last token after loading state to regenerate logits
822
// used after loading session state to ensure the sampling context has valid logits
823
bool common_replay_last_token(struct llama_context * ctx, llama_token last_token, int32_t pos);
824
825
//
826
// Vocab utils
827
//
828
829
// tokenizes a string into a vector of tokens
830
// should work similar to Python's `tokenizer.encode`
831
std::vector<llama_token> common_tokenize(
832
  const struct llama_context * ctx,
833
           const std::string & text,
834
                        bool   add_special,
835
                        bool   parse_special = false);
836
837
std::vector<llama_token> common_tokenize(
838
    const struct llama_vocab * vocab,
839
           const std::string & text,
840
                        bool   add_special,
841
                        bool   parse_special = false);
842
843
// tokenizes a token into a piece, optionally renders special/control tokens
844
// should work similar to Python's `tokenizer.id_to_piece`
845
std::string common_token_to_piece(
846
        const struct llama_context * ctx,
847
                       llama_token   token,
848
                       bool          special = true);
849
850
std::string common_token_to_piece(
851
          const struct llama_vocab * vocab,
852
                       llama_token   token,
853
                       bool          special = true);
854
855
// detokenizes a vector of tokens into a string
856
// should work similar to Python's `tokenizer.decode`
857
// optionally renders special/control tokens
858
std::string common_detokenize(
859
            const struct llama_context * ctx,
860
        const std::vector<llama_token> & tokens,
861
                                  bool   special = true);
862
863
std::string common_detokenize(
864
              const struct llama_vocab * vocab,
865
        const std::vector<llama_token> & tokens,
866
                                  bool   special = true);
867
868
//
869
// Embedding utils
870
//
871
872
// TODO: repace embd_norm with an enum
873
void common_embd_normalize(const float * inp, float * out, int n, int embd_norm);
874
875
float common_embd_similarity_cos(const float * embd1, const float * embd2, int n);
876
877
//
878
// Control vector utils
879
//
880
881
struct common_control_vector_data {
882
    int n_embd;
883
884
    // stores data for layers [1, n_layer] where n_layer = data.size() / n_embd
885
    std::vector<float> data;
886
};
887
888
struct common_control_vector_load_info {
889
    float strength;
890
891
    std::string fname;
892
};
893
894
// Load control vectors, scale each by strength, and add them together.
895
// On error, returns {-1, empty}
896
common_control_vector_data common_control_vector_load(const std::vector<common_control_vector_load_info> & load_infos);
897
898
//
899
// Split utils
900
//
901
902
namespace {
903
904
const char * const LLM_KV_SPLIT_NO            = "split.no";
905
const char * const LLM_KV_SPLIT_COUNT         = "split.count";
906
const char * const LLM_KV_SPLIT_TENSORS_COUNT = "split.tensors.count";
907
908
}
909
910
//
911
// MoE utils
912
//
913
914
const char * const LLM_FFN_EXPS_REGEX = "\\.ffn_(up|down|gate)_(ch|)exps";
915
916
0
inline std::string llm_ffn_exps_block_regex(int idx) {
917
0
    return string_format("blk\\.%d%s", idx, LLM_FFN_EXPS_REGEX);
918
0
}
919
920
0
inline llama_model_tensor_buft_override llm_ffn_exps_cpu_override() {
921
0
    return { LLM_FFN_EXPS_REGEX, ggml_backend_cpu_buffer_type() };
922
0
}
923
924
//
925
// training utils
926
//
927
928
ggml_opt_dataset_t common_opt_dataset_init(struct llama_context * ctx, const std::vector<llama_token> & tokens, int64_t stride);
929
930
// "adamw" or "sgd" (case insensitive)
931
enum ggml_opt_optimizer_type common_opt_get_optimizer(const char *);