| """Example usage for `load_nullu_model`. |
| |
| Run Nullu's `experiments/llava_run.pbs` then `experiments/llava_edit.pbs` first to produce |
| an edited checkpoint (every layer in [0, 32) has its `mlp.down_proj.weight` null-projected). |
| This script then loads that checkpoint and applies its edits to only the chosen layer slice |
| on a fresh `HookedSAELlavaConditionalGeneration`, without re-running the edit pipeline. |
| |
| Example: |
| python training/test_nullu.py \ |
| --edited-model /path/to/Nullu/output/edited_model/LLaVA-7B-top4-0-32-test \ |
| --lowest-layer 16 --highest-layer 32 |
| """ |
|
|
| import argparse |
|
|
| import torch |
|
|
| from model.llava.hooked_llava import ( |
| HookedSAELlavaConditionalGeneration, |
| load_nullu_model, |
| ) |
|
|
|
|
| def main(): |
| parser = argparse.ArgumentParser(description=__doc__) |
| parser.add_argument( |
| "--edited-model", |
| required=True, |
| help="Path to Nullu's edited checkpoint directory " |
| "(e.g. Nullu/output/edited_model/LLaVA-7B-top4-0-32-test).", |
| ) |
| parser.add_argument("--lowest-layer", type=int, default=16) |
| parser.add_argument("--highest-layer", type=int, default=32) |
| parser.add_argument("--base-model", default="llava-hf/llava-1.5-7b-hf") |
| args = parser.parse_args() |
|
|
| device = "cuda:0" if torch.cuda.is_available() else "cpu" |
| dtype = torch.float16 |
|
|
| model = load_nullu_model( |
| lowest_layer=args.lowest_layer, |
| highest_layer=args.highest_layer, |
| edited_model_path=args.edited_model, |
| base_model_name=args.base_model, |
| torch_dtype=dtype, |
| device=device, |
| ) |
|
|
| base = HookedSAELlavaConditionalGeneration.from_pretrained( |
| args.base_model, torch_dtype=dtype |
| ).to(device) |
|
|
| n_layers = model.config.text_config.num_hidden_layers |
| print(f"layer | in-range | status") |
| for i in range(n_layers): |
| merged_w = model.model.language_model.layers[i].mlp.down_proj.weight |
| base_w = base.model.language_model.layers[i].mlp.down_proj.weight |
| edited = not torch.allclose(merged_w, base_w) |
| in_range = args.lowest_layer <= i < args.highest_layer |
| status = "EDITED" if edited else "base" |
| marker = "*" if in_range else " " |
| print(f" {i:02d} | {marker} | {status}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|