Skip to content

Ръководство за обучение и фина настройка на TTS модел

Подготвили сте данните и средата за работа. Сега е време да обучите или донастроите своя TTS модел, като стартирате процеса на обучение, наблюдавате напредъка и управлявате checkpoint файловете безопасно.

Ако някой термин за обучение е неясен, използвайте речника. Тук са обяснени само термините, които пряко влияят върху стартирането, наблюдението или дебъгването на обучението.


Стартиране на обучението

Тази част описва как да стартирате, следите и управлявате обучението.

Стартиране на скрипта за обучение

  • Влезте в правилната директория: Отворете терминал и се преместете в главната директория на избраната TTS рамка, където е train.py или еквивалентният скрипт.
  • Активирайте виртуалната среда: Уверете се, че правилната Python среда е активна.

    # Примерна активация
    # Windows: ..\venv_tts\Scripts\activate
    # Linux/macOS: source ../venv_tts/bin/activate
    # Conda: conda activate tts_env
    
  • Стартирайте обучението: Подайте вашия персонализиран config файл от Ръководство 2. Точната команда зависи от рамката; често срещаните варианти са:

    python train.py --config ../my_configs/my_yoruba_voice_ft_config.yaml
    
    # Вариант с име на run
    # Проверете дали -m не заменя output_directory от config файла.
    python train.py -c ../my_configs/my_yoruba_voice_ft_config.yaml -m my_yoruba_voice_run1
    
    # Вариант с директно зададена checkpoint директория
    python train.py --config ../my_configs/my_yoruba_voice_ft_config.yaml --checkpoint_path ../checkpoints/my_yoruba_voice_run1
    
  • Multi-GPU обучение: Ако имате няколко GPU и рамката поддържа разпределено обучение, проверете документацията ѝ и може да използвате torchrun.

    # Пример с torchrun; съобразете nproc_per_node с броя на GPU картите
    torchrun --nproc_per_node=2 train.py --config ../my_configs/my_yoruba_voice_ft_config.yaml
    

Първа проверка на пълното стартиране

Преди да оставите задачата за обучение да върви с часове или дни, проверете в първите няколко минути:

  • скриптът за обучение минава началната фаза и започва да зарежда реални batch-ове
  • изходната директория започва да получава логове, checkpoints или event файлове
  • loss стойностите изглеждат като нормални числа, а не NaN или inf
  • GPU паметта се стабилизира вместо да расте до моментален срив

Ако задачата се счупи още тук, оправете това първо. Счупените първи пет минути често означават изгубен цял ден.

