kashif HF Staff commited on
Commit
5c82694
·
verified ·
1 Parent(s): b86b0ef

Restore store_kv vs retrieve-only split: use layers[idx] for v5 retrieve path

Browse files
Files changed (1) hide show
  1. modeling_sdar.py +12 -13
modeling_sdar.py CHANGED
@@ -261,21 +261,20 @@ class SDARAttention(nn.Module):
261
  query_states, key_states = apply_rotary_pos_emb(
262
  query_states, key_states, cos, sin)
263
 
264
- if past_key_value is not None:
265
- # transformers v5 idiom: `.update()` both stores and returns concatenated keys/values.
266
- # For v5, we always call `.update()` and ignore the `store_kv` distinction since the cache
267
- # handles both paths atomically. For v4 compatibility, we fall back to the old split logic.
 
 
 
268
  if hasattr(past_key_value, "layers"):
269
- key_states, value_states = past_key_value.update(
270
- key_states, value_states, self.layer_idx
271
- )
272
- elif kwargs.get("store_kv", False):
273
- key_states, value_states = past_key_value.update(
274
- key_states, value_states, self.layer_idx)
275
- elif not kwargs.get("store_kv", False) and len(past_key_value) > self.layer_idx:
276
  past_key_states, past_value_states = past_key_value[self.layer_idx]
277
- key_states = torch.cat([past_key_states, key_states], dim=-2)
278
- value_states = torch.cat([past_value_states, value_states], dim=-2)
279
 
280
  attention_mask = attention_mask.bool() if attention_mask is not None else None
281
  if torch.all(attention_mask): # decoding
 
261
  query_states, key_states = apply_rotary_pos_emb(
262
  query_states, key_states, cos, sin)
263
 
264
+ if past_key_value is not None and kwargs.get("store_kv", False):
265
+ # Store new kv into the cache (and get concatenated result).
266
+ key_states, value_states = past_key_value.update(
267
+ key_states, value_states, self.layer_idx)
268
+ elif past_key_value is not None and not kwargs.get("store_kv", False) and len(past_key_value) > self.layer_idx:
269
+ # Retrieve only (don't store): read cached kv and concatenate with current block kv.
270
+ # transformers v5 DynamicCache uses `.layers[idx].keys/.values`; v4 supports `cache[idx]`.
271
  if hasattr(past_key_value, "layers"):
272
+ layer = past_key_value.layers[self.layer_idx]
273
+ past_key_states, past_value_states = layer.keys, layer.values
274
+ else:
 
 
 
 
275
  past_key_states, past_value_states = past_key_value[self.layer_idx]
276
+ key_states = torch.cat([past_key_states, key_states], dim=-2)
277
+ value_states = torch.cat([past_value_states, value_states], dim=-2)
278
 
279
  attention_mask = attention_mask.bool() if attention_mask is not None else None
280
  if torch.all(attention_mask): # decoding