2026-04-17 19:10:02 +08:00
# Ming-flash-omni 2.0
## Installation
Please refer to [README.md ](../../../README.md )
2026-04-23 12:04:52 +08:00
## Deployment modes
| Mode | Launch command | Output |
|------|---------------|--------|
2026-05-03 10:43:49 +08:00
| Thinker + Talker (omni-speech, default) | `vllm serve ... --omni` | Text + Audio |
| Thinker only (multimodal understanding) | `vllm serve ... --omni --deploy-config vllm_omni/deploy/ming_flash_omni_thinker_only.yaml` | Text |
2026-05-27 23:21:20 +08:00
| Thinker + Imagegen (text-to-image / img2img) | `vllm serve ... --omni --stage-configs-path vllm_omni/model_executor/stage_configs/ming_flash_omni_dual.yaml` | Image |
2026-04-23 12:04:52 +08:00
2026-05-05 13:36:16 -04:00
For standalone TTS (talker only), see the [Ming-flash-omni-TTS section in the Text-To-Speech hub ](../text_to_speech/README.md#ming-flash-omni-tts ).
2026-04-23 12:04:52 +08:00
2026-04-17 19:10:02 +08:00
## Run examples (Ming-flash-omni 2.0)
### Launch the Server
2026-05-03 10:43:49 +08:00
**Thinker + Talker (omni-speech, text + audio output):**
2026-04-17 19:10:02 +08:00
```bash
vllm serve Jonathan1909/Ming-flash-omni-2.0 --omni --port 8091
```
2026-05-03 10:43:49 +08:00
The model registry auto-loads corresponding deploy yaml.
**Thinker-only (text output):**
2026-04-17 19:10:02 +08:00
```bash
2026-04-23 12:04:52 +08:00
vllm serve Jonathan1909/Ming-flash-omni-2.0 --omni --port 8091 \
2026-05-03 10:43:49 +08:00
--deploy-config vllm_omni/deploy/ming_flash_omni_thinker_only.yaml
2026-04-17 19:10:02 +08:00
```
2026-05-03 10:43:49 +08:00
Pass `--deploy-config /path/to/your_deploy.yaml` to use a custom deploy
2026-04-23 12:04:52 +08:00
config.
2026-04-17 19:10:02 +08:00
### Send Multi-modal Request
2026-04-23 12:04:52 +08:00
Shared Python client (supports `text | use_image | use_audio | use_video |
use_mixed_modalities` ; pass `--image-path` / `--audio-path` / `--video-path`
for local files or URLs, `--modalities text` for output, `--help` for the
full flag list):
2026-04-17 19:10:02 +08:00
```bash
2026-04-23 12:04:52 +08:00
python examples/online_serving/openai_chat_completion_client_for_multimodal_generation.py \
--model Jonathan1909/Ming-flash-omni-2.0 \
--query-type use_mixed_modalities \
--port 8091 --host localhost \
--modalities text
2026-04-17 19:10:02 +08:00
```
2026-04-23 12:04:52 +08:00
Parameterized curl wrapper in this directory:
2026-04-17 19:10:02 +08:00
```bash
bash run_curl_multimodal_generation.sh text
bash run_curl_multimodal_generation.sh use_image
bash run_curl_multimodal_generation.sh use_audio
bash run_curl_multimodal_generation.sh use_video
bash run_curl_multimodal_generation.sh use_mixed_modalities
2026-05-27 23:21:20 +08:00
bash run_curl_multimodal_generation.sh use_image_gen
2026-04-17 19:10:02 +08:00
```
2026-05-27 23:21:20 +08:00
## Image generation (text-to-image)
Ming-flash-omni-2.0 also exposes an image-generation (diffusion) stage.
Launch with the dual-stage YAML, which adds an image-gen stage behind the
thinker:
```bash
vllm serve Jonathan1909/Ming-flash-omni-2.0 --omni \
--stage-configs-path vllm_omni/model_executor/stage_configs/ming_flash_omni_dual.yaml \
--stage-init-timeout 1800 \
--port 8188
```
Then request image output by passing `"modalities": ["image"]` :
```bash
curl http://127.0.0.1:8188/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Jonathan1909/Ming-flash-omni-2.0",
"messages": [{"role": "user", "content": "Draw a beautiful girl with short black hair and red dress."}],
"modalities": ["image"]
}' -o /tmp/ming_response.json
python - <<'PY'
import base64, json
r = json.load(open('/tmp/ming_response.json'))
url = r['choices'][0]['message']['content'][0]['image_url']['url']
open('/tmp/ming_gen.png', 'wb').write(base64.b64decode(url.split(',', 1)[1]))
print('saved /tmp/ming_gen.png')
PY
```
### Optional knobs
Pass image-gen overrides via the diffusion-stage `sampling_params_list[1].extra_args.image_gen` :
| Key | Default | Description |
| --- | --- | --- |
| `height` / `width` | from config (1024) | Output resolution (multiples of `vae_scale_factor * 2` , currently 16). |
| `steps` | 30 | Number of FlowMatchEuler denoise steps. |
| `cfg` | 2.0 | Classifier-free guidance scale. |
| `seed` | 42 | Per-request RNG seed (deterministic when ByT5 is also seed-stable). |
| `byte5_text` | (auto) | Override the glyph text for ByT5 enhancement; raw strings are auto-wrapped to Ming's `Text "...". ` format. |
| `negative_prompt` | empty | Real CFG negative conditioning (must be set on **stage-0 thinker** `sampling_params` so `expand_cfg_prompts` spawns the companion). |
Example with all the knobs:
```bash
curl http://127.0.0.1:8188/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Jonathan1909/Ming-flash-omni-2.0",
"modalities": ["image"],
"sampling_params_list": [
{"temperature":0.4,"top_p":0.9,"top_k":1,"max_tokens":1,"seed":42,
"extra_args":{"image_gen":{"negative_prompt":"ugly, blurry, distorted"}}},
{"seed":42,"extra_args":{"image_gen":{
"steps":6,"cfg":1.5,"height":512,"width":512,"seed":123,
"byte5_text":["理解与生成统一"]}}}
],
"messages": [{"role": "user", "content": "Draw a poster."}]
}' -o /tmp/ming_response.json
```
### img2img (reference image)
Add an `image_url` content part to the user message; the parser routes it
into the diffusion stage as `extra[reference_image]` :
```jsonc
"messages" : [{
"role" : "user" ,
"content" : [
{ "type" : "text" , "text" : "Change the background to a sandy beach at sunset." },
{ "type" : "image_url" , "image_url" : { "url" : "data:image/png;base64,<base64>" }}
]
}]
```
### GPU layout
The shipped `ming_flash_omni_dual.yaml` allocates the thinker on GPUs 0– 3
(TP=4) and the diffusion stage on GPU 4 (TP=1). Copy the YAML and edit
`runtime.devices` per stage to relocate; with fewer GPUs available, drop
the thinker TP to 2 and run the diffusion stage on a free card. Image-gen
warmup takes roughly an extra 30– 60 s on top of the thinker — set
`--stage-init-timeout 1800` if the default 300 s is too tight.
2026-04-17 19:10:02 +08:00
## Modality control
2026-04-23 12:04:52 +08:00
| `modalities` | Server config | Output |
|-------------|--------------|--------|
| `["text"]` or omitted | Thinker only | Text |
| `["audio"]` | Thinker + Talker | Audio (speech) |
| `["text", "audio"]` | Thinker + Talker | Text + Audio |
2026-05-27 23:21:20 +08:00
| `["image"]` | Thinker + Imagegen (dual YAML) | Image (PNG, base64 in `choices[0].message.content` ) |
2026-04-17 19:10:02 +08:00
2026-04-23 12:04:52 +08:00
For ready-to-copy curl examples (text / audio / multimodal input, SSE
streaming, reasoning mode), see the recipe at
[`recipes/inclusionAI/Ming-flash-omni-2.0.md` ](../../../recipes/inclusionAI/Ming-flash-omni-2.0.md ).
2026-04-17 19:10:02 +08:00
2026-04-23 12:04:52 +08:00
## OpenAI Python SDK — streaming
2026-04-17 19:10:02 +08:00
```python
from openai import OpenAI
client = OpenAI ( base_url = "http://localhost:8091/v1" , api_key = "EMPTY" )
response = client . chat . completions . create (
model = "Jonathan1909/Ming-flash-omni-2.0" ,
messages = [
{ "role" : "system" , "content" : [{ "type" : "text" , "text" : "你是一个友好的AI助手。 \n\n detailed thinking off" }]},
{ "role" : "user" , "content" : "请详细介绍鹦鹉的生活习性。" },
],
modalities = [ "text" ],
stream = True ,
)
for chunk in response :
for choice in chunk . choices :
if hasattr ( choice , "delta" ) and choice . delta . content :
print ( choice . delta . content , end = "" , flush = True )
print ()
```
2026-04-23 12:04:52 +08:00
The `--stream` flag on the Python client script above shows the same pattern
driven by the shared multimodal client.