jefffffff9 Claude Sonnet 4.6 commited on
Commit
65e1d64
·
1 Parent(s): 257bae8

Fix Cell 11: bypass WhisperProcessor entirely to avoid torchvision crash

Browse files

WhisperProcessor -> processing_utils -> image_utils -> torchvision fails
when torch CUDA 13.0 and torchvision CUDA 12.8 are mismatched in memory
(reinstalling torchvision in Cell 2 fixes disk but not the live process).

Build processor from WhisperFeatureExtractor + WhisperTokenizer directly
-- neither touches image_utils or torchvision. A minimal _Processor class
exposes feature_extractor, tokenizer, get_decoder_prompt_ids, and
save_pretrained, which is all the rest of the notebook needs.

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

notebooks/kaggle_master_trainer.ipynb CHANGED
@@ -111,7 +111,7 @@
111
  "id": "cell-prepare",
112
  "metadata": {},
113
  "outputs": [],
114
- "source": "# -- Cell 11: Whisper processor + prepare_dataset -----------------------------\n# Use the direct module path to avoid the top-level transformers lazy loader\n# which triggers torchvision -> torch._dynamo and breaks on Kaggle Python 3.12.\nimport numpy as np\n\ntry:\n from transformers.models.whisper.processing_whisper import WhisperProcessor\nexcept ImportError:\n from transformers import WhisperProcessor\n\nprint(f'Loading processor: {WHISPER_MODEL_ID} ...')\nprocessor = WhisperProcessor.from_pretrained(WHISPER_MODEL_ID, token=HF_TOKEN)\nprint('Processor ready')\n\n\ndef prepare_dataset(batch, text_col='transcription', lang=TRAIN_LANG):\n \"\"\"\n Unified feature-extraction for all data sources.\n Resamples audio to 16 kHz, cleans text, returns Whisper input_features + labels.\n \"\"\"\n audio = batch['audio']\n audio_array = np.array(audio['array'], dtype=np.float32)\n orig_sr = audio['sampling_rate']\n\n if orig_sr != TARGET_SR:\n try:\n import torchaudio.functional as F_audio\n import torch\n audio_array = F_audio.resample(\n torch.from_numpy(audio_array).unsqueeze(0),\n orig_sr, TARGET_SR,\n ).squeeze(0).numpy()\n except Exception:\n import librosa\n audio_array = librosa.resample(audio_array, orig_sr=orig_sr, target_sr=TARGET_SR)\n\n batch['input_features'] = processor.feature_extractor(\n audio_array, sampling_rate=TARGET_SR\n ).input_features[0]\n\n raw_text = batch.get(text_col, '') or ''\n cleaned = clean_text(str(raw_text), lang=lang)\n batch['labels'] = processor.tokenizer(cleaned).input_ids\n return batch\n\n\nprint('prepare_dataset ready')"
115
  },
116
  {
117
  "cell_type": "code",
 
111
  "id": "cell-prepare",
112
  "metadata": {},
113
  "outputs": [],
114
+ "source": "# -- Cell 11: Whisper processor + prepare_dataset -----------------------------\n# WhisperProcessor imports processing_utils -> image_utils -> torchvision,\n# which crashes when torch/torchvision have mismatched CUDA versions.\n# Fix: build the processor manually from its two sub-components.\n# WhisperFeatureExtractor and WhisperTokenizer have no torchvision dependency.\nimport numpy as np\n\nfrom transformers.models.whisper.feature_extraction_whisper import WhisperFeatureExtractor\nfrom transformers.models.whisper.tokenization_whisper import WhisperTokenizer\n\nprint(f'Loading Whisper feature extractor + tokenizer: {WHISPER_MODEL_ID} ...')\n_feat_ext = WhisperFeatureExtractor.from_pretrained(WHISPER_MODEL_ID, token=HF_TOKEN)\n_tokenizer = WhisperTokenizer.from_pretrained(WHISPER_MODEL_ID, token=HF_TOKEN)\n\n\nclass _Processor:\n \"\"\"Minimal WhisperProcessor substitute that avoids the torchvision import chain.\"\"\"\n def __init__(self, feature_extractor, tokenizer):\n self.feature_extractor = feature_extractor\n self.tokenizer = tokenizer\n\n def get_decoder_prompt_ids(self, language, task='transcribe'):\n return self.tokenizer.get_decoder_prompt_ids(language=language, task=task)\n\n def save_pretrained(self, path):\n self.feature_extractor.save_pretrained(path)\n self.tokenizer.save_pretrained(path)\n\n\nprocessor = _Processor(_feat_ext, _tokenizer)\nprint('Processor ready')\n\n\ndef prepare_dataset(batch, text_col='transcription', lang=TRAIN_LANG):\n \"\"\"\n Resample to 16 kHz, extract log-mel features, tokenise text.\n Works on any dict with 'audio' (HF Audio column) and a text column.\n \"\"\"\n audio = batch['audio']\n audio_array = np.array(audio['array'], dtype=np.float32)\n orig_sr = audio['sampling_rate']\n\n if orig_sr != TARGET_SR:\n try:\n import torchaudio.functional as F_audio, torch\n audio_array = F_audio.resample(\n torch.from_numpy(audio_array).unsqueeze(0),\n orig_sr, TARGET_SR,\n ).squeeze(0).numpy()\n except Exception:\n import librosa\n audio_array = librosa.resample(audio_array, orig_sr=orig_sr, target_sr=TARGET_SR)\n\n batch['input_features'] = processor.feature_extractor(\n audio_array, sampling_rate=TARGET_SR\n ).input_features[0]\n\n raw_text = batch.get(text_col, '') or ''\n cleaned = clean_text(str(raw_text), lang=lang)\n batch['labels'] = processor.tokenizer(cleaned).input_ids\n return batch\n\n\nprint('prepare_dataset ready')"
115
  },
116
  {
117
  "cell_type": "code",