| 1752 | } |
| 1753 | |
| 1754 | size_t llama_context::state_write_data(llama_io_write_i & io) { |
| 1755 | LLAMA_LOG_DEBUG("%s: writing state\n", __func__); |
| 1756 | |
| 1757 | // write model info |
| 1758 | { |
| 1759 | LLAMA_LOG_DEBUG("%s: - writing model info\n", __func__); |
| 1760 | |
| 1761 | const std::string arch_str = llm_arch_name(model.arch); |
| 1762 | io.write_string(arch_str); |
| 1763 | // TODO: add more model-specific info which should prevent loading the session file if not identical |
| 1764 | } |
| 1765 | |
| 1766 | // write output ids |
| 1767 | { |
| 1768 | LLAMA_LOG_DEBUG("%s: - writing output ids\n", __func__); |
| 1769 | |
| 1770 | const auto n_outputs = this->n_outputs; |
| 1771 | const auto & output_ids = this->output_ids; |
| 1772 | |
| 1773 | std::vector<int32_t> w_output_pos; |
| 1774 | |
| 1775 | GGML_ASSERT(n_outputs <= n_outputs_max); |
| 1776 | |
| 1777 | w_output_pos.resize(n_outputs); |
| 1778 | |
| 1779 | // build a more compact representation of the output ids |
| 1780 | for (size_t i = 0; i < n_batch(); ++i) { |
| 1781 | // map an output id to a position in the batch |
| 1782 | int32_t pos = output_ids[i]; |
| 1783 | if (pos >= 0) { |
| 1784 | GGML_ASSERT(pos < n_outputs); |
| 1785 | w_output_pos[pos] = i; |
| 1786 | } |
| 1787 | } |
| 1788 | |
| 1789 | io.write(&n_outputs, sizeof(n_outputs)); |
| 1790 | |
| 1791 | if (n_outputs) { |
| 1792 | io.write(w_output_pos.data(), n_outputs * sizeof(int32_t)); |
| 1793 | } |
| 1794 | } |
| 1795 | |
| 1796 | // write logits |
| 1797 | { |
| 1798 | LLAMA_LOG_DEBUG("%s: - writing logits\n", __func__); |
| 1799 | |
| 1800 | const uint64_t logits_size = std::min((uint64_t) this->logits_size, (uint64_t) n_outputs * model.vocab.n_tokens()); |
| 1801 | |
| 1802 | io.write(&logits_size, sizeof(logits_size)); |
| 1803 | |
| 1804 | if (logits_size) { |
| 1805 | io.write(logits, logits_size * sizeof(float)); |
| 1806 | } |
| 1807 | } |
| 1808 | |
| 1809 | // write embeddings |
| 1810 | { |
| 1811 | LLAMA_LOG_DEBUG("%s: - writing embeddings\n", __func__); |
nothing calls this directly
no test coverage detected