@@ -461,6 +461,43 @@ def _decoder_layers(self):
461461 For text models this is exactly self.model.model.layers — identical to before."""
462462 return self ._base_model ().layers
463463
464+ @staticmethod
465+ def _copy_activation_value (value ):
466+ if isinstance (value , t .Tensor ):
467+ return value .clone ().detach ()
468+ try :
469+ return copy .deepcopy (value )
470+ except Exception :
471+ return value
472+
473+ def _save_and_clear_generation_state (self , model_layers ):
474+ saved_layer_state = {}
475+
476+ for i , layer in enumerate (model_layers ):
477+ layer_state = {}
478+ if hasattr (layer , 'add_activations_dict' ) and layer .add_activations_dict :
479+ layer_state ['add_activations_dict' ] = {
480+ key : self ._copy_activation_value (value )
481+ for key , value in layer .add_activations_dict .items ()
482+ }
483+ layer .add_activations_dict = {}
484+
485+ if hasattr (layer , 'intervention_dict' ) and layer .intervention_dict :
486+ layer_state ['intervention_dict' ] = dict (layer .intervention_dict )
487+ layer .intervention_dict = {}
488+
489+ if layer_state :
490+ saved_layer_state [i ] = layer_state
491+
492+ return saved_layer_state
493+
494+ def _restore_generation_state (self , model_layers , saved_layer_state ):
495+ for i , layer_state in saved_layer_state .items ():
496+ if 'add_activations_dict' in layer_state :
497+ model_layers [i ].add_activations_dict = layer_state ['add_activations_dict' ]
498+ if 'intervention_dict' in layer_state :
499+ model_layers [i ].intervention_dict = layer_state ['intervention_dict' ]
500+
464501 def _lm_head (self ):
465502 """The output projection. Override if a subclass nests it elsewhere."""
466503 return self .model .lm_head
@@ -587,24 +624,8 @@ def get_logits(self, tokens):
587624 return logits
588625
589626 def ori_generate (self , input_ids , ** kwargs ):
590- # Save activation dictionaries
591- saved_activations = {}
592627 model_layers = self ._decoder_layers ()
593-
594- for i , layer in enumerate (model_layers ):
595- if hasattr (layer , 'add_activations_dict' ) and layer .add_activations_dict :
596- saved_dict = {}
597- for key , value in layer .add_activations_dict .items ():
598- if isinstance (value , t .Tensor ):
599- saved_dict [key ] = value .clone ().detach ()
600- else :
601- try :
602- saved_dict [key ] = copy .deepcopy (value )
603- except :
604- saved_dict [key ] = value
605-
606- saved_activations [i ] = saved_dict
607- layer .add_activations_dict = {}
628+ saved_layer_state = self ._save_and_clear_generation_state (model_layers )
608629
609630 # Save steer value if exists
610631 saved_steer_values = t .zeros (1 )
@@ -619,9 +640,7 @@ def ori_generate(self, input_ids, **kwargs):
619640 ** kwargs
620641 )
621642 finally :
622- # Restore activation dictionaries
623- for i , activations_dict in saved_activations .items ():
624- model_layers [i ].add_activations_dict = activations_dict
643+ self ._restore_generation_state (model_layers , saved_layer_state )
625644
626645 # Restore steer value
627646 if saved_steer_values is not None and hasattr (self , 'steer' ):
@@ -630,24 +649,8 @@ def ori_generate(self, input_ids, **kwargs):
630649 return output
631650
632651 def ori_vllm_generate (self , input_batch , vllm_sampling_params ):
633- # Save activation dictionaries
634- saved_activations = {}
635652 model_layers = self ._decoder_layers ()
636-
637- for i , layer in enumerate (model_layers ):
638- if hasattr (layer , 'add_activations_dict' ) and layer .add_activations_dict :
639- saved_dict = {}
640- for key , value in layer .add_activations_dict .items ():
641- if isinstance (value , t .Tensor ):
642- saved_dict [key ] = value .clone ().detach ()
643- else :
644- try :
645- saved_dict [key ] = copy .deepcopy (value )
646- except :
647- saved_dict [key ] = value
648-
649- saved_activations [i ] = saved_dict
650- layer .add_activations_dict = {}
653+ saved_layer_state = self ._save_and_clear_generation_state (model_layers )
651654
652655 # Save steer value if exists
653656 saved_steer_values = t .zeros (1 )
@@ -663,9 +666,7 @@ def ori_vllm_generate(self, input_batch, vllm_sampling_params):
663666 )
664667
665668 finally :
666- # Restore activation dictionaries
667- for i , activations_dict in saved_activations .items ():
668- model_layers [i ].add_activations_dict = activations_dict
669+ self ._restore_generation_state (model_layers , saved_layer_state )
669670
670671 # Restore steer value
671672 if saved_steer_values is not None and hasattr (self , 'steer' ):
@@ -877,17 +878,8 @@ def reset(self, method_name):
877878 raise ValueError (f"Method { method_name } not supported to reset" )
878879
879880 def ori_generate (self , input_ids , ** kwargs ):
880- # Save activation dictionaries
881- saved_activations = {}
882- if hasattr (self .model , 'transformer' ) and isinstance (self .model .transformer , Hack_no_grad ):
883- model_layers = self .model .transformer .module .h
884- else :
885- model_layers = self .model .transformer .h
886-
887- for i , layer in enumerate (model_layers ):
888- if hasattr (layer , 'add_activations_dict' ) and layer .add_activations_dict :
889- saved_activations [i ] = copy .deepcopy (layer .add_activations_dict )
890- layer .add_activations_dict = {}
881+ model_layers = self ._decoder_layers ()
882+ saved_layer_state = self ._save_and_clear_generation_state (model_layers )
891883
892884 # Save steer value if exists
893885 saved_steer_value = 0
@@ -902,9 +894,7 @@ def ori_generate(self, input_ids, **kwargs):
902894 ** kwargs
903895 )
904896 finally :
905- # Restore activation dictionaries
906- for i , activations_dict in saved_activations .items ():
907- model_layers [i ].add_activations_dict = activations_dict
897+ self ._restore_generation_state (model_layers , saved_layer_state )
908898
909899 # Restore steer value
910900 if saved_steer_value is not None and hasattr (self , 'steer' ):
0 commit comments