Prompt-Transferability
318 строк · 9.1 Кб
1# -*- coding: utf-8 -*-
2"""pipeline.ipynb
3
4Automatically generated by Colaboratory.
5
6Original file is located at
7https://colab.research.google.com/drive/1-m2ywJVcfgCHOcEN-4agAbLz7tRGqMvM
8"""
9
10'''准备模型和数据'''
11'''这里模型就用model这个变量'''
12'''数据之后用example作为演示'''
13'''使用的时候替换成自己的model就可以了'''
14#import numpy as np
15import torch16import config17#from activate_neuron.mymodel import *
18#import activate_neuron.mymodel as mymodel
19#from activate_neuron.utils import *
20#import activate_neuron.utils as utils
21
22
23#from transformers import AutoConfig, AutoModelForMaskedLM
24#from model.modelling_roberta import RobertaForMaskedLM
25#from reader.reader import init_dataset, init_formatter, init_test_dataset
26
27import argparse28import os29import torch30import logging31import random32import numpy as np33
34from tools.init_tool import init_all35from config_parser import create_config36from tools.valid_tool import valid37from torch.autograd import Variable38
39logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',40datefmt='%m/%d/%Y %H:%M:%S',41level=logging.INFO)42
43logger = logging.getLogger(__name__)44
45def set_random_seed(seed):46"""Set random seed for reproducability."""47
48if seed is not None and seed > 0:49random.seed(seed)50np.random.seed(seed)51torch.manual_seed(seed)52torch.cuda.manual_seed_all(seed)53
54
55
56def relu(tmp):57return 1*(tmp > 0)*tmp58
59def topk(obj, k):60M=-1000061obj = list(obj)[:]62idlist = []63for i in range(k):64idlist.append(obj.index(max(obj)))65obj[obj.index(max(obj))]=M66return idlist67
68def relu(tmp):69return 1*(tmp > 0)*tmp70
71def topk(obj, k):72M=-1000073obj = list(obj)[:]74idlist = []75for i in range(k):76idlist.append(obj.index(max(obj)))77obj[obj.index(max(obj))]=M78return idlist79
80
81
82
83if __name__ == "__main__":84parser = argparse.ArgumentParser()85parser.add_argument('--config', '-c', help="specific config file", required=True)86parser.add_argument('--gpu', '-g', help="gpu id list")87parser.add_argument('--local_rank', type=int, help='local rank', default=-1)88parser.add_argument('--do_test', help="do test while training or not", action="store_true")89parser.add_argument('--checkpoint', help="checkpoint file path", type=str, default=None)90parser.add_argument('--comment', help="checkpoint file path", default=None)91parser.add_argument("--seed", type=int, default=None)92parser.add_argument("--prompt_emb_output", type=bool, default=False)93parser.add_argument("--save_name", type=str, default=None)94parser.add_argument("--replacing_prompt", type=str, default=None)95parser.add_argument("--pre_train_mlm", default=False, action='store_true')96parser.add_argument("--task_transfer_projector", default=False, action='store_true')97parser.add_argument("--model_transfer_projector", default=False, action='store_true')98parser.add_argument("--activate_neuron", default=True, action='store_true')99parser.add_argument("--mode", type=str, default="valid")100parser.add_argument("--projector", type=str, default=None)101
102
103args = parser.parse_args()104configFilePath = args.config105
106
107config = create_config(configFilePath)108
109
110
111use_gpu = True112gpu_list = []113if args.gpu is None:114use_gpu = False115else:116use_gpu = True117os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu118
119device_list = args.gpu.split(",")120for a in range(0, len(device_list)):121gpu_list.append(int(a))122
123os.system("clear")124config.set('distributed', 'local_rank', args.local_rank)125config.set("distributed", "use", False)126if config.getboolean("distributed", "use") and len(gpu_list)>1:127torch.cuda.set_device(gpu_list[args.local_rank])128torch.distributed.init_process_group(backend=config.get("distributed", "backend"))129config.set('distributed', 'gpu_num', len(gpu_list))130
131cuda = torch.cuda.is_available()132logger.info("CUDA available: %s" % str(cuda))133if not cuda and len(gpu_list) > 0:134logger.error("CUDA is not available but specific gpu id")135raise NotImplementedError136set_random_seed(args.seed)137
138
139########140'''141formatter = "mlmPrompt"
142config.set("data","train_formatter_type",formatter)
143config.set("data","valid_formatter_type",formatter)
144config.set("data","test_formatter_type",formatter)
145config.set("model","model_name","mlmPrompt")
146'''
147########148
149
150
151parameters = init_all(config, gpu_list, args.checkpoint, args.mode, local_rank = args.local_rank, args=args)152do_test = False153
154model = parameters["model"]155valid_dataset = parameters["valid_dataset"]156
157
158##########################159##########################160
161
162'''准备hook'''163'''这是提取特征的代码'''164outputs=[[] for _ in range(12)]165def save_ppt_outputs1_hook(n):166def fn(_,__,output):167outputs[n].append(output.detach().to("cpu"))168#outputs[n].append(output.detach())169return fn170
171
172for n in range(12):173#这里面提取feature的模组可以改变,这里因为我自定义模型的原因要两层roberta174#for l in model.state_dict().keys():175# print(l)176#print("====")177#exit()178model.encoder.roberta.encoder.layer[n].intermediate.register_forward_hook(save_ppt_outputs1_hook(n))179
180
181
182
183
184'''将数据通过模型'''185'''hook会自动将中间层的激活储存在outputs中'''186model.eval()187valid(model, parameters["valid_dataset"], 1, None, config, gpu_list, parameters["output_function"], mode=args.mode, args=args)188
189
190#################################################191#################################################192#################################################193
194
195'''196print(len(outputs)) #12
197print(len(outputs[0])) #17 epoch
198print(len(outputs[0][0])) #64
199print(len(outputs[0][0][0])) #231
200print(len(outputs[0][0][0][0])) #3072
201#outputs[][][][][] , layer:12, epoch:17, batch_size:64, input_length:231, neuron:3072
202'''
203
204#merge 17 epoch205for k in range(12):206#outputs[k] = relu(np.concatenate(outputs[k]))207#outputs[k] = torch.relu(torch.cat(outputs[k]))208outputs[k] = torch.cat(outputs[k])209
210
211'''212print(len(outputs)) #12
213print(len(outputs[0])) #17 epoch
214print(len(outputs[0][0])) #64
215print(len(outputs[0][0][0])) #231
216print(len(outputs[0][0][0][0])) #3072
217#outputs[][][][][] , layer:12, epoch:17, batch_size:64, input_length:231, neuron:3072
218'''
219
220
221'''这部分是根据论文里的代码找到某个neuron的最大激活'''222'''223#划定层数
224#layer = np.random.randint(12)
225layer = torch.randint(1,12,(1,))
226#决定neuron
227#neuron = np.random.randint(3072)
228neuron = torch.randint(1,3072,(1,))
229#这里面是得到了某层的某个neuron的所有激活
230neuron_activation = outputs[layer][:,:,neuron]
231max_activation = [neuron_activation[i,:length[i]].max() for i in range(size)]
232print(neuron_activation)
233print(max_activation)
234exit()
235'''
236
237
238
239#Activated neuron for a task-specific prompt240outputs = torch.stack(outputs)241#print(outputs.shape)242#exit()243
244
245#outputs = outputs[11:,:,:1,:]246#outputs = outputs[11:,:,:100,:]247#outputs = outputs[:,:,:1,:] #12 layers, [mask]248#print(outputs)249#print(outputs.shape)250#exit()251outputs = outputs[:,:,:1,:] #12 layers, [mask]252#outputs = outputs[:,:,:100,:] #12 layers, [mask]+[promot]253#outputs = outputs[11:,:,:100,:]254
255print(outputs.shape)256# [12, 128, 231, 3072] --> 12, 128(eval batcch size), 231(1 or 100), 3072257#exit()258
259
260
261
262save_name = args.replacing_prompt.strip().split("/")[-1].split(".")[0]263dir = "task_activated_neuron"264if os.path.isdir(dir):265save_dir = dir+"/"+save_name266if os.path.isdir(save_dir):267torch.save(outputs,save_dir+"/task_activated_neuron")268else:269os.mkdir(save_dir)270torch.save(outputs,save_dir+"/task_activated_neuron")271else:272os.mkdir(dir)273save_dir = dir+"/"+save_name274os.mkdir(save_dir)275torch.save(outputs,save_dir+"/task_activated_neuron")276
277
278print("==Prompt emb==")279print(outputs.shape)280print("Save Done")281print("==============")282
283
284
285
286
287
288
289
290
291
292'''293size = 8 # number of the sentences
294length = 231 #sentence length
295#Activated neuron for a task-specific prompt
296for layer in range(1,12):
297for neuron in range(1,3072):
298neuron_activation = outputs[layer][:,:,neuron]
299print(outputs[layer].shape)
300print(neuron_activation.shape)
301exit()
302max_activation = [neuron_activation[i,:length[i]].max() for i in range(size)]
303print(neuron_activation)
304print("------------")
305print(max_activation)
306print("============")
307exit()
308'''
309
310
311
312'''选择头几个句子展示'''313'''314N = 4
315indexes = topk(max_activation,N)
316for ids in indexes:
317print(tokenizer.decode(example['input_ids'][ids,:length[ids]]))
318'''
319