Triton runtime produces repetitive non-speech audio with custom F5-TTS checkpoint (SWivid default works)

#32
by MaxViksna - opened

Окружение

  • GPU: NVIDIA GeForce RTX 4090 (24GB), CC 8.9
  • ОС/контейнер: образ, собранный из Dockerfile.server из src/f5_tts/runtime/triton_trtllm
  • Triton Server: 2.53.0
  • TensorRT: 10.7.0
  • TRT-LLM: 0.16.0
  • PyTorch: 2.5.1 (по логу экспорта ONNX)
  • Python: 3.12
  • Дополнительно: установлено cuda-python==12.6 (иначе ImportError: cannot import name 'cudart', см. ссылку)

Модель

  • Базовая модель из HF: SWivid/F5-TTS — работает корректно через Triton
    • https://huggingface.co/SWivid/F5-TTS/tree/main
  • Кастомная модель (русская):
    • Чекпойнт: Misha24-10/F5-TTS_RUSSIAN/F5TTS_v1_Base_v2/model_last.pt
    • https://huggingface.co/Misha24-10/F5-TTS_RUSSIAN/tree/main/F5TTS_v1_Base_v2

Что хотел получить

  • Тот же корректный синтез, что и при локальном запуске CLI/питон-бекенда, но через Triton runtime (TRT-LLM).

Что получил фактически

  • Triton сервер стартует без ошибок, инференс идёт, но на выходе — повторяющиеся однообразные звуки без слов (полный «мусор»).
  • С дефолтной моделью SWivid через Triton всё хорошо.
  • С тем же кастомным чекпойнтом вне Triton (CLI/локально) синтез корректный.

Полные шаги воспроизведения

  1. Сборка образа:
docker build . -f Dockerfile.server -t soar97/triton-f5-tts:24.12
  1. Запуск контейнера:
docker run --gpus all --rm -it --net host \
  -v /home/user/viksna/local-voice-ai-v2/f5-tts-assets:/assets \
  -v /home/user/viksna/local-voice-ai-v2/triton_models:/out \
  -v /home/user/viksna/F5-TTS:/F5-TTS \
  --shm-size=2g soar97/triton-f5-tts:24.12 bash
  1. В контейнере:
pip3 install cuda-python==12.6
cd /F5-TTS/src/f5_tts/runtime/triton_trtllm
# подготовка и запуск:
bash run.sh 0 4 F5TTS_v1_Base_v2
  1. Тестовый запрос (HTTP):
python3 client_http.py \
  --reference-audio=/home/user/viksna/local-voice-ai-v2/f5-tts-assets/ref_max.wav \
  --reference-text="Солнце жёлтое. Море синее. Небо голубое. Космос чёрный. Кошка каричневая. Машина белая. Огонь оранжевый." \
  --target-text="Солнце жёлтое. Море синее. Небо голубое. Космос чёрный. Кошка каричневая. Машина белая. Огонь оранжевый." \
  --model-name="f5_tts"

Конфигурация Triton, важные моменты

  • model_repo/f5_tts/config.pbtxt указывает на:
    • model_path: ./F5-TTS/F5TTS_v1_Base_v2/model_last.pt
    • vocab_file: ./F5-TTS/F5TTS_v1_Base/vocab.txt (я также пробовал подставлять свой точный русский vocab.txt, используемый в рабочем CLI; см. ниже)
    • tllm_model_dir: ./f5_trt_llm_engine
    • vocoder: vocos
  • Vocos план успешно экспортируется и создаётся.
  • TRT-движок строится без ошибок (много warning про dtype, но без фейлов).

