Skip to content

Commit 26d8fa4

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

1 file changed

Lines changed: 14 additions & 8 deletions

File tree

common/ngram-map.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,15 @@ 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 cleanup_begin = map.size_last_begin;
129+
if (cleanup_begin > size_begin) {
130+
cleanup_begin = (size_begin > (size_t) map.size_key + map.size_value)
131+
? size_begin - map.size_key - map.size_value
132+
: 0;
133+
LOG_INF("%s: shrink cleanup begin: %zu -> %zu\n", __func__,
134+
map.size_last_begin, cleanup_begin);
135+
}
136+
128137
size_t count_map_entries_upd = 0;
129138
if (!map.key_map.empty() && size_begin < map.idx_last_check) {
130139
if (map.show_key_map_stats) {
@@ -150,26 +159,23 @@ void common_ngram_map_begin(
150159
// Update the map from hash to key index (clear outdated entries).
151160
for (size_t i = 0; i < map.key_map.size(); ++i) {
152161
uint32_t key_idx = map.key_map[i];
153-
if (key_idx != 0 && key_idx + map.size_key > size_begin) {
162+
if (key_idx != 0 && key_idx >= cleanup_begin) {
154163
map.key_map[i] = 0;
155164
count_map_entries_upd++;
156165
}
157166
}
158-
map.key_map_last_idx = (size_begin > 0) ? (uint32_t) (size_begin - 1) : 0;
167+
map.key_map_last_idx = (cleanup_begin > 0) ? (uint32_t) (cleanup_begin - 1) : 0;
159168
}
160169

161170
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).
165171
size_t count_keys = map.keys.size();
166172
size_t count_keys_del = 0;
167173
size_t count_values_del = 0;
168174
for (int32_t i = map.keys.size() - 1; i >= 0; --i) {
169175
common_ngram_map_key & key = map.keys[i];
170-
if (key.key_idx + map.size_key > size_begin) {
176+
if (key.key_idx >= cleanup_begin) {
171177
// 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);
178+
LOG_DBG("%s: delete key %d at index %zu (>= cleanup_begin=%zu)\n", __func__, i, key.key_idx, cleanup_begin);
173179
map.keys.erase(map.keys.begin() + i);
174180
count_keys_del++;
175181
continue;
@@ -181,7 +187,7 @@ void common_ngram_map_begin(
181187
// Check the indices of the values.
182188
for (int16_t j = COMMON_NGRAM_MAX_VALUES - 1; j >= 0; --j) {
183189
common_ngram_map_value & value = key.values[j];
184-
if (value.value_idx != 0 && value.value_idx + map.size_value > size_begin) {
190+
if (value.value_idx != 0 && value.value_idx >= cleanup_begin) {
185191
// Delete the value.
186192
count_values_del++;
187193

0 commit comments

Comments
 (0)