llama: add token ID tracking to KV cell (#27762)
* kv: track token id * rm get_prev_tokens, move it to the main pr * nits * add get_prev_tokens
This commit is contained in:
+28
-1
@@ -15,6 +15,10 @@ struct llama_kv_cell_ext {
|
||||
llama_pos x = 0;
|
||||
llama_pos y = 0;
|
||||
|
||||
// when tok = LLAMA_TOKEN_NULL when the cell is produced by embedding input (i.e. multimodal)
|
||||
// use case: n-gram embeddings hash
|
||||
llama_token tok = LLAMA_TOKEN_NULL;
|
||||
|
||||
// return true if the current 2D spatial position is greater than other
|
||||
bool is_2d_gt(llama_pos ox, llama_pos oy) const {
|
||||
return (y > oy) || (y == oy && x > ox);
|
||||
@@ -23,7 +27,7 @@ struct llama_kv_cell_ext {
|
||||
void reset() {
|
||||
static_assert(std::is_trivially_copyable_v<llama_kv_cell_ext>);
|
||||
|
||||
memset(this, 0, sizeof(*this));
|
||||
*this = llama_kv_cell_ext{};
|
||||
}
|
||||
};
|
||||
|
||||
@@ -305,6 +309,29 @@ public:
|
||||
return seq[i].test(seq_id);
|
||||
}
|
||||
|
||||
// gather the token ids of the cells in `seqs` with position in [p0, p1)
|
||||
// the callback receives (seq_id, pos, token) for every such (cell, seq) pair
|
||||
// note: used by n-gram input embeddings to recover the tokens preceding a ubatch
|
||||
template<typename F>
|
||||
void for_each_token_in(const std::bitset<LLAMA_MAX_SEQ> & seqs, llama_pos p0, llama_pos p1, F && f) const {
|
||||
for (const auto & i : used) {
|
||||
if (pos[i] < p0 || pos[i] >= p1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const auto m = seq[i] & seqs;
|
||||
if (m.none()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (llama_seq_id s = 0; s < LLAMA_MAX_SEQ; ++s) {
|
||||
if (m.test(s)) {
|
||||
f(s, pos[i], ext[i].tok);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// note: call only if the cell is not empty and the seq_id is not in the cell
|
||||
void seq_add(uint32_t i, llama_seq_id seq_id) {
|
||||
assert(i < pos.size());
|
||||
|
||||
Reference in New Issue
Block a user