MCPcopy Create free account
hub / github.com/OpenMOSS/MOSS / train

Function train

finetune_moss.py:163–270  ·  view source on GitHub ↗
(args)

Source from the content-addressed store, hash-verified

161
162
163def 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

Callers 1

finetune_moss.pyFile · 0.85

Calls 4

get_metricMethod · 0.95
SFTDatasetClass · 0.85
SFTMetricClass · 0.85
backwardMethod · 0.80

Tested by

no test coverage detected