Files
vllm-omni/vllm_omni/deploy/personaplex.yaml
T

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