1earner1 commited on
Commit
e9e5c63
·
verified ·
1 Parent(s): dc20024

Upload run_mix_lora.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. run_mix_lora.py +601 -0
run_mix_lora.py ADDED
@@ -0,0 +1,601 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ from run_mix_lora_config import *
3
+ #model_name = "mistralai/Mistral-7B-Instruct-v0.3"
4
+ #model_name = "bigcode/starcoder2-7b"
5
+ #model_name = "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"
6
+ #out_name = "HPC_2_mistral_iffp_20k_5_lora" #"meta-llama/Meta-Llama-3-8B" #"tiiuae/falcon-40b" #"Phind/Phind-CodeLlama-34B-v2" # "deepseek-ai/DeepSeek-Coder-V2-Instruct" #
7
+ from datasets import load_dataset, Dataset
8
+ import pandas as pd
9
+ import json
10
+ import traceback
11
+ import peft
12
+ import os
13
+ from tqdm import tqdm
14
+ import sys
15
+ import math
16
+ from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, AdamW, default_data_collator, get_linear_schedule_with_warmup, get_cosine_schedule_with_warmup,set_seed
17
+ from torch.utils.data import DataLoader
18
+ import numpy as np
19
+ import random
20
+ import os
21
+ import argparse
22
+ import torch
23
+ import datetime
24
+ from datasets import load_dataset
25
+ from transformers import (
26
+ AutoModelForCausalLM,
27
+ AutoTokenizer,
28
+ BitsAndBytesConfig,
29
+ HfArgumentParser,
30
+ TrainingArguments,
31
+ pipeline,
32
+ logging,
33
+ )
34
+ from peft import LoraConfig, PeftModel
35
+ from trl import SFTTrainer
36
+ import wandb
37
+ import socket
38
+ # import json
39
+ # filepath = "/kaggle/input/code-sim-try1/mutated_graph_all_lang_eq.json"
40
+ # examples = []
41
+ # with open(filepath, 'r') as file:
42
+ # for l in file:
43
+ # examples.append(json.loads(l))
44
+
45
+ # len(examples)
46
+ # examples[0]
47
+
48
+ # instruct_tune_dataset = load_dataset("mosaicml/instruct-v3",cache_dir = "/scratch/scai/mtech/aib222688/HF")
49
+ # instruct_tune_dataset = instruct_tune_dataset.filter(lambda x: x["source"] == "dolly_hhrlhf")
50
+
51
+
52
+ # traindataset_file = "./dataset_lfs/allpairs_data_large_900_loop2.json"
53
+ # valdataset_file = "./dataset_lfs/allpairs_data_val_900_loop2.json"
54
+ # testdataset_file = "./llm_for_code/datasets/codecontests/verified_iffp_900_loop2.json"
55
+
56
+ # initial_lr = 5e-6
57
+ # checkpoint_store_dir_path = "./HPC_2_mistral_iffp_20k_3_lora_900_loop2"
58
+
59
+ # num_epochs = 5
60
+ # batch_size_train = 1
61
+ # max_length = 2000
62
+ # ckpnt_NUM = 2000
63
+ # SAVEALL = False #True
64
+
65
+
66
+ # parser = argparse.ArgumentParser(description='Run lora finetuning..., NOTE: UPDATE PEFT CONFIG if needed')
67
+ # parser.add_argument('--model_name', default="mistralai/Mistral-7B-Instruct-v0.3",type=str)
68
+ # parser.add_argument('--traindataset_file', type=str, default="./dataset_lfs/allpairs_data_large_900_loop2.json")
69
+ # parser.add_argument('--valdataset_file', type=str, default="./dataset_lfs/allpairs_data_val_900_loop2.json")
70
+ # parser.add_argument('--testdataset_file', type=str, default="./llm_for_code/datasets/codecontests/verified_iffp_900_loop2.json")
71
+ # parser.add_argument('--checkpoint_store_dir_path', type=str, default="./HPC_3_mistral_iffp_20k_3_lora_900_loop2")
72
+ # parser.add_argument('--initial_lr', type=float, default=5e-6)
73
+ # parser.add_argument('--num_epochs', type=int, default=5)
74
+ # parser.add_argument('--batch_size_train', type=int, default=1)
75
+ # parser.add_argument('--ckpnt_num', type=int, default=2000)
76
+ # parser.add_argument('--saveall', type=int, default=0)
77
+ # parser.add_argument('--prompt_file_path', type=str, default='./loop_prompt.txt')
78
+ # parser.add_argument('--max_length', type=int, default=2000)
79
+ # parser.add_argument('--max_new_tok', type=int, default=50)
80
+
81
+ # args = parser.parse_args()
82
+ # print(f"{len(vars(args))=}")
83
+
84
+
85
+
86
+
87
+
88
+ # model_name = args.model_name.replace('\r', '')
89
+ # traindataset_file = args.traindataset_file.replace('\r', '')
90
+ # valdataset_file = args.valdataset_file.replace('\r', '')
91
+ # testdataset_file = args.testdataset_file.replace('\r', '')
92
+ # checkpoint_store_dir_path = args.checkpoint_store_dir_path.replace('\r', '')
93
+ # initial_lr = args.initial_lr
94
+ # num_epochs = args.num_epochs
95
+ # batch_size_train = args.batch_size_train
96
+ # ckpnt_NUM = args.ckpnt_num
97
+ # SAVEALL = args.saveall
98
+ # prompt_file_path = args.prompt_file_path.replace('\r', '')
99
+ # max_length = args.max_length
100
+ # max_new_tok = args.max_new_tok
101
+
102
+
103
+
104
+ hostname = socket.gethostname()
105
+ ip_address = socket.gethostbyname(hostname)
106
+ node_name = os.uname().nodename
107
+ system_info = os.uname()
108
+ machine_info = {
109
+ "hostname": hostname,
110
+ "ip_address": ip_address,
111
+ "node_name": node_name,
112
+ "system_info": {
113
+ "sysname": system_info.sysname,
114
+ "nodename": system_info.nodename,
115
+ "release": system_info.release,
116
+ "version": system_info.version,
117
+ "machine": system_info.machine,
118
+ },
119
+ }
120
+
121
+ os.makedirs(checkpoint_store_dir_path, exist_ok=True)
122
+ current_time = datetime.datetime.now()
123
+
124
+ with open("./run_mix_lora_config.py", 'r') as config_file:
125
+ args = config_file.read()
126
+
127
+ with open(checkpoint_store_dir_path+'/lora_logs.txt', 'a') as log_file:
128
+ log_file.write(f"{current_time}: running lora\n {args}\n")
129
+ log_file.write(f"{machine_info}-----\n")
130
+
131
+ traindata = []
132
+ nf4_config = BitsAndBytesConfig(
133
+ load_in_4bit=True,
134
+ bnb_4bit_quant_type="nf4",
135
+ bnb_4bit_use_double_quant=True,
136
+ bnb_4bit_compute_dtype=torch.bfloat16
137
+ )
138
+
139
+ random.seed(40)
140
+ per_file = 10000
141
+ for traindataset_file in traindataset_files:
142
+ cnt = 0
143
+ with open(traindataset_file, 'r') as file:
144
+ for l in file:
145
+ sample = json.loads(l)
146
+ if sample['category'][-1] == '1':
147
+ cnt += 1
148
+ traindata.append(sample)
149
+ if cnt > per_file:
150
+ break
151
+
152
+ for traindataset_file in traindataset_files:
153
+ #cnt = 0
154
+ with open(traindataset_file, 'r') as file:
155
+ for l in file:
156
+ sample = json.loads(l)
157
+ if sample['category'][-1] == '0':
158
+ cnt -= 1
159
+ traindata.append(sample)
160
+ if cnt <= 0:
161
+ break
162
+
163
+
164
+ random.shuffle(traindata)
165
+ print(traindata[0])
166
+
167
+
168
+ valdata = []
169
+ per_file = 100
170
+ for valdataset_file in valdataset_files:
171
+ cnt = 0
172
+ with open(valdataset_file, 'r') as file:
173
+ for l in file:
174
+ cnt += 1
175
+ if cnt > per_file:
176
+ break
177
+ valdata.append(json.loads(l))
178
+ random.shuffle(valdata)
179
+ testdata = []
180
+
181
+ testdataset_file = testdataset_files[0]
182
+ with open(testdataset_file, 'r') as file:
183
+ for l in file:
184
+ testdata.append(json.loads(l))
185
+
186
+
187
+
188
+
189
+ def filter_ds(data):
190
+ filtered_data = [item for item in data if item['category'] in category_included]
191
+ print(len(filtered_data), len(data))
192
+ pos_data = [item for item in filtered_data if item['category'][-1] == '1']
193
+ random.shuffle(pos_data)
194
+ max_len = len(pos_data)
195
+ print("Max pos: ", max_len)
196
+ neg_data = random.sample([item for item in filtered_data if item['category'][-1] == '0'], max_len)
197
+ train_size = int(0.999* max_len)
198
+ new_train = pos_data[:train_size] + neg_data[:train_size]
199
+ new_val = pos_data[train_size:] + neg_data[train_size:]
200
+ random.shuffle(new_train)
201
+ random.shuffle(new_val)
202
+ return new_train, new_val
203
+
204
+ traindata, valdata = filter_ds(traindata)
205
+
206
+ print(len(traindata), len(valdata), len(testdata))
207
+
208
+
209
+
210
+
211
+ model = AutoModelForCausalLM.from_pretrained(
212
+ model_name,
213
+ #device_map='auto',
214
+ #quantization_config=nf4_config,
215
+ use_cache=True,
216
+ #cache_dir = "../aib222688.scratch/HF/",
217
+ attn_implementation="sdpa", #"flash_attention_2",
218
+ torch_dtype=torch.float16,
219
+ #trust_remote_code=True,
220
+ )
221
+ if not (load_path is None):
222
+ model = AutoModelForCausalLM.from_pretrained(
223
+ load_path,
224
+ #model_name,
225
+ use_cache=True,
226
+ #cache_dir = "../aib222688.scratch/HF/",
227
+ #attn_implementation="flash_attention_2",
228
+ torch_dtype=torch.float16,
229
+ #device_map='auto',
230
+ #quantization_config=nf4_config,
231
+ #use_cache=False
232
+ )
233
+
234
+ # model = AutoModelForCausalLM.from_pretrained(
235
+ # "./HPC_2_mistral_iffp_20k_2_lora_1200/checkpoint_0_18000/"
236
+ # )
237
+
238
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
239
+
240
+ tokenizer.pad_token = tokenizer.eos_token
241
+ tokenizer.padding_side = "right"
242
+
243
+
244
+
245
+ wandb.init(project=checkpoint_store_dir_path[3:]+'_wandb', config={
246
+ 'args' : args,
247
+ 'machine' : machine_info,
248
+ })
249
+
250
+
251
+ file_content = ""
252
+ with open(prompt_file_path, 'r') as file:
253
+ file_content = file.read()
254
+
255
+
256
+ def create_prompt(pair):
257
+ bos_token = "<s>"
258
+ eos_token = "</s>"
259
+ if pair['prog1']['probid'] == pair['prog2']['probid']:
260
+ response = "Yes"
261
+ else:
262
+ response = "No"
263
+
264
+ full_prompt = ""
265
+ full_prompt += bos_token
266
+ #print(f"{pair['prog1']['scode']=}")
267
+ full_prompt += file_content + pair['prog1']['scode'] + "\nProgram 2:"
268
+ full_prompt += pair['prog2']['scode']+ "\n### Response:"
269
+ full_prompt += "\n" #+ response
270
+ full_prompt += eos_token
271
+
272
+ return full_prompt, response
273
+ #print(create_prompt(instruct_tune_dataset["train"][1]))
274
+
275
+ traindata1 = list(traindata) #[0:]
276
+ valdata1 = list( valdata)[:250]
277
+ testdata1 = list(testdata) #[0:]
278
+
279
+ traindata = []
280
+
281
+ for tdata in traindata1:
282
+ inp, trg = create_prompt(tdata)
283
+ traindata.append({
284
+ 'inputs' : inp,
285
+ 'targets' : trg
286
+ })
287
+
288
+
289
+ valdata = []
290
+
291
+ for tdata in valdata1:
292
+ inp, trg = create_prompt(tdata)
293
+ valdata.append({
294
+ 'inputs' : inp,
295
+ 'targets' : trg
296
+ })
297
+
298
+ testdata = []
299
+
300
+ for tdata in testdata1:
301
+ inp, trg = create_prompt(tdata)
302
+ testdata.append({
303
+ 'inputs' : inp,
304
+ 'targets' : trg
305
+ })
306
+
307
+ traindataset = Dataset.from_pandas(pd.DataFrame(traindata))
308
+ valdataset = Dataset.from_pandas(pd.DataFrame(valdata))
309
+ testdataset = Dataset.from_pandas(pd.DataFrame(testdata))
310
+
311
+ instruct_tune_dataset = {"train": traindataset,
312
+ "val" : valdataset,
313
+ "test" : testdataset}
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+ def preprocess_function(examples):
324
+ batch_size = len(examples['inputs'])
325
+ #inputs = [f"<s>[INST] Question : {x} [/INST] \\n Answer : " for x in examples[past_context_code]]
326
+ #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'])]
327
+ #targets = [str(x) for x in examples[label_column]]
328
+ #inputs, targets = get_examples_all_context(examples)
329
+
330
+ #inputs, targets = get_examples_all_context(examples)
331
+ #inputs, targets = get_examples_all_context_granite(examples, only_code=False)
332
+ inputs = []
333
+ targets = []
334
+ # for eg in examples:
335
+ # print(eg)
336
+ # #inp, trg = create_prompt(eg)
337
+ # #inputs.append(inp)
338
+ # #targets.append(trg)
339
+ inputs = examples['inputs']
340
+ targets = examples['targets']
341
+ model_inputs = tokenizer(inputs)
342
+
343
+ #print("Input example:\n{}".format(inputs[0]))
344
+ #print("Output example:\n{}".format(targets[0]))
345
+
346
+ input_sizes = [len(tokens) for tokens in model_inputs['input_ids']]
347
+ #print("Input sizes {}".format(input_sizes))
348
+ labels = tokenizer(targets, add_special_tokens=False) # don't add bos token because we concatenate with inputs
349
+ label_sizes = [len(tokens) for tokens in labels['input_ids']]
350
+ #print("Label sizes {}".format(label_sizes))
351
+
352
+ for i in range(batch_size):
353
+ sample_input_ids = model_inputs["input_ids"][i]
354
+ label_input_ids = labels["input_ids"][i] + [tokenizer.eos_token_id]
355
+ # print(i, sample_input_ids, label_input_ids)
356
+ model_inputs["input_ids"][i] = sample_input_ids + label_input_ids
357
+ labels["input_ids"][i] = [-100] * len(sample_input_ids) + label_input_ids
358
+ model_inputs["attention_mask"][i] = [1] * len(model_inputs["input_ids"][i])
359
+ # print(model_inputs)
360
+ for i in range(batch_size):
361
+ sample_input_ids = model_inputs["input_ids"][i]
362
+ label_input_ids = labels["input_ids"][i]
363
+ model_inputs["input_ids"][i] = [tokenizer.pad_token_id] * (
364
+ max_length - len(sample_input_ids)
365
+ ) + sample_input_ids
366
+ model_inputs["attention_mask"][i] = [0] * (max_length - len(sample_input_ids)) + model_inputs["attention_mask"][i]
367
+ labels["input_ids"][i] = [-100] * (max_length - len(sample_input_ids)) + label_input_ids
368
+ model_inputs["input_ids"][i] = torch.tensor(model_inputs["input_ids"][i][:max_length])
369
+ model_inputs["attention_mask"][i] = torch.tensor(model_inputs["attention_mask"][i][:max_length])
370
+ labels["input_ids"][i] = torch.tensor(labels["input_ids"][i][:max_length])
371
+ model_inputs["labels"] = labels["input_ids"]
372
+ input_sizes = [len(tokens) for tokens in model_inputs['input_ids']]
373
+ #print("Input sizes {}".format(input_sizes))
374
+ return model_inputs
375
+
376
+ processed_datasets = traindataset.map(
377
+ preprocess_function,
378
+ batched=True,
379
+ num_proc=1,
380
+ remove_columns=traindataset.column_names,
381
+ load_from_cache_file=False,
382
+ desc="Running tokenizer on dataset",
383
+ )
384
+ train_dataset = processed_datasets
385
+ train_dataloader = DataLoader(
386
+ train_dataset, shuffle=True, collate_fn=default_data_collator, batch_size=batch_size_train, pin_memory=True
387
+ )
388
+
389
+
390
+ processed_datasets = valdataset.map(
391
+ preprocess_function,
392
+ batched=True,
393
+ num_proc=1,
394
+ remove_columns=valdataset.column_names,
395
+ load_from_cache_file=False,
396
+ desc="Running tokenizer on dataset",
397
+ )
398
+ val_dataset = processed_datasets
399
+ val_dataloader = DataLoader(
400
+ val_dataset, shuffle=True, collate_fn=default_data_collator, batch_size=batch_size_train, pin_memory=True
401
+ )
402
+
403
+
404
+
405
+
406
+ def test_preprocess_function(examples):
407
+ batch_size = len(examples['inputs'])
408
+ #inputs, targets = get_examples_all_context(examples)
409
+ #inputs, targets = get_examples_all_context_granite(examples)
410
+ #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'])]
411
+ model_inputs = tokenizer(examples['inputs'])
412
+ # print(model_inputs)
413
+ for i in range(batch_size):
414
+ sample_input_ids = model_inputs["input_ids"][i]
415
+ model_inputs["input_ids"][i] = [tokenizer.pad_token_id] * (
416
+ max_length - len(sample_input_ids)
417
+ ) + sample_input_ids
418
+ model_inputs["attention_mask"][i] = [0] * (max_length - len(sample_input_ids)) + model_inputs["attention_mask"][i]
419
+ model_inputs["input_ids"][i] = torch.tensor(model_inputs["input_ids"][i][:max_length])
420
+ model_inputs["attention_mask"][i] = torch.tensor(model_inputs["attention_mask"][i][:max_length])
421
+ return model_inputs
422
+
423
+
424
+ processed_datasets = testdataset.map(
425
+ preprocess_function,
426
+ batched=True,
427
+ num_proc=1,
428
+ remove_columns=testdataset.column_names,
429
+ load_from_cache_file=False,
430
+ desc="Running tokenizer on dataset",
431
+ )
432
+ test_dataset = processed_datasets
433
+ test_dataloader = DataLoader(
434
+ test_dataset, shuffle=False, collate_fn=default_data_collator, batch_size=batch_size_train, pin_memory=True
435
+ )
436
+
437
+
438
+
439
+
440
+ peft_config = LoraConfig(
441
+ lora_alpha=16,
442
+ lora_dropout=0.1,
443
+ #target_modules = ['c_attn'],
444
+ r=64,
445
+ bias="none",
446
+ task_type="CAUSAL_LM"
447
+ )
448
+
449
+ # peft_config = LoraConfig(
450
+ # r=lora_r,
451
+ # lora_alpha=lora_alpha,
452
+ # lora_dropout=lora_dropout,
453
+ # target_modules= target_modules,
454
+ # bias="none",
455
+ # task_type="CAUSAL_LM"
456
+ # )
457
+
458
+ model = peft.get_peft_model(model, peft_config)
459
+
460
+ wandb.watch(model, log='all')
461
+ print("Model loaded successfully!")
462
+
463
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
464
+
465
+ #optimizer = AdamW(model.parameters(), lr=3e-4)
466
+ optimizer = AdamW(model.parameters(), lr=initial_lr)
467
+
468
+ # Instantiate scheduler
469
+ lr_scheduler = get_cosine_schedule_with_warmup(
470
+ optimizer=optimizer,
471
+ num_warmup_steps=0.06 * (len(train_dataloader) * num_epochs),
472
+ num_training_steps=(len(train_dataloader) * num_epochs),
473
+ )
474
+
475
+ model.to(device)
476
+ model.to('cuda')
477
+
478
+ #model = torch.nn.DataParallel(model)
479
+ #model = model.cuda()
480
+
481
+ for epoch in range(num_epochs):
482
+ try:
483
+ model.train()
484
+ total_loss = 0
485
+ best_eval_loss = 10000 #np.inf
486
+
487
+ for step, batch in enumerate(tqdm(train_dataloader)):
488
+ batch = {k: v.to(device) for k, v in batch.items()}
489
+ #batch = {k: v.cuda() for k, v in batch.items()}
490
+ # print(batch)
491
+ #print(batch["input_ids"].shape)
492
+ # if step > 5:
493
+ # break
494
+ #batch.to(device)
495
+ outputs = model(**batch)
496
+ loss = outputs.loss
497
+ total_loss += loss.detach().float()
498
+ wandb.log({'train_loss': loss})
499
+ if step % 100 == 0:
500
+ wandb.log({'train_step_loss': loss})
501
+ print(loss)
502
+ loss.backward()
503
+ #print("Loss {}".format(loss.item()))
504
+ optimizer.step()
505
+ lr_scheduler.step()
506
+ optimizer.zero_grad()
507
+ # if step % ckpnt_NUM == 0:
508
+ # checkpoint_dir = os.path.join(checkpoint_store_dir_path, f"checkpoint_{epoch}_{step}/")
509
+ # os.makedirs(checkpoint_dir, exist_ok=True)
510
+ # model.save_pretrained(checkpoint_dir)
511
+
512
+ if step % ckpnt_NUM == 0:
513
+
514
+ model.eval()
515
+ eval_loss = 0
516
+ eval_preds = []
517
+ eval_cnt = 1
518
+ for step1, batch_eval in enumerate(tqdm(val_dataloader)):
519
+
520
+ batch_eval = {k: v.to(device) for k, v in batch_eval.items()}
521
+ #batch_eval = {k: v.cuda() for k, v in batch_eval.items()}
522
+
523
+ #outputs = model.generate(**batch_eval, max_new_tokens=48)
524
+ #out = tokenizer.batch_decode(outputs, skip_special_tokens=True)
525
+ # for x in out:
526
+ # print(x)
527
+ # print("#" * 50)
528
+ with torch.no_grad():
529
+ outputs = model(**batch_eval)
530
+ loss = outputs.loss
531
+ if not math.isnan(loss.detach().float()) :
532
+ eval_loss += loss.detach().float()
533
+ eval_cnt += 1
534
+ # eval_preds.extend(
535
+ # tokenizer.batch_decode(torch.argmax(outputs.logits, -1).detach().cpu().numpy(),
536
+ # skip_special_tokens=True)
537
+ # )
538
+ print(eval_loss)
539
+ wandb.log({'eval_loss': eval_loss})
540
+ eval_epoch_loss = eval_loss / len(val_dataloader)
541
+ if ((eval_loss/eval_cnt) < best_eval_loss) or SAVEALL==1:
542
+
543
+ best_eval_loss = eval_loss/eval_cnt
544
+ print(f"saving...{best_eval_loss} to checkpoint_{epoch}_{step}\n")
545
+ checkpoint_dir = os.path.join(checkpoint_store_dir_path, f"checkpoint_{epoch}_{step}/")
546
+ os.makedirs(checkpoint_dir, exist_ok=True)
547
+ model.save_pretrained(checkpoint_dir)
548
+
549
+ eval_ppl = torch.exp(eval_epoch_loss)
550
+ train_epoch_loss = total_loss #/ len(train_dataloader)
551
+ train_ppl = torch.exp(train_epoch_loss)
552
+ print(f"{epoch=}: {train_ppl=} {train_epoch_loss=} {eval_ppl=} {eval_epoch_loss=} {eval_loss/eval_cnt=} {eval_cnt=}")
553
+ #print(f"{epoch=}: {train_ppl=} {train_epoch_loss=}")
554
+
555
+ print("Total Loss {}".format(total_loss.item()))
556
+ if ((epoch+1) % 1) == 0:
557
+ checkpoint_dir = os.path.join(checkpoint_store_dir_path, f"checkpoint_{epoch}/")
558
+ os.makedirs(checkpoint_dir, exist_ok=True)
559
+ model.save_pretrained(checkpoint_dir)
560
+ model.eval()
561
+ eval_loss = 0
562
+ eval_preds = []
563
+ for step1, batch_eval in enumerate(tqdm(test_dataloader)):
564
+ if step1 > 5:
565
+ break
566
+ batch_eval = {k: v.to(device) for k, v in batch_eval.items()}
567
+ #batch_eval = {k: v.cuda() for k, v in batch_eval.items()}
568
+
569
+ outputs = model.generate(**batch_eval, max_new_tokens=max_new_tok)
570
+ out = tokenizer.batch_decode(outputs, skip_special_tokens=True)
571
+ for x in out:
572
+ print(x)
573
+ print("#" * 50)
574
+ # with torch.no_grad():
575
+ # outputs = model(**batch)
576
+ # loss = outputs.loss
577
+ # eval_loss += loss.detach().float()
578
+ # eval_preds.extend(
579
+ # tokenizer.batch_decode(torch.argmax(outputs.logits, -1).detach().cpu().numpy(),
580
+ # skip_special_tokens=True)
581
+ # )
582
+
583
+ # eval_epoch_loss = eval_loss / len(test_dataloader)
584
+ # eval_ppl = torch.exp(eval_epoch_loss)
585
+ train_epoch_loss = total_loss / len(train_dataloader)
586
+ train_ppl = torch.exp(train_epoch_loss)
587
+ #print(f"{epoch=}: {train_ppl=} {train_epoch_loss=} {eval_ppl=} {eval_epoch_loss=}")
588
+ print(f"{epoch=}: {train_ppl=} {train_epoch_loss=}")
589
+
590
+
591
+
592
+
593
+ except KeyboardInterrupt:
594
+
595
+ checkpoint_dir = os.path.join(checkpoint_store_dir_path, f"checkpoint_{epoch}_interrupt/")
596
+ os.makedirs(checkpoint_dir, exist_ok=True)
597
+ model.save_pretrained(checkpoint_dir)
598
+
599
+
600
+
601
+