(args)
| 150 | |
| 151 | |
| 152 | def run_single(args): |
| 153 | dtype = get_torch_dtype(args.dtype) |
| 154 | print(f"=== Training with bnb {args.optimizer} on CPU ({args.dtype}) ===") |
| 155 | print(f"Model: {args.model} | Dataset: {args.dataset}") |
| 156 | print(f"Steps: {args.steps} | LR: {args.lr} | Batch: {args.batch_size} | MaxLen: {args.max_length}") |
| 157 | print() |
| 158 | |
| 159 | tokenizer = AutoTokenizer.from_pretrained(args.model) |
| 160 | if tokenizer.pad_token is None: |
| 161 | tokenizer.pad_token = tokenizer.eos_token |
| 162 | |
| 163 | model = AutoModelForCausalLM.from_pretrained(args.model, dtype=dtype) |
| 164 | |
| 165 | ds = prepare_data(tokenizer, args.dataset, args.max_length) |
| 166 | dataloader = torch.utils.data.DataLoader( |
| 167 | ds, |
| 168 | batch_size=args.batch_size, |
| 169 | shuffle=True, |
| 170 | collate_fn=collate_fn, |
| 171 | ) |
| 172 | |
| 173 | optimizer = create_optimizer(model, args.optimizer, args.lr) |
| 174 | |
| 175 | history = train_loop(model, optimizer, dataloader, args.steps, args.log_interval) |
| 176 | |
| 177 | loss_start = history[0][1] |
| 178 | loss_end = history[-1][1] |
| 179 | total_time = history[-1][2] |
| 180 | print("\n--- Results ---") |
| 181 | print(f"Loss: {loss_start:.4f} -> {loss_end:.4f} (delta={loss_start - loss_end:+.4f})") |
| 182 | print(f"Total time: {total_time:.1f}s ({args.steps / total_time:.1f} steps/s)") |
| 183 | print(f"Optimizer: bnb.optim.{args.optimizer} | Dtype: {args.dtype}") |
| 184 | |
| 185 | if loss_end >= loss_start: |
| 186 | print("WARNING: Loss did not decrease! Training may not be working correctly.") |
| 187 | else: |
| 188 | print("OK: Loss decreased as expected.") |
| 189 | |
| 190 | return history |
| 191 | |
| 192 | |
| 193 | def run_compare(args): |
no test coverage detected