Skip to content

Commit 451acc4

Browse files
committed
speculative : fix ngram-map cleanup cutoff after prompt shrink
1 parent 703310b commit 451acc4

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

common/ngram-map.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,16 @@ void common_ngram_map_begin(
125125
LOG_DBG("%s: begin, idx_last_draft=%zu, new begin=%zu, #keys=%zu\n", __func__,
126126
map.idx_last_check, size_begin, map.keys.size());
127127

128+
size_t idx_begin_cleanup = map.size_last_begin;
129+
if (idx_begin_cleanup > size_begin) {
130+
if (size_begin > (size_t) map.size_key + map.size_value) {
131+
idx_begin_cleanup = size_begin - map.size_key - map.size_value;
132+
} else {
133+
idx_begin_cleanup = 0;
134+
}
135+
LOG_INF("%s: shrink cleanup begin: %zu -> %zu\n", __func__, map.size_last_begin, idx_begin_cleanup);
136+
}
137+
128138
size_t count_map_entries_upd = 0;
129139
if (!map.key_map.empty() && size_begin < map.idx_last_check) {
130140
if (map.show_key_map_stats) {
@@ -150,26 +160,23 @@ void common_ngram_map_begin(
150160
// Update the map from hash to key index (clear outdated entries).
151161
for (size_t i = 0; i < map.key_map.size(); ++i) {
152162
uint32_t key_idx = map.key_map[i];
153-
if (key_idx != 0 && key_idx + map.size_key > size_begin) {
163+
if (key_idx != 0 && key_idx >= idx_begin_cleanup) {
154164
map.key_map[i] = 0;
155165
count_map_entries_upd++;
156166
}
157167
}
158-
map.key_map_last_idx = (size_begin > 0) ? (uint32_t) (size_begin - 1) : 0;
168+
map.key_map_last_idx = (idx_begin_cleanup > 0) ? (uint32_t) (idx_begin_cleanup - 1) : 0;
159169
}
160170

161171
if (size_begin < map.idx_last_check && !map.keys.empty()) {
162-
// The next token generation will start at index size_begin.
163-
// The valid token history is [0, size_begin), so remove any n-gram/m-gram
164-
// that does not fit entirely inside it (idx + size > size_begin).
165172
size_t count_keys = map.keys.size();
166173
size_t count_keys_del = 0;
167174
size_t count_values_del = 0;
168175
for (int32_t i = map.keys.size() - 1; i >= 0; --i) {
169176
common_ngram_map_key & key = map.keys[i];
170-
if (key.key_idx + map.size_key > size_begin) {
177+
if (key.key_idx >= idx_begin_cleanup) {
171178
// Delete the key.
172-
LOG_DBG("%s: delete key %d (key_idx=%zu + size_key=%d > size_begin=%zu)\n", __func__, i, key.key_idx, map.size_key, size_begin);
179+
LOG_DBG("%s: delete key %d at index %zu (>= idx_begin_cleanup=%zu)\n", __func__, i, key.key_idx, idx_begin_cleanup);
173180
map.keys.erase(map.keys.begin() + i);
174181
count_keys_del++;
175182
continue;
@@ -181,7 +188,7 @@ void common_ngram_map_begin(
181188
// Check the indices of the values.
182189
for (int16_t j = COMMON_NGRAM_MAX_VALUES - 1; j >= 0; --j) {
183190
common_ngram_map_value & value = key.values[j];
184-
if (value.value_idx != 0 && value.value_idx + map.size_value > size_begin) {
191+
if (value.value_idx != 0 && value.value_idx >= idx_begin_cleanup) {
185192
// Delete the value.
186193
count_values_del++;
187194

0 commit comments

Comments
 (0)