| 1215 | template void BlockMLA::_attention_impl<block_q3_K>(InferenceState&, int, int, int, int) const; |
| 1216 | |
| 1217 | void Model::_copy_embedding(InferenceState& s, int token) { |
| 1218 | const Config& c = *config; |
| 1219 | switch (c.weight_quant) { |
| 1220 | case Quant::F32: { |
| 1221 | float* emb = static_cast<float*>(token_embedding_table->data); |
| 1222 | for (int i = 0; i < c.dim; ++i) { |
| 1223 | s.x()[i] = emb[token * c.dim + i]; |
| 1224 | } |
| 1225 | break; |
| 1226 | } |
| 1227 | case Quant::F16: { |
| 1228 | f16_t* emb = static_cast<f16_t*>(token_embedding_table->data); |
| 1229 | for (int i = 0; i < c.dim; i+=1) { |
| 1230 | s.x()[i] = half_to_float(emb[token * c.dim + i]); |
| 1231 | } |
| 1232 | break; |
| 1233 | } |
| 1234 | case Quant::F8E5M2: { |
| 1235 | f8e5m2_t* emb = static_cast<f8e5m2_t*>(token_embedding_table->data); |
| 1236 | float* emb_scale = static_cast<float*>(token_embedding_scale->data); |
| 1237 | int* block_size = config->block_size.data(); |
| 1238 | int scale_num_cols = (c.dim + block_size[1] - 1) / block_size[1]; |
| 1239 | for (int i = 0; i < c.dim; i+=1) { |
| 1240 | int scale_i = token / block_size[0]; |
| 1241 | int scale_j = i / block_size[1]; |
| 1242 | float scale = emb_scale[scale_i * scale_num_cols + scale_j]; |
| 1243 | s.x()[i] = float8e5m2_to_float(emb[token * c.dim + i]) * scale; |
| 1244 | } |
| 1245 | break; |
| 1246 | } |
| 1247 | case Quant::Q2_K: { |
| 1248 | block_q2_K* emb = static_cast<block_q2_K*>(token_embedding_table->data); |
| 1249 | int blocks_per_row = c.dim / QK_K; |
| 1250 | dequantize_row_q2_K(emb + token * blocks_per_row, s.x(), c.dim); |
| 1251 | break; |
| 1252 | } |
| 1253 | case Quant::Q3_K: { |
| 1254 | block_q3_K* emb = static_cast<block_q3_K*>(token_embedding_table->data); |
| 1255 | int blocks_per_row = c.dim / QK_K; |
| 1256 | dequantize_row_q3_K(emb + token * blocks_per_row, s.x(), c.dim); |
| 1257 | break; |
| 1258 | } |
| 1259 | default: { |
| 1260 | assert(false && "unsupported weight quantization"); |
| 1261 | } |
| 1262 | } |
| 1263 | } |
| 1264 | |
| 1265 | void Model::_forward_cpu(InferenceState& s, int token, int pos, InferenceMode mode) { |
| 1266 | const Config& c = *config; |
nothing calls this directly
no test coverage detected