1earner1 commited on
Commit
7f61966
·
verified ·
1 Parent(s): 6244dc4

Upload run_lora_santa.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. run_lora_santa.py +462 -0
run_lora_santa.py ADDED
@@ -0,0 +1,462 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #model_name = "mistralai/Mistral-7B-Instruct-v0.3"
2
+ #model_name = "bigcode/starcoder2-7b"
3
+ model_name = "meta-llama/CodeLlama-7b-hf" # "dorkai/codeX-1.0" #"Alibaba-NLP/gte-Qwen1.5-7B-instruct" #"google/flan-t5-small" #"microsoft/Phi-3-medium-128k-instruct" #"google/gemma-2-9b-it" # "meta-llama/CodeLlama-7b-hf" #"deepseek-ai/DeepSeek-Coder-V2-Instruct" #"deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct"
4
+ out_name = "HPC_2_codellama_iffp_20k_5_lora" #"meta-llama/Meta-Llama-3-8B" #"tiiuae/falcon-40b" #"Phind/Phind-CodeLlama-34B-v2" # "deepseek-ai/DeepSeek-Coder-V2-Instruct" #
5
+ from datasets import load_dataset, Dataset
6
+ import pandas as pd
7
+ import json
8
+ import traceback
9
+ import peft
10
+ import os
11
+ from tqdm import tqdm
12
+ import sys
13
+ import math
14
+ from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, AdamW, default_data_collator, get_linear_schedule_with_warmup, get_cosine_schedule_with_warmup,set_seed
15
+ from torch.utils.data import DataLoader
16
+ import numpy as np
17
+ # import json
18
+ # filepath = "/kaggle/input/code-sim-try1/mutated_graph_all_lang_eq.json"
19
+ # examples = []
20
+ # with open(filepath, 'r') as file:
21
+ # for l in file:
22
+ # examples.append(json.loads(l))
23
+
24
+ # len(examples)
25
+ # examples[0]
26
+
27
+ # instruct_tune_dataset = load_dataset("mosaicml/instruct-v3",cache_dir = "/scratch/scai/mtech/aib222688/HF")
28
+ # instruct_tune_dataset = instruct_tune_dataset.filter(lambda x: x["source"] == "dolly_hhrlhf")
29
+
30
+
31
+ traindataset_file = "./dataset_lfs/allpairs_data_large.json"
32
+ valdataset_file = "./dataset_lfs/allpairs_data_val.json"
33
+ testdataset_file = "./llm_for_code/datasets/codecontests/verified_iffp_900.json"
34
+ traindata = []
35
+ initial_lr = 1e-5
36
+ checkpoint_store_dir_path = "./HPC_2_codellama_iffp_20k_4_lora_900"
37
+ os.makedirs(checkpoint_store_dir_path, exist_ok=True)
38
+ num_epochs = 5
39
+ batch_size_train = 1
40
+ max_length = 2000
41
+ ckpnt_NUM = 2000
42
+ #ckpnt_NUM2 = 5000
43
+ SAVEALL = False #True
44
+
45
+
46
+
47
+
48
+
49
+ import os
50
+ import torch
51
+ from datasets import load_dataset
52
+ from transformers import (
53
+ AutoModelForCausalLM,
54
+ AutoTokenizer,
55
+ BitsAndBytesConfig,
56
+ HfArgumentParser,
57
+ TrainingArguments,
58
+ pipeline,
59
+ logging,
60
+ )
61
+ from peft import LoraConfig, PeftModel
62
+ from trl import SFTTrainer
63
+
64
+ nf4_config = BitsAndBytesConfig(
65
+ load_in_4bit=True,
66
+ bnb_4bit_quant_type="nf4",
67
+ bnb_4bit_use_double_quant=True,
68
+ bnb_4bit_compute_dtype=torch.bfloat16
69
+ )
70
+
71
+ model = AutoModelForCausalLM.from_pretrained(
72
+ model_name,
73
+ #device_map='auto',
74
+ #quantization_config=nf4_config,
75
+ use_cache=True,
76
+ cache_dir = "/scratch/scai/mtech/aib222688/HF",
77
+ attn_implementation="flash_attention_2",
78
+ torch_dtype=torch.float16,
79
+ trust_remote_code=True,
80
+ )
81
+ print(model)
82
+ # model = AutoModelForCausalLM.from_pretrained(
83
+ # "./HPC_2_codellama_iffp_20k_3_lora_900/checkpoint_0_99/",
84
+ # use_cache=True,
85
+ # cache_dir = "/scratch/scai/mtech/aib222688/HF",
86
+ # )
87
+
88
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
89
+
90
+ tokenizer.pad_token = tokenizer.eos_token
91
+ tokenizer.padding_side = "right"
92
+
93
+
94
+
95
+
96
+
97
+ with open(traindataset_file, 'r') as file:
98
+ for l in file:
99
+ traindata.append(json.loads(l))
100
+
101
+ valdata = []
102
+
103
+ with open(valdataset_file, 'r') as file:
104
+ for l in file:
105
+ valdata.append(json.loads(l))
106
+
107
+ testdata = []
108
+
109
+
110
+ with open(testdataset_file, 'r') as file:
111
+ for l in file:
112
+ testdata.append(json.loads(l))
113
+ print(len(traindata), len(valdata), len(testdata))
114
+
115
+
116
+
117
+
118
+ file_path = './prompt_file.txt'
119
+ file_content = ""
120
+ with open(file_path, 'r') as file:
121
+ file_content = file.read()
122
+
123
+
124
+ def create_prompt(pair):
125
+ bos_token = "<s>"
126
+ eos_token = "</s>"
127
+ if pair['prog1']['probid'] == pair['prog2']['probid']:
128
+ response = "Yes"
129
+ else:
130
+ response = "No"
131
+
132
+ full_prompt = ""
133
+ full_prompt += bos_token
134
+ full_prompt += file_content + pair['prog1']['scode'] + "\nProgram 2:"
135
+ full_prompt += pair['prog2']['scode']+ "\n### Response:"
136
+ full_prompt += "\n" #+ response
137
+ full_prompt += eos_token
138
+
139
+ return full_prompt, response
140
+ #print(create_prompt(instruct_tune_dataset["train"][1]))
141
+
142
+ traindata1 = list(traindata) #[0:]
143
+ valdata1 = list( valdata)
144
+ testdata1 = list(testdata) #[0:]
145
+
146
+ traindata = []
147
+
148
+ for tdata in traindata1:
149
+ inp, trg = create_prompt(tdata)
150
+ traindata.append({
151
+ 'inputs' : inp,
152
+ 'targets' : trg
153
+ })
154
+
155
+
156
+ valdata = []
157
+
158
+ for tdata in valdata1:
159
+ inp, trg = create_prompt(tdata)
160
+ valdata.append({
161
+ 'inputs' : inp,
162
+ 'targets' : trg
163
+ })
164
+
165
+ testdata = []
166
+
167
+ for tdata in testdata1:
168
+ inp, trg = create_prompt(tdata)
169
+ testdata.append({
170
+ 'inputs' : inp,
171
+ 'targets' : trg
172
+ })
173
+
174
+ traindataset = Dataset.from_pandas(pd.DataFrame(traindata))
175
+ valdataset = Dataset.from_pandas(pd.DataFrame(valdata))
176
+ testdataset = Dataset.from_pandas(pd.DataFrame(testdata))
177
+
178
+ instruct_tune_dataset = {"train": traindataset,
179
+ "val" : valdataset,
180
+ "test" : testdataset}
181
+
182
+
183
+
184
+
185
+
186
+
187
+
188
+
189
+
190
+ def preprocess_function(examples):
191
+ batch_size = len(examples['inputs'])
192
+ #inputs = [f"<s>[INST] Question : {x} [/INST] \\n Answer : " for x in examples[past_context_code]]
193
+ #inputs = [f"\n<|user|>\n You are given a set of APIs and previously generated Code as context. The task is given a new requirement from Bob modify or expand the given code using the provided APIs.\n\nAPIs:\n{apis}\n\nContext:\n{past_context}\n\nInput:\n{new_input} \n<|assistant|>\n " for apis, past_context, new_input in zip(examples['apis'], examples['past_context_code'], examples['new_input'])]
194
+ #targets = [str(x) for x in examples[label_column]]
195
+ #inputs, targets = get_examples_all_context(examples)
196
+
197
+ #inputs, targets = get_examples_all_context(examples)
198
+ #inputs, targets = get_examples_all_context_granite(examples, only_code=False)
199
+ inputs = []
200
+ targets = []
201
+ # for eg in examples:
202
+ # print(eg)
203
+ # #inp, trg = create_prompt(eg)
204
+ # #inputs.append(inp)
205
+ # #targets.append(trg)
206
+ inputs = examples['inputs']
207
+ targets = examples['targets']
208
+ model_inputs = tokenizer(inputs)
209
+
210
+ #print("Input example:\n{}".format(inputs[0]))
211
+ #print("Output example:\n{}".format(targets[0]))
212
+
213
+ input_sizes = [len(tokens) for tokens in model_inputs['input_ids']]
214
+ #print("Input sizes {}".format(input_sizes))
215
+ labels = tokenizer(targets, add_special_tokens=False) # don't add bos token because we concatenate with inputs
216
+ label_sizes = [len(tokens) for tokens in labels['input_ids']]
217
+ #print("Label sizes {}".format(label_sizes))
218
+
219
+ for i in range(batch_size):
220
+ sample_input_ids = model_inputs["input_ids"][i]
221
+ label_input_ids = labels["input_ids"][i] + [tokenizer.eos_token_id]
222
+ # print(i, sample_input_ids, label_input_ids)
223
+ model_inputs["input_ids"][i] = sample_input_ids + label_input_ids
224
+ labels["input_ids"][i] = [-100] * len(sample_input_ids) + label_input_ids
225
+ model_inputs["attention_mask"][i] = [1] * len(model_inputs["input_ids"][i])
226
+ # print(model_inputs)
227
+ for i in range(batch_size):
228
+ sample_input_ids = model_inputs["input_ids"][i]
229
+ label_input_ids = labels["input_ids"][i]
230
+ model_inputs["input_ids"][i] = [tokenizer.pad_token_id] * (
231
+ max_length - len(sample_input_ids)
232
+ ) + sample_input_ids
233
+ model_inputs["attention_mask"][i] = [0] * (max_length - len(sample_input_ids)) + model_inputs["attention_mask"][i]
234
+ labels["input_ids"][i] = [-100] * (max_length - len(sample_input_ids)) + label_input_ids
235
+ model_inputs["input_ids"][i] = torch.tensor(model_inputs["input_ids"][i][:max_length])
236
+ model_inputs["attention_mask"][i] = torch.tensor(model_inputs["attention_mask"][i][:max_length])
237
+ labels["input_ids"][i] = torch.tensor(labels["input_ids"][i][:max_length])
238
+ model_inputs["labels"] = labels["input_ids"]
239
+ input_sizes = [len(tokens) for tokens in model_inputs['input_ids']]
240
+ #print("Input sizes {}".format(input_sizes))
241
+ return model_inputs
242
+
243
+ processed_datasets = traindataset.map(
244
+ preprocess_function,
245
+ batched=True,
246
+ num_proc=1,
247
+ remove_columns=traindataset.column_names,
248
+ load_from_cache_file=False,
249
+ desc="Running tokenizer on dataset",
250
+ )
251
+ train_dataset = processed_datasets
252
+ train_dataloader = DataLoader(
253
+ train_dataset, shuffle=True, collate_fn=default_data_collator, batch_size=batch_size_train, pin_memory=True
254
+ )
255
+
256
+
257
+ processed_datasets = valdataset.map(
258
+ preprocess_function,
259
+ batched=True,
260
+ num_proc=1,
261
+ remove_columns=valdataset.column_names,
262
+ load_from_cache_file=False,
263
+ desc="Running tokenizer on dataset",
264
+ )
265
+ val_dataset = processed_datasets
266
+ val_dataloader = DataLoader(
267
+ val_dataset, shuffle=True, collate_fn=default_data_collator, batch_size=batch_size_train, pin_memory=True
268
+ )
269
+
270
+
271
+
272
+
273
+ def test_preprocess_function(examples):
274
+ batch_size = len(examples['inputs'])
275
+ #inputs, targets = get_examples_all_context(examples)
276
+ #inputs, targets = get_examples_all_context_granite(examples)
277
+ #inputs = [f"\n<|user|>\n You are given a set of APIs and previously generated Code as context. The task is given a new requirement from Bob modify or expand the given code using the provided APIs.\n\nAPIs:\n{apis}\n\nContext:\n{past_context}\n\nInput:\n{new_input} \n<|assistant|>\n " for apis, past_context, new_input in zip(examples['apis'], examples['past_context_code'], examples['new_input'])]
278
+ model_inputs = tokenizer(examples['inputs'])
279
+ # print(model_inputs)
280
+ for i in range(batch_size):
281
+ sample_input_ids = model_inputs["input_ids"][i]
282
+ model_inputs["input_ids"][i] = [tokenizer.pad_token_id] * (
283
+ max_length - len(sample_input_ids)
284
+ ) + sample_input_ids
285
+ model_inputs["attention_mask"][i] = [0] * (max_length - len(sample_input_ids)) + model_inputs["attention_mask"][i]
286
+ model_inputs["input_ids"][i] = torch.tensor(model_inputs["input_ids"][i][:max_length])
287
+ model_inputs["attention_mask"][i] = torch.tensor(model_inputs["attention_mask"][i][:max_length])
288
+ return model_inputs
289
+
290
+
291
+ processed_datasets = testdataset.map(
292
+ preprocess_function,
293
+ batched=True,
294
+ num_proc=1,
295
+ remove_columns=testdataset.column_names,
296
+ load_from_cache_file=False,
297
+ desc="Running tokenizer on dataset",
298
+ )
299
+ test_dataset = processed_datasets
300
+ test_dataloader = DataLoader(
301
+ test_dataset, shuffle=False, collate_fn=default_data_collator, batch_size=batch_size_train, pin_memory=True
302
+ )
303
+
304
+
305
+
306
+
307
+ peft_config = LoraConfig(
308
+ lora_alpha=16,
309
+ lora_dropout=0.1,
310
+ #target_modules = ['c_attn'],
311
+ target_modules = ['q_proj', 'kv_a_proj_with_mqa', 'o_proj'], #['q_proj', 'kv_a_proj_with_mqa', 'kv_b_proj', 'o_proj'],
312
+ r=64,
313
+ bias="none",
314
+ task_type="CAUSAL_LM"
315
+ )
316
+
317
+ # peft_config = LoraConfig(
318
+ # r=lora_r,
319
+ # lora_alpha=lora_alpha,
320
+ # lora_dropout=lora_dropout,
321
+ # target_modules= target_modules,
322
+ # bias="none",
323
+ # task_type="CAUSAL_LM"
324
+ # )
325
+
326
+ model = peft.get_peft_model(model, peft_config)
327
+
328
+
329
+ print("Model loaded successfully!")
330
+
331
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
332
+
333
+ #optimizer = AdamW(model.parameters(), lr=3e-4)
334
+ optimizer = AdamW(model.parameters(), lr=initial_lr)
335
+
336
+ # Instantiate scheduler
337
+ lr_scheduler = get_cosine_schedule_with_warmup(
338
+ optimizer=optimizer,
339
+ num_warmup_steps=0.06 * (len(train_dataloader) * num_epochs),
340
+ num_training_steps=(len(train_dataloader) * num_epochs),
341
+ )
342
+
343
+ model.to(device)
344
+
345
+ #model = torch.nn.DataParallel(model)
346
+ #model = model.cuda()
347
+
348
+ for epoch in range(num_epochs):
349
+ try:
350
+ model.train()
351
+ total_loss = 0
352
+ best_eval_loss = 10000 #np.inf
353
+
354
+ for step, batch in enumerate(tqdm(train_dataloader)):
355
+ batch = {k: v.to(device) for k, v in batch.items()}
356
+ #batch = {k: v.cuda() for k, v in batch.items()}
357
+ # print(batch)
358
+ #print(batch["input_ids"].shape)
359
+ # if step > 5:
360
+ # break
361
+ #batch.to(device)
362
+ outputs = model(**batch)
363
+ loss = outputs.loss
364
+ total_loss += loss.detach().float()
365
+ if step % 100 == 0:
366
+ print(loss)
367
+ loss.backward()
368
+ #print("Loss {}".format(loss.item()))
369
+ optimizer.step()
370
+ lr_scheduler.step()
371
+ optimizer.zero_grad()
372
+ # if step % ckpnt_NUM2 == 0:
373
+ # checkpoint_dir = os.path.join(checkpoint_store_dir_path, f"checkpoint_{epoch}_{step}/")
374
+ # os.makedirs(checkpoint_dir, exist_ok=True)
375
+ # model.save_pretrained(checkpoint_dir)
376
+
377
+ if step % ckpnt_NUM == 0:
378
+
379
+ model.eval()
380
+ eval_loss = 0
381
+ eval_preds = []
382
+ eval_cnt = 1
383
+ for step1, batch_eval in enumerate(tqdm(val_dataloader)):
384
+
385
+ batch_eval = {k: v.to(device) for k, v in batch_eval.items()}
386
+ #batch_eval = {k: v.cuda() for k, v in batch_eval.items()}
387
+
388
+ #outputs = model.generate(**batch_eval, max_new_tokens=48)
389
+ #out = tokenizer.batch_decode(outputs, skip_special_tokens=True)
390
+ # for x in out:
391
+ # print(x)
392
+ # print("#" * 50)
393
+ with torch.no_grad():
394
+ outputs = model(**batch_eval)
395
+ loss = outputs.loss
396
+ if not math.isnan(loss.detach().float()) :
397
+ eval_loss += loss.detach().float()
398
+ eval_cnt += 1
399
+ # eval_preds.extend(
400
+ # tokenizer.batch_decode(torch.argmax(outputs.logits, -1).detach().cpu().numpy(),
401
+ # skip_special_tokens=True)
402
+ # )
403
+ print(eval_loss)
404
+ eval_epoch_loss = eval_loss / len(val_dataloader)
405
+ if ((eval_loss/eval_cnt) < best_eval_loss) or SAVEALL:
406
+
407
+ best_eval_loss = eval_loss/eval_cnt
408
+ print(f"saving...{best_eval_loss} to checkpoint_{epoch}_{step}\n")
409
+ checkpoint_dir = os.path.join(checkpoint_store_dir_path, f"checkpoint_{epoch}_{step}/")
410
+ os.makedirs(checkpoint_dir, exist_ok=True)
411
+ model.save_pretrained(checkpoint_dir)
412
+
413
+ eval_ppl = torch.exp(eval_epoch_loss)
414
+ train_epoch_loss = total_loss #/ len(train_dataloader)
415
+ train_ppl = torch.exp(train_epoch_loss)
416
+ print(f"{epoch=}: {train_ppl=} {train_epoch_loss=} {eval_ppl=} {eval_epoch_loss=} {eval_loss/eval_cnt=} {eval_cnt=}")
417
+ #print(f"{epoch=}: {train_ppl=} {train_epoch_loss=}")
418
+
419
+
420
+ except KeyboardInterrupt:
421
+
422
+ checkpoint_dir = os.path.join(checkpoint_store_dir_path, f"checkpoint_{epoch}_interrupt/")
423
+ os.makedirs(checkpoint_dir, exist_ok=True)
424
+ model.save_pretrained(checkpoint_dir)
425
+
426
+
427
+
428
+ print("Total Loss {}".format(total_loss.item()))
429
+ if ((epoch+1) % 1) == 0:
430
+ checkpoint_dir = os.path.join(checkpoint_store_dir_path, f"checkpoint_{epoch}/")
431
+ os.makedirs(checkpoint_dir, exist_ok=True)
432
+ model.save_pretrained(checkpoint_dir)
433
+ model.eval()
434
+ eval_loss = 0
435
+ eval_preds = []
436
+ for step1, batch_eval in enumerate(tqdm(test_dataloader)):
437
+ if step1 > 5:
438
+ break
439
+ batch_eval = {k: v.to(device) for k, v in batch_eval.items()}
440
+ #batch_eval = {k: v.cuda() for k, v in batch_eval.items()}
441
+
442
+ outputs = model.generate(**batch_eval, max_new_tokens=48)
443
+ out = tokenizer.batch_decode(outputs, skip_special_tokens=True)
444
+ for x in out:
445
+ print(x)
446
+ print("#" * 50)
447
+ # with torch.no_grad():
448
+ # outputs = model(**batch)
449
+ # loss = outputs.loss
450
+ # eval_loss += loss.detach().float()
451
+ # eval_preds.extend(
452
+ # tokenizer.batch_decode(torch.argmax(outputs.logits, -1).detach().cpu().numpy(),
453
+ # skip_special_tokens=True)
454
+ # )
455
+
456
+ # eval_epoch_loss = eval_loss / len(test_dataloader)
457
+ # eval_ppl = torch.exp(eval_epoch_loss)
458
+ train_epoch_loss = total_loss / len(train_dataloader)
459
+ train_ppl = torch.exp(train_epoch_loss)
460
+ #print(f"{epoch=}: {train_ppl=} {train_epoch_loss=} {eval_ppl=} {eval_epoch_loss=}")
461
+ print(f"{epoch=}: {train_ppl=} {train_epoch_loss=}")
462
+