Signed-off-by: wangyu <410167048@qq.com> Signed-off-by: [Your Name] <your.email@example.com> Co-authored-by: Cursor <cursoragent@cursor.com>
184 lines
5.0 KiB
Python
184 lines
5.0 KiB
Python
"""
|
|
Comprehensive tests of diffusion features that are available in online serving mode
|
|
and are supported by the following model:
|
|
- zai-org/GLM-Image (t2i and i2i)
|
|
|
|
Coverage (per mode):
|
|
- Baseline
|
|
- Cache-DiT
|
|
- Tensor-Parallel
|
|
- HSDP
|
|
- Sequence parallel
|
|
|
|
Topology for multi-GPU cases uses runtime deploy YAML (except TP)
|
|
so stage-1 parallel fields reach the diffusion worker without relying on CLI
|
|
|
|
assert_diffusion_response validates successful generation and the expected resolution.
|
|
"""
|
|
|
|
import os
|
|
|
|
import pytest
|
|
|
|
from tests.helpers.mark import hardware_marks
|
|
from tests.helpers.media import generate_synthetic_image
|
|
from tests.helpers.runtime import (
|
|
OmniServer,
|
|
OmniServerParams,
|
|
OpenAIClientHandler,
|
|
dummy_messages_from_mix_data,
|
|
)
|
|
from tests.helpers.stage_config import get_deploy_config_path, modify_stage_config
|
|
|
|
pytestmark = [pytest.mark.diffusion, pytest.mark.slow]
|
|
|
|
MODEL = os.environ.get("GLM_IMAGE_MODEL_PATH", "zai-org/GLM-Image")
|
|
|
|
T2I_PROMPT = "A Vincent van Gogh style impressionist painting."
|
|
I2I_PROMPT = "Transform this modern, geometric image into a Vincent van Gogh style impressionist painting."
|
|
NEGATIVE_PROMPT = "low quality, blurry, distorted, unnatural colors"
|
|
|
|
TWO_CARD_FEATURE_MARKS = hardware_marks(res={"cuda": "H100"}, num_cards=2)
|
|
|
|
GLM_DEPLOY = get_deploy_config_path("glm_image.yaml")
|
|
GLM_CACHEDIT_DEPLOY = modify_stage_config(
|
|
GLM_DEPLOY,
|
|
updates={
|
|
"stages": {
|
|
1: {"cache_backend": "cache_dit"},
|
|
},
|
|
},
|
|
)
|
|
GLM_TP_2_DEPLOY = modify_stage_config(
|
|
GLM_DEPLOY,
|
|
updates={
|
|
"stages": {
|
|
0: {"devices": "0", "tensor_parallel_size": 1},
|
|
1: {"devices": "0,1", "tensor_parallel_size": 2},
|
|
},
|
|
},
|
|
)
|
|
GLM_HSDP_2_DEPLOY = modify_stage_config(
|
|
GLM_DEPLOY,
|
|
updates={
|
|
"stages": {
|
|
0: {"devices": "0"},
|
|
1: {
|
|
"devices": "0,1",
|
|
"parallel_config": {
|
|
"use_hsdp": True,
|
|
"hsdp_shard_size": 2,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
)
|
|
GLM_SP_2_DEPLOY = modify_stage_config(
|
|
GLM_DEPLOY,
|
|
updates={
|
|
"stages": {
|
|
0: {"devices": "0"},
|
|
1: {
|
|
"devices": "0,1",
|
|
"parallel_config": {
|
|
"ulysses_degree": 2,
|
|
"ring_degree": 1,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
)
|
|
|
|
|
|
def _get_diffusion_feature_cases(model: str):
|
|
return [
|
|
# Baseline: default deploy (stage 0 -> GPU 0, stage 1 -> GPU 1)
|
|
pytest.param(
|
|
OmniServerParams(
|
|
model=model,
|
|
stage_config_path=GLM_DEPLOY,
|
|
),
|
|
id="baseline",
|
|
marks=TWO_CARD_FEATURE_MARKS,
|
|
),
|
|
# Cache-DiT via runtime deploy patch (cache_backend -> engine_extras on stage 1)
|
|
pytest.param(
|
|
OmniServerParams(
|
|
model=model,
|
|
stage_config_path=GLM_CACHEDIT_DEPLOY,
|
|
),
|
|
id="cachedit",
|
|
marks=TWO_CARD_FEATURE_MARKS,
|
|
),
|
|
# Tensor-Parallel (2 GPUs on diffusion stage)
|
|
pytest.param(
|
|
OmniServerParams(
|
|
model=model,
|
|
stage_config_path=GLM_TP_2_DEPLOY,
|
|
),
|
|
id="tensor_parallel_2",
|
|
marks=TWO_CARD_FEATURE_MARKS,
|
|
),
|
|
# HSDP (2 GPUs on diffusion stage)
|
|
pytest.param(
|
|
OmniServerParams(
|
|
model=model,
|
|
stage_config_path=GLM_HSDP_2_DEPLOY,
|
|
),
|
|
id="hsdp_2",
|
|
marks=TWO_CARD_FEATURE_MARKS,
|
|
),
|
|
# Ulysses sequence parallel degree=2 (2 GPUs)
|
|
pytest.param(
|
|
OmniServerParams(
|
|
model=model,
|
|
stage_config_path=GLM_SP_2_DEPLOY,
|
|
),
|
|
id="sequence_parallel_2",
|
|
marks=TWO_CARD_FEATURE_MARKS,
|
|
),
|
|
]
|
|
|
|
|
|
MODES = ["t2i", "i2i"]
|
|
|
|
|
|
@pytest.mark.parametrize("mode", MODES)
|
|
@pytest.mark.parametrize(
|
|
"omni_server",
|
|
_get_diffusion_feature_cases(MODEL),
|
|
indirect=True,
|
|
)
|
|
def test_glm_image(
|
|
omni_server: OmniServer,
|
|
mode: str,
|
|
openai_client: OpenAIClientHandler,
|
|
):
|
|
"""GLM-Image diffusion feature coverage for t2i and i2i on two H100s."""
|
|
|
|
if mode == "t2i":
|
|
messages = dummy_messages_from_mix_data(content_text=T2I_PROMPT)
|
|
else:
|
|
image_size = 1024
|
|
image_data_url = f"data:image/jpeg;base64,{generate_synthetic_image(image_size, image_size)['base64']}"
|
|
messages = dummy_messages_from_mix_data(
|
|
image_data_url=image_data_url,
|
|
content_text=I2I_PROMPT,
|
|
)
|
|
|
|
request_config = {
|
|
"model": omni_server.model,
|
|
"messages": messages,
|
|
"extra_body": {
|
|
"height": 1024,
|
|
"width": 1024,
|
|
"num_inference_steps": 2,
|
|
"guidance_scale": 1.5,
|
|
"true_cfg_scale": 4.0,
|
|
"negative_prompt": NEGATIVE_PROMPT,
|
|
"seed": 42,
|
|
},
|
|
}
|
|
|
|
openai_client.send_diffusion_request(request_config)
|