@@ -720,7 +720,7 @@ llama_dsv4_comp_state::llama_dsv4_comp_state(
720720 auto it = ctx_map.find (buft);
721721 if (it == ctx_map.end ()) {
722722 ggml_init_params params = {
723- /* .mem_size =*/ size_t (2u *hparams.n_layer ()*ggml_tensor_overhead ()),
723+ /* .mem_size =*/ size_t (2u *( 1 + n_stream)* hparams.n_layer ()*ggml_tensor_overhead ()),
724724 /* .mem_buffer =*/ NULL ,
725725 /* .no_alloc =*/ true ,
726726 };
@@ -767,9 +767,17 @@ llama_dsv4_comp_state::llama_dsv4_comp_state(
767767 ggml_format_name (kv, " dsv4_%s_state_kv_l%d" , name, il);
768768 ggml_format_name (score, " dsv4_%s_state_score_l%d" , name, il);
769769
770+ std::vector<ggml_tensor *> kv_stream;
771+ std::vector<ggml_tensor *> score_stream;
772+
773+ for (uint32_t s = 0 ; s < n_stream; ++s) {
774+ kv_stream.push_back (ggml_view_2d (ctx, kv, n_embd_state, state_size, kv->nb [1 ], s*kv->nb [2 ]));
775+ score_stream.push_back (ggml_view_2d (ctx, score, n_embd_state, state_size, score->nb [1 ], s*score->nb [2 ]));
776+ }
777+
770778 map_layer_ids[il] = layers.size ();
771779
772- layers.push_back ({ il, kv, score });
780+ layers.push_back ({ il, kv, score, std::move (kv_stream), std::move (score_stream) });
773781 }
774782
775783 for (auto & [buft, ctx] : ctx_map) {
@@ -809,6 +817,30 @@ void llama_dsv4_comp_state::clear(llama_seq_id seq_id, bool data) {
809817 }
810818}
811819
820+ void llama_dsv4_comp_state::seq_cp (llama_seq_id seq_id_src, llama_seq_id seq_id_dst) {
821+ GGML_ASSERT (seq_id_src >= 0 && (uint32_t ) seq_id_src < n_stream);
822+ GGML_ASSERT (seq_id_dst >= 0 && (uint32_t ) seq_id_dst < n_stream);
823+
824+ if (seq_id_src == seq_id_dst) {
825+ return ;
826+ }
827+
828+ sc_info.ssrc .push_back ((uint32_t ) seq_id_src);
829+ sc_info.sdst .push_back ((uint32_t ) seq_id_dst);
830+ }
831+
832+ void llama_dsv4_comp_state::apply_copies (const stream_copy_info & sc_info) const {
833+ for (size_t i = 0 ; i < sc_info.ssrc .size (); ++i) {
834+ const uint32_t ssrc = sc_info.ssrc [i];
835+ const uint32_t sdst = sc_info.sdst [i];
836+
837+ for (const auto & layer : layers) {
838+ ggml_backend_tensor_copy (layer.kv_stream [ssrc], layer.kv_stream [sdst]);
839+ ggml_backend_tensor_copy (layer.score_stream [ssrc], layer.score_stream [sdst]);
840+ }
841+ }
842+ }
843+
812844uint32_t llama_dsv4_comp_state::get_ratio () const {
813845 return ratio;
814846}
@@ -1154,7 +1186,13 @@ llama_memory_context_ptr llama_kv_cache_dsv4::init_full() {
11541186}
11551187
11561188llama_memory_context_ptr llama_kv_cache_dsv4::init_update (llama_context * lctx, bool optimize) {
1157- return std::make_unique<llama_kv_cache_dsv4_context>(this , lctx, optimize);
1189+ return std::make_unique<llama_kv_cache_dsv4_context>(
1190+ this ,
1191+ lctx,
1192+ optimize,
1193+ std::move (csa_state->sc_info ),
1194+ std::move (hca_state->sc_info ),
1195+ std::move (lid_state->sc_info ));
11581196}
11591197
11601198bool llama_kv_cache_dsv4::get_can_shift () const {
@@ -1174,14 +1212,19 @@ bool llama_kv_cache_dsv4::seq_rm(llama_seq_id seq_id, llama_pos p0, llama_pos p1
11741212 }
11751213
11761214 if (p0 > 0 ) {
1177- // DSV4 compressed cache rows are derived from running compressor state,
1178- // so arbitrary rollback is not reconstructible from the raw cache alone.
1179- // Allow the common prompt-cache cleanup no-op: remove [end, infinity).
1180- if (seq_id >= 0 && p0 > kv_raw->seq_pos_max (seq_id)) {
1181- return true ;
1215+ if (seq_id < 0 || (uint32_t ) seq_id >= n_seq_max ||
1216+ p0 <= kv_raw->seq_pos_max (seq_id)) {
1217+ return false ;
11821218 }
11831219
1184- return false ;
1220+ bool res = true ;
1221+
1222+ res = res & kv_raw->seq_rm (seq_id, p0, -1 );
1223+ res = res & kv_csa->seq_rm (seq_id, p0/DSV4_CSA_RATIO , -1 );
1224+ res = res & kv_hca->seq_rm (seq_id, p0/DSV4_HCA_RATIO , -1 );
1225+ res = res & kv_lid->seq_rm (seq_id, p0/DSV4_CSA_RATIO , -1 );
1226+
1227+ return res;
11851228 }
11861229
11871230 const bool res = kv_raw->seq_rm (seq_id, p0, p1);
@@ -1194,7 +1237,16 @@ bool llama_kv_cache_dsv4::seq_rm(llama_seq_id seq_id, llama_pos p0, llama_pos p1
11941237}
11951238
11961239void llama_kv_cache_dsv4::seq_cp (llama_seq_id seq_id_src, llama_seq_id seq_id_dst, llama_pos p0, llama_pos p1) {
1240+ GGML_ASSERT (p0 <= 0 && p1 < 0 && " DSV4 only supports full sequence copies" );
1241+
11971242 kv_raw->seq_cp (seq_id_src, seq_id_dst, p0, p1);
1243+ kv_csa->seq_cp (seq_id_src, seq_id_dst, -1 , -1 );
1244+ kv_hca->seq_cp (seq_id_src, seq_id_dst, -1 , -1 );
1245+ kv_lid->seq_cp (seq_id_src, seq_id_dst, -1 , -1 );
1246+
1247+ csa_state->seq_cp (seq_id_src, seq_id_dst);
1248+ hca_state->seq_cp (seq_id_src, seq_id_dst);
1249+ lid_state->seq_cp (seq_id_src, seq_id_dst);
11981250}
11991251
12001252void llama_kv_cache_dsv4::seq_keep (llama_seq_id seq_id) {
@@ -1639,20 +1691,26 @@ llama_kv_cache_dsv4_context::llama_kv_cache_dsv4_context(
16391691llama_kv_cache_dsv4_context::llama_kv_cache_dsv4_context (
16401692 llama_kv_cache_dsv4 * kv,
16411693 llama_context * lctx,
1642- bool optimize) :
1694+ bool optimize,
1695+ stream_copy_info sc_info_csa,
1696+ stream_copy_info sc_info_hca,
1697+ stream_copy_info sc_info_lid) :
16431698 ctx_raw(std::make_unique<llama_kv_cache_dsv4_raw_context>(kv->get_raw (), lctx, optimize)),
16441699 ctx_csa_mem(kv->get_csa ()->init_update(lctx, optimize)),
16451700 ctx_hca_mem(kv->get_hca ()->init_update(lctx, optimize)),
16461701 ctx_lid_mem(kv->get_lid ()->init_update(lctx, optimize)),
1647- ctx_csa(std::make_unique<llama_kv_cache_dsv4_comp_context>(kv->get_csa ())),
1648- ctx_hca(std::make_unique<llama_kv_cache_dsv4_comp_context>(kv->get_hca ())),
1649- ctx_lid(std::make_unique<llama_kv_cache_dsv4_comp_context>(kv->get_lid ())),
16501702 csa_state(kv->get_csa_state ()),
16511703 hca_state(kv->get_hca_state ()),
16521704 lid_state(kv->get_lid_state ()),
1705+ sc_info_csa(std::move(sc_info_csa)),
1706+ sc_info_hca(std::move(sc_info_hca)),
1707+ sc_info_lid(std::move(sc_info_lid)),
16531708 status(llama_memory_status_combine(
1654- llama_memory_status_combine (ctx_raw->get_status (), ctx_csa_mem->get_status()),
1655- llama_memory_status_combine(ctx_hca_mem->get_status (), ctx_lid_mem->get_status()))) {
1709+ llama_memory_status_combine (
1710+ llama_memory_status_combine (ctx_raw->get_status (), ctx_csa_mem->get_status()),
1711+ llama_memory_status_combine(ctx_hca_mem->get_status (), ctx_lid_mem->get_status())),
1712+ this->sc_info_csa.empty() && this->sc_info_hca.empty() && this->sc_info_lid.empty() ?
1713+ LLAMA_MEMORY_STATUS_NO_UPDATE : LLAMA_MEMORY_STATUS_SUCCESS)) {
16561714}
16571715
16581716llama_kv_cache_dsv4_context::llama_kv_cache_dsv4_context (
@@ -1720,6 +1778,18 @@ bool llama_kv_cache_dsv4_context::apply() {
17201778
17211779 res = res & ctx_raw->apply ();
17221780
1781+ if (ctx_csa_mem) {
1782+ res = res & ctx_csa_mem->apply ();
1783+ res = res & ctx_hca_mem->apply ();
1784+ res = res & ctx_lid_mem->apply ();
1785+ }
1786+
1787+ if (ubatches.empty ()) {
1788+ csa_state->apply_copies (sc_info_csa);
1789+ hca_state->apply_copies (sc_info_hca);
1790+ lid_state->apply_copies (sc_info_lid);
1791+ }
1792+
17231793 return res;
17241794}
17251795
0 commit comments