jefffffff9 Claude Sonnet 4.6 commited on
Commit
8cf3564
·
1 Parent(s): c3a3cb7

Fix Cell 13: drop bitsandbytes, load whisper-small in fp16

Browse files

bitsandbytes 8-bit requires libnvJitLink.so.13 which is absent on
Kaggle CUDA 13. whisper-small (244MB) fits in T4 16GB in fp16 with
room to spare -- 8-bit quantization is unnecessary.

Cell 13: WhisperForConditionalGeneration loaded via direct module path
(avoids torchvision chain), fp16, .to(device), gradient_checkpointing
enabled on the model directly.

Cell 15: set gradient_checkpointing=False in TrainingArguments since
it is already enabled on the model in Cell 13 (setting both causes a
warning and double-wrapping).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

notebooks/kaggle_master_trainer.ipynb CHANGED
@@ -141,7 +141,7 @@
141
  "id": "cell-model",
142
  "metadata": {},
143
  "outputs": [],
144
- "source": "# ── Cell 13: Load Whisper-small (8-bit) + LoRA ────────────────────────────────\nimport torch\nfrom transformers import WhisperForConditionalGeneration, BitsAndBytesConfig\nfrom peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training, TaskType\n\n# 8-bit quantisation — halves VRAM vs fp16 with negligible quality loss\nbnb_config = BitsAndBytesConfig(load_in_8bit=True)\n\nprint(f'Loading {WHISPER_MODEL_ID} in 8-bit ...')\nmodel = WhisperForConditionalGeneration.from_pretrained(\n WHISPER_MODEL_ID,\n quantization_config=bnb_config,\n device_map='auto',\n token=HF_TOKEN,\n)\n\n# Required before applying LoRA to a k-bit model:\n# - enables gradient checkpointing\n# - casts LayerNorm & output embedding to float32 for stability\nmodel = prepare_model_for_kbit_training(model)\n\n# Force Whisper to generate in the target language (no language detection overhead)\nmodel.config.forced_decoder_ids = processor.get_decoder_prompt_ids(\n language='fr' if TRAIN_LANG in ('bam', 'ful') else TRAIN_LANG,\n task='transcribe',\n)\nmodel.config.suppress_tokens = []\n\n# LoRA: inject adapters into decoder Q and V projections\nlora_cfg = LoraConfig(\n r=LORA_R,\n lora_alpha=LORA_ALPHA,\n target_modules=LORA_TARGETS,\n lora_dropout=LORA_DROPOUT,\n bias='none',\n task_type=TaskType.SEQ_2_SEQ_LM,\n)\nmodel = get_peft_model(model, lora_cfg)\nmodel.print_trainable_parameters()\nprint(f'\\n✅ Model ready on {next(model.parameters()).device}')"
145
  },
146
  {
147
  "cell_type": "code",
@@ -163,7 +163,7 @@
163
  "id": "cell-train-args",
164
  "metadata": {},
165
  "outputs": [],
166
- "source": "# ── Cell 15: Training arguments ───────────────────────────────────────────────\nfrom transformers import Seq2SeqTrainingArguments\n\ntraining_args = Seq2SeqTrainingArguments(\n output_dir=OUTPUT_DIR,\n\n # Steps\n max_steps=MAX_STEPS,\n warmup_steps=WARMUP_STEPS,\n logging_steps=LOGGING_STEPS,\n save_steps=SAVE_STEPS,\n eval_steps=EVAL_STEPS,\n\n # Batch\n per_device_train_batch_size=BATCH_SIZE,\n per_device_eval_batch_size=8,\n gradient_accumulation_steps=GRAD_ACCUM,\n\n # Precision & memory\n fp16=True,\n gradient_checkpointing=True,\n\n # Optimiser\n learning_rate=LEARNING_RATE,\n lr_scheduler_type='cosine',\n weight_decay=0.0,\n adam_beta1=0.9,\n adam_beta2=0.98,\n adam_epsilon=1e-6,\n\n # Evaluation\n evaluation_strategy='steps',\n predict_with_generate=True,\n generation_max_length=225,\n load_best_model_at_end=True,\n metric_for_best_model='wer',\n greater_is_better=False,\n\n # Checkpointing\n save_total_limit=3,\n save_strategy='steps',\n\n # Logging\n report_to=['tensorboard'],\n logging_dir=f'{OUTPUT_DIR}/logs',\n\n # Push — disabled during training, done manually in the export cell\n push_to_hub=False,\n)\nprint('✅ Training arguments configured')\nprint(f' Effective batch size: {BATCH_SIZE * GRAD_ACCUM}')\nprint(f' Max steps : {MAX_STEPS}')\nprint(f' Checkpoint every : {SAVE_STEPS} steps')"
167
  },
