| 1764 | } |
| 1765 | |
| 1766 | void llama_kv_cache::state_write_data(llama_io_write_i & io, const cell_ranges_t & cr) const { |
| 1767 | const auto & cells = v_cells[cr.strm]; |
| 1768 | |
| 1769 | const uint32_t v_trans = this->v_trans ? 1 : 0; |
| 1770 | const uint32_t n_layer = layers.size(); |
| 1771 | |
| 1772 | io.write(&v_trans, sizeof(v_trans)); |
| 1773 | io.write(&n_layer, sizeof(n_layer)); |
| 1774 | |
| 1775 | // Iterate and write all the keys first, each row is a cell |
| 1776 | // Get whole range at a time |
| 1777 | for (const auto & layer : layers) { |
| 1778 | const uint32_t il = layer.il; |
| 1779 | |
| 1780 | const uint32_t n_embd_k_gqa = hparams.n_embd_k_gqa(il); |
| 1781 | |
| 1782 | auto * k = layer.k_stream[cr.strm]; |
| 1783 | |
| 1784 | // Write key type |
| 1785 | const int32_t k_type_i = (int32_t) k->type; |
| 1786 | io.write(&k_type_i, sizeof(k_type_i)); |
| 1787 | |
| 1788 | // Write row size of key |
| 1789 | const uint64_t k_size_row = ggml_row_size(k->type, n_embd_k_gqa); |
| 1790 | io.write(&k_size_row, sizeof(k_size_row)); |
| 1791 | |
| 1792 | // Read each range of cells of k_size length and write out |
| 1793 | for (const auto & range : cr.data) { |
| 1794 | const size_t range_size = range.second - range.first; |
| 1795 | const size_t buf_size = range_size * k_size_row; |
| 1796 | io.write_tensor(k, range.first * k_size_row, buf_size); |
| 1797 | } |
| 1798 | } |
| 1799 | |
| 1800 | if (!v_trans) { |
| 1801 | for (const auto & layer : layers) { |
| 1802 | const uint32_t il = layer.il; |
| 1803 | |
| 1804 | const uint32_t n_embd_v_gqa = hparams.n_embd_v_gqa(il); |
| 1805 | |
| 1806 | auto * v = layer.v_stream[cr.strm]; |
| 1807 | if (!v) { |
| 1808 | continue; |
| 1809 | } |
| 1810 | |
| 1811 | // Write value type |
| 1812 | const int32_t v_type_i = (int32_t) v->type; |
| 1813 | io.write(&v_type_i, sizeof(v_type_i)); |
| 1814 | |
| 1815 | // Write row size of value |
| 1816 | const uint64_t v_size_row = ggml_row_size(v->type, n_embd_v_gqa); |
| 1817 | io.write(&v_size_row, sizeof(v_size_row)); |
| 1818 | |
| 1819 | // Read each range of cells of v_size length and write out |
| 1820 | for (const auto & range : cr.data) { |
| 1821 | const size_t range_size = range.second - range.first; |
| 1822 | const size_t buf_size = range_size * v_size_row; |
| 1823 | io.write_tensor(v, range.first * v_size_row, buf_size); |
nothing calls this directly
no test coverage detected