(args)
| 161 | |
| 162 | |
| 163 | def train(args): |
| 164 | |
| 165 | # deepspeed needs to know your gradient accumulation steps before hand, so don't forget to pass it |
| 166 | # Remember you still need to do gradient accumulation by yourself, just like you would have done without deepspeed |
| 167 | # deepspeed_plugin = DeepSpeedPlugin(zero_stage=3, gradient_accumulation_steps=1) |
| 168 | # deepspeed_plugin.deepspeed_config['train_micro_batch_size_per_gpu'] = 2 |
| 169 | accelerator = Accelerator(mixed_precision='fp16') |
| 170 | |
| 171 | if accelerator.is_main_process: |
| 172 | writer = SummaryWriter(args.log_dir) |
| 173 | writer.add_hparams(vars(args), {}) |
| 174 | |
| 175 | accelerator.state.deepspeed_plugin.deepspeed_config['train_micro_batch_size_per_gpu'] = args.train_bsz_per_gpu |
| 176 | |
| 177 | tokenizer = AutoTokenizer.from_pretrained(args.model_name_or_path, trust_remote_code=True) |
| 178 | tokenizer.eos_token_id = 106068 # The eos_token_id of base model is 106028. We need map the eos token to <eom> (its token id is 106068) |
| 179 | |
| 180 | model = AutoModelForCausalLM.from_pretrained(args.model_name_or_path, trust_remote_code=True, use_cache=False) |
| 181 | |
| 182 | model.transformer.gradient_checkpointing = True |
| 183 | assert model.transformer.gradient_checkpointing is True |
| 184 | |
| 185 | # Optimizer |
| 186 | # Split weights in two groups, one with weight decay and the other not. |
| 187 | no_decay = ["bias", "LayerNorm.weight"] |
| 188 | optimizer_grouped_parameters = [ |
| 189 | { |
| 190 | "params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], |
| 191 | "weight_decay": args.weight_decay, |
| 192 | }, |
| 193 | { |
| 194 | "params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], |
| 195 | "weight_decay": 0.0, |
| 196 | }, |
| 197 | ] |
| 198 | |
| 199 | optimizer = torch.optim.AdamW(optimizer_grouped_parameters, lr=args.learning_rate) |
| 200 | |
| 201 | train_dataset = SFTDataset(args.data_dir, tokenizer) |
| 202 | train_dataloader = DataLoader(train_dataset, batch_size=args.train_bsz_per_gpu, shuffle=True, drop_last=True, collate_fn=train_dataset.collate_fn) |
| 203 | |
| 204 | val_dataset = SFTDataset(args.data_dir, tokenizer, data_type='val') |
| 205 | val_dataloader = DataLoader(val_dataset, batch_size=args.eval_bsz_per_gpu, shuffle=False, drop_last=True, collate_fn=train_dataset.collate_fn) |
| 206 | |
| 207 | num_training_steps = (len(train_dataloader) * args.n_epochs) // accelerator.gradient_accumulation_steps |
| 208 | lr_scheduler = get_cosine_schedule_with_warmup(optimizer, num_warmup_steps=int(args.warmup_rates * num_training_steps), num_training_steps=num_training_steps) |
| 209 | |
| 210 | model, optimizer, train_dataloader, val_dataloader, lr_scheduler = accelerator.prepare(model, optimizer, train_dataloader, val_dataloader, lr_scheduler) |
| 211 | |
| 212 | global_step = 0 |
| 213 | metric = SFTMetric(device=torch.cuda.current_device()) |
| 214 | |
| 215 | model.train() |
| 216 | for epoch in range(args.n_epochs): |
| 217 | for batch_cnt, (input_ids, attention_mask, labels) in enumerate(train_dataloader): |
| 218 | if batch_cnt == 1 and epoch == 0: |
| 219 | torch.cuda.empty_cache() |
| 220 |
no test coverage detected