Музыкальные модели на GPU: генерация и демиксинг
Задача страницы. Инженерный гид по развёртыванию Music ML на GPU: генерация музыки (text/melody/condition‑based), апсемплинг/вокодинг, и демиксинг (stem‑сепарация) для вокала/баса/барабанов/инструментов. Дадим пайплайны (онлайн/батч), таблицу профилей 24/48/80 ГБ, конфиги (Docker/K8s/YAML), наблюдаемость (TTFA/RTF/tokens‑per‑sec/steps‑per‑sec), экономику и траблшутинг. Базовые паттерны: локальный NVMe‑кэш, режимы On‑Demand (низкая латентность) и Interruptible (массовые офлайн‑партии), стриминг через SSE/WebSocket.
TL;DR
-
**Два режима:
-
On‑Demand — интерактивная генерация клипов/лупов и предпросмотр; демиксинг коротких отрывков онлайн.
-
Interruptible — массовая генерация каталога/саундпаков, полнотрековый демиксинг со стемами.
-
Генерация: Text→Tokenizer/Фонемы→Acoustic/Latent→Vocoder/Decoder→Post. Управление: жанр, BPM, тональность, «seed», референс‑аудио, MIDI/аккорды.
-
Демиксинг: STFT/SSL→Masker/Separator→iSTFT→стемы (vocals/bass/drums/other…); overlap‑add, loudness‑match.
-
Ключевые метрики: TTFA_gen (до первого аудиофрейма), RTF_gen/RTF_demix, tokens/sec (AR), steps/sec (diffusion), clipping‑rate, LUFS.
-
Тюнинг: FP16/BF16, фьюзинг, TensorRT/ONNX‑сервинг, кэш токенизации и кондишнов на NVMe. См. https://cloudcompute.ru/solutions/performance-tuning/, https://cloudcompute.ru/solutions/fp8-bf16/, https://cloudcompute.ru/solutions/throughput-vs-latency/
-
Экономика: Cost_per_min = (c_gpu * RTF / U) / 60; для демикса многостемного: RTF_total ≈ Σ RTF_stem или меньше при shared‑encoder.
-
Интеграции: ASR/TTS/VC/энхансмент, пайплайны и мониторинг. См. хабы в конце страницы.
Сценарии (когда это нужно)
- Продакшен/геймдев/медиа: генерация бэков/лупов, вариаций, переходов; пакетный рендер саундпаков.
- Каталоги/стоки: авто‑теги/жанры, генерация в ключе/темпе по промпту; A/B‑пакеты для отбора качества.
- Пост‑продакшен: демиксинг для ремиксов/реставрации/караоке; извлечение вокала, барабанов и т. д.
- Реал‑тайм‑интерактив: предпросмотр и сглаженная догенерация следующего блока (inpainting/continuation) в UI.
- R&D: сравнение стеков (autoregressive/latent diffusion/DDSP‑класс), LoRA‑адаптации под домен.
Архитектуры и пайплайны 1) Генерация (низкая латентность, стриминг блоками 1–4 с)
Prompt (text/MIDI/chords/ref)
└─> Normalize/Tokenize/Cond Cache
└─> GPU: Acoustic/Latent Model (AR или diffusion; stream blocks)
└─> GPU: Vocoder/Decoder (24–48 kHz, FP16/BF16)
└─> Loudness/AGC + Dither
└─> Stream Out (SSE/WebSocket, PCM/Opus)
Особенности: TTFA_gen 0.7–2.0 с (зависит от типа модели/шага диффузии), стабильный буфер 200–500 мс, backpressure, кросс‑фейд 5–10 мс между блоками.
2) Демиксинг (стем‑сепарация, офлайн/онлайн)
Audio In
└─> Preprocess (resample, mono/stereo)
└─> GPU: Encoder (STFT/SSL)
└─> GPU: Separator/Masker (N stems)
└─> iSTFT/Decoder → Stems (vocals/bass/drums/other,...)
└─> Post (loudness match, phase align)
└─> Writer (WAV/FLAC + stems.json)
Особенности: overlap‑add для швов, согласование громкости (LUFS), фазовая согласованность каналов.
3) Сервисная шина (мульти‑тенант)
Ingress ─> Auth ─> Router(by tenant/stack) ─> GPU Pools (24/48/80 ГБ)
└─> Autoscaler (по U/RTF/queue)
└─> Policy (контент/контракты)
GPU‑профили и ориентиры
Оценка одновременных потоков реального времени при целевом U≈0.7. Для батчей масштабируйте по «Экономике».
| **Профиль GPU** | **Память** | **Типичные стеки** | **Реал‑тайм потоки\*** | **Батчи (параллель)** | **Комментарии** |
| 24 ГБ (Compact) | 24 ГБ | AR‑класс + HiFi‑GAN‑класс / лёгкий демикс (2‑4 стема) | 1–2 | 2–6 | Быстрые предпросмотры/лупы; базовый демикс коротких клипов. |
| 48 ГБ (Balanced) | 48 ГБ | Latent/diffusion‑класс + HQ‑вокодер / демикс (4–5 стемов) | 2–4 | 6–12 | Баланс качества и скорости, устойчивый p95. |
| 80 ГБ (HQ) | 80 ГБ | Крупные diffusion‑стэки (48 кГц) / демикс HQ multi‑stem | 4–8 | 12–24 | HQ‑контент, длинные продолжения, сложные материалы. |
* Сильно зависит от частоты дискретизации, длины блока, числа шагов диффузии, числа стемов и пост‑процесса. См. тюнинг: https://cloudcompute.ru/solutions/performance-tuning/, https://cloudcompute.ru/solutions/fp8-bf16/, https://cloudcompute.ru/solutions/throughput-vs-latency/
Конфиги и скелеты кода
Docker Compose (генерация + демиксинг)
version: "3.9"
x-common-env: &env
MODELS_DIR: /models
CACHE_DIR: /var/cache/music
SAMPLE_RATE: "48000"
FRAME_SEC: "2.0" # длина стрим-блока (генерация)
PRECISION: "fp16" # bf16|fp16
STREAM_CODEC: "pcm_s16le" # или opus
DIFFUSION_STEPS: "30" # для diffusion-класса
AR_MAX_TOKENS: "8192" # для AR-класса
DEMIX_STEMS: "vocals,bass,drums,other"
services:
music-gen-rt:
image: cloudcompute/music-gen:latest
environment:
<<: *env
SERVICE_MODE: "realtime"
TTFA_TARGET_MS: "1200"
deploy:
resources:
reservations:
devices: [{ capabilities: ["gpu"] }]
ports: ["8060:8060"]
volumes:
- /nvme/models:/models
- /nvme/music-cache:/var/cache/music
command: ["python", "serve_gen.py", "--host=0.0.0.0", "--port=8060"]
music-demix-batch:
image: cloudcompute/music-demix:latest
environment:
<<: *env
SERVICE_MODE: "batch"
MAX_CHUNK_SECONDS: "120"
OVERLAP_SECONDS: "0.5"
deploy:
resources:
reservations:
devices: [{ capabilities: ["gpu"] }]
volumes:
- /nvme/models:/models
- /nvme/music-cache:/var/cache/music
- /mnt/audio-in:/data/in
- /mnt/stems-out:/data/out
command: ["python", "run_demix.py", "--input=/data/in", "--output=/data/out"]
K8s (скелет, 1 GPU/под)
apiVersion: apps/v1
kind: Deployment
metadata:
name: music-gen-rt
spec:
replicas: 2
selector: { matchLabels: { app: music-gen-rt } }
template:
metadata:
labels: { app: music-gen-rt }
spec:
containers:
- name: gen
image: cloudcompute/music-gen:latest
ports: [{ containerPort: 8060 }]
env:
- { name: PRECISION, value: "fp16" }
- { name: SAMPLE_RATE, value: "48000" }
- { name: FRAME_SEC, value: "2.0" }
- { name: DIFFUSION_STEPS, value: "30" }
volumeMounts:
- { name: models, mountPath: /models }
- { name: cache, mountPath: /var/cache/music }
resources:
limits:
nvidia.com/gpu: 1
memory: "24Gi"
cpu: "4"
volumes:
- name: models
hostPath: { path: /nvme/models }
- name: cache
hostPath: { path: /nvme/music-cache }
Конфиг пайплайна (YAML)
pipeline:
input:
sample_rate: 48000
stereo: true
generation:
mode: "latent_diffusion" # latent_diffusion|autoregressive|ddsp_like
prompt:
text: "uplifting electronic, 120 BPM, key A minor"
bpm: 120
key: "Amin"
seed: 42
controls:
chords_midi: null
style_ref_wav: null
sampler:
steps: 30
guidance: 3.5
stream_blocks_sec: 2.0
vocoder:
type: "hifigan_like" # при AR-режиме
precision: "fp16"
demix:
enabled: true
stems: ["vocals","bass","drums","other"]
separator: "demucs_like" # или mask_unet_like
overlap_sec: 0.5
post:
loudness_target_lufs: -14
dither: true
output:
formats: [wav, stems_json]
stream_codec: pcm_s16le
FastAPI: стриминг генерации (SSE, PCM‑фреймы) и демиксинга (архив стемов)
from fastapi import FastAPI, Body
from sse_starlette.sse import EventSourceResponse
import base64, asyncio, io, zipfile
app = FastAPI()
# --- Generation stream (blocks) ---
async def gen_blocks(prompt_cfg):
async for block in generate_audio(prompt_cfg): # 1–4 s PCM48k stereo
yield base64.b64encode(block).decode("ascii")
@app.post("/music/gen/stream")
async def music_gen_stream(payload: dict = Body(...)):
cfg = payload.get("config", {})
async def event_gen():
async for b64_chunk in gen_blocks(cfg):
yield {"event": "audio", "data": b64_chunk}
yield {"event": "done", "data": "{}"}
return EventSourceResponse(event_gen())
# --- Demix batch (return zip of stems) ---
@app.post("/music/demix")
async def music_demix(payload: dict = Body(...)):
wav = decode_wav(payload["audio_b64"])
stems = run_demix(wav, stems=("vocals","bass","drums","other"))
buf = io.BytesIO()
with zipfile.ZipFile(buf, "w") as z:
for name, audio in stems.items():
z.writestr(f"{name}.wav", encode_wav(audio, sr=48000))
buf.seek(0)
return {"stems_zip_b64": base64.b64encode(buf.read()).decode("ascii")}
Батч‑генерация + A/B‑оценка качества (псевдокод)
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
def render(prompt, cfg):
wav = generate_full(prompt, cfg)
return postprocess(wav, lufs=-14)
def batch_generate(prompts, outdir, cfg_a, cfg_b):
out = Path(outdir); out.mkdir(parents=True, exist_ok=True)
with ThreadPoolExecutor(max_workers=GPU_PARALLEL) as ex:
results_a = list(ex.map(lambda p: render(p, cfg_a), prompts))
results_b = list(ex.map(lambda p: render(p, cfg_b), prompts))
for i, (wa, wb) in enumerate(zip(results_a, results_b)):
write_wav(out/f"trk_{i:05d}_A.wav", wa, sr=48000)
write_wav(out/f"trk_{i:05d}_B.wav", wb, sr=48000)
``` **Наблюдаемость, метрики, алерты**
**Метрики (Prometheus‑стиль):**
- **TTFA\_gen**: music\_ttfa\_seconds{mode=rt} — время до первого блока аудио. Цель p95 ≤ 1.5–2.0 с.
- **RTF\_gen / RTF\_demix**: music\_rtf{mode=rt|batch} — t\_proc / t\_audio.
- **Perf**: music\_tokens\_per\_sec (AR), music\_steps\_per\_sec (diffusion), music\_blocks\_per\_sec.
- **Audio quality/proxy**: music\_loudness\_lufs, music\_clipping\_rate, music\_spectral\_spread, music\_onsets\_per\_min.
- **Stability**: music\_jitter\_ms, music\_buffer\_underrun\_total, music\_drop\_rate.
- **GPU**: music\_gpu\_utilization, music\_gpu\_memory\_bytes, music\_gpu\_mem\_peak\_bytes.
- **I/O**: music\_nvme\_read\_mb\_s, music\_nvme\_write\_mb\_s, hit‑rate кэша токенизации/кондишнов.
**Алерты (примеры):**
- ttfa\_p95 > 2.0s — уменьшить steps, увеличить буфер, включить подогрев.
- rtf\_p95 > 0.8 в real‑time — упростить стек (AR/меньше шагов), снизить SR, добавить GPU.
- clipping\_rate > 0.01 — нормализация/лимитер/порог генерации.
- gpu\_mem\_peak / HBM > 0.9 — уменьшить блок, FP16/BF16, offload, разбить сервисы.
См. хабы: <https://cloudcompute.ru/solutions/monitoring-logging/> • <https://cloudcompute.ru/solutions/llm-inference/observability/>
## **Экономика и формулы**
Обозначения: c\_gpu — цена GPU/час, U — целевая загрузка, RTF\_gen, RTF\_demix.
- **Онлайн‑генерация (стриминг):
GPU\_count = ceil( (Σ RTF\_gen\_streams) / U ).
- **Демиксинг (N стемов):
Если отдельные головы без shared‑encoder:
RTF\_total ≈ Σ\_i RTF\_stem\_i.
При shared‑encoder:
RTF\_total ≈ RTF\_encoder + max\_i RTF\_head\_i.
- **Стоимость минуты аудио:
Cost\_per\_min = (c\_gpu × RTF / U) / 60.
- **Диффузия (оценка RTF):
RTF\_gen ≈ (steps × t\_step) / L\_audio. Уменьшая steps, снижаете качество/детализацию.
- **Батчи:
T\_batch ≈ (RTF × L\_audio\_total) / (GPU\_count × U).
Оптимизация: микс профилей **24/48/80 ГБ** под стек/частоту, батчирование офлайна, NVMe‑кэш кондишнов/эмбеддингов. См. <https://cloudcompute.ru/solutions/cost-planner/> и <https://cloudcompute.ru/solutions/throughput-vs-latency/>
**Безопасность/политики**
- **Контент и права:** храните связи промпт↔аудио↔лицензия, файлы прав/контракты — отдельно; логируйте только необходимые метаданные.
- **Ретеншн:** временные WAV/стемы/эмбеддинги — авто‑очистка по TTL; кэш на NVMe.
- **Изоляция:** раздельные GPU‑пулы по тенантам/стекам; доступ к бакетам по ролям.
- **Секреты:** через Secret‑хранилища/переменные окружения; ротация.
- **Фильтры:** базовая валидация входных промптов/референсов (размер/формат/политики контента).
Подробнее: <https://cloudcompute.ru/solutions/security/> • <https://cloudcompute.ru/solutions/storage-data/>
**Траблшутинг**
<table><tbody><tr><td>**Симптом**
</td><td>**Возможная причина**
</td><td>**Решение**
</td></tr><tr><td>Длинный TTFA
</td><td>Слишком много шагов диффузии/«холодный» сервис
</td><td>Подогрев, уменьшить steps, укрупнить блоки/буфер
</td></tr><tr><td>«Мыльный» звук
</td><td>Низкая частота/агрессивный денойз после вокодера
</td><td>Увеличить SR до 48 кГц, смягчить пост‑фильтры
</td></tr><tr><td>Флэт по громкости
</td><td>Жёсткий лимитер/неверный LUFS
</td><td>Калибровать loudness‑таргет (‑14/‑16 LUFS), мягкий лимитер
</td></tr><tr><td>Повторы/циклы
</td><td>AR‑инстабилити/слишком длинные фразы
</td><td>Ограничить max‑tokens, сброс кэш‑состояния, использовать continuation с «seed»
</td></tr><tr><td>Фазовые артефакты в стемах
</td><td>Неверный overlap‑add/iSTFT
</td><td>Увеличить overlap, согласовать окна, фазовые поправки
</td></tr><tr><td>Утечка инструмента между стемами
</td><td>Недостаточный контекст/маска
</td><td>Увеличить окно, усилить модель/регуляризацию, пост‑маскирование
</td></tr><tr><td>VRAM OOM
</td><td>Высокий SR/длинные блоки/много стемов
</td><td>FP16/BF16, уменьшить блоки, разделить сервисы на разные GPU
</td></tr><tr><td>RTF > SLA
</td><td>Перегрузка модели/IO
</td><td>Снизить steps/сложность, уменьшить SR, добавить GPU, улучшить NVMe/сетку
</td></tr></tbody></table>
См. также: <https://cloudcompute.ru/solutions/performance-tuning/> • <https://cloudcompute.ru/solutions/interruptible-patterns/>
**Как запустить в cloudcompute.ru**
1. Откройте **Шаблоны запусков**: <https://cloudcompute.ru/solutions/templates/>
Выберите **Music Generation (Real‑time)** или **Music Demix (Batch)**.
2. Профиль GPU: **24/48/80 ГБ**. Для интерактива — AR/latent с низкими steps; для HQ офлайна — diffusion‑класс с 48 кГц и большим числом шагов.
3. Диски: смонтируйте /nvme/models, /nvme/music-cache; для батчей — /mnt/audio-in и /mnt/stems-out.
4. Переменные окружения по docker-compose.yml: DIFFUSION\_STEPS, AR\_MAX\_TOKENS, SAMPLE\_RATE, DEMIX\_STEMS.
5. Продакшн: автоскейл по U/RTF/queue, отдельные пулы для генерации и демикса, мониторинг/алерты.
Дополнительно:
[ https://cloudcompute.ru/solutions/triton-inference-server/](https://cloudcompute.ru/solutions/triton-inference-server/) — сервинг через ONNX/TensorRT.
[ https://cloudcompute.ru/solutions/gradio-fastapi/](https://cloudcompute.ru/solutions/gradio-fastapi/) — быстрый UI/эндпойнты.
[ https://cloudcompute.ru/solutions/containers-ci-cd/](https://cloudcompute.ru/solutions/containers-ci-cd/) — сборка и выкладка контейнеров.
[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/) — мониторинг.
[ https://cloudcompute.ru/solutions/llm-inference/observability/](https://cloudcompute.ru/solutions/llm-inference/observability/) — наблюдаемость инференса.
**Чек‑лист перед продом**
- Замерены TTFA\_gen p50/p95, RTF\_gen/RTF\_demix p50/p95, jitter.
- Выбран стек (AR/latent/diffusion) и SR (24/48 кГц) под SLA.
- NVMe‑кэш и каталоги примонтированы; кэш токенизации/кондишнов активен.
- Настроены алерты по TTFA/RTF/HBM/clipping/queue.
- Оверлап/окна для демикса калиброваны; нет швов и фазовых сдвигов.
- Политики контента/ретеншна внедрены; секреты — в Secret‑хранилище.
- Interruptible‑джобы идемпотентны, чанк ≤ 120 с, ретраи настроены.
- Нагрузочный прогон ≥ 30 мин с целевыми p95 и стабильной громкостью.
**Навигация**
- Хаб «Решения»: <https://cloudcompute.ru/solutions/>
- Шаблоны запусков: <https://cloudcompute.ru/solutions/templates/>
- ASR (Whisper/WhisperX): <https://cloudcompute.ru/solutions/asr-whisper/>
- TTS: <https://cloudcompute.ru/solutions/tts/>
- Voice Conversion: <https://cloudcompute.ru/solutions/voice-conversion/>
- Улучшение речи (denoise/demix): <https://cloudcompute.ru/solutions/speech-enhancement/>
- Производительность и тюнинг: <https://cloudcompute.ru/solutions/performance-tuning/>
- Throughput vs Latency: <https://cloudcompute.ru/solutions/throughput-vs-latency/>
- FP8/BF16: <https://cloudcompute.ru/solutions/fp8-bf16/>
- Multi‑GPU: <https://cloudcompute.ru/solutions/multi-gpu/>
- Хранилище и данные: <https://cloudcompute.ru/solutions/storage-data/>
- Безопасность: <https://cloudcompute.ru/solutions/security/>
- Мониторинг и логи: <https://cloudcompute.ru/solutions/monitoring-logging/>
- Наблюдаемость инференса: <https://cloudcompute.ru/solutions/llm-inference/observability/>
- Interruptible‑паттерны: <https://cloudcompute.ru/solutions/interruptible-patterns/>
- Triton Inference Server: <https://cloudcompute.ru/solutions/triton-inference-server/>
- Gradio + FastAPI: <https://cloudcompute.ru/solutions/gradio-fastapi/>
- CI/CD контейнеров: <https://cloudcompute.ru/solutions/containers-ci-cd/>
Готовы запустить?
Запустить GPU-сервер