MCPcopy Create free account
hub / github.com/Tiiny-AI/PowerInfer / state_write_data

Method state_write_data

smallthinker/src/llama-kv-cache-unified.cpp:1314–1399  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1312}
1313
1314void llama_kv_cache_unified::state_write_data(llama_io_write_i & io, const std::vector<std::pair<uint32_t, uint32_t>> & cell_ranges) const {
1315 const uint32_t v_trans = this->v_trans ? 1 : 0;
1316 const uint32_t n_layer = layers.size();
1317
1318 io.write(&v_trans, sizeof(v_trans));
1319 io.write(&n_layer, sizeof(n_layer));
1320
1321 std::vector<uint8_t> tmp_buf;
1322
1323 // Iterate and write all the keys first, each row is a cell
1324 // Get whole range at a time
1325 for (const auto & layer : layers) {
1326 const uint32_t il = layer.il;
1327
1328 const uint32_t n_embd_k_gqa = hparams.n_embd_k_gqa(il) + hparams.n_embd_k_s();
1329
1330 // Write key type
1331 const int32_t k_type_i = (int32_t)layer.k->type;
1332 io.write(&k_type_i, sizeof(k_type_i));
1333
1334 // Write row size of key
1335 const uint64_t k_size_row = ggml_row_size(layer.k->type, n_embd_k_gqa);
1336 io.write(&k_size_row, sizeof(k_size_row));
1337
1338 // Read each range of cells of k_size length each into tmp_buf and write out
1339 for (const auto & range : cell_ranges) {
1340 const size_t range_size = range.second - range.first;
1341 const size_t buf_size = range_size * k_size_row;
1342 io.write_tensor(layer.k, range.first * k_size_row, buf_size);
1343 }
1344 }
1345
1346 if (!v_trans) {
1347 for (const auto & layer : layers) {
1348 const uint32_t il = layer.il;
1349
1350 const uint32_t n_embd_v_gqa = hparams.n_embd_v_gqa(il) + hparams.n_embd_v_s();
1351
1352 // Write value type
1353 const int32_t v_type_i = (int32_t)layer.v->type;
1354 io.write(&v_type_i, sizeof(v_type_i));
1355
1356 // Write row size of value
1357 const uint64_t v_size_row = ggml_row_size(layer.v->type, n_embd_v_gqa);
1358 io.write(&v_size_row, sizeof(v_size_row));
1359
1360 // Read each range of cells of v_size length each into tmp_buf and write out
1361 for (const auto & range : cell_ranges) {
1362 const size_t range_size = range.second - range.first;
1363 const size_t buf_size = range_size * v_size_row;
1364 io.write_tensor(layer.v, range.first * v_size_row, buf_size);
1365 }
1366 }
1367 } else {
1368 // When v is transposed, we also need the element size and get the element ranges from each row
1369 const uint32_t kv_size = cells.size();
1370
1371 for (const auto & layer : layers) {

Callers

nothing calls this directly

Calls 9

ggml_row_sizeFunction · 0.85
n_embd_k_gqaMethod · 0.80
n_embd_k_sMethod · 0.80
n_embd_v_gqaMethod · 0.80
n_embd_v_sMethod · 0.80
ggml_type_sizeFunction · 0.50
sizeMethod · 0.45
writeMethod · 0.45
write_tensorMethod · 0.45

Tested by

no test coverage detected