🐛 fix training cell: manual ChatML format, list return for Unsloth SFTTrainer
Browse files
notebooks/qwen35-2b-bash-finetune.ipynb
CHANGED
|
@@ -174,41 +174,7 @@
|
|
| 174 |
"execution_count": null,
|
| 175 |
"metadata": {},
|
| 176 |
"outputs": [],
|
| 177 |
-
"source": [
|
| 178 |
-
"from trl import SFTTrainer, SFTConfig\n",
|
| 179 |
-
"\n",
|
| 180 |
-
"trainer = SFTTrainer(\n",
|
| 181 |
-
" model=model,\n",
|
| 182 |
-
" tokenizer=tokenizer,\n",
|
| 183 |
-
" train_dataset=train_dataset,\n",
|
| 184 |
-
" eval_dataset=val_dataset,\n",
|
| 185 |
-
" args=SFTConfig(\n",
|
| 186 |
-
" max_seq_length=max_seq_length,\n",
|
| 187 |
-
" per_device_train_batch_size=4,\n",
|
| 188 |
-
" gradient_accumulation_steps=4,\n",
|
| 189 |
-
" warmup_steps=20,\n",
|
| 190 |
-
" num_train_epochs=3,\n",
|
| 191 |
-
" logging_steps=25,\n",
|
| 192 |
-
" eval_strategy=\"steps\",\n",
|
| 193 |
-
" eval_steps=200,\n",
|
| 194 |
-
" save_steps=200,\n",
|
| 195 |
-
" save_total_limit=3,\n",
|
| 196 |
-
" load_best_model_at_end=True,\n",
|
| 197 |
-
" metric_for_best_model=\"eval_loss\",\n",
|
| 198 |
-
" learning_rate=1e-4,\n",
|
| 199 |
-
" optim=\"adamw_8bit\",\n",
|
| 200 |
-
" weight_decay=0.01,\n",
|
| 201 |
-
" lr_scheduler_type=\"cosine\",\n",
|
| 202 |
-
" seed=3407,\n",
|
| 203 |
-
" output_dir=\"outputs_qwen35_2b\",\n",
|
| 204 |
-
" dataset_text_field=\"text\",\n",
|
| 205 |
-
" ),\n",
|
| 206 |
-
")\n",
|
| 207 |
-
"\n",
|
| 208 |
-
"trainer_stats = trainer.train()\n",
|
| 209 |
-
"print(f\"\\nTraining time: {trainer_stats.metrics['train_runtime']:.0f}s\")\n",
|
| 210 |
-
"print(f\"Peak memory: {torch.cuda.max_memory_allocated() / 1e9:.2f} GB\")"
|
| 211 |
-
]
|
| 212 |
},
|
| 213 |
{
|
| 214 |
"cell_type": "markdown",
|
|
|
|
| 174 |
"execution_count": null,
|
| 175 |
"metadata": {},
|
| 176 |
"outputs": [],
|
| 177 |
+
"source": "from trl import SFTTrainer, SFTConfig\n\ndef format_messages(example):\n msgs = example[\"messages\"]\n parts = []\n for msg in msgs:\n if isinstance(msg, dict):\n role, content = msg[\"role\"], msg[\"content\"]\n else:\n role, content = msg[0], msg[1]\n parts.append(f\"<|im_start|>{role}\\n{content}<|im_end|>\")\n return [\"\\n\".join(parts)]\n\ntrainer = SFTTrainer(\n model=model,\n tokenizer=tokenizer,\n train_dataset=train_dataset,\n eval_dataset=val_dataset,\n formatting_func=format_messages,\n args=SFTConfig(\n max_seq_length=max_seq_length,\n per_device_train_batch_size=4,\n gradient_accumulation_steps=4,\n warmup_steps=20,\n num_train_epochs=3,\n logging_steps=25,\n eval_strategy=\"steps\",\n eval_steps=200,\n save_steps=200,\n save_total_limit=3,\n load_best_model_at_end=True,\n metric_for_best_model=\"eval_loss\",\n learning_rate=1e-4,\n optim=\"adamw_8bit\",\n weight_decay=0.01,\n lr_scheduler_type=\"cosine\",\n seed=3407,\n output_dir=\"outputs_qwen35_2b\",\n ),\n)\n\ntrainer_stats = trainer.train()\nprint(f\"\\nTraining time: {trainer_stats.metrics['train_runtime']:.0f}s\")\nprint(f\"Peak memory: {torch.cuda.max_memory_allocated() / 1e9:.2f} GB\")"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 178 |
},
|
| 179 |
{
|
| 180 |
"cell_type": "markdown",
|