mirror of
https://github.com/ggml-org/llama.cpp.git
synced 2026-07-23 11:10:55 -05:00
common : fix state save in common_prompt_batch_decode (#23468)
* common : fix state save in common_prompt_batch_decode This commit addresses a bug in common_prompt_batch_decode that affects the session state store/restore in completion.cpp and save-load-state.cpp. The motivation for this is that currently the code is saving n-1 tokens in both the session_tokens and in the KV cache. Then when loading the session tokens, and if the prompt matches, it would replay the last saved token (n-1) into the next position, effectively replaying the same token in the wrong position. The fix is to store all n tokens in session_tokens, while the memory state only reflects n-1 processed tokens as the saving happens before the last token is decoded in common_prompt_batch_decode. I ran both completion.cpp and save-load-state.cpp with a transformer, a recurrent, and a hybrid model. Resolves: https://github.com/ggml-org/llama.cpp/issues/23400 Co-authored-by: fairydreaming <166155368+fairydreaming@users.noreply.github.com>
This commit is contained in:
@@ -63,7 +63,7 @@ static std::string test_baseline(struct llama_model * model, const struct common
|
||||
auto tokens = common_tokenize(ctx.get(), params.prompt, true);
|
||||
|
||||
auto n_past = 0;
|
||||
if (!common_prompt_batch_decode(ctx.get(), tokens, n_past, params.n_batch, params.out_file, true)) {
|
||||
if (!common_prompt_batch_decode(ctx.get(), tokens, (int)tokens.size(), n_past, params.n_batch, params.out_file, true)) {
|
||||
LOG_ERR("%s: failed to decode prompt\n", __func__);
|
||||
return {};
|
||||
}
|
||||
@@ -111,7 +111,7 @@ static bool test_state_load(struct llama_model * model, const struct common_para
|
||||
LOG_TRC("%s: loaded state with %zu tokens\n", __func__, n_token_count_out);
|
||||
|
||||
// Replay last token
|
||||
int n_past = (int) n_token_count_out;
|
||||
int n_past = (int) n_token_count_out - 1;
|
||||
if (!common_replay_last_token(ctx.get(), tokens.back(), n_past)) {
|
||||
return false;
|
||||
}
|
||||
@@ -165,7 +165,7 @@ static bool test_seq_cp_host(struct llama_model * model, const struct common_par
|
||||
LOG_TRC("%s: loaded state with %zu tokens\n", __func__, n_token_count_out);
|
||||
|
||||
// Replay last token
|
||||
int n_past = (int) n_token_count_out;
|
||||
int n_past = (int) n_token_count_out - 1;
|
||||
if (!common_replay_last_token(ctx.get(), tokens.back(), n_past)) {
|
||||
return false;
|
||||
}
|
||||
@@ -240,7 +240,7 @@ static bool test_seq_cp_device(struct llama_model * model, const struct common_p
|
||||
LOG_TRC("%s: loaded state with %zu tokens\n", __func__, n_token_count_out);
|
||||
|
||||
// Replay last token
|
||||
int n_past = (int) n_token_count_out;
|
||||
int n_past = (int) n_token_count_out - 1;
|
||||
if (!common_replay_last_token(ctx.get(), tokens.back(), n_past)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user