[Test] Add L4 diffusion feature test for GLM-Image (#3451)
Signed-off-by: herotai214 <herotai214@gmail.com>
This commit is contained in:
1 parent
af02713952
commit
9a9c8f7503
2 files changed
+222
No files matched your search
@@ -801,6 +801,45 @@ steps:
|
||||
type: DirectoryOrCreate
|
||||
|
||||
|
||||
- label: ":full_moon: Diffusion X2I(&A&T) · GLM-Image Function Test with H100"
|
||||
timeout_in_minutes: 120
|
||||
commands:
|
||||
- pytest -sv tests/e2e/online_serving/test_glm_image_expansion.py -m "full_model and diffusion and H100" --run-level "full_model"
|
||||
agents:
|
||||
queue: "mithril-h100-pool"
|
||||
plugins:
|
||||
- kubernetes:
|
||||
podSpec:
|
||||
containers:
|
||||
- image: 936637512419.dkr.ecr.us-west-2.amazonaws.com/vllm-ci-pull-through-cache/q9t5s3a7/vllm-ci-test-repo:$BUILDKITE_COMMIT
|
||||
resources:
|
||||
limits:
|
||||
nvidia.com/gpu: 2
|
||||
volumeMounts:
|
||||
- name: devshm
|
||||
mountPath: /dev/shm
|
||||
- name: hf-cache
|
||||
mountPath: /root/.cache/huggingface
|
||||
env:
|
||||
- name: HF_HOME
|
||||
value: /root/.cache/huggingface
|
||||
- name: HF_TOKEN
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: hf-token-secret
|
||||
key: token
|
||||
nodeSelector:
|
||||
node.kubernetes.io/instance-type: gpu-h100-sxm
|
||||
volumes:
|
||||
- name: devshm
|
||||
emptyDir:
|
||||
medium: Memory
|
||||
- name: hf-cache
|
||||
hostPath:
|
||||
path: /mnt/hf-cache
|
||||
type: DirectoryOrCreate
|
||||
|
||||
|
||||
- label: ":full_moon: Diffusion X2I(&A&T) · Function Test with L4"
|
||||
timeout_in_minutes: 60
|
||||
commands:
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
"""
|
||||
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.full_model]
|
||||
|
||||
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)
|
||||
Reference in new issue
Block a user