@@ -4714,6 +4714,10 @@ def gemma4_text_attention_forward(
47144714) -> tuple :
47154715 from transformers .models .gemma4 .modeling_gemma4 import apply_rotary_pos_emb as apply_rotary_pos_emb_gemma4
47164716
4717+ # since transformers >= v5.6 (PR #45788) `shared_kv_states` dict and is passed and `kv_shared_layer_index` removed
4718+ shared_kv_states = kwargs .pop ("shared_kv_states" , None )
4719+ legacy_shared_kv_states = hasattr (self , "kv_shared_layer_index" )
4720+
47174721 input_shape = hidden_states .shape [:- 1 ]
47184722 hidden_shape = (* input_shape , - 1 , self .head_dim )
47194723
@@ -4724,8 +4728,12 @@ def gemma4_text_attention_forward(
47244728 query_states = apply_rotary_pos_emb_gemma4 (query_states , cos , sin , unsqueeze_dim = 2 )
47254729 query_states = query_states .transpose (1 , 2 )
47264730
4727- if self .is_kv_shared_layer and past_key_values is not None :
4728- key_states , value_states = past_key_values .shared_layers [self .kv_shared_layer_index ]
4731+ if self .is_kv_shared_layer and (not legacy_shared_kv_states or past_key_values is not None ):
4732+ if legacy_shared_kv_states :
4733+ key_states , value_states = past_key_values .shared_layers [self .kv_shared_layer_index ]
4734+ else :
4735+ key_states , value_states = shared_kv_states [self .layer_type ]
4736+
47294737 key_states = key_states .to (query_states .device )
47304738 value_states = value_states .to (query_states .device )
47314739 else :
@@ -4740,18 +4748,26 @@ def gemma4_text_attention_forward(
47404748 value_states = value_states .transpose (1 , 2 )
47414749
47424750 if past_key_values is not None :
4743- cache_kwargs = {
4744- "sin" : sin ,
4745- "cos" : cos ,
4746- "cache_position" : cache_position ,
4747- "sliding_window" : self .sliding_window ,
4748- }
4749- if not self .is_kv_shared_layer :
4750- key_states , value_states = past_key_values .update (key_states , value_states , self .layer_idx , cache_kwargs )
4751- if self .store_full_length_kv :
4752- if not hasattr (past_key_values , "shared_layers" ):
4753- past_key_values .shared_layers = {}
4754- past_key_values .shared_layers [self .layer_idx ] = key_states , value_states
4751+ if legacy_shared_kv_states :
4752+ cache_kwargs = {
4753+ "sin" : sin ,
4754+ "cos" : cos ,
4755+ "cache_position" : cache_position ,
4756+ "sliding_window" : self .sliding_window ,
4757+ }
4758+ if not self .is_kv_shared_layer :
4759+ key_states , value_states = past_key_values .update (
4760+ key_states , value_states , self .layer_idx , cache_kwargs
4761+ )
4762+ if self .store_full_length_kv :
4763+ if not hasattr (past_key_values , "shared_layers" ):
4764+ past_key_values .shared_layers = {}
4765+ past_key_values .shared_layers [self .layer_idx ] = key_states , value_states
4766+ else :
4767+ if not self .is_kv_shared_layer :
4768+ key_states , value_states = past_key_values .update (key_states , value_states , self .layer_idx )
4769+ if self .store_full_length_kv and shared_kv_states is not None :
4770+ shared_kv_states [self .layer_type ] = key_states , value_states
47554771
47564772 attention_interface = gemma4_eager_attention_forward_patched
47574773
0 commit comments