168
  {
169
  "cell_type": "code",
 
141
  "id": "cell-model",
142
  "metadata": {},
143
  "outputs": [],
144
+ "source": "# -- Cell 13: Load Whisper-small (fp16) + LoRA --------------------------------\n# bitsandbytes 8-bit quantization requires libnvJitLink.so.13 which is absent\n# on Kaggle's CUDA 13 environment. For whisper-small (244MB) this doesn't\n# matter -- fp16 on a T4 (16GB) uses only ~500MB VRAM, well within budget.\nimport torch\nfrom transformers.models.whisper.modeling_whisper import WhisperForConditionalGeneration\nfrom peft import LoraConfig, get_peft_model, TaskType\n\ndevice = 'cuda' if torch.cuda.is_available() else 'cpu'\nprint(f'Loading {WHISPER_MODEL_ID} in fp16 on {device} ...')\n\nmodel = WhisperForConditionalGeneration.from_pretrained(\n WHISPER_MODEL_ID,\n torch_dtype=torch.float16,\n token=HF_TOKEN,\n)\nmodel = model.to(device)\nmodel.train()\n\n# Force target language -- avoids language-detection overhead during training\nmodel.config.forced_decoder_ids = processor.get_decoder_prompt_ids(\n language='fr', # closest Whisper supports for Bambara/Fula\n task='transcribe',\n)\nmodel.config.suppress_tokens = []\n\n# Enable gradient checkpointing to save activation memory\nmodel.gradient_checkpointing_enable()\n\n# LoRA -- inject adapters into decoder Q and V projections only\nlora_cfg = LoraConfig(\n r=LORA_R,\n lora_alpha=LORA_ALPHA,\n target_modules=LORA_TARGETS,\n lora_dropout=LORA_DROPOUT,\n bias='none',\n task_type=TaskType.SEQ_2_SEQ_LM,\n)\nmodel = get_peft_model(model, lora_cfg)\nmodel.print_trainable_parameters()\n\nvram_mb = torch.cuda.memory_allocated() / 1e6 if torch.cuda.is_available() else 0\nprint(f'\\nVRAM used: {vram_mb:.0f} MB / {torch.cuda.get_device_properties(0).total_memory / 1e6:.0f} MB')\nprint(f'Model ready on {device}')"
145
  },
146
  {
147
  "cell_type": "code",
 
163
  "id": "cell-train-args",
164
  "metadata": {},
165
  "outputs": [],
166
+ "source": "# -- Cell 15: Training arguments ----------------------------------------------\nfrom transformers import Seq2SeqTrainingArguments\n\ntraining_args = Seq2SeqTrainingArguments(\n output_dir=OUTPUT_DIR,\n\n max_steps=MAX_STEPS,\n warmup_steps=WARMUP_STEPS,\n logging_steps=LOGGING_STEPS,\n save_steps=SAVE_STEPS,\n eval_steps=EVAL_STEPS,\n\n per_device_train_batch_size=BATCH_SIZE,\n per_device_eval_batch_size=8,\n gradient_accumulation_steps=GRAD_ACCUM,\n\n fp16=True,\n # gradient_checkpointing handled directly on model in Cell 13\n gradient_checkpointing=False,\n\n learning_rate=LEARNING_RATE,\n lr_scheduler_type='cosine',\n weight_decay=0.0,\n adam_beta1=0.9,\n adam_beta2=0.98,\n adam_epsilon=1e-6,\n\n eval_strategy='steps',\n predict_with_generate=True,\n generation_max_length=225,\n load_best_model_at_end=True,\n metric_for_best_model='wer',\n greater_is_better=False,\n\n save_total_limit=3,\n save_strategy='steps',\n\n report_to=['tensorboard'],\n logging_dir=f'{OUTPUT_DIR}/logs',\n push_to_hub=False,\n)\n\nprint('Training arguments ready')\nprint(f' Effective batch size: {BATCH_SIZE * GRAD_ACCUM}')\nprint(f' Max steps : {MAX_STEPS}')"
167
  },
168
  {
169
  "cell_type": "code",