Signed-off-by: Yueqian Lin <linyueqian@outlook.com> Signed-off-by: Sy0307 <24841857+Sy0307@users.noreply.github.com> Co-authored-by: Sy0307 <24841857+Sy0307@users.noreply.github.com>
91 lines
3.0 KiB
YAML
91 lines
3.0 KiB
YAML
# PersonaPlex deploy: talker -> code2wav (Mimi) via shared-memory chunk streaming.
|
|
#
|
|
# PersonaPlex is a Moshi finetune (full-duplex S2S), served offline as a 2-stage
|
|
# audio->audio pipeline that reuses the Qwen3-TTS staged deploy layout. Fields
|
|
# omitted from a stage fall back to StageDeployConfig defaults (see
|
|
# vllm_omni/config/stage_config.py).
|
|
#
|
|
# Notable choices for this model:
|
|
# * Stage 0 (talker) keeps a small max_num_batched_tokens for async-chunk
|
|
# first-chunk latency (not correctness).
|
|
# * Stage 1 (code2wav) wraps the external Mimi codec. Each codec frame is
|
|
# 8 active codebooks (cb 0..7) -> 1920 PCM samples @ 24 kHz / 12.5 Hz.
|
|
# * Stage 0 runs cudagraph by default; Stage 1 (Mimi) is eager because the
|
|
# external decoder performs host-to-device copies that cannot be captured.
|
|
pipeline: personaplex
|
|
session_mode: duplex
|
|
duplex_session:
|
|
max_sessions: 2
|
|
|
|
async_chunk: true
|
|
|
|
connectors:
|
|
connector_of_shared_memory:
|
|
name: SharedMemoryConnector
|
|
extra:
|
|
shm_threshold_bytes: 65536
|
|
codec_streaming: true
|
|
connector_get_sleep_s: 0.01
|
|
connector_get_max_wait_first_chunk: 3000
|
|
connector_get_max_wait: 300
|
|
# Mimi runs at 12.5 Hz (80 ms / frame). Stream a few frames per chunk.
|
|
codec_chunk_frames: 5
|
|
codec_left_context_frames: 10
|
|
# Emit only the first audio chunk early, then return to codec_chunk_frames.
|
|
initial_codec_chunk_frames: 1
|
|
|
|
stages:
|
|
- stage_id: 0
|
|
max_num_seqs: 10
|
|
gpu_memory_utilization: 0.4
|
|
trust_remote_code: true
|
|
skip_tokenizer_init: true
|
|
# Prompt IDs are placeholders; voice/persona/audio semantics live in
|
|
# request-specific embeddings, so token-ID prefix caching is invalid.
|
|
enable_prefix_caching: false
|
|
async_scheduling: true
|
|
max_num_batched_tokens: 512
|
|
# Temporal transformer sliding_window is 3000 frames; keep model len within.
|
|
max_model_len: 3000
|
|
devices: "0"
|
|
output_connectors:
|
|
to_stage_1: connector_of_shared_memory
|
|
default_sampling_params:
|
|
# Greedy talker decoding: the HeliumModel temporal matches Moshi within cos
|
|
# 0.999 (not bit-exact), and chaotic sampling amplifies that into divergence.
|
|
# Greedy is reliably coherent; raise temperature only once the temporal is
|
|
# bit-exact.
|
|
temperature: 0.0
|
|
top_k: 1
|
|
max_tokens: 3000
|
|
seed: 42
|
|
repetition_penalty: 1.0
|
|
|
|
- stage_id: 1
|
|
max_num_seqs: 10
|
|
gpu_memory_utilization: 0.3
|
|
enforce_eager: true
|
|
trust_remote_code: true
|
|
skip_tokenizer_init: true
|
|
enable_prefix_caching: false
|
|
async_scheduling: true
|
|
# Codec prefill length is num_codebooks * num_frames; keep ample headroom.
|
|
max_num_batched_tokens: 65536
|
|
max_model_len: 65536
|
|
devices: "0"
|
|
input_connectors:
|
|
from_stage_0: connector_of_shared_memory
|
|
default_sampling_params:
|
|
temperature: 0.0
|
|
top_p: 1.0
|
|
top_k: -1
|
|
max_tokens: 65536
|
|
seed: 42
|
|
repetition_penalty: 1.0
|
|
|
|
platforms:
|
|
npu:
|
|
stages:
|
|
- stage_id: 0
|
|
enforce_eager: false
|