74#include <initializer_list>
78#include <unordered_map>
83#include <nlohmann/json.hpp>
98 std::vector<std::string>
in,
out;
204 std::vector<std::vector<float>>
k,
v;
225 std::vector<float>
v;
230 using Env = std::unordered_map<std::string, Buf>;
236 std::vector<uint8_t>
q;
249 const std::vector<std::pair<float, float>>&
rope_table(
int layer)
const;
250 const std::vector<float>&
weight(
const std::string&
name)
const;
251 const Weight&
bound(
const std::string&
name)
const;
309 std::unordered_map<std::string, std::vector<int64_t>>
shapes_;
310 std::vector<KVCacheLayer>
kv_;
326 std::vector<std::vector<std::pair<float, float>>>
rope_tabs_;
363 std::map<const Node*, std::shared_ptr<rec::Recurrence>>
recs_;
382 float*
alloc =
nullptr;
385 int width = 0,
rows = 0;
386 bool is_list =
false;
394 Embedding,
PosEmbedding,
LayerNorm,
Split,
Gelu,
RmsNorm,
Linear,
Rope,
Attention, Add, Mul,
MoeFfn,
Silu,
395 Sub, Relu, Sigmoid,
Affine,
MulCol,
RmsRow,
List,
Append,
DepthAttend,
LinearAttention,
SsmScan, Expr,
400 const Node*
node =
nullptr;
401 std::vector<int>
in,
out;
403 const float*
w =
nullptr;
404 const float*
b =
nullptr;
405 const float *
gate =
nullptr, *
up =
nullptr, *
down =
nullptr;
406 const float *
ssm_c =
nullptr, *
ssm_d =
nullptr;
408 const RecSlot* rec =
nullptr;
412 int E = 0, top_k = 0,
d_ff = 0;
416 const float*
rope =
nullptr;
417 const float* rope_long =
nullptr;
419 std::vector<expr::Stage>
expr;
422 std::vector<int>
sizes;
424 const float*
state_w =
nullptr;
432 int slot(
const std::string&
name);
434 const float*
dweight(
const std::string&
name)
const;
453 std::unordered_map<std::string, float*>
dweights_;
454 std::unordered_map<std::string, int>
slots_;
457 std::vector<std::vector<DBuf>>
ditems_;
462 std::vector<float*>
dk_,
dv_;
511 float*
drec_ =
nullptr;
525 const int*
dpos_ =
nullptr;
std::vector< RecSlot > rec_slots_
std::vector< float > mor_xin_
void attention_window(const Node &n, int layer, int &window, int &sinks) const
void ts_evict_below(int seg)
const std::string & kv_slot() const
std::vector< int > mor_step_
void load_state(const State &s)
std::set< std::string > offset_applied_
void rec_row_done(const RecSlot &slot, int layer, int t)
const char * kv_format() const
void set_rope_long(bool v)
const std::vector< int > & last_depths() const
std::vector< float > rec_init_
int ts_seg_after(int p) const
bool has_depth_route() const
Interpreter(const Interpreter &)=delete
void run_nodes(const std::vector< Node > &nodes, int layer, Env &env, int T, int start_pos, bool head_last_only)
std::vector< std::vector< int > > mor_rows_
std::vector< float > rec_rows_
std::vector< int > rope_tab_short_
std::vector< int > kv_pos_
std::vector< float > forward(const std::vector< int > &tokens, int start_pos, bool all_rows=false, int tail_rows=0)
std::map< const Node *, std::shared_ptr< rec::Recurrence > > recs_
std::vector< std::vector< std::pair< float, float > > > rope_tabs_
void rec_end(int start_pos, int T)
bool evict_declared() const
int kv_rows_in_use(int application) const
const std::string & family_hint() const
std::vector< RecurrentTensorInfo > recurrent_tensors() const
std::vector< float > rope_scale_layer_
void ts_begin(const std::vector< int > &tokens, int start_pos)
std::vector< int > ts_seg_
int resume_point(int want) const
std::vector< Node > head_
std::vector< float > recurrent_values(const std::string &slot, const std::string &tensor, int application) const
Interpreter & operator=(const Interpreter &)=delete
std::vector< int > rope_tab_long_
std::vector< KVCacheLayer > kv_
std::vector< int > kv_positions(int application) const
std::vector< float > rec_
std::vector< Node > block_
bool has_recurrent() const
std::vector< Node > embed_
std::vector< float > rope_theta_layer_
std::vector< int > window_layer_
void init(const nlohmann::json &j, const std::string &ir_json, const GGUFData &gguf, bool use_gpu)
const RecSlot & rec_slot(const Node &n, const char *op) const
std::string state_weight_
void bind_tensor(const std::string &name, const GGUFData &gguf, bool keep_quantised=false)
size_t kv_cache_bytes() const
std::vector< int > mor_depth_
std::vector< float > mor_g_
std::map< std::pair< const Node *, int >, int > da_sources_
void mor_step(int layer, Env &env, int T, int start_pos)
void build_rope_tables(const GGUFData &gguf)
const Weight & bound(const std::string &name) const
std::unordered_map< std::string, Buf > Env
std::map< int, std::vector< float > > rec_snaps_
std::vector< int > ts_sidx_
const std::vector< std::pair< float, float > > & rope_table(int layer) const
std::vector< int > rec_snap_rows_
size_t kv_scratch_bytes() const
std::unordered_map< std::string, Weight > weights_
std::vector< int > weight_map_
std::vector< float > forward_impl(const std::vector< int > &tokens, int start_pos, bool all_rows, int tail_rows)
std::vector< int > held_positions(int application) const
std::vector< std::vector< int > > ts_vis_
int ts_segment_start(int m) const
void rec_begin(int start_pos, int T, bool all_rows)
void bind(const std::vector< Node > &nodes, int layer, const GGUFData &gguf)
std::string layer_name(const std::string &pattern, int layer) const
const std::vector< float > & weight(const std::string &name) const
float * rec_tensor(const RecSlot &slot, const char *tensor, int layer, size_t floats)
std::unordered_map< std::string, std::vector< int64_t > > shapes_
std::vector< float > rope_attn_layer_
Type definitions for GGML (Georgi Gerganov Machine Learning) library.
GGMLType
Enumeration of GGML tensor data types.
const float * in[expr::Expr::kMaxInputs]
const float * p[kIrDepthSourcesMax]
std::vector< Value > items
std::string build_ir_from_gguf(const GGUFData &g, bool log)
bool has_recurrent_state(const std::string &ir_json)
bool has_state_tokens(const std::string &ir_json)
void linear_attention_row_cpu(const float *q, const float *k, const float *v, float *num, float *den, float *out, int width, float den_floor)
bool has_windowed_attention(const std::string &ir_json)
bool tuned_llama_match(const std::string &ir_json, const GGUFData &gguf, std::string *why)
bool device_supported(const std::string &ir_json)
std::string find_ir(const GGUFData &gguf)
void ssm_scan_row_cpu(const float *u, const float *A, const float *B, const float *C, float D, float *s, float *scratch, float *y, int n)
bool has_ir_builder(const std::string &arch)
Constants for Rotary Position Embedding (RoPE)
Complete representation of a GGUF file's contents.
AppIndex(bool &f, const Node &n)
std::vector< RecTensor > tensors
std::vector< int64_t > shape
std::vector< int64_t > shape
std::vector< std::vector< int > > mor_rows
std::map< int, std::vector< float > > rec_snaps
std::vector< int > ts_seg
std::vector< int > ts_sidx
std::vector< int > kv_pos
std::vector< std::vector< float > > v
std::vector< std::vector< float > > k
std::vector< int > mor_depth
std::vector< std::string > out
std::vector< std::string > in