Наблюдение на напредъка

  • Конзолен изход: Следете:
    • инициализацията на модела и data loader-ите
    • текущ epoch или step
    • train_loss и validation_loss
    • learning rate
    • време за step или epoch
  • TensorBoard: Ако е активиран в config файла, стартирайте го в отделен терминал.

    tensorboard --logdir ../checkpoints/my_yoruba_voice_run1
    

    Отворете URL адреса, който TensorBoard покаже (обикновено http://localhost:6006/). Там можете да следите кривите на loss, графиките на learning rate и евентуално синтезираните validation sample-и.

  • Изходна директория: Тя трябва да съдържа checkpoints (.pth, .pt или .ckpt), логове, копие на config файла, TensorBoard event файлове и понякога синтезирани audio sample-и.

Как изглежда добрият ранен напредък

При здраво първо изпълнение обикновено търсите:

  • обучение без моментални сривове, NaN стойности или неконтролируемо нарастване на използваната памет
  • train_loss и validation_loss постепенно намаляват вместо да се взривяват
  • validation sample-ите постепенно стават по-ясни и по-стабилни
  • по-късните checkpoints звучат по-добре от най-ранните, дори още да не са идеални

Не се вманиачавайте в едно-единствено число за loss. При TTS слушането е толкова важно, колкото и метриките.

Разбиране на checkpoint файловете

  • Checkpoint-ите са snapshot-и на състоянието на модела — научените тегла и често състоянието на optimizer-а — записани през определени интервали.
  • Те са важни за:
    • възобновяване на обучението
    • сравняване на различни етапи
    • избор на най-добър модел
  • Честота на записване: Задайте разумен save_checkpoint_interval. Твърде честото записване хаби дисково пространство, а твърде рядкото повишава риска да загубите значителен напредък. Много рамки записват и автоматично „best“ checkpoint според validation loss.

Възобновяване на прекъснато обучение

Ако обучението спре неочаквано, често можете да го продължите от последния checkpoint:

  • Намерете последния checkpoint в изходната директория, например ../checkpoints/my_yoruba_voice_run1/ckpt_step_50000.pth или latest_checkpoint.pth.
  • Използвайте аргумента за resume на рамката. Името му може да се различава:
python train.py --config ../my_configs/my_yoruba_voice_ft_config.yaml --resume_checkpoint ../checkpoints/my_yoruba_voice_run1/ckpt_step_50000.pth

python train.py --config ../my_configs/my_yoruba_voice_ft_config.yaml --restore_path ../checkpoints/my_yoruba_voice_run1/ckpt_step_50000.pth

Скриптът трябва да зареди теглата и състоянието на optimizer-а и да продължи от същото място в обучението.

Кога да спрете обучението

  • Лимит на epochs: Обучението спира, когато достигне максималния брой epochs от config файла.
  • Ранно спиране: Ако validation loss спре да намалява и стабилно започне да се покачва през няколко validation интервала, моделът може да започва да се преобучава.
  • Оценка чрез слушане: Редовно слушайте validation sample-ите и спрете, когато качеството и стабилността са достатъчни за целта ви, дори loss да продължава леко да намалява.

Понякога малко по-ранен checkpoint звучи по-добре от този с най-ниската loss стойност.


Фина настройка срещу обучение от нулата

Избор на подход

Когато започвате TTS проект, едно от най-важните решения е дали да правите fine-tuning на съществуващ модел или да обучавате нов модел от нулата. Тази таблица помага да изберете по-подходящия подход за конкретния ви случай:

Фактор Fine-tuning Обучение от нулата
Размер на набора от данни Работи добре с по-малки набори (5-20 часа)
При някои гласове може да даде полезни резултати и с 1-2 часа
Обикновено изисква по-големи набори (30+ часа)
Под 20 часа често води до по-слабо качество
Сходство на гласа Най-подходящ е, когато целевият глас прилича на гласовете в предварително обучения модел По-добър е, когато целевият глас е много специфичен или силно различен
Език Работи добре при fine-tuning в рамките на същия език
Може да сработи и между езици при добра подготовка
Нужен е, когато няма подходящи предварително обучени модели за езика
Улавя по-добре езиково-специфичната фонетика
Време за обучение Значително по-бърз (дни вместо седмици)
Изисква по-малко epochs за сходимост
Изисква много повече време
Може да трябват 2 до 5 пъти повече epochs
Хардуерни изисквания Подобни GPU изисквания, но за по-кратко време
Често понася и по-малки batch size стойности
Иска устойчив достъп до GPU за по-дълъг период
Се възползва повече от multi-GPU конфигурации
Потенциал за качество Може бързо да даде много добро качество
Може да наследи ограниченията на базовия модел
Дава максимална гъвкавост и потенциал за качество
Няма ограничения от предишно обучение
Стабилност Обикновено е по-стабилен процес
По-рядко се срива или не достига сходимост
По-чувствителен е към hyperparameter-и
Има по-висок риск от нестабилност

Кога да изберете fine-tuning

  • Имате ограничени данни
  • Искате по-бързи резултати
  • Работите с глас или език, близък до наличен предварително обучен модел
  • Имате ограничени изчислителни ресурси
  • Нови сте в TTS обучението, защото fine-tuning обикновено е по-прощаващ

Кога да изберете обучение от нулата

  • Имате много данни (30+ часа)
  • Целевият глас е много специфичен или има особености, които липсват в наличните базови модели
  • Нямате добър базов модел за вашия език
  • Искате максимален контрол върху всички аспекти на модела
  • Имате достъп до сериозни изчислителни ресурси
  • Изграждате базов модел, който други по-късно ще донастройват

Особености при fine-tuning

Fine-tuning използва силен предварително обучен модел и го адаптира към вашия конкретен набор от данни, било то глас, език или стил. Обикновено е по-бърз и изисква по-малко данни от обучението от нулата.

Целта

  • Да прехвърлите общите способности за речев синтез на базовия модел, като връзка между текст и звук и базова просодия, докато адаптирате гласовата идентичност и евентуално акцент или стил към по-малкия си набор от данни.

Ключови разлики в конфигурацията

  • pretrained_model_path: Задължително трябва да зададете пътя до checkpoint файла на предварително обучения модел в конфигурацията.
  • fine_tuning: True: Активирайте всеки флаг за fine-tuning режим, ако рамката го изисква.
  • Learning rate: Започнете с по-нисък learning rate от този за обучение от нулата, например 1e-5, 2e-5 или 5e-5. Висок learning rate може да унищожи ценната информация от базовия модел.
  • Batch size: Често може да е подобен на този при обучение от нулата, но трябва да се съобрази с наличната VRAM.
  • Epochs: Обикновено са значително по-малко от обучението от нулата, но пак зависят от размера на набора и желаното качество. Наблюдавайте внимателно validation loss и аудио sample-ите.

Стратегии за fine-tuning

  • Пълно fine-tuning на мрежата: Най-често срещаният подход е да се обновяват теглата в цялата мрежа, но с нисък learning rate.
  • Замразяване на слоеве: Някои рамки позволяват в началото да замразите части от мрежата, като текстов encoder или duration predictor, и да обучавате само конкретни компоненти. Проверете документацията за --freeze_layers или подобна настройка.
  • Игнориране или преинициализация на слоеве: Понякога е полезно при зареждане на предварително обучения модел да игнорирате (ignore_layers) или преинициализирате (reinitialize_layers) последния output layer или speaker embedding layer, особено ако вашият dataset има различен брой говорители.

Какво да следите по време на fine-tuning

  • Бързо начално подобрение: Validation loss обикновено трябва да пада сравнително бързо в началото.
  • Възприемано качество: Слушайте validation sample-ите. Гласът трябва да започне да се доближава до целевия говорител, без да губи яснота и стабилност.
  • Стабилност: Следете за артефакти, повторения или влошаване при продължително обучение.

Fine-tuning често е повече въпрос на възприемано качество, отколкото на достигане на абсолютно най-ниската loss стойност.


Ръководство за проблеми при обучение

Обучението на TTS модели може да бъде трудно и да доведе до различни проблеми. Следващите раздели дават насоки за най-често срещаните случаи.

Чести грешки и какво обикновено означават

Грешка Възможни причини Решения
CUDA out of memory Твърде голям batch size
Моделът е твърде тежък за GPU
Теч или натиск в паметта
Намалете batch size
Включете gradient checkpointing
Използвайте mixed precision
Намалете дължината на последователностите
RuntimeError: Expected tensor for argument #1 'indices' to have scalar type Long Неправилен тип данни в dataset-а
Несъвместими tensor типове
Проверете preprocessing-а
Уверете се, че всички tensor-и са с правилния dtype
Добавете явна конверсия на тип
ValueError: too many values to unpack Разминаване между изхода на модела и очакванията на loss функцията
Грешен формат на данните
Проверете структурата на изхода на модела
Проверете имплементацията на loss функцията
Дебъгнете изхода на data loader-а
FileNotFoundError: [Errno 2] No such file or directory Грешни пътища в конфигурацията
Липсващи файлове с данни
Проверете всички пътища
Проверете целостта на manifest файловете
Уверете се, че всички данни са изтеглени и разархивирани
KeyError: 'speaker_id' Липсва speaker информация
Грешен формат на dataset-а
Проверете формата на dataset-а
Проверете speaker mapping файла
Добавете speaker информация в manifest файла
Loss is NaN Твърде висок learning rate
Нестабилна инициализация
Експлозия на градиентите
Намалете learning rate
Добавете gradient clipping
Проверете за деление на нула
Нормализирайте входните данни
ModuleNotFoundError: No module named 'X' Липсваща зависимост
Проблем в средата
Инсталирайте липсващия пакет
Проверете виртуалната среда
Проверете версиите на пакетите
RuntimeError: expected scalar type Float but found Double Несъответстващи tensor типове Добавете .float() към tensor-ите
Проверете preprocessing-а
Уеднаквете dtype-а в целия модел

Проблеми с качеството

Симптом Възможни причини Решения
Роботизиран или бръмчащ звук Проблеми с vocoder-а
Недостатъчно обучение
Лош audio preprocessing
Обучавайте vocoder-а по-дълго
Проверете audio normalization
Потвърдете consistency на sampling rate
Пропуснати или повторени думи Attention проблеми
Нестабилно обучение
Недостатъчно данни
Използвайте guided attention loss
Добавете повече разнообразие в данните
Намалете learning rate
Търсете дълги тишини в dataset-а
Неправилно произношение Проблеми с текстова нормализация
Фонемни грешки
Езиково разминаване
Подобрете text preprocessing-а
Използвайте phoneme-based input
Добавете pronunciation dictionary
Загуба на идентичността на говорителя Overfitting към доминиращ speaker
Слаби speaker embeddings
Недостатъчно данни за speaker-а
Балансирайте speaker данните
Увеличете размерността на speaker embedding-а
Прегледайте multi-speaker стратегията
Бавна сходимост Проблеми с learning rate-а
Лоша инициализация
Сложен dataset
Пробвайте различни learning rate schedules
Използвайте transfer learning
Опростете dataset-а в началото
Нестабилно обучение Голяма вариация между batch-овете
Outlier-и в dataset-а
Проблеми с optimizer-а
Използвайте gradient accumulation
Почистете outlier sample-ите
Пробвайте друг optimizer

Проблеми, специфични за рамката и средата

Coqui TTS

# Error: "RuntimeError: Error in applying gradient to param_name"
# Решение: Проверете за NaN стойности в dataset-а или намалете learning rate
python -c "import torch; torch.autograd.set_detect_anomaly(True)"  # Стартирайте това преди обучението за дебъг
# Error: "ValueError: Tacotron training requires `r` > 1"
# Решение: Задайте правилно reduction factor в config-а
# Примерна корекция в config.json:
"r": 2  # Пробвайте стойности между 2 и 5

ESPnet

# Error: "TypeError: forward() missing 1 required positional argument: 'feats'"
# Решение: Проверете формата на данните и се уверете, че feats се подават
# Дебъг на зареждането на данни:
python -c "from espnet2.train.dataset import ESPnetDataset; dataset = ESPnetDataset(...); print(dataset[0])"

VITS / StyleTTS

# Error: "RuntimeError: expected scalar type Half but found Float"
# Решение: Поддържайте последователна прецизност в целия модел
# Добавете в скрипта за обучение:
model = model.half()  # Ако използвате mixed precision
# ИЛИ
model = model.float()  # Ако не използвате mixed precision

Хардуерни проблеми и проблеми със средата

  1. Фрагментация на GPU паметта
  2. Симптом: OOM грешки след часове обучение, въпреки че VRAM би трябвало да стига
  3. Решение: Периодично рестартирайте обучението от checkpoint и пробвайте по-малки batch-ове

  4. Ограничение от CPU

  5. Симптом: GPU натоварването е ниско или силно неравномерно
  6. Решение: Увеличете num_workers в DataLoader-а, използвайте по-бързо storage и precache-вайте dataset-а при възможност

  7. Ограничение от дисковия I/O

  8. Симптом: Обучението спира периодично по време на зареждане на данни
  9. Решение: Използвайте SSD, увеличете prefetch factor-а или кеширайте dataset-а в RAM

  10. Конфликти в средата

  11. Симптом: Странни сривове или import грешки
  12. Решение: Използвайте изолирани среди, проверете CUDA/PyTorch съвместимостта и не смесвайте стари инсталации

Допълнителни стратегии за дебъгване

  1. Включете подробно логване: Добавете към скрипта за обучение, ако е нужно:
# Добавете към скрипта за обучение
import logging
logging.basicConfig(level=logging.DEBUG)
  1. Използвайте профилиране с TensorBoard: При нужда профилирайте CPU/GPU времето, за да откриете тесни места:
# Добавете към кода за обучение
from torch.profiler import ProfilerActivity, profile, record_function
with profile(activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA]) as prof:
    with record_function("model_inference"):
        # Вашият forward pass
        pass
print(prof.key_averages().table())

Стратегии за дебъгване

  1. Изолирайте проблема
# Тествайте зареждането на данни отделно
python -c "from your_framework import DataLoader; loader = DataLoader(...); next(iter(loader))"

# Тествайте forward pass с примерни данни
python -c "import torch; from your_model import Model; model = Model(); x = torch.randn(1, 100); model(x)"
  1. Опростете, за да намерите проблема
  2. Пуснете обучение върху много малък и чист поднабор
  3. Временно изключете аугментацията
  4. Използвайте по-малка конфигурация, ако рамката го позволява

  5. Проверявайте междинните артефакти

  6. Гледайте attention alignment-и, mel spectrogram-и, логове и validation sample-и
  7. Проверете дали проблемът е налице още от началото или се появява след няколко checkpoint-а

  8. Добавете повече видимост

  9. Активирайте по-подробно логване, ако е налично
  10. Записвайте повече междинни sample-и
  11. Използвайте torch.autograd.set_detect_anomaly(True) само докато дебъгвате, а не като постоянна настройка за обучение

След като обучението е стартирано и се наблюдава правилно, следващата стъпка е да изберете добър checkpoint и да използвате модела за генериране на реч от нов текст.