Skip to content

sampling : add XTC sampler #9742

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 49 commits into from
Oct 15, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
89640b0
Initial XTC commit
MaggotHATE Oct 4, 2024
9455194
Cleanup
MaggotHATE Oct 4, 2024
db54ac5
Simplified chances calculation
MaggotHATE Oct 4, 2024
41e1665
First fixes by comments
MaggotHATE Oct 4, 2024
d9c9203
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 4, 2024
f2a2a61
Fixed trailing backspaces
MaggotHATE Oct 4, 2024
4f8e55b
Fixed RNG to be reproduceable
MaggotHATE Oct 4, 2024
6d94ba2
Fixed forgotten header
MaggotHATE Oct 4, 2024
49cd211
Moved `min_keep`
MaggotHATE Oct 4, 2024
899e073
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 4, 2024
74f657c
Fixed broken randomization
MaggotHATE Oct 4, 2024
59e8e63
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 5, 2024
63e60de
Swapped sorting for a custom algorithm
MaggotHATE Oct 5, 2024
094caea
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 6, 2024
39940e5
Algorithm rework
MaggotHATE Oct 6, 2024
4c44e3d
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 7, 2024
dbe9ef7
Added XTC to `test-sampling`
MaggotHATE Oct 7, 2024
98b204c
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 7, 2024
8110f78
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 8, 2024
81a0c26
Simplified algorithm and more tests
MaggotHATE Oct 8, 2024
09bc6d5
Updated info in common and args
MaggotHATE Oct 8, 2024
c19fb26
Merged back lost commits in common and arg
MaggotHATE Oct 8, 2024
6feb6b3
Update dump info in common
MaggotHATE Oct 8, 2024
d0b1053
Fixed incorrect min_keep check
MaggotHATE Oct 8, 2024
ed535bb
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 9, 2024
37e02e3
Added XTC to README
MaggotHATE Oct 9, 2024
ba29d31
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 10, 2024
2107882
Renamed parameters, fixed info and defaults
MaggotHATE Oct 10, 2024
f7a383f
Initial server support
MaggotHATE Oct 10, 2024
72db625
Added XTC to server UIs
MaggotHATE Oct 10, 2024
882a603
Merge branch 'master' into master
MaggotHATE Oct 11, 2024
3968369
Fixed labels in old server UI
MaggotHATE Oct 11, 2024
acada1a
Made algorithm safer and more readable
MaggotHATE Oct 11, 2024
dfe587a
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 11, 2024
9c43a01
Removed xtc_threshold_max
MaggotHATE Oct 12, 2024
68557eb
Merge branch 'master' of https://github.com/MaggotHATE/llama.cpp-xtc
MaggotHATE Oct 12, 2024
ea85a51
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 12, 2024
cca842f
Fixed arg after update
MaggotHATE Oct 12, 2024
ea62e65
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 13, 2024
44bbd63
Quick fixes by comments
MaggotHATE Oct 14, 2024
a3e6522
Merge branch 'master' of https://github.com/MaggotHATE/llama.cpp-xtc
MaggotHATE Oct 14, 2024
dfef2c4
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 14, 2024
436a991
Simplified algorithm since threshold_max is removed
MaggotHATE Oct 14, 2024
3613a6d
Renamed random distribution
MaggotHATE Oct 14, 2024
17ad143
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 14, 2024
2be814a
Fixed tests and outdated README
MaggotHATE Oct 15, 2024
28d2cff
Merge branch 'master' of https://github.com/MaggotHATE/llama.cpp-xtc
MaggotHATE Oct 15, 2024
3496f58
Small fixes
MaggotHATE Oct 15, 2024
050eb7a
Merge branch 'ggerganov:master' into master
MaggotHATE Oct 15, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions common/arg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -966,6 +966,27 @@ gpt_params_context gpt_params_parser_init(gpt_params & params, llama_example ex,
params.sparams.min_p = std::stof(value);
}
).set_sparam());
add_opt(llama_arg(
{"--xtc-p"}, "N",
format("xtc probability (default: %.1f, 0.0 = disabled)", (double)params.sparams.xtc_p),
[](gpt_params & params, const std::string & value) {
params.sparams.xtc_p = std::stof(value);
}
).set_sparam());
add_opt(llama_arg(
{"--xtc-t"}, "N",
format("xtc threshold (default: %.1f, 0.0 = disabled)", (double)params.sparams.xtc_t),
[](gpt_params & params, const std::string & value) {
params.sparams.xtc_t = std::stof(value);
}
).set_sparam());
add_opt(llama_arg(
{"--xtc-t-max"}, "N",
format("xtc upper threshold (default: %.1f, 0.0 = disabled)", (double)params.sparams.xtc_t_max),
[](gpt_params & params, const std::string & value) {
params.sparams.xtc_t_max = std::stof(value);
}
).set_sparam());
add_opt(llama_arg(
{"--tfs"}, "N",
format("tail free sampling, parameter z (default: %.1f, 1.0 = disabled)", (double)params.sparams.tfs_z),
Expand Down
3 changes: 3 additions & 0 deletions common/common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2060,6 +2060,9 @@ void yaml_dump_non_result_info(FILE * stream, const gpt_params & params, const l
fprintf(stream, "top_k: %d # default: 40\n", sparams.top_k);
fprintf(stream, "top_p: %f # default: 0.95\n", sparams.top_p);
fprintf(stream, "min_p: %f # default: 0.0\n", sparams.min_p);
fprintf(stream, "xtc_p: %f # default: 0.0\n", sparams.xtc_p);
fprintf(stream, "xtc_t: %f # default: 0.0\n", sparams.xtc_t);
fprintf(stream, "xtc_t_max: %f # default: 0.0\n", sparams.xtc_t_max);
fprintf(stream, "typ_p: %f # default: 1.0\n", sparams.typ_p);
fprintf(stream, "verbose_prompt: %s # default: false\n", params.verbose_prompt ? "true" : "false");
fprintf(stream, "display_prompt: %s # default: true\n", params.display_prompt ? "true" : "false");
Expand Down
4 changes: 4 additions & 0 deletions common/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ enum gpt_sampler_type {
GPT_SAMPLER_TYPE_TFS_Z = 4,
GPT_SAMPLER_TYPE_TYPICAL_P = 5,
GPT_SAMPLER_TYPE_TEMPERATURE = 6,
GPT_SAMPLER_TYPE_XTC = 7,
};

// dimensionality reduction methods, used by cvector-generator
Expand All @@ -108,6 +109,9 @@ struct gpt_sampler_params {
int32_t top_k = 40; // <= 0 to use vocab size
float top_p = 0.95f; // 1.0 = disabled
float min_p = 0.05f; // 0.0 = disabled
float xtc_p = 0.50f; // 0.0 = disabled
float xtc_t = 0.10f; // 1.0 = disabled
float xtc_t_max = 1.00f; // 0.0 = disabled
float tfs_z = 1.00f; // 1.0 = disabled
float typ_p = 1.00f; // typical_p, 1.0 = disabled
float temp = 0.80f; // <= 0.0 to sample greedily, 0.0 to not output probabilities
Expand Down
13 changes: 10 additions & 3 deletions common/sampling.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,10 @@ std::string gpt_sampler_params::print() const {

snprintf(result, sizeof(result),
"\trepeat_last_n = %d, repeat_penalty = %.3f, frequency_penalty = %.3f, presence_penalty = %.3f\n"
"\ttop_k = %d, tfs_z = %.3f, top_p = %.3f, min_p = %.3f, typical_p = %.3f, temp = %.3f\n"
"\ttop_k = %d, tfs_z = %.3f, top_p = %.3f, min_p = %.3f, xtc_p = %.3f, xtc_t = %.3f, xtc_t_max = %.3f, typical_p = %.3f, temp = %.3f\n"
"\tmirostat = %d, mirostat_lr = %.3f, mirostat_ent = %.3f",
penalty_last_n, penalty_repeat, penalty_freq, penalty_present,
top_k, tfs_z, top_p, min_p, typ_p, temp,
top_k, tfs_z, top_p, min_p, xtc_p, xtc_t, xtc_t_max, typ_p, temp,
mirostat, mirostat_eta, mirostat_tau);

return std::string(result);
Expand Down Expand Up @@ -184,6 +184,9 @@ struct gpt_sampler * gpt_sampler_init(const struct llama_model * model, const st
case GPT_SAMPLER_TYPE_MIN_P:
llama_sampler_chain_add(result->chain, llama_sampler_init_min_p (params.min_p, params.min_keep));
break;
case GPT_SAMPLER_TYPE_XTC:
llama_sampler_chain_add(result->chain, llama_sampler_init_xtc (params.xtc_p, params.xtc_t, params.xtc_t_max, params.min_keep));
break;
case GPT_SAMPLER_TYPE_TFS_Z:
llama_sampler_chain_add(result->chain, llama_sampler_init_tail_free(params.tfs_z, params.min_keep));
break;
Expand Down Expand Up @@ -372,6 +375,7 @@ char gpt_sampler_type_to_chr(enum gpt_sampler_type cnstr) {
case GPT_SAMPLER_TYPE_TOP_P: return 'p';
case GPT_SAMPLER_TYPE_MIN_P: return 'm';
case GPT_SAMPLER_TYPE_TEMPERATURE: return 't';
case GPT_SAMPLER_TYPE_XTC: return 'x';
default : return '?';
}
}
Expand All @@ -384,6 +388,7 @@ std::string gpt_sampler_type_to_str(enum gpt_sampler_type cnstr) {
case GPT_SAMPLER_TYPE_TOP_P: return "top_p";
case GPT_SAMPLER_TYPE_MIN_P: return "min_p";
case GPT_SAMPLER_TYPE_TEMPERATURE: return "temperature";
case GPT_SAMPLER_TYPE_XTC: return "xtc";
default : return "";
}
}
Expand All @@ -396,6 +401,7 @@ std::vector<gpt_sampler_type> gpt_sampler_types_from_names(const std::vector<std
{ "min_p", GPT_SAMPLER_TYPE_MIN_P },
{ "tfs_z", GPT_SAMPLER_TYPE_TFS_Z },
{ "temperature", GPT_SAMPLER_TYPE_TEMPERATURE },
{ "xtc", GPT_SAMPLER_TYPE_XTC },
};

// since samplers names are written multiple ways
Expand Down Expand Up @@ -441,7 +447,8 @@ std::vector<gpt_sampler_type> gpt_sampler_types_from_chars(const std::string & c
{ gpt_sampler_type_to_chr(GPT_SAMPLER_TYPE_TYPICAL_P), GPT_SAMPLER_TYPE_TYPICAL_P },
{ gpt_sampler_type_to_chr(GPT_SAMPLER_TYPE_TOP_P), GPT_SAMPLER_TYPE_TOP_P },
{ gpt_sampler_type_to_chr(GPT_SAMPLER_TYPE_MIN_P), GPT_SAMPLER_TYPE_MIN_P },
{ gpt_sampler_type_to_chr(GPT_SAMPLER_TYPE_TEMPERATURE), GPT_SAMPLER_TYPE_TEMPERATURE }
{ gpt_sampler_type_to_chr(GPT_SAMPLER_TYPE_TEMPERATURE), GPT_SAMPLER_TYPE_TEMPERATURE },
{ gpt_sampler_type_to_chr(GPT_SAMPLER_TYPE_XTC), GPT_SAMPLER_TYPE_XTC }
};

std::vector<gpt_sampler_type> samplers;
Expand Down
3 changes: 3 additions & 0 deletions include/llama.h
Original file line number Diff line number Diff line change
Expand Up @@ -1093,6 +1093,9 @@ extern "C" {
/// @details Dynamic temperature implementation (a.k.a. entropy) described in the paper https://arxiv.org/abs/2309.02772.
LLAMA_API struct llama_sampler * llama_sampler_init_temp_ext (float t, float delta, float exponent);

/// @details XTC sampler as described in https://github.com/oobabooga/text-generation-webui/pull/6335
LLAMA_API struct llama_sampler * llama_sampler_init_xtc (float p, float t, float t_max, size_t min_keep);

/// @details Mirostat 1.0 algorithm described in the paper https://arxiv.org/abs/2007.14966. Uses tokens instead of words.
/// @param candidates A vector of `llama_token_data` containing the candidate tokens, their probabilities (p), and log-odds (logit) for the current position in the generated text.
/// @param tau The target cross-entropy (or surprise) value you want to achieve for the generated text. A higher value corresponds to more surprising or less predictable text, while a lower value corresponds to less surprising or more predictable text.
Expand Down
80 changes: 80 additions & 0 deletions src/llama-sampling.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1059,6 +1059,86 @@ struct llama_sampler * llama_sampler_init_temp_ext(float temp, float delta, floa
};
}

// xtc

struct llama_sampler_xtc {
const float probability;
const float threshold;
const float threshold_max;
const size_t min_keep;
};

static const char * llama_sampler_xtc_name(const struct llama_sampler * /*smpl*/) {
return "xtc";
}

static void llama_sample_xtc_apply(struct llama_sampler * smpl, llama_token_data_array * cur_p) {
const auto * ctx = (llama_sampler_xtc *) smpl->ctx;

if (ctx->probability <= 0.0f || ctx->threshold <= 0.0f || cur_p->size <= 1 || ctx->min_keep <= 2) {
return;
}

std::random_device rd;
float chance = (float)(rd()%100)/100;
if (chance > ctx->probability) return;
// in case it's not sorted/recalculated yet
llama_sampler_softmax_impl(cur_p);

int removed = 0;
// going through all candidates from back to front, easier to keep the last of probables
for (int i = (cur_p->size - 1); i >= 0; --i) {
if (cur_p->data[i].p >= ctx->threshold && cur_p->data[i].p <= ctx->threshold_max) {
++removed;
if (removed > 1) {
// .logits are used for sorting and calculating .p in llama_sample_softmax_impl
cur_p->data[i].logit = -999.0f;
}
}
}

if (removed > 1) {
// sorting with new logits, ex-last probable will be the first anyway
std::sort(cur_p->data, cur_p->data + cur_p->size, [](const llama_token_data & a, const llama_token_data & b) {
return a.logit > b.logit;
});
cur_p->sorted = true;

// resizing now that penalized tokens are at the back
cur_p->size = cur_p->size - removed + 1;
}
}

static struct llama_sampler * llama_sampler_xtc_clone(const struct llama_sampler * smpl) {
const auto * ctx = (const llama_sampler_xtc *) smpl->ctx;
return llama_sampler_init_xtc(ctx->probability, ctx->threshold, ctx->threshold_max, ctx->min_keep);
}

static void llama_sampler_xtc_free(struct llama_sampler * smpl) {
delete (llama_sampler_xtc *) smpl->ctx;
}

static struct llama_sampler_i llama_sampler_xtc_i = {
/* .name = */ llama_sampler_xtc_name,
/* .accept = */ nullptr,
/* .apply = */ llama_sample_xtc_apply,
/* .reset = */ nullptr,
/* .clone = */ llama_sampler_xtc_clone,
/* .free = */ llama_sampler_xtc_free,
};

struct llama_sampler * llama_sampler_init_xtc(float p, float t, float t_max, size_t min_keep) {
return new llama_sampler {
/* .iface = */ &llama_sampler_xtc_i,
/* .ctx = */ new llama_sampler_xtc {
/* .probability = */ p,
/* .threshold = */ t,
/* .threshold_max = */ t_max,
/* .min_keep = */ min_keep,
},
};
}

// mirostat

struct llama_sampler_mirostat {
Expand Down
Loading