fix: use AutoModel for audio, is_relative_to path check, early librosa import

- Use AutoModel instead of AutoModelForCausalLM for audio-language models
  (Qwen2-Audio, Whisper don't work with causal LM auto class)
- Use Path.is_relative_to() for path traversal check (symlink-safe, Python 3.9+)
- Fail fast with helpful error if librosa not installed before dataset processing
This commit is contained in:
Alpamys 2026-03-26 13:59:46 +05:00
parent fb1f49afc8
commit 20c2f4e515
2 changed files with 13 additions and 3 deletions

View File

@ -195,7 +195,7 @@ def _validate_audio_files(data: list[dict], audio_dir: Path) -> list[dict]:
audio_path = audio_dir / audio_path
# Path traversal protection: resolved path must stay under audio_dir
resolved = audio_path.resolve()
if not str(resolved).startswith(str(resolved_base)):
if not resolved.is_relative_to(resolved_base):
traversal += 1
continue
valid.append({**row, "audio": str(resolved)})

View File

@ -424,7 +424,7 @@ class SFTTrainerWrapper:
"""Load audio-language model via transformers (Qwen2-Audio, Whisper, etc.)."""
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from rich.panel import Panel as RichPanel
from transformers import AutoModelForCausalLM, AutoProcessor, BitsAndBytesConfig
from transformers import AutoModel, AutoProcessor, BitsAndBytesConfig
console.print(
RichPanel(
@ -461,7 +461,9 @@ class SFTTrainerWrapper:
if bnb_config:
model_kwargs["quantization_config"] = bnb_config
self.model = AutoModelForCausalLM.from_pretrained(cfg.base, **model_kwargs)
# Use AutoModel for audio models — AutoModelForCausalLM doesn't handle
# audio-language architectures (Qwen2-Audio, Whisper, etc.)
self.model = AutoModel.from_pretrained(cfg.base, **model_kwargs)
if tcfg.quantization in ("4bit", "8bit"):
self.model = prepare_model_for_kbit_training(self.model)
@ -485,6 +487,14 @@ class SFTTrainerWrapper:
"""Prepare dataset for audio fine-tuning with audio loading."""
from datasets import Dataset
try:
import librosa # noqa: F401
except ImportError:
raise ImportError(
"librosa is required for audio training. "
"Install with: pip install 'soup-cli[audio]'"
)
def load_and_format_audio(example):
import librosa