Что уже попробовал

  • Синхронизировал vocab.txt:
    • Убрал дефолтные словари и во всех местах (и в Triton, и в локальной среде) использую ровно один и тот же vocab.txt, с которым локальный CLI даёт корректный синтез.
    • Проверил, что config.pbtxt реально указывает на этот файл.
  • Пробовал менять nfe_steps (до 32) — не помогает (и ожидаемо: это влияет на качество/стабильность, но не исправляет «мусорные» токены).
  • Убедился, что в model_path используется model_last.pt (EMA), а не model_last_inference.safetensors.
  • Референс-аудио/текст — ровно те же, что дают корректный результат в локальном CLI.

Логи/артефакты из запуска

  • TRT-LLM build (успешно), множество предупреждений вида:
    • Parameter dtype is None, using default dtype: DataType.FLOAT ...
    • Provided but not required tensors: {... text_embed.* ...}
  • Triton сервер:
    • f5_tts и vocoder в статусе READY, HTTP на 8000, gRPC на 8001, метрики на 8002.
  • При инференсе выход — повторяющиеся однообразные звуки без слов.

Почему считаю, что дело в конвертации под TRT-LLM

  • Тот же чекпойнт + тот же словарь + те же референсы локально (CLI/питон-бекенд) работают корректно.
  • В Triton с дефолтной моделью SWivid звук хороший (значит сам пайплайн запросов ок).
  • На стороне Triton-модели mel-спека и токенизация соответствуют стандартной конфигурации (Vocos 24k, 100 мелов, hop 256, win 1024; токены формируются из конкатенации ref+target по vocab.txt). Если словарь правильный, и CLI на нём работает, но именно TRT-движок даёт мусор — вероятен сбой в scripts/convert_checkpoint.py/builder.

Гипотезы

  • Несовместимость/особенности кастомного чекпойнта с текущим convert_checkpoint.py (name mapping, EMA, dtype, head scaling и т.п.) — в итоге TRT-движок выдаёт некорректный mel.
  • Отличия в архитектурных деталях/токенизаторе у чужого дообученного чекпойнта (например, размер/состав словаря, на который не рассчитаны текущие скрипты конвертации), несмотря на то, что локальный PyTorch-инференс проходит.

возможно это будет интересно https://github.com/SWivid/F5-TTS/compare/main...CallmeZhangChenchen:F5-TTS:opt_trtllm_v1_support

не работает всё равно, как бы Я не правил model.py и config.pbtxt падение с ошибкой:

I1008 11:48:10.005858 3598 grpc_server.cc:2558] "Started GRPCInferenceService at 0.0.0.0:8001"
I1008 11:48:10.006029 3598 http_server.cc:4725] "Started HTTPService at 0.0.0.0:8000"
I1008 11:48:10.047449 3598 http_server.cc:358] "Started Metrics Service at 0.0.0.0:8002"
W1008 11:48:11.011164 3598 metrics.cc:662] "Unable to get power usage for GPU 0. Status:Success, value:0.000000"
W1008 11:48:11.011186 3598 metrics.cc:686] "Unable to get energy consumption for GPU 0. Status:Success, value:0"
W1008 11:48:12.014866 3598 metrics.cc:662] "Unable to get power usage for GPU 0. Status:Success, value:0.000000"
W1008 11:48:12.014940 3598 metrics.cc:686] "Unable to get energy consumption for GPU 0. Status:Success, value:0"
W1008 11:48:13.015869 3598 metrics.cc:662] "Unable to get power usage for GPU 0. Status:Success, value:0.000000"
W1008 11:48:13.015909 3598 metrics.cc:686] "Unable to get energy consumption for GPU 0. Status:Success, value:0"
batch 1
Signal (11) received.
 0# 0x000061F0F0F06B48 in tritonserver
 1# 0x000072F73C7F0330 in /lib/x86_64-linux-gnu/libc.so.6

Segmentation fault
[email protected]:/workspace/F5-TTS/src/f5_tts/runtime/triton_trtllm$ I1008 11:48:22.385673 3646 pb_stub.cc:2145]  Non-graceful termination detected. 

Удалось в итоге запустить? Или не стоит даже начинать?

Sign up or log in to comment