char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

timkhronosmodel: M3: Move MSA into a new memory implementation (#26338)67d5978bb

char/aliceai-t5-moe
5.6 KiB153 linesraw
1#pragma once
2
3#include "llama-kv-cache.h"
4
5#include <vector>
6
7// llama_kv_cache_msa
8
9// uses two instances of llama_kv_cache, one for K/V tensors, and one for the MSA indexer tensors
10// both receive identical sequence operations and identical ubatches, so their cell layouts stay in synced.
11// the context also exposes per-ubatch pos - cell translation maps populated from llama_kv_cells via
12// llama_kv_cache::get_cells(), which the model graph uses to run MSA block selection in position space
13
14class llama_kv_cache_msa : public llama_memory_i {
15public:
16    llama_kv_cache_msa(
17            const llama_model & model,
18                    ggml_type   type_k,
19                    ggml_type   type_v,
20                         bool   v_trans,
21                         bool   offload,
22                         bool   unified,
23                     uint32_t   kv_size,
24                     uint32_t   n_seq_max,
25                     uint32_t   n_pad,
26                     uint32_t   n_swa,
27               llama_swa_type   swa_type,
28        const layer_filter_cb & filter,
29        const layer_filter_cb & filter_idx,
30        const  layer_reuse_cb & reuse);
31
32    ~llama_kv_cache_msa() = default;
33
34    // llama_memory_i
35
36    llama_memory_context_ptr init_batch(
37            llama_batch_allocr & balloc,
38            uint32_t n_ubatch,
39            bool embd_all) override;
40
41    llama_memory_context_ptr init_full() override;
42
43    llama_memory_context_ptr init_update(llama_context * lctx, bool optimize) override;
44
45    bool get_can_shift() const override;
46
47    void clear(bool data) override;
48
49    bool seq_rm  (llama_seq_id seq_id,                              llama_pos p0, llama_pos p1) override;
50    void seq_cp  (llama_seq_id seq_id_src, llama_seq_id seq_id_dst, llama_pos p0, llama_pos p1) override;
51    void seq_keep(llama_seq_id seq_id)                                                          override;
52    void seq_add (llama_seq_id seq_id,                              llama_pos p0, llama_pos p1, llama_pos shift) override;
53    void seq_div (llama_seq_id seq_id,                              llama_pos p0, llama_pos p1, int d) override;
54
55    llama_pos seq_pos_min(llama_seq_id seq_id) const override;
56    llama_pos seq_pos_max(llama_seq_id seq_id) const override;
57
58    std::map<ggml_backend_buffer_type_t, size_t> memory_breakdown() const override;
59
60    // state write/load
61
62    void state_write(llama_io_write_i & io, llama_seq_id seq_id = -1, llama_state_seq_flags flags = 0) const override;
63    void state_read (llama_io_read_i  & io, llama_seq_id seq_id = -1, llama_state_seq_flags flags = 0) override;
64
65    // llama_kv_cache_msa specific API
66
67    llama_kv_cache * get_base() const;
68    llama_kv_cache * get_idx () const;
69
70    uint32_t       get_n_pad()    const { return n_pad; }
71    uint32_t       get_n_seq_max() const { return n_seq_max; }
72    uint32_t       get_n_swa()    const { return n_swa; }
73    llama_swa_type get_swa_type() const { return swa_type; }
74
75private:
76    // keep the indexer KV cache hparams instance here as llama_kv_cache stores only a reference
77    llama_hparams hparams_idx;
78
79    const uint32_t n_stream  = 1;
80    const uint32_t n_seq_max = 1;
81    const uint32_t n_pad     = 1;
82
83    const uint32_t       n_swa    = 0;
84    const llama_swa_type swa_type = LLAMA_SWA_TYPE_NONE;
85
86    std::unique_ptr<llama_kv_cache> kv_base;
87    std::unique_ptr<llama_kv_cache> kv_idx;
88};
89
90class llama_kv_cache_msa_context : public llama_memory_context_i {
91public:
92    using slot_info_vec_t = llama_kv_cache::slot_info_vec_t;
93
94    // used for errors
95    llama_kv_cache_msa_context(llama_memory_status status);
96
97    // used to create a full-cache context
98    llama_kv_cache_msa_context(
99            llama_kv_cache_msa * kv);
100
101    // used to create an update context
102    llama_kv_cache_msa_context(
103            llama_kv_cache_msa * kv,
104            llama_context * lctx,
105            bool optimize);
106
107    // used to create a batch processing context from a batch
108    llama_kv_cache_msa_context(
109            llama_kv_cache_msa * kv,
110            slot_info_vec_t sinfos_base,
111            slot_info_vec_t sinfos_idx,
112            std::vector<llama_ubatch> ubatches);
113
114    virtual ~llama_kv_cache_msa_context();
115
116    // llama_memory_context_i
117
118    bool next()  override;
119    bool apply() override;
120
121    llama_memory_status  get_status() const override;
122    const llama_ubatch & get_ubatch() const override;
123
124    // llama_kv_cache_msa_context specific API
125
126    const llama_kv_cache_context * get_base() const;
127    const llama_kv_cache_context * get_idx () const;
128
129    // max position currently present in the cache plus one, padded MSA blocks are defined over token positions
130    // so the block-selection tensors are sized by this value rather than by the number of cells
131    uint32_t get_n_pos() const;
132
133    // position <-> cell translation maps, populated from the base cache cells
134    // the model graph relates cache contents to token positions only through these per ubatch inputs
135    // value for empty or other-sequence cells is 0 so consumers must mask them
136    void set_input_cell_pos(ggml_tensor * dst, const llama_ubatch * ubatch, int32_t div) const;
137    // positions without a cell map to cell 0, consumers must mask them assumes one sequence per stream
138    void set_input_pos_slot(ggml_tensor * dst, const llama_ubatch * ubatch) const;
139    void set_input_pos_mask(ggml_tensor * dst, const llama_ubatch * ubatch) const;
140
141private:
142    llama_kv_cache_msa * kv;
143
144    // the index of the next ubatch to process
145    size_t i_next = 0;
146
147    std::vector<llama_ubatch> ubatches;
148
149    const llama_memory_context_ptr ctx_base;
150    const llama_memory_context_ptr ctx_idx;
151
152    const llama_memory_status status;
153};