| 1312 | } |
| 1313 | |
| 1314 | void 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) { |
nothing calls this directly
no test coverage detected