Ръководство за обучение и фина настройка на TTS модел¶
Подготвили сте данните и средата за работа. Сега е време да обучите или донастроите своя TTS модел, като стартирате процеса на обучение, наблюдавате напредъка и управлявате checkpoint файловете безопасно.
Ако някой термин за обучение е неясен, използвайте речника. Тук са обяснени само термините, които пряко влияят върху стартирането, наблюдението или дебъгването на обучението.
Стартиране на обучението¶
Тази част описва как да стартирате, следите и управлявате обучението.
Стартиране на скрипта за обучение¶
- Влезте в правилната директория: Отворете терминал и се преместете в главната директория на избраната TTS рамка, където е
train.pyили еквивалентният скрипт. -
Активирайте виртуалната среда: Уверете се, че правилната Python среда е активна.
-
Стартирайте обучението: Подайте вашия персонализиран 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.
Първа проверка на пълното стартиране¶
Преди да оставите задачата за обучение да върви с часове или дни, проверете в първите няколко минути:
- скриптът за обучение минава началната фаза и започва да зарежда реални batch-ове
- изходната директория започва да получава логове, checkpoints или event файлове
- loss стойностите изглеждат като нормални числа, а не
NaNилиinf - GPU паметта се стабилизира вместо да расте до моментален срив
Ако задачата се счупи още тук, оправете това първо. Счупените първи пет минути често означават изгубен цял ден.
Наблюдение на напредъка¶
- Конзолен изход: Следете:
- инициализацията на модела и data loader-ите
- текущ epoch или step
train_lossиvalidation_loss- learning rate
- време за step или epoch
-
TensorBoard: Ако е активиран в config файла, стартирайте го в отделен терминал.
Отворете 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
Хардуерни проблеми и проблеми със средата¶
- Фрагментация на GPU паметта
- Симптом: OOM грешки след часове обучение, въпреки че VRAM би трябвало да стига
-
Решение: Периодично рестартирайте обучението от checkpoint и пробвайте по-малки batch-ове
-
Ограничение от CPU
- Симптом: GPU натоварването е ниско или силно неравномерно
-
Решение: Увеличете
num_workersв DataLoader-а, използвайте по-бързо storage и precache-вайте dataset-а при възможност -
Ограничение от дисковия I/O
- Симптом: Обучението спира периодично по време на зареждане на данни
-
Решение: Използвайте SSD, увеличете prefetch factor-а или кеширайте dataset-а в RAM
-
Конфликти в средата
- Симптом: Странни сривове или import грешки
- Решение: Използвайте изолирани среди, проверете CUDA/PyTorch съвместимостта и не смесвайте стари инсталации
Допълнителни стратегии за дебъгване¶
- Включете подробно логване: Добавете към скрипта за обучение, ако е нужно:
- Използвайте профилиране с 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())
Стратегии за дебъгване¶
- Изолирайте проблема
# Тествайте зареждането на данни отделно
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)"
- Опростете, за да намерите проблема
- Пуснете обучение върху много малък и чист поднабор
- Временно изключете аугментацията
-
Използвайте по-малка конфигурация, ако рамката го позволява
-
Проверявайте междинните артефакти
- Гледайте attention alignment-и, mel spectrogram-и, логове и validation sample-и
-
Проверете дали проблемът е налице още от началото или се появява след няколко checkpoint-а
-
Добавете повече видимост
- Активирайте по-подробно логване, ако е налично
- Записвайте повече междинни sample-и
- Използвайте
torch.autograd.set_detect_anomaly(True)само докато дебъгвате, а не като постоянна настройка за обучение
След като обучението е стартирано и се наблюдава правилно, следващата стъпка е да изберете добър checkpoint и да използвате модела за генериране на реч от нов текст.