ember.cpp 0.1.0
C++ inference engine for Llama-family and paperkiln models (CPU, CUDA, WebAssembly)
Loading...
Searching...
No Matches
utils.h
Go to the documentation of this file.
1#pragma once
2
3#include <vector>
4#include <string>
5#include <cstdint>
6#include <functional>
7
8#include "quantization.h"
9#include "model_constants.h"
10
11// SIMD optimized functions
12float simd_dot_product(const float* a, const float* b, int n);
13void simd_scaled_add(float* dst, const float* src, float scale, int n);
14
15// BFloat16 conversion functions
18std::vector<float> bfloat16_vector_to_float32(const std::vector<uint16_t>& bf16_vec);
19
20// Vector utility functions
21std::vector<uint16_t> uint8_vector_to_uint16_vector(const std::vector<uint8_t>& bytes, size_t numel);
22int argmax(const std::vector<float>& v);
23
24// Matrix-vector multiplication functions (CPU)
25void matvec_q6k_f32_vector_cpu(const std::vector<block_q6_K>& mat_q6k,
26 const std::vector<float>& vec_f32,
27 std::vector<float>& out_f32, int rows,
28 int cols, bool log_first_block = false);
29
30void matvec_q4k_f32_vector_cpu(const std::vector<block_q4_K>& mat_q4k,
31 const std::vector<float>& vec_f32,
32 std::vector<float>& out_f32, int rows,
33 int cols, bool log_first_block = false);
34
35void matvec_q8_0_f32_vector_cpu(const std::vector<block_q8_0>& mat_q8_0,
36 const std::vector<float>& vec_f32,
37 std::vector<float>& out_f32, int rows,
38 int cols, bool log_first_block = false);
39
40void matvec_q8k_f32_vector_cpu(const std::vector<block_q8_K>& mat_q8k,
41 const std::vector<float>& vec_f32,
42 std::vector<float>& out_f32, int rows,
43 int cols, bool log_first_block = false);
44
45// Mixture-of-experts FFN for one token; see utils.cpp.
46void moe_ffn_f32_cpu(const float* x, int d, int d_ff, int E, int k, const float* router, const float* gate_exps,
47 const float* up_exps, const float* down_exps, float* out, bool renorm = true);
48// The same with DeepSeek-V3's router (sigmoid scores, a selection bias, group-limited routing); see utils.cpp.
49void moe_ffn_routed_f32_cpu(const float* x, int d, int d_ff, int E, int k, const float* router, const float* gate_exps,
50 const float* up_exps, const float* down_exps, float* out, bool renorm, bool sigmoid,
51 const float* bias, int groups_n, int groups_top);
52
53void matvec_f32_f32_vector_cpu(const std::vector<float>& mat_f32,
54 const std::vector<float>& vec_f32,
55 std::vector<float>& out_f32, int rows,
56 int cols);
57
58// Batch matrix multiplication functions (CPU)
59void matmul_q4k_f32_batch_cpu(const std::vector<block_q4_K>& mat_q4k,
60 const std::vector<float>& batch_input_activations,
61 std::vector<float>& batch_output_activations,
62 int num_tokens, int output_dim, int input_dim);
63
64// The same product for a weight kept quantised: row_fn(o, dst) writes weight
65// row o (input_dim floats) into dst. Rows are dequantised one at a time into
66// a per-thread scratch row and dotted exactly as matmul_f32_f32_batch_cpu
67// does, so when row_fn yields the dequantise-at-load values the outputs are
68// bit-identical to it. batch_output_activations is [num_tokens][output_dim].
69void matmul_rows_f32_batch_cpu(const std::function<void(int64_t, float*)>& row_fn,
71 int num_tokens, int output_dim, int input_dim);
72
73void matmul_q6k_f32_batch_cpu(const std::vector<block_q6_K>& mat_q6k,
74 const std::vector<float>& batch_input_activations,
75 std::vector<float>& batch_output_activations,
76 int num_tokens, int output_dim, int input_dim);
77
78void matmul_q8_0_f32_batch_cpu(const std::vector<block_q8_0>& mat_q8_0,
79 const std::vector<float>& batch_input_activations,
80 std::vector<float>& batch_output_activations,
81 int num_tokens, int output_dim, int input_dim);
82
83void matmul_q8k_f32_batch_cpu(const std::vector<block_q8_K>& mat_q8k,
84 const std::vector<float>& batch_input_activations,
85 std::vector<float>& batch_output_activations,
86 int num_tokens, int output_dim, int input_dim);
87
88// Neural network operations (CPU) - these are implemented as static functions in model.cpp
89
90// RoPE (Rotary Position Embedding) functions
91void apply_rope_vector(std::vector<float>& x, int num_heads, int head_dim,
93 const std::vector<std::pair<float, float>>& all_freqs_cis,
95
96void apply_rope_batch_cpu(std::vector<float>& q_batch, std::vector<float>& k_batch,
99 const std::vector<std::pair<float, float>>& all_freqs_cis,
101
102// Neural network operations
103void rmsnorm_batch_cpu(const std::vector<float>& x_batch,
104 const std::vector<float>& weight,
105 std::vector<float>& out_batch,
106 int num_tokens, int hidden_size,
107 float eps = numeric::DEFAULT_EPS);
108
109void rmsnorm_vector_cpu(const std::vector<float>& x,
110 const std::vector<float>& weight,
111 std::vector<float>& out,
112 float eps = numeric::DEFAULT_EPS);
113
114void softmax_vector_cpu(const std::vector<float>& x, std::vector<float>& out);
115void silu_cpu(const std::vector<float>& x, std::vector<float>& out);
116void gelu_cpu(const std::vector<float>& x, std::vector<float>& out); // For Phi models
117void gelu_new_cpu(const std::vector<float>& x, std::vector<float>& out); // gelu_new variant
118
119// Batch matrix multiplication
120void matmul_f32_f32_batch_cpu(const std::vector<float>& mat_weights,
121 const std::vector<float>& batch_input_activations,
122 std::vector<float>& batch_output_activations,
123 int num_tokens, int output_dim, int input_dim);
124
125// BFloat16 matrix-vector operations
126void matvec_bf16_f32_vector_cpu(const std::vector<uint16_t>& mat_bf16,
127 const std::vector<float>& vec_f32,
128 std::vector<float>& out_f32, int rows, int cols);
129
130// Attention computation functions
131void weighted_sum_probs_v(const std::vector<float>& probs,
132 const std::vector<float>& V,
133 std::vector<float>& out, int seq_len, int head_dim);
134
135void calculate_attention_scores(const std::vector<float>& Q,
136 const std::vector<float>& K,
137 std::vector<float>& scores, int seq_len,
138 int head_dim, float scale);
139
140// Logging and debugging functions
141void log_vector_summary(const std::string& name, const std::vector<float>& v, int head_count);
142void log_vector_summary_with_tail(const std::string& name, const std::vector<float>& v,
143 int head_count, int tail_count);
144void log_vector_summary_detailed(const std::string& name, const std::vector<float>& v,
145 int current_pos, int current_layer, int N = 5);
146void log_vec_stats(const std::string& name, const std::vector<float>& v);
147void log_raw_float_pointer(const std::string& name, const float* ptr, size_t count = 5);
148
149// File I/O utility functions
150bool write_vector_to_file(const std::string& filename, const std::vector<float>& vec);
151std::vector<std::vector<float>> load_rmsnorm_bin(const std::string& filename,
152 int num_tokens, int hidden_size);
153
154// Helper conversion functions
155std::vector<float> bf16vec_to_float_vec(const std::vector<uint16_t>& v_bf16);
156
157// Quantization utility
158void dequantize_q8_k(const std::vector<block_q8_K>& q8k_vec,
159 std::vector<float>& out_f32, int n, bool log_this_block);
int n
std::vector< float > v
const char * name
size_t numel
std::vector< E > a
node out
node scale
node sigmoid
size_t j
Constants used throughout the TinyLlama model implementation.
constexpr float DEFAULT_EPS
Weight quantization structures and functions for model compression.
void moe_ffn_f32_cpu(const float *x, int d, int d_ff, int E, int k, const float *router, const float *gate_exps, const float *up_exps, const float *down_exps, float *out, bool renorm=true)
Definition utils.cpp:709
void apply_rope_vector(std::vector< float > &x, int num_heads, int head_dim, int current_token_pos, const std::vector< std::pair< float, float > > &all_freqs_cis, int max_pos_embeddings, bool use_adjacent_pairing)
Definition utils.cpp:428
float bfloat16_to_float32(uint16_t bf16)
Definition utils.cpp:145
void log_vector_summary(const std::string &name, const std::vector< float > &v, int head_count)
Definition utils.cpp:208
void matvec_q4k_f32_vector_cpu(const std::vector< block_q4_K > &mat_q4k, const std::vector< float > &vec_f32, std::vector< float > &out_f32, int rows, int cols, bool log_first_block=false)
Definition utils.cpp:983
std::vector< uint16_t > uint8_vector_to_uint16_vector(const std::vector< uint8_t > &bytes, size_t numel)
Definition utils.cpp:177
std::vector< float > bfloat16_vector_to_float32(const std::vector< uint16_t > &bf16_vec)
Definition utils.cpp:166
void log_vector_summary_with_tail(const std::string &name, const std::vector< float > &v, int head_count, int tail_count)
Definition utils.cpp:235
void rmsnorm_batch_cpu(const std::vector< float > &x_batch, const std::vector< float > &weight, std::vector< float > &out_batch, int num_tokens, int hidden_size, float eps=numeric::DEFAULT_EPS)
Definition utils.cpp:613
void matvec_bf16_f32_vector_cpu(const std::vector< uint16_t > &mat_bf16, const std::vector< float > &vec_f32, std::vector< float > &out_f32, int rows, int cols)
Definition utils.cpp:1192
void matvec_f32_f32_vector_cpu(const std::vector< float > &mat_f32, const std::vector< float > &vec_f32, std::vector< float > &out_f32, int rows, int cols)
Definition utils.cpp:365
void simd_scaled_add(float *dst, const float *src, float scale, int n)
Definition utils.cpp:93
void moe_ffn_routed_f32_cpu(const float *x, int d, int d_ff, int E, int k, const float *router, const float *gate_exps, const float *up_exps, const float *down_exps, float *out, bool renorm, bool sigmoid, const float *bias, int groups_n, int groups_top)
Definition utils.cpp:763
void matmul_q4k_f32_batch_cpu(const std::vector< block_q4_K > &mat_q4k, const std::vector< float > &batch_input_activations, std::vector< float > &batch_output_activations, int num_tokens, int output_dim, int input_dim)
Definition utils.cpp:1155
void matmul_rows_f32_batch_cpu(const std::function< void(int64_t, float *)> &row_fn, const float *batch_input_activations, float *batch_output_activations, int num_tokens, int output_dim, int input_dim)
Definition utils.cpp:916
void matvec_q8k_f32_vector_cpu(const std::vector< block_q8_K > &mat_q8k, const std::vector< float > &vec_f32, std::vector< float > &out_f32, int rows, int cols, bool log_first_block=false)
Definition utils.cpp:399
std::vector< float > bf16vec_to_float_vec(const std::vector< uint16_t > &v_bf16)
Definition utils.cpp:199
void matvec_q8_0_f32_vector_cpu(const std::vector< block_q8_0 > &mat_q8_0, const std::vector< float > &vec_f32, std::vector< float > &out_f32, int rows, int cols, bool log_first_block=false)
Definition utils.cpp:294
void matvec_q6k_f32_vector_cpu(const std::vector< block_q6_K > &mat_q6k, const std::vector< float > &vec_f32, std::vector< float > &out_f32, int rows, int cols, bool log_first_block=false)
Definition utils.cpp:930
bool write_vector_to_file(const std::string &filename, const std::vector< float > &vec)
Definition utils.cpp:1301
void rmsnorm_vector_cpu(const std::vector< float > &x, const std::vector< float > &weight, std::vector< float > &out, float eps=numeric::DEFAULT_EPS)
Definition utils.cpp:648
void log_raw_float_pointer(const std::string &name, const float *ptr, size_t count=5)
Definition utils.cpp:1342
void softmax_vector_cpu(const std::vector< float > &x, std::vector< float > &out)
Definition utils.cpp:675
void gelu_cpu(const std::vector< float > &x, std::vector< float > &out)
Definition utils.cpp:851
int argmax(const std::vector< float > &v)
Definition utils.cpp:186
float simd_dot_product(const float *a, const float *b, int n)
Definition utils.cpp:36
void matmul_q8_0_f32_batch_cpu(const std::vector< block_q8_0 > &mat_q8_0, const std::vector< float > &batch_input_activations, std::vector< float > &batch_output_activations, int num_tokens, int output_dim, int input_dim)
Definition utils.cpp:1036
void apply_rope_batch_cpu(std::vector< float > &q_batch, std::vector< float > &k_batch, int num_tokens, int num_q_heads, int num_kv_heads, int head_dim, int start_pos_in_sequence, const std::vector< std::pair< float, float > > &all_freqs_cis, int max_pos_embeddings, bool use_adjacent_pairing)
Definition utils.cpp:491
void calculate_attention_scores(const std::vector< float > &Q, const std::vector< float > &K, std::vector< float > &scores, int seq_len, int head_dim, float scale)
Definition utils.cpp:1258
std::vector< std::vector< float > > load_rmsnorm_bin(const std::string &filename, int num_tokens, int hidden_size)
Definition utils.cpp:1324
void log_vector_summary_detailed(const std::string &name, const std::vector< float > &v, int current_pos, int current_layer, int N=5)
Definition utils.cpp:1357
void dequantize_q8_k(const std::vector< block_q8_K > &q8k_vec, std::vector< float > &out_f32, int n, bool log_this_block)
void weighted_sum_probs_v(const std::vector< float > &probs, const std::vector< float > &V, std::vector< float > &out, int seq_len, int head_dim)
Definition utils.cpp:1227
void matmul_f32_f32_batch_cpu(const std::vector< float > &mat_weights, const std::vector< float > &batch_input_activations, std::vector< float > &batch_output_activations, int num_tokens, int output_dim, int input_dim)
Definition utils.cpp:872
void gelu_new_cpu(const std::vector< float > &x, std::vector< float > &out)
Definition utils.cpp:860
void silu_cpu(const std::vector< float > &x, std::vector< float > &out)
Definition utils.cpp:842
void matmul_q8k_f32_batch_cpu(const std::vector< block_q8_K > &mat_q8k, const std::vector< float > &batch_input_activations, std::vector< float > &batch_output_activations, int num_tokens, int output_dim, int input_dim)
Definition utils.cpp:1074
void matmul_q6k_f32_batch_cpu(const std::vector< block_q6_K > &mat_q6k, const std::vector< float > &batch_input_activations, std::vector< float > &batch_output_activations, int num_tokens, int output_dim, int input_dim)
Definition utils.cpp:1117
void log_vec_stats(const std::string &name, const std::vector< float > &v)
Definition utils.cpp:1286
uint16_t float32_to_bfloat16(float val)
Definition utils.cpp:137