Skip to content

Commit 5bb37e7

Browse files
authored
Merge pull request #701 from xwh12345-user/issue1
fix steering baseline
2 parents d124389 + a2b9257 commit 5bb37e7

1 file changed

Lines changed: 44 additions & 54 deletions

File tree

steer/models/model_wrapper.py

Lines changed: 44 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)