Pull to refresh

Обучение переходит в опыт: Whisper + pyannote на AMD завёлся с первого раза

Сегодня пишу именно потому, что замкнулся цикл от обучения к продукту. Тема специфическая, мало кому интересно использовать AMD для нейронок вместо NVIDIA, но раз уж прошёл через это сам поделюсь решениями. Дальше кому надо берите, экономьте себе недели.

Изначально AMD у меня появился под другую задачу. Я исследовал возможность сделать веса для CUDA→HIP конвертера. AMD-машина под столом осталась, и я наконец начал использовать её для проектов, а не только для экспериментов с конвертером.

Понадобилось сделать голосовой ассистент для анализа встреч. Нужна транскрипция русской речи с разделением говорящих. Whisper large-v3 + pyannote.audio 3.1 - стандартный стек, только обычно его гоняют на NVIDIA. Я решил ставить на AMD RX 7900 XTX (24 GB VRAM, PyTorch ROCm 6.2). DeepSeek 32B стоит на соседней машине с 4090, ему нужен весь её VRAM, а ещё на 4090 загружаю весовые LoRA-адаптеры пользователей. Завёлся с первого раза. От этого и кайфанул - обучение перешло в опыт. Можно сказать, записалось в мои веса.

Из коробки сработало всё, никаких откатов версий, никаких ручных сборок:

bash pip3 install openai-whisper --break-system-packages pip3 install pyannote.audio --no-deps --break-system-packages pip3 install omegaconf pytorch-metric-learning rich soundfile torchmetrics --break-system-packages pip3 install fastapi uvicorn python-multipart --break-system-packages ​

Обе модели занимают ~5.9 GB VRAM из 24. Whisper 3 GB, pyannote 2 GB.

Дальше самое ценное мои грабли, которые решил заранее, за предыдущие месяцы боли. На эти вещи обычно тратят недели.

Первое - pip install --no-deps для pyannote. Обычный pip install pyannote.audio тянет torch как зависимость. pip видит «torch уже установлен», но не разбирается, что у тебя специальный PyTorch ROCm build, и ставит CUDA-версию поверх. PyTorch ROCm убит, вся экосистема AMD ломается. С флагом --no-deps pip ставит pyannote без зависимостей, дальше вручную доставляешь omegaconf, pytorch-metric-learning, soundfile, torchmetrics, rich. Чисто, ничего не ломается.

Второе - API pyannote 3.1 сломали тихо. В 3.0 было result.itertracks(yield_label=True). В 3.1 - result.speaker_diarization.itertracks(yield_label=True). Документация молчит, узнаёшь через ошибку. Плюс use_auth_token переименован в token без фанфар.

​```python from pyannote.audio import Pipeline

pipeline = Pipeline.from_pretrained( “pyannote/speaker-diarization-3.1”, token=HF_TOKEN, # не use_auth_token! ) pipeline.to(torch.device(“cuda”))

result = pipeline({“waveform”: waveform, “sample_rate”: sr})

for turn, _, speaker in result.speaker_diarization.itertracks(yield_label=True): print(f"{turn.start:.2f} - {turn.end:.2f}: {speaker}") ​```

Третье - torchcodec тихая мина на ROCm. pyannote в новых версиях пытается использовать torchcodec для декодирования аудио. На AMD ROCm torchcodec не собран, падает с невнятной ошибкой про libavutil. Обход - подавать waveform напрямую через torchaudio:

​```python import torchaudio

waveform, sample_rate = torchaudio.load(audio_path) result = pipeline({“waveform”: waveform, “sample_rate”: sample_rate}) ​```

pyannote-команда упоминает эту возможность мелкими буквами в одном issue на GitHub. Работает идеально.

Четвёртое - нужна переменная окружения TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL=1. Без неё часть операций fallback-ит на медленный путь.

Пятое - две модели в одном процессе на ROCm работают. Была мысль разносить Whisper и pyannote по процессам - вдруг конфликты HIP runtime. Нет. Обе модели грузятся в одном Python-процессе, работают параллельно.

По производительности на 9-минутном WAV (16 kHz, два говорящих, русская речь) Whisper large-v3 отрабатывает за ~60 секунд, pyannote 3.1 за ~3 секунды, итого ~63 секунды. pyannote практически бесплатен. Качество диаризации отличное - два спикера разнесены корректно, таймкоды совпадают с репликами. Стек: PyTorch ROCm 6.2, openai-whisper, pyannote.audio 3.1. RX 7900 XTX, 24 GB VRAM, Ubuntu 24.04.

Tags:
Total votes 4: ↑2 and ↓20
Comments0

Articles