char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
dd1ea5243
char/aliceai-t5-moe
1#pragma once 2 3#include "llama.h" 4 5#include "common.h" 6 7#include <string> 8#include <vector> 9 10// common_sampler extends llama_sampler with additional functionality: 11// 12// - grammar support 13// - custom sampler logic based on the parameters 14// - history of the last accepted tokens 15// - performance metrics 16// 17// This goal is to have a common implementation of the sampling logic shared across the examples. 18// For example, depending on the temperature, the sampling chain can be very simple (greedy) or more 19// complex (top-k, top-p, etc). 20// 21// Another example is related to the grammar. In general, the grammar constraints applied on the full 22// vocabulary can be very taxing. To improve performance, the grammar can be applied only to the sampled 23// token in order to verify if it fits the grammar. And only if the token doesn't fit the grammar, the 24// grammar constraints are applied to the full vocabulary and the token is resampled. 25// 26// The common_sampler also maintains a container with the last accepted tokens. In the future, this can 27// be moved into the core llama library. 28// 29// For convenience, the common_sampler also maintains a container with the current candidate tokens. 30// This can be used to access the probabilities of the rest of the non-sampled tokens. 31// 32// TODO: measure grammar performance 33// 34 35struct common_sampler ; 36 37// llama_sampler API overloads 38 39// note: can mutate params in some cases 40struct common_sampler * common_sampler_init ( 41const struct llama_model * model , 42struct common_params_sampling & params ); 43 44void common_sampler_free (struct common_sampler * gsmpl ); 45 46// if is_generated is true, the token is accepted by the sampling chain, the reasoning budget sampler, and the grammar sampler 47void common_sampler_accept (struct common_sampler * gsmpl ,llama_token token ,bool is_generated ); 48void common_sampler_reset (struct common_sampler * gsmpl ); 49struct common_sampler * common_sampler_clone (struct common_sampler * gsmpl ); 50void common_sampler_copy (const struct common_sampler * src ,struct common_sampler * dst ); 51 52// arguments can be nullptr to skip printing 53void common_perf_print (const struct llama_context * ctx ,const struct common_sampler * gsmpl ); 54 55// get the underlying llama_sampler_chain 56struct llama_sampler * common_sampler_get (const struct common_sampler * gsmpl ); 57 58// extended sampling implementation: 59// 60// - set logits 61// - apply the configured sampler chain 62// - check if the token fits the grammar (if any) 63// - if not: resample by first applying the grammar constraints and then sampling again (slower path) 64// 65// if grammar_first is true, the grammar is applied before the samplers (slower) 66// useful in cases where all the resulting candidates (not just the sampled one) must fit the grammar 67// 68llama_token common_sampler_sample (struct common_sampler * gsmpl ,struct llama_context * ctx ,int idx ,bool grammar_first = false); 69 70// generalized version of common_sampler_sample 71// 72// will cross-reference the sampled tokens with a batch of draft tokens and accept those that match 73// if the sampler disagrees at some point, we stop and return the accepted tokens up to now 74// 75// common_sampler_sample_n(gsmpl, ctx, { idx }, {}); 76// 77// is equivalent to 78// 79// common_sampler_sample(gsmpl, ctx, idx); 80// common_sampler_accept(gsmpl, token, true); 81// 82// requires: idxs.size() == draft.size() + 1 83// 84// returns at least 1 token, up to idxs.size() 85// 86std ::vector < llama_token > common_sampler_sample_and_accept_n (struct common_sampler * gsmpl ,struct llama_context * ctx ,const std ::vector < int > & idxs ,const llama_tokens & draft ,bool grammar_first = false); 87 88// assume idxs == [ 0, 1, 2, ..., draft.size() ] 89std ::vector < llama_token > common_sampler_sample_and_accept_n (struct common_sampler * gsmpl ,struct llama_context * ctx ,const llama_tokens & draft ,bool grammar_first = false); 90 91uint32_t common_sampler_get_seed (const struct common_sampler * gsmpl ); 92 93// force the reasoning budget sampler (if any) to begin forcing its end sequence now. 94bool common_sampler_reasoning_budget_force (struct common_sampler * gsmpl ); 95 96// helpers 97 98// access the internal list of current candidate tokens 99// if do_sort == true, the candidates are guaranteed to be sorted afterwards (in descending order of probability) 100// the .sorted flag of the result indicates whether the returned candidates are sorted 101llama_token_data_array * common_sampler_get_candidates (struct common_sampler * gsmpl ,bool do_sort ); 102 103// get the last accepted token 104llama_token common_sampler_last (const struct common_sampler * gsmpl ); 105 106// print the sampler chain into a string 107std ::string common_sampler_print (const struct common_sampler * gsmpl ); 108 109// get a string representation of the last accepted tokens 110std ::string common_sampler_prev_str (common_sampler * gsmpl ,llama_context * ctx ,int n ); 111 112char common_sampler_type_to_chr (enum common_sampler_type cnstr ); 113std ::string common_sampler_type_to_str (enum common_sampler_type cnstr ); 114 115std ::vector < enum common_sampler_type > common_sampler_types_from_names (const std ::vector < std ::string > & names ); 116std ::vector < enum common_sampler_type > common_sampler_types_from_chars (const std ::string & chars ); 117 118llama_sampler * llama_sampler_init_llg (const llama_vocab * vocab , 119const char * grammar_kind ,const char * grammar_data ); 120 121struct common_sampler_deleter { 122void operator ()(common_sampler * s ) {common_sampler_free (s ); } 123}; 124 125typedef std ::unique_ptr < common_sampler ,common_sampler_deleter > common_sampler_ptr ;