diff --git a/mjc_notes.md b/mjc_notes.md index 4809c93..549be66 100644 --- a/mjc_notes.md +++ b/mjc_notes.md @@ -1821,4 +1821,7 @@ Ok what should my pipeline do? TODO: -- [ ] change layer -1 to actual name? +- [x] change layer -1 to actual name? +- [ ] in the TQS notebook they only get the mean from the generated tokens +- [ ] they only interven on the ones that are not padded... wait no they passed in no token pos in honesty +- [ ] but they did in TQA diff --git a/notebooks/201_make_data.ipynb b/notebooks/201_make_data.ipynb index aa8f757..ffe7c26 100644 --- a/notebooks/201_make_data.ipynb +++ b/notebooks/201_make_data.ipynb @@ -87,12 +87,12 @@ "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m2023-10-24 10:49:20.938\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36msrc.models.load\u001b[0m:\u001b[36mverbose_change_param\u001b[0m:\u001b[36m18\u001b[0m - \u001b[1mchanging pad_token_id from 32000 to 0\u001b[0m\n", - "2023-10-24T10:49:20.938690+0800 INFO changing pad_token_id from 32000 to 0\n", - "\u001b[32m2023-10-24 10:49:20.940\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36msrc.models.load\u001b[0m:\u001b[36mverbose_change_param\u001b[0m:\u001b[36m18\u001b[0m - \u001b[1mchanging padding_side from right to left\u001b[0m\n", - "2023-10-24T10:49:20.940322+0800 INFO changing padding_side from right to left\n", - "\u001b[32m2023-10-24 10:49:20.941\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36msrc.models.load\u001b[0m:\u001b[36mverbose_change_param\u001b[0m:\u001b[36m18\u001b[0m - \u001b[1mchanging truncation_side from right to left\u001b[0m\n", - "2023-10-24T10:49:20.941383+0800 INFO changing truncation_side from right to left\n" + "\u001b[32m2023-10-24 12:20:50.811\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36msrc.models.load\u001b[0m:\u001b[36mverbose_change_param\u001b[0m:\u001b[36m18\u001b[0m - \u001b[1mchanging pad_token_id from 32000 to 0\u001b[0m\n", + "2023-10-24T12:20:50.811435+0800 INFO changing pad_token_id from 32000 to 0\n", + "\u001b[32m2023-10-24 12:20:50.812\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36msrc.models.load\u001b[0m:\u001b[36mverbose_change_param\u001b[0m:\u001b[36m18\u001b[0m - \u001b[1mchanging padding_side from right to left\u001b[0m\n", + "2023-10-24T12:20:50.812537+0800 INFO changing padding_side from right to left\n", + "\u001b[32m2023-10-24 12:20:50.813\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36msrc.models.load\u001b[0m:\u001b[36mverbose_change_param\u001b[0m:\u001b[36m18\u001b[0m - \u001b[1mchanging truncation_side from right to left\u001b[0m\n", + "2023-10-24T12:20:50.813021+0800 INFO changing truncation_side from right to left\n" ] } ], @@ -147,11 +147,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "tokenize: 100%|██████████| 302/302 [00:00<00:00, 3490.12 examples/s]\n", - "truncated: 100%|██████████| 302/302 [00:00<00:00, 3889.90 examples/s]\n", - "prompt_truncated: 100%|██████████| 302/302 [00:00<00:00, 604.08 examples/s]\n", - "choice_ids: 100%|██████████| 302/302 [00:00<00:00, 9749.77 examples/s]\n", - "Filter: 100%|██████████| 302/302 [00:00<00:00, 3987.01 examples/s]" + "tokenize: 100%|██████████| 302/302 [00:00<00:00, 2898.85 examples/s]\n", + "truncated: 100%|██████████| 302/302 [00:00<00:00, 3922.12 examples/s]\n", + "prompt_truncated: 100%|██████████| 302/302 [00:00<00:00, 565.78 examples/s]\n", + "choice_ids: 100%|██████████| 302/302 [00:00<00:00, 10226.05 examples/s]\n", + "Filter: 100%|██████████| 302/302 [00:00<00:00, 3935.72 examples/s]" ] }, { @@ -236,7 +236,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 8, @@ -268,17 +268,17 @@ { "data": { "text/plain": [ - "{8: -7.1495447,\n", - " 11: 16.796896,\n", - " 14: 13.5725565,\n", - " 17: -5.684828,\n", - " 20: 26.571663,\n", - " 23: 37.01544,\n", - " 26: -67.76076,\n", - " 29: -64.502205,\n", - " 32: -52.72602,\n", - " 35: -76.70331,\n", - " 38: -80.74953}" + "{8: 1.661585,\n", + " 11: 4.2028227,\n", + " 14: -1.7875421,\n", + " 17: -6.6559744,\n", + " 20: -7.8236346,\n", + " 23: -10.668092,\n", + " 26: -1.1562811,\n", + " 29: -2.477594,\n", + " 32: -3.406129,\n", + " 35: -6.056723,\n", + " 38: 3.0787961}" ] }, "execution_count": 9, @@ -308,61 +308,241 @@ "cell_type": "code", "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "\n", - "# layer_id = hidden_layers\n", - "# block_name=\"decoder_block\"\n", - "# control_method=\"reading_vec\"\n", + "layer_id = hidden_layers\n", + "block_name=\"decoder_block\"\n", + "control_method=\"reading_vec\"\n", "\n", - "# rep_control_pipeline = pipeline(\n", - "# \"rep-control\", \n", - "# model=model, \n", - "# tokenizer=tokenizer, \n", - "# layers=layer_id, max_length=cfg.max_length,\n", - "# control_method=control_method)\n", - "# rep_control_pipeline\n" + "rep_control_pipeline = pipeline(\n", + " \"rep-control\", \n", + " model=model, \n", + " tokenizer=tokenizer, \n", + " layers=layer_id, max_length=cfg.max_length,\n", + " control_method=control_method)\n", + "rep_control_pipeline\n" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "===== No Control =====\n", + "negative\n", + "===== + Honesty Control =====\n", + "negative\n", + "\n", + "===== - Honesty Control =====\n", + "I\n", + "\n", + "===== No Control =====\n", + "pos\n", + "===== + Honesty Control =====\n", + "pos\n", + "\n", + "===== - Honesty Control =====\n", + "pos\n", + "\n" + ] + } + ], "source": [ "\n", - "# from re import S\n", + "from re import S\n", + "layer_id = hidden_layers\n", "\n", + "inputs = dataset_train[:2]\n", + "coeff=8.0\n", + "max_new_tokens=1\n", + "text_gen_kwargs = dict(do_sample=False, max_new_tokens=max_new_tokens, use_cache=False, \n", + " output_hidden_states=True, return_dict=True,\n", + " )\n", "\n", - "# inputs = dataset_train[:2]\n", - "# coeff=8.0\n", - "# max_new_tokens=1\n", - "# text_gen_kwargs = dict(do_sample=False, max_new_tokens=max_new_tokens, use_cache=False, \n", - "# output_hidden_states=True, return_dict=True,\n", - "# )\n", - "\n", - "# activations = {}\n", - "# for layer in layer_id:\n", - "# activations[layer] = torch.tensor(coeff * honesty_rep_reader.directions[layer] * honesty_rep_reader.direction_signs[layer]).to(model.device).half()\n", + "activations = {}\n", + "for layer in layer_id:\n", + " activations[layer] = torch.tensor(coeff * honesty_rep_reader.directions[layer] * honesty_rep_reader.direction_signs[layer]).to(model.device).half()\n", " \n", "\n", - "# activations_neg = {k:-v for k,v in activations.items()}\n", + "activations_neg = {k:-v for k,v in activations.items()}\n", "\n", - "# model.eval()\n", - "# with torch.no_grad():\n", - "# baseline_outputs = rep_control_pipeline(inputs, batch_size=batch_size, **text_gen_kwargs)\n", - "# control_outputs = rep_control_pipeline(inputs, activations=activations, batch_size=batch_size, **text_gen_kwargs)\n", - "# control_outputs_neg = rep_control_pipeline(inputs, activations=activations_neg, batch_size=batch_size, **text_gen_kwargs)\n", + "model.eval()\n", + "with torch.no_grad():\n", + " baseline_outputs = rep_control_pipeline(inputs, batch_size=batch_size, **text_gen_kwargs)\n", + " control_outputs = rep_control_pipeline(inputs, activations=activations, batch_size=batch_size, **text_gen_kwargs)\n", + " control_outputs_neg = rep_control_pipeline(inputs, activations=activations_neg, batch_size=batch_size, **text_gen_kwargs)\n", "\n", - "# for i,s,p,n in zip(inputs, baseline_outputs['text_ans'], control_outputs['text_ans'], control_outputs_neg['text_ans']):\n", - "# print(\"===== No Control =====\")\n", - "# print(s)\n", - "# print(f\"===== + Honesty Control =====\")\n", - "# print(p)\n", - "# print()\n", - "# print(f\"===== - Honesty Control =====\")\n", - "# print(n)\n", - "# print()\n" + "for i,s,p,n in zip(inputs, baseline_outputs['text_ans'], control_outputs['text_ans'], control_outputs_neg['text_ans']):\n", + " print(\"===== No Control =====\")\n", + " print(s)\n", + " print(f\"===== + Honesty Control =====\")\n", + " print(p)\n", + " print()\n", + " print(f\"===== - Honesty Control =====\")\n", + " print(n)\n", + " print()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "===== No Control =====\n", + "15.20%\n", + "===== + Honesty Control =====\n", + "19.81%\n", + "\n", + "===== - Honesty Control =====\n", + "29.42%\n", + "\n", + "===== No Control =====\n", + "61.88%\n", + "===== + Honesty Control =====\n", + "91.96%\n", + "\n", + "===== - Honesty Control =====\n", + "84.79%\n", + "\n" + ] + } + ], + "source": [ + "for i,s,p,n in zip(inputs, baseline_outputs['ans'], control_outputs['ans'], control_outputs_neg['ans']):\n", + " print(\"===== No Control =====\")\n", + " print(f'{s:02.2%}')\n", + " print(f\"===== + Honesty Control =====\")\n", + " print(f'{p:02.2%}')\n", + " print()\n", + " print(f\"===== - Honesty Control =====\")\n", + " print(f'{n:02.2%}')\n", + " print()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "===== No Control =====\n", + "negative\n", + "===== + Honesty Control =====\n", + "negative\n", + "\n", + "===== - Honesty Control =====\n", + "I\n", + "\n", + "===== No Control =====\n", + "pos\n", + "===== + Honesty Control =====\n", + "pos\n", + "\n", + "===== - Honesty Control =====\n", + "pos\n", + "\n" + ] + } + ], + "source": [ + "\n", + "from re import S\n", + "layer_id = hidden_layers\n", + "\n", + "inputs = dataset_train[:2]\n", + "coeff=8.0\n", + "max_new_tokens=1\n", + "text_gen_kwargs = dict(do_sample=False, max_new_tokens=max_new_tokens, use_cache=False, \n", + " output_hidden_states=True, return_dict=True,\n", + " token_pos=\"end\",\n", + " normalize=False\n", + " )\n", + "\n", + "activations = {}\n", + "for layer in layer_id:\n", + " activations[layer] = torch.tensor(coeff * honesty_rep_reader.directions[layer] * honesty_rep_reader.direction_signs[layer]).to(model.device).half()\n", + " \n", + "\n", + "activations_neg = {k:-v for k,v in activations.items()}\n", + "\n", + "model.eval()\n", + "with torch.no_grad():\n", + " baseline_outputs = rep_control_pipeline(inputs, batch_size=batch_size, **text_gen_kwargs)\n", + " control_outputs = rep_control_pipeline(inputs, activations=activations, batch_size=batch_size, **text_gen_kwargs)\n", + " control_outputs_neg = rep_control_pipeline(inputs, activations=activations_neg, batch_size=batch_size, **text_gen_kwargs)\n", + "\n", + "for i,s,p,n in zip(inputs, baseline_outputs['text_ans'], control_outputs['text_ans'], control_outputs_neg['text_ans']):\n", + " print(\"===== No Control =====\")\n", + " print(s)\n", + " print(f\"===== + Honesty Control =====\")\n", + " print(p)\n", + " print()\n", + " print(f\"===== - Honesty Control =====\")\n", + " print(n)\n", + " print()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "===== No Control =====\n", + "15.20%\n", + "===== + Honesty Control =====\n", + "19.81%\n", + "\n", + "===== - Honesty Control =====\n", + "29.42%\n", + "\n", + "===== No Control =====\n", + "61.88%\n", + "===== + Honesty Control =====\n", + "91.96%\n", + "\n", + "===== - Honesty Control =====\n", + "84.79%\n", + "\n" + ] + } + ], + "source": [ + "for i,s,p,n in zip(inputs, baseline_outputs['ans'], control_outputs['ans'], control_outputs_neg['ans']):\n", + " print(\"===== No Control =====\")\n", + " print(f'{s:02.2%}')\n", + " print(f\"===== + Honesty Control =====\")\n", + " print(f'{p:02.2%}')\n", + " print()\n", + " print(f\"===== - Honesty Control =====\")\n", + " print(f'{n:02.2%}')\n", + " print()\n" ] }, { @@ -381,35 +561,35 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "layer_id = hidden_layers\n", "\n", - "rep_control_pipeline = pipeline(\n", + "\n", + "rep_control_pipeline2 = pipeline(\n", " \"rep-control2\", \n", " model=model, \n", " tokenizer=tokenizer, \n", " layers=layer_id, \n", " max_length=cfg.max_length,)\n", - "rep_control_pipeline\n" + "rep_control_pipeline2\n" ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -422,15 +602,15 @@ "negative\n", "\n", "===== - Honesty Control =====\n", - "negative\n", + "I\n", "\n", "===== No Control =====\n", - "The\n", + "pos\n", "===== + Honesty Control =====\n", - "The\n", + "pos\n", "\n", "===== - Honesty Control =====\n", - "negative\n", + "pos\n", "\n" ] } @@ -452,9 +632,9 @@ "\n", "model.eval()\n", "with torch.no_grad():\n", - " baseline_outputs = rep_control_pipeline(inputs, batch_size=batch_size, **text_gen_kwargs)\n", - " control_outputs = rep_control_pipeline(inputs, activations=activations, batch_size=batch_size, **text_gen_kwargs)\n", - " control_outputs_neg = rep_control_pipeline(inputs, activations=activations_neg, batch_size=batch_size, **text_gen_kwargs)\n", + " baseline_outputs = rep_control_pipeline2(inputs, batch_size=batch_size, **text_gen_kwargs)\n", + " control_outputs = rep_control_pipeline2(inputs, activations=activations, batch_size=batch_size, **text_gen_kwargs)\n", + " control_outputs_neg = rep_control_pipeline2(inputs, activations=activations_neg, batch_size=batch_size, **text_gen_kwargs)\n", "\n", "\n", "for i,s,p,n in zip(inputs, baseline_outputs['text_ans'], control_outputs['text_ans'], control_outputs_neg['text_ans']):\n", @@ -470,7 +650,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -478,20 +658,20 @@ "output_type": "stream", "text": [ "===== No Control =====\n", - "2.03%\n", + "15.20%\n", "===== + Honesty Control =====\n", - "23.10%\n", + "19.81%\n", "\n", "===== - Honesty Control =====\n", - "1.02%\n", + "29.42%\n", "\n", "===== No Control =====\n", - "33.63%\n", + "61.88%\n", "===== + Honesty Control =====\n", - "83.52%\n", + "91.96%\n", "\n", "===== - Honesty Control =====\n", - "7.75%\n", + "84.79%\n", "\n" ] } @@ -508,6 +688,20 @@ " print()\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/src/repe/rep_control_pipeline.py b/src/repe/rep_control_pipeline.py index c89645e..222ddd3 100644 --- a/src/repe/rep_control_pipeline.py +++ b/src/repe/rep_control_pipeline.py @@ -35,7 +35,7 @@ class RepControlPipeline(RepControlPipeline2): self.layers = layers self.max_length = max_length - super().__init__(model=model, tokenizer=tokenizer, **kwargs) + super().__init__(model=model, tokenizer=tokenizer, max_length=max_length, **kwargs) def __call__(self, text_inputs, activations=None, **kwargs): if activations is not None: diff --git a/src/repe/rep_control_pipeline_baukit.py b/src/repe/rep_control_pipeline_baukit.py index 3593d33..53ab78b 100644 --- a/src/repe/rep_control_pipeline_baukit.py +++ b/src/repe/rep_control_pipeline_baukit.py @@ -20,6 +20,7 @@ def row_choice_ids(answer_choices, tokenizer): def intervene(output, activation): + # TODO need attention mask assert output.ndim == 3, f"expected output to be (batch, seq, vocab), got {output.shape}" return output + activation.to(output.device)[None, None, :]