[diffusion] CI: fix consistency check (#22251)
This commit is contained in:
@@ -22,6 +22,10 @@ permissions:
|
|||||||
contents: write
|
contents: write
|
||||||
actions: read
|
actions: read
|
||||||
|
|
||||||
|
env:
|
||||||
|
SGLANG_IS_IN_CI: true
|
||||||
|
SGLANG_CUDA_COREDUMP: "1"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
multimodal-diffusion-gen-1gpu:
|
multimodal-diffusion-gen-1gpu:
|
||||||
if: github.repository == 'sgl-project/sglang'
|
if: github.repository == 'sgl-project/sglang'
|
||||||
@@ -40,6 +44,8 @@ jobs:
|
|||||||
run: bash scripts/ci/cuda/ci_install_dependency.sh diffusion
|
run: bash scripts/ci/cuda/ci_install_dependency.sh diffusion
|
||||||
|
|
||||||
- name: Generate outputs
|
- name: Generate outputs
|
||||||
|
env:
|
||||||
|
RUNAI_STREAMER_MEMORY_LIMIT: 0
|
||||||
run: |
|
run: |
|
||||||
cd python
|
cd python
|
||||||
python -m sglang.multimodal_gen.test.scripts.gen_diffusion_ci_outputs \
|
python -m sglang.multimodal_gen.test.scripts.gen_diffusion_ci_outputs \
|
||||||
@@ -56,6 +62,11 @@ jobs:
|
|||||||
path: python/diffusion-ci-outputs
|
path: python/diffusion-ci-outputs
|
||||||
retention-days: 7
|
retention-days: 7
|
||||||
|
|
||||||
|
- name: Publish GT images to sglang-bot/sglang-ci-data
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GH_PAT_FOR_NIGHTLY_CI_DATA }}
|
||||||
|
run: python scripts/ci/utils/diffusion/publish_diffusion_gt.py --source-dir python/diffusion-ci-outputs
|
||||||
|
|
||||||
multimodal-diffusion-gen-2gpu:
|
multimodal-diffusion-gen-2gpu:
|
||||||
if: github.repository == 'sgl-project/sglang'
|
if: github.repository == 'sgl-project/sglang'
|
||||||
runs-on: 2-gpu-h100
|
runs-on: 2-gpu-h100
|
||||||
@@ -73,6 +84,8 @@ jobs:
|
|||||||
run: bash scripts/ci/cuda/ci_install_dependency.sh diffusion
|
run: bash scripts/ci/cuda/ci_install_dependency.sh diffusion
|
||||||
|
|
||||||
- name: Generate outputs
|
- name: Generate outputs
|
||||||
|
env:
|
||||||
|
RUNAI_STREAMER_MEMORY_LIMIT: 0
|
||||||
run: |
|
run: |
|
||||||
cd python
|
cd python
|
||||||
python -m sglang.multimodal_gen.test.scripts.gen_diffusion_ci_outputs \
|
python -m sglang.multimodal_gen.test.scripts.gen_diffusion_ci_outputs \
|
||||||
@@ -89,27 +102,42 @@ jobs:
|
|||||||
path: python/diffusion-ci-outputs
|
path: python/diffusion-ci-outputs
|
||||||
retention-days: 7
|
retention-days: 7
|
||||||
|
|
||||||
diffusion-ci-push:
|
- name: Publish GT images to sglang-bot/sglang-ci-data
|
||||||
needs: [multimodal-diffusion-gen-1gpu, multimodal-diffusion-gen-2gpu]
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GH_PAT_FOR_NIGHTLY_CI_DATA }}
|
||||||
|
run: python scripts/ci/utils/diffusion/publish_diffusion_gt.py --source-dir python/diffusion-ci-outputs
|
||||||
|
|
||||||
|
multimodal-diffusion-gen-b200:
|
||||||
if: github.repository == 'sgl-project/sglang'
|
if: github.repository == 'sgl-project/sglang'
|
||||||
runs-on: ubuntu-latest
|
runs-on: 4-gpu-b200
|
||||||
|
timeout-minutes: 240
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Download artifacts
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
with:
|
||||||
pattern: diffusion-gen-*
|
ref: ${{ inputs.ref || github.ref }}
|
||||||
path: combined
|
|
||||||
merge-multiple: true
|
|
||||||
|
|
||||||
- name: Collect image files
|
- name: Install dependencies
|
||||||
|
run: bash scripts/ci/cuda/ci_install_dependency.sh diffusion
|
||||||
|
|
||||||
|
- name: Generate outputs
|
||||||
|
env:
|
||||||
|
RUNAI_STREAMER_MEMORY_LIMIT: 0
|
||||||
run: |
|
run: |
|
||||||
mkdir -p gt_images
|
cd python
|
||||||
find combined \( -name "*.png" -o -name "*.jpg" -o -name "*.jpeg" -o -name "*.webp" \) -type f -exec cp -f {} gt_images/ \;
|
python -m sglang.multimodal_gen.test.scripts.gen_diffusion_ci_outputs \
|
||||||
|
--suite 1-gpu-b200 \
|
||||||
|
--out-dir ./diffusion-ci-outputs \
|
||||||
|
${{ inputs.case_ids != '' && format('--case-ids {0}', inputs.case_ids) || '' }}
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: diffusion-gen-b200
|
||||||
|
path: python/diffusion-ci-outputs
|
||||||
|
retention-days: 7
|
||||||
|
|
||||||
- name: Publish GT images to sglang-bot/sglang-ci-data
|
- name: Publish GT images to sglang-bot/sglang-ci-data
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GH_PAT_FOR_NIGHTLY_CI_DATA }}
|
GITHUB_TOKEN: ${{ secrets.GH_PAT_FOR_NIGHTLY_CI_DATA }}
|
||||||
run: python scripts/ci/utils/diffusion/publish_diffusion_gt.py --source-dir gt_images
|
run: python scripts/ci/utils/diffusion/publish_diffusion_gt.py --source-dir python/diffusion-ci-outputs
|
||||||
|
|||||||
@@ -17,7 +17,12 @@ import sys
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from sglang.multimodal_gen.runtime.utils.logging_utils import init_logger
|
from sglang.multimodal_gen.runtime.utils.logging_utils import init_logger
|
||||||
from sglang.multimodal_gen.test.run_suite import SUITES, collect_test_items, run_pytest
|
from sglang.multimodal_gen.test.run_suite import (
|
||||||
|
SUITES,
|
||||||
|
_maybe_pin_update_weights_model_pair,
|
||||||
|
collect_test_items,
|
||||||
|
run_pytest,
|
||||||
|
)
|
||||||
|
|
||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
@@ -95,6 +100,7 @@ def main():
|
|||||||
|
|
||||||
# Get files from suite (same as run_suite.py)
|
# Get files from suite (same as run_suite.py)
|
||||||
suite_files_rel = SUITES[args.suite]
|
suite_files_rel = SUITES[args.suite]
|
||||||
|
_maybe_pin_update_weights_model_pair(suite_files_rel)
|
||||||
suite_files_abs = []
|
suite_files_abs = []
|
||||||
for f_rel in suite_files_rel:
|
for f_rel in suite_files_rel:
|
||||||
f_abs = target_dir / f_rel
|
f_abs = target_dir / f_rel
|
||||||
|
|||||||
@@ -49,12 +49,6 @@
|
|||||||
"psnr_threshold": 19.0,
|
"psnr_threshold": 19.0,
|
||||||
"mean_abs_diff_threshold": 10.0
|
"mean_abs_diff_threshold": 10.0
|
||||||
},
|
},
|
||||||
"sana_image_t2i": {
|
|
||||||
"clip_threshold": 0.91,
|
|
||||||
"ssim_threshold": 0.88,
|
|
||||||
"psnr_threshold": 21.0,
|
|
||||||
"mean_abs_diff_threshold": 8.4
|
|
||||||
},
|
|
||||||
"qwen_image_edit_2509_ti2i": {
|
"qwen_image_edit_2509_ti2i": {
|
||||||
"clip_threshold": 0.92,
|
"clip_threshold": 0.92,
|
||||||
"ssim_threshold": 0.65,
|
"ssim_threshold": 0.65,
|
||||||
|
|||||||
@@ -51,14 +51,6 @@ from sglang.multimodal_gen.test.test_utils import (
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def _is_lora_case(case: DiffusionTestCase) -> bool:
|
|
||||||
return bool(
|
|
||||||
case.server_args.lora_path
|
|
||||||
or case.server_args.dynamic_lora_path
|
|
||||||
or case.server_args.second_lora_path
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def diffusion_server(case: DiffusionTestCase) -> ServerContext:
|
def diffusion_server(case: DiffusionTestCase) -> ServerContext:
|
||||||
"""Start a diffusion server for a single case and tear it down afterwards."""
|
"""Start a diffusion server for a single case and tear it down afterwards."""
|
||||||
@@ -81,11 +73,6 @@ def diffusion_server(case: DiffusionTestCase) -> ServerContext:
|
|||||||
sampling_params = case.sampling_params
|
sampling_params = case.sampling_params
|
||||||
extra_args = os.environ.get("SGLANG_TEST_SERVE_ARGS", "")
|
extra_args = os.environ.get("SGLANG_TEST_SERVE_ARGS", "")
|
||||||
|
|
||||||
# Keep LoRA GT on the normal backend path so adapter state matches CI.
|
|
||||||
if os.environ.get("SGLANG_GEN_GT", "0") == "1":
|
|
||||||
if not _is_lora_case(case) and "--backend" not in extra_args:
|
|
||||||
extra_args = "--backend diffusers " + extra_args.strip()
|
|
||||||
|
|
||||||
extra_args += f" --num-gpus {server_args.num_gpus}"
|
extra_args += f" --num-gpus {server_args.num_gpus}"
|
||||||
|
|
||||||
if server_args.tp_size is not None:
|
if server_args.tp_size is not None:
|
||||||
@@ -235,18 +222,21 @@ Consider updating perf_baselines.json with the snippets below:
|
|||||||
ctx: ServerContext,
|
ctx: ServerContext,
|
||||||
case_id: str,
|
case_id: str,
|
||||||
generate_fn: Callable[[str, openai.Client], tuple[str, bytes]],
|
generate_fn: Callable[[str, openai.Client], tuple[str, bytes]],
|
||||||
) -> tuple[RequestPerfRecord, bytes]:
|
collect_perf: bool = True,
|
||||||
"""Run generation and collect performance records.
|
) -> tuple[RequestPerfRecord | None, bytes]:
|
||||||
|
"""Run generation and optionally collect performance records.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Tuple of (performance_record, content_bytes)
|
Tuple of (performance_record, content_bytes)
|
||||||
"""
|
"""
|
||||||
log_path = ctx.perf_log_path
|
|
||||||
log_wait_timeout = 30
|
|
||||||
|
|
||||||
client = self._client(ctx)
|
client = self._client(ctx)
|
||||||
rid, content = generate_fn(case_id, client)
|
rid, content = generate_fn(case_id, client)
|
||||||
|
|
||||||
|
if not collect_perf:
|
||||||
|
return None, content
|
||||||
|
|
||||||
|
log_path = ctx.perf_log_path
|
||||||
|
log_wait_timeout = 30
|
||||||
req_perf_record = wait_for_req_perf_record(
|
req_perf_record = wait_for_req_perf_record(
|
||||||
rid,
|
rid,
|
||||||
log_path,
|
log_path,
|
||||||
@@ -1024,6 +1014,7 @@ Repository: https://github.com/sglang-bot/sglang-ci-data (path: diffusion-ci/con
|
|||||||
diffusion_server,
|
diffusion_server,
|
||||||
case.id,
|
case.id,
|
||||||
generate_fn,
|
generate_fn,
|
||||||
|
collect_perf=not is_gt_gen_mode,
|
||||||
)
|
)
|
||||||
|
|
||||||
if is_gt_gen_mode:
|
if is_gt_gen_mode:
|
||||||
|
|||||||
@@ -500,15 +500,6 @@ ONE_GPU_CASES_A: list[DiffusionTestCase] = [
|
|||||||
run_lora_dynamic_switch_check=True,
|
run_lora_dynamic_switch_check=True,
|
||||||
run_multi_lora_api_check=True,
|
run_multi_lora_api_check=True,
|
||||||
),
|
),
|
||||||
DiffusionTestCase(
|
|
||||||
"sana_image_t2i",
|
|
||||||
DiffusionServerArgs(
|
|
||||||
model_path="Efficient-Large-Model/Sana_600M_1024px_diffusers",
|
|
||||||
modality="image",
|
|
||||||
),
|
|
||||||
T2I_sampling_params,
|
|
||||||
run_perf_check=False,
|
|
||||||
),
|
|
||||||
# === Text and Image to Image (TI2I) ===
|
# === Text and Image to Image (TI2I) ===
|
||||||
DiffusionTestCase(
|
DiffusionTestCase(
|
||||||
"qwen_image_edit_ti2i",
|
"qwen_image_edit_ti2i",
|
||||||
@@ -804,7 +795,6 @@ ONE_GPU_CASES_C = [
|
|||||||
modality="image",
|
modality="image",
|
||||||
),
|
),
|
||||||
T2I_sampling_params,
|
T2I_sampling_params,
|
||||||
run_consistency_check=False,
|
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -945,7 +935,6 @@ TWO_GPU_CASES_A = [
|
|||||||
extras=["--pipeline-class-name LTX2TwoStagePipeline"],
|
extras=["--pipeline-class-name LTX2TwoStagePipeline"],
|
||||||
),
|
),
|
||||||
T2V_sampling_params,
|
T2V_sampling_params,
|
||||||
run_consistency_check=False,
|
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user