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-30 16:13:21 +08:00
|
|
|
|
| Thinker + Imagegen (text-to-image / img2img) | `vllm serve ... --omni --deploy-config vllm_omni/deploy/ming_flash_omni_image.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.
|
2026-05-30 16:13:21 +08:00
|
|
|
|
Launch with the image deploy YAML, which adds an image-gen stage behind
|
|
|
|
|
|
the thinker:
|
2026-05-27 23:21:20 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
vllm serve Jonathan1909/Ming-flash-omni-2.0 --omni \
|
2026-05-30 16:13:21 +08:00
|
|
|
|
--deploy-config vllm_omni/deploy/ming_flash_omni_image.yaml \
|
2026-05-27 23:21:20 +08:00
|
|
|
|
--stage-init-timeout 1800 \
|
2026-05-30 16:13:21 +08:00
|
|
|
|
--init-timeout 1800 \
|
|
|
|
|
|
--port 8091
|
2026-05-27 23:21:20 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Then request image output by passing `"modalities": ["image"]`:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-05-30 16:13:21 +08:00
|
|
|
|
curl -s http://127.0.0.1:8091/v1/chat/completions \
|
2026-05-27 23:21:20 +08:00
|
|
|
|
-H "Content-Type: application/json" \
|
|
|
|
|
|
-d '{
|
|
|
|
|
|
"model": "Jonathan1909/Ming-flash-omni-2.0",
|
2026-05-30 16:13:21 +08:00
|
|
|
|
"messages": [{"role": "user", "content": "Please draw a cute cat."}],
|
2026-05-27 23:21:20 +08:00
|
|
|
|
"modalities": ["image"]
|
2026-05-30 16:13:21 +08:00
|
|
|
|
}' | jq -r '.choices[0].message.content[0].image_url.url | split(",")[1]' | base64 -d > ming_imagegen.png
|
2026-05-27 23:21:20 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Optional knobs
|
|
|
|
|
|
|
2026-06-24 17:01:58 +08:00
|
|
|
|
Pass image-gen overrides as flat keys on the diffusion-stage `sampling_params_list[1].extra_args`:
|
2026-05-27 23:21:20 +08:00
|
|
|
|
|
|
|
|
|
|
| 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. |
|
2026-06-24 17:01:58 +08:00
|
|
|
|
| `negative_prompt` | empty | Real CFG negative conditioning (set on **stage-0 thinker** `extra_args` so `expand_cfg_prompts` spawns the companion). |
|
2026-05-27 23:21:20 +08:00
|
|
|
|
|
|
|
|
|
|
Example with all the knobs:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-05-30 16:13:21 +08:00
|
|
|
|
curl http://127.0.0.1:8091/v1/chat/completions \
|
2026-06-24 17:01:58 +08:00
|
|
|
|
-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": {
|
|
|
|
|
|
"negative_prompt": "ugly, blurry, distorted"
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
"seed": 42,
|
|
|
|
|
|
"extra_args": {
|
|
|
|
|
|
"steps": 6,
|
|
|
|
|
|
"cfg": 1.5,
|
|
|
|
|
|
"height": 512,
|
|
|
|
|
|
"width": 512,
|
|
|
|
|
|
"seed": 123,
|
|
|
|
|
|
"byte5_text": ["理解与生成统一"]
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
],
|
|
|
|
|
|
"messages": [
|
|
|
|
|
|
{
|
|
|
|
|
|
"role": "user",
|
|
|
|
|
|
"content": "Draw a poster."
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
}' \
|
|
|
|
|
|
| jq -r '.choices[0].message.content[0].image_url.url | split(",")[1]' \
|
|
|
|
|
|
| base64 -d > ming_imagegen_knobs.png
|
2026-05-27 23:21:20 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 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
|
|
|
|
|
|
|
2026-05-30 16:13:21 +08:00
|
|
|
|
The shipped `ming_flash_omni_image.yaml` allocates the thinker on GPUs 0–3
|
2026-05-27 23:21:20 +08:00
|
|
|
|
(TP=4) and the diffusion stage on GPU 4 (TP=1). Copy the YAML and edit
|
2026-05-30 16:13:21 +08:00
|
|
|
|
`devices` per stage to relocate; with fewer GPUs available, drop
|
2026-05-27 23:21:20 +08:00
|
|
|
|
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-30 16:13:21 +08:00
|
|
|
|
| `["image"]` | Thinker + Imagegen (image deploy 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\ndetailed 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.
|