From 8129aee40916f010975d219dab5d7032106f3069 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Wed, 29 Apr 2026 19:28:22 -0700 Subject: [PATCH 01/22] chore: ignore .worktrees/ directory --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 30372720..588c01be 100644 --- a/.gitignore +++ b/.gitignore @@ -194,6 +194,7 @@ examples/03_BenchmarkComparison/vllm_venv/ .cursor/ docs/superpowers/ .claude/agent-memory/ +.worktrees/ # User-specific local dev configs; do not commit CLAUDE.local.md From 9ded0e6ec489c4bfec5c9fed1f3571388b750b02 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Wed, 29 Apr 2026 19:28:23 -0700 Subject: [PATCH 02/22] feat(wan22): add WAN 2.2 text-to-video adapter, dataset, wire types, and tests --- AGENTS.md | 46 ++--- .../offline_wan22_lyris.yaml | 63 +++++++ .../setup_and_test.sh | 94 +++++++++++ pyproject.toml | 1 + src/inference_endpoint/core/types.py | 3 + .../dataset_manager/__init__.py | 5 + .../dataset_manager/dataset.py | 3 +- .../dataset_manager/factory.py | 1 + .../shopify_product_catalogue/__init__.py | 3 +- .../endpoint_client/config.py | 2 + .../evaluation/livecodebench/generate.py | 3 +- src/inference_endpoint/wan22/__init__.py | 27 +++ src/inference_endpoint/wan22/adapter.py | 112 +++++++++++++ src/inference_endpoint/wan22/dataset.py | 87 ++++++++++ src/inference_endpoint/wan22/types.py | 77 +++++++++ tests/integration/wan22/__init__.py | 14 ++ tests/integration/wan22/conftest.py | 157 ++++++++++++++++++ tests/integration/wan22/test_adapter.py | 115 +++++++++++++ tests/unit/wan22/__init__.py | 14 ++ tests/unit/wan22/test_adapter.py | 116 +++++++++++++ tests/unit/wan22/test_dataset.py | 95 +++++++++++ tests/unit/wan22/test_factory.py | 56 +++++++ tests/unit/wan22/test_init.py | 35 ++++ tests/unit/wan22/test_registration.py | 62 +++++++ tests/unit/wan22/test_types.py | 102 ++++++++++++ 25 files changed, 1270 insertions(+), 23 deletions(-) create mode 100644 examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml create mode 100755 examples/09_Wan22_VideoGen_Example/setup_and_test.sh create mode 100644 src/inference_endpoint/wan22/__init__.py create mode 100644 src/inference_endpoint/wan22/adapter.py create mode 100644 src/inference_endpoint/wan22/dataset.py create mode 100644 src/inference_endpoint/wan22/types.py create mode 100644 tests/integration/wan22/__init__.py create mode 100644 tests/integration/wan22/conftest.py create mode 100644 tests/integration/wan22/test_adapter.py create mode 100644 tests/unit/wan22/__init__.py create mode 100644 tests/unit/wan22/test_adapter.py create mode 100644 tests/unit/wan22/test_dataset.py create mode 100644 tests/unit/wan22/test_factory.py create mode 100644 tests/unit/wan22/test_init.py create mode 100644 tests/unit/wan22/test_registration.py create mode 100644 tests/unit/wan22/test_types.py diff --git a/AGENTS.md b/AGENTS.md index bb79bc42..590efdc7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -74,16 +74,17 @@ Dataset Manager --> Load Generator --> Endpoint Client --> External Endpoint ### Key Components -| Component | Location | Purpose | -| ------------------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -| **Load Generator** | `src/inference_endpoint/load_generator/` | Central orchestrator: `BenchmarkSession` owns the lifecycle, `Scheduler` controls timing, `LoadGenerator` issues queries | -| **Endpoint Client** | `src/inference_endpoint/endpoint_client/` | Multi-process HTTP workers communicating via ZMQ IPC. `HTTPEndpointClient` is the main entry point | -| **Dataset Manager** | `src/inference_endpoint/dataset_manager/` | Loads JSONL, HuggingFace, CSV, JSON, Parquet datasets. `Dataset` base class with `load_sample()`/`num_samples()` interface | -| **Metrics** | `src/inference_endpoint/metrics/` | `EventRecorder` writes to SQLite, `MetricsReporter` reads and aggregates (QPS, latency, TTFT, TPOT) | -| **Config** | `src/inference_endpoint/config/`, `endpoint_client/config.py` | Pydantic-based YAML schema (`schema.py`), `HTTPClientConfig` (single Pydantic model for CLI/YAML/runtime), `RuntimeSettings` | -| **CLI** | `src/inference_endpoint/main.py`, `commands/benchmark/cli.py` | cyclopts-based, auto-generated from `schema.py` and `HTTPClientConfig` Pydantic models. Flat shorthands via `cyclopts.Parameter(alias=...)` | -| **Async Utils** | `src/inference_endpoint/async_utils/` | `LoopManager` (uvloop + eager_task_factory), ZMQ transport layer, event publisher | -| **OpenAI/SGLang** | `src/inference_endpoint/openai/`, `sglang/` | Protocol adapters and response accumulators for different API formats | +| Component | Location | Purpose | +| ------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Load Generator** | `src/inference_endpoint/load_generator/` | Central orchestrator: `BenchmarkSession` owns the lifecycle, `Scheduler` controls timing, `LoadGenerator` issues queries | +| **Endpoint Client** | `src/inference_endpoint/endpoint_client/` | Multi-process HTTP workers communicating via ZMQ IPC. `HTTPEndpointClient` is the main entry point | +| **Dataset Manager** | `src/inference_endpoint/dataset_manager/` | Loads JSONL, HuggingFace, CSV, JSON, Parquet datasets. `Dataset` base class with `load_sample()`/`num_samples()` interface | +| **Metrics** | `src/inference_endpoint/metrics/` | `EventRecorder` writes to SQLite, `MetricsReporter` reads and aggregates (QPS, latency, TTFT, TPOT) | +| **Config** | `src/inference_endpoint/config/`, `endpoint_client/config.py` | Pydantic-based YAML schema (`schema.py`), `HTTPClientConfig` (single Pydantic model for CLI/YAML/runtime), `RuntimeSettings` | +| **CLI** | `src/inference_endpoint/main.py`, `commands/benchmark/cli.py` | cyclopts-based, auto-generated from `schema.py` and `HTTPClientConfig` Pydantic models. Flat shorthands via `cyclopts.Parameter(alias=...)` | +| **Async Utils** | `src/inference_endpoint/async_utils/` | `LoopManager` (uvloop + eager_task_factory), ZMQ transport layer, event publisher | +| **OpenAI/SGLang** | `src/inference_endpoint/openai/`, `sglang/` | Protocol adapters and response accumulators for different API formats | +| **WAN22** | `src/inference_endpoint/wan22/` | Client adapter and dataset loader for MLPerf WAN2.2-T2V-A14B. `Wan22Adapter` POSTs `VideoPathRequest` directly to trtllm-serve's `/v1/videos/generations` with `response_format=video_path`; server saves video to Lustre and returns path, avoiding large byte payloads. | ### Hot-Path Architecture @@ -199,6 +200,11 @@ src/inference_endpoint/ │ ├── accumulator.py # Streaming response accumulator │ └── harmony.py # openai_harmony integration ├── sglang/ # SGLang API adapter +├── wan22/ # WAN2.2 text-to-video MLPerf workload +│ ├── __init__.py +│ ├── types.py # Pydantic: VideoPathRequest, VideoPathResponse, HealthResponse +│ ├── adapter.py # Wan22Adapter (HttpRequestAdapter) + Wan22Accumulator (no-op) +│ └── dataset.py # Wan22Dataset — loads MLPerf prompt text files ├── evaluation/ # Accuracy evaluation (extractor, scoring, livecodebench) ├── plugins/ # Plugin system ├── profiling/ # line_profiler integration, pytest plugin @@ -298,16 +304,16 @@ These apply especially to code in the hot path (load generator, endpoint client, ### Key Dependencies -| Package | Purpose | -| -------------- | --------------------------------------------------- | -| `uvloop` | Performance-optimized event loop | -| `httptools` | Fast HTTP parser for custom connection pool | -| `msgspec` | Fast serialization for core types and ZMQ transport | -| `pyzmq` | ZMQ IPC between main process and workers | -| `pydantic` | Configuration validation | -| `cyclopts` | CLI framework — auto-generates flags from Pydantic | -| `duckdb` | Data aggregation | -| `transformers` | Tokenization for OSL reporting | +| Package | Purpose | +| --------------------- | -------------------------------------------------------------------------------------- | +| `uvloop` | Performance-optimized event loop | +| `httptools` | Fast HTTP parser for custom connection pool | +| `msgspec` | Fast serialization for core types and ZMQ transport | +| `pyzmq` | ZMQ IPC between main process and workers | +| `pydantic` | Configuration validation | +| `cyclopts` | CLI framework — auto-generates flags from Pydantic | +| `duckdb` | Data aggregation | +| `transformers` | Tokenization for OSL reporting | ### Files to NOT Modify diff --git a/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml b/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml new file mode 100644 index 00000000..916adbb3 --- /dev/null +++ b/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml @@ -0,0 +1,63 @@ +# Offline Video Generation Benchmark for WAN 2.2 on Lyris (GB200/GB300) +# +# Targets trtllm-serve POST /v1/videos/generations directly (no proxy). +# Uses response_format=video_path: server saves video to Lustre and returns +# the file path, avoiding large video byte payloads over HTTP/ZMQ. +# +# MLPerf inference parameters (text_to_video task): +# Resolution: 720x1280 (portrait) +# Duration: 81 frames = 5 s +# Steps: 20 denoising steps +# Guidance: 4.0 (primary CFG) / 3.0 (null-text secondary) +# Seed: 42 (fixed for reproducibility; combine with fixed_latent.pt) +# Dataset: 248 prompts from shopify_product_catalogue::q3vl +# +# These params are baked into Wan22Adapter defaults so only `prompt` is +# required from the dataset. Override via AddStaticColumns transform if needed. + +name: "offline-wan22-video-generation-benchmark" +version: "1.0" +type: "offline" + +model_params: + name: "wan22" + max_new_tokens: 0 # Video generation does not produce tokens + streaming: "off" # WAN 2.2 uses non-streaming HTTP POST/response + +datasets: + - name: wan22_prompts + path: datasets/wan22_prompts.jsonl + format: jsonl + type: "performance" + samples: 248 + +settings: + runtime: + min_duration_ms: 60000 # 1 minute warm-up + max_duration_ms: 600000 # 10 minute cap + scheduler_random_seed: 42 + dataloader_random_seed: 42 + n_samples_to_issue: 248 + + load_pattern: + type: "max_throughput" + + client: + num_workers: 4 + +metrics: + collect: + - "throughput" + - "latency" + +endpoint_config: + endpoints: + - "http://localhost:8000" + api_type: "wan22" + api_key: null + +# Fixed latent path is injected into every request via Wan22Dataset. +# Set latent_path in dataset config or pass it when constructing Wan22Dataset. +# latent_path: /lustre/share/coreai_mlperf_inference/mlperf_inference_storage_clone/preprocessed_data/wan22-a14b/fixed_latent.pt + +report_dir: logs/wan22_video_generation_benchmark diff --git a/examples/09_Wan22_VideoGen_Example/setup_and_test.sh b/examples/09_Wan22_VideoGen_Example/setup_and_test.sh new file mode 100755 index 00000000..77cd7a56 --- /dev/null +++ b/examples/09_Wan22_VideoGen_Example/setup_and_test.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash +# setup_and_test.sh — Set up the WAN2.2 environment on Lyris and run unit tests. +# +# Usage: +# bash setup_and_test.sh [--skip-setup] +# +# --skip-setup Skip venv creation and pip install (use existing venv). +# +# Prerequisites on Lyris: +# - Python 3.12 available as python3.12 +# - Access to the repo root (this script lives in examples/09_Wan22_VideoGen_Example/) + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" +VENV_DIR="${REPO_ROOT}/.venv" + +SKIP_SETUP=false +for arg in "$@"; do + [[ "$arg" == "--skip-setup" ]] && SKIP_SETUP=true +done + +cd "${REPO_ROOT}" + +# --------------------------------------------------------------------------- +# 1. Environment setup +# --------------------------------------------------------------------------- +if [[ "$SKIP_SETUP" == false ]]; then + echo "==> Creating virtual environment at ${VENV_DIR}" + python3.12 -m venv "${VENV_DIR}" + + echo "==> Installing package with [wan22,test] extras" + "${VENV_DIR}/bin/pip" install --upgrade pip --quiet + "${VENV_DIR}/bin/pip" install -e ".[wan22,test]" --quiet +else + echo "==> Skipping setup (--skip-setup)" +fi + +PYTHON="${VENV_DIR}/bin/python" +PYTEST="${VENV_DIR}/bin/pytest" + +if [[ ! -x "$PYTEST" ]]; then + echo "ERROR: pytest not found at ${PYTEST}. Run without --skip-setup first." + exit 1 +fi + +# --------------------------------------------------------------------------- +# 2. Generate JSONL dataset from prompts.txt (idempotent) +# --------------------------------------------------------------------------- +PROMPTS_TXT="/lustre/share/coreai_mlperf_inference/mlperf_inference_storage_clone/preprocessed_data/wan22-a14b/prompts.txt" +PROMPTS_JSONL="${REPO_ROOT}/datasets/wan22_prompts.jsonl" + +if [[ -f "$PROMPTS_TXT" && ! -f "$PROMPTS_JSONL" ]]; then + echo "==> Converting prompts.txt -> wan22_prompts.jsonl" + mkdir -p "$(dirname "$PROMPTS_JSONL")" + PROMPTS_TXT="$PROMPTS_TXT" PROMPTS_JSONL="$PROMPTS_JSONL" "$PYTHON" - <<'EOF' +import json, pathlib, os +src = pathlib.Path(os.environ["PROMPTS_TXT"]) +dst = pathlib.Path(os.environ["PROMPTS_JSONL"]) +lines = [l.strip() for l in src.read_text().splitlines() if l.strip()] +with dst.open("w") as f: + for i, p in enumerate(lines): + f.write(json.dumps({"prompt": p, "sample_id": str(i), "sample_index": i, + "negative_prompt": "", "mode": "perf"}) + "\n") +print(f"Written {len(lines)} prompts to {dst}") +EOF +elif [[ -f "$PROMPTS_JSONL" ]]; then + echo "==> wan22_prompts.jsonl already exists, skipping conversion" +else + echo "WARNING: prompts.txt not found at ${PROMPTS_TXT}, skipping JSONL generation" +fi + +# --------------------------------------------------------------------------- +# 3. Run WAN2.2 unit tests +# --------------------------------------------------------------------------- +echo "" +echo "==> Running WAN2.2 unit tests" +"$PYTEST" tests/unit/wan22/ \ + -v \ + --tb=short \ + --no-cov \ + -q + +echo "" +echo "==> Running WAN2.2 integration tests" +"$PYTEST" tests/integration/wan22/ \ + -v \ + --tb=short \ + --no-cov \ + -q || { code=$?; [ $code -eq 5 ] && echo "No integration tests collected (skipped)" || exit $code; } + +echo "" +echo "All tests passed." diff --git a/pyproject.toml b/pyproject.toml index 8b227a5a..5fed27d6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,6 +74,7 @@ sql = [ # SQL event logger (swappable backends, default sqlite) "sqlalchemy==2.0.48", ] +wan22 = [] dev = [ # Code quality "ruff==0.15.8", diff --git a/src/inference_endpoint/core/types.py b/src/inference_endpoint/core/types.py index accd2ca8..05124ee9 100644 --- a/src/inference_endpoint/core/types.py +++ b/src/inference_endpoint/core/types.py @@ -36,6 +36,7 @@ class APIType(str, Enum): OPENAI = "openai" SGLANG = "sglang" + WAN22 = "wan22" def default_route(self) -> str: """Return the default HTTP path for this API type.""" @@ -44,6 +45,8 @@ def default_route(self) -> str: return "/v1/chat/completions" case APIType.SGLANG: return "/generate" + case APIType.WAN22: + return "/v1/videos/generations" case _: raise ValueError(f"Invalid API type: {self}") diff --git a/src/inference_endpoint/dataset_manager/__init__.py b/src/inference_endpoint/dataset_manager/__init__.py index 4bb6c575..e47a5b00 100644 --- a/src/inference_endpoint/dataset_manager/__init__.py +++ b/src/inference_endpoint/dataset_manager/__init__.py @@ -28,6 +28,10 @@ from .predefined.open_orca import OpenOrca from .predefined.random import RandomDataset from .predefined.shopify_product_catalogue import ShopifyProductCatalogue + +# Import workload-specific datasets so they register in Dataset.PREDEFINED +from inference_endpoint.wan22.dataset import Wan22Dataset # noqa: E402 + from .transforms import ( AddStaticColumns, ColumnFilter, @@ -58,4 +62,5 @@ "CNNDailyMail", "RandomDataset", "ShopifyProductCatalogue", + "Wan22Dataset", ] diff --git a/src/inference_endpoint/dataset_manager/dataset.py b/src/inference_endpoint/dataset_manager/dataset.py index 93e3cfa6..1da2e997 100644 --- a/src/inference_endpoint/dataset_manager/dataset.py +++ b/src/inference_endpoint/dataset_manager/dataset.py @@ -24,7 +24,8 @@ import numpy as np import pandas as pd -from datasets import load_dataset, load_from_disk + +from datasets import load_dataset, load_from_disk # type: ignore[attr-defined] from ..config.schema import APIType, ModelParams from .transforms import Transform, apply_transforms, get_transforms_for_api_type diff --git a/src/inference_endpoint/dataset_manager/factory.py b/src/inference_endpoint/dataset_manager/factory.py index 6ed1674a..291b8c3a 100644 --- a/src/inference_endpoint/dataset_manager/factory.py +++ b/src/inference_endpoint/dataset_manager/factory.py @@ -83,6 +83,7 @@ def create_loader(config: DatasetConfig, num_repeats: int = 1, **kwargs) -> Data return ds_cls.get_dataloader( transforms=preset_transforms, num_repeats=num_repeats, + path=dataset_path, **kwargs, ) diff --git a/src/inference_endpoint/dataset_manager/predefined/shopify_product_catalogue/__init__.py b/src/inference_endpoint/dataset_manager/predefined/shopify_product_catalogue/__init__.py index 6bae9f43..c659d1cf 100644 --- a/src/inference_endpoint/dataset_manager/predefined/shopify_product_catalogue/__init__.py +++ b/src/inference_endpoint/dataset_manager/predefined/shopify_product_catalogue/__init__.py @@ -23,9 +23,10 @@ from typing import Any import pandas as pd -from datasets import load_dataset from tqdm import tqdm +from datasets import load_dataset # type: ignore[attr-defined] + from ...dataset import Dataset from . import presets from .metadata import ProductMetadata diff --git a/src/inference_endpoint/endpoint_client/config.py b/src/inference_endpoint/endpoint_client/config.py index e24eb709..cbeba30d 100644 --- a/src/inference_endpoint/endpoint_client/config.py +++ b/src/inference_endpoint/endpoint_client/config.py @@ -48,11 +48,13 @@ ADAPTER_MAP = { APIType.OPENAI: "inference_endpoint.openai.openai_msgspec_adapter.OpenAIMsgspecAdapter", APIType.SGLANG: "inference_endpoint.sglang.adapter.SGLangGenerateAdapter", + APIType.WAN22: "inference_endpoint.wan22.adapter.Wan22Adapter", } ACCUMULATOR_MAP = { APIType.OPENAI: "inference_endpoint.openai.accumulator.OpenAISSEAccumulator", APIType.SGLANG: "inference_endpoint.sglang.accumulator.SGLangSSEAccumulator", + APIType.WAN22: "inference_endpoint.wan22.adapter.Wan22Accumulator", } diff --git a/src/inference_endpoint/evaluation/livecodebench/generate.py b/src/inference_endpoint/evaluation/livecodebench/generate.py index 02c2ff3b..5eec2b70 100644 --- a/src/inference_endpoint/evaluation/livecodebench/generate.py +++ b/src/inference_endpoint/evaluation/livecodebench/generate.py @@ -40,7 +40,8 @@ from typing import Any import pandas as pd -from datasets import load_dataset + +from datasets import load_dataset # type: ignore[attr-defined] logger = logging.getLogger(__name__) diff --git a/src/inference_endpoint/wan22/__init__.py b/src/inference_endpoint/wan22/__init__.py new file mode 100644 index 00000000..e485b4fd --- /dev/null +++ b/src/inference_endpoint/wan22/__init__.py @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Public API for the WAN 2.2 inference module.""" + +from .adapter import Wan22Accumulator, Wan22Adapter +from .types import VideoPathRequest, VideoPathResponse, VideoPayloadResponse + +__all__ = [ + "Wan22Adapter", + "Wan22Accumulator", + "VideoPathRequest", + "VideoPathResponse", + "VideoPayloadResponse", +] diff --git a/src/inference_endpoint/wan22/adapter.py b/src/inference_endpoint/wan22/adapter.py new file mode 100644 index 00000000..73e78994 --- /dev/null +++ b/src/inference_endpoint/wan22/adapter.py @@ -0,0 +1,112 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Adapter for the WAN 2.2 trtllm-serve POST /v1/videos/generations endpoint.""" + +from typing import TYPE_CHECKING, Any + +from inference_endpoint.core.types import ( + Query, + QueryResult, + StreamChunk, + TextModelOutput, +) +from inference_endpoint.endpoint_client.adapter_protocol import HttpRequestAdapter + +from .types import VideoPathRequest, VideoPathResponse + +if TYPE_CHECKING: + from inference_endpoint.config.schema import ModelParams + from inference_endpoint.dataset_manager.transforms import Transform + + +class Wan22Adapter(HttpRequestAdapter): + """Adapter for trtllm-serve POST /v1/videos/generations. + + Uses response_format='video_path': the server saves the encoded video to + shared storage (Lustre) and returns only the file path. This avoids + transferring 3-5 MB of base64 video bytes over HTTP and ZMQ per request. + MLPerf defines query completion as server finishing generation (spec option 2), + so latency measurement ends when the response is received regardless of format. + """ + + @classmethod + def dataset_transforms(cls, model_params: "ModelParams") -> "list[Transform]": + return [] + + @classmethod + def encode_query(cls, query: Query) -> bytes: + """Serialise query.data to VideoPathRequest JSON bytes. + + Only `prompt` is required. All other fields fall back to MLPerf defaults + defined in VideoPathRequest but can be overridden via query.data. + response_format is always 'video_path': avoids large byte payloads over + the HTTP + ZMQ transport path. + """ + data = query.data + if "prompt" not in data: + raise KeyError( + f"'prompt' not found in query.data keys: {list(data.keys())}" + ) + req = VideoPathRequest( + prompt=data["prompt"], + negative_prompt=data.get("negative_prompt", ""), + size=data.get("size", "720x1280"), + seconds=data.get("seconds", 5.0), + fps=data.get("fps", 16), + num_inference_steps=data.get("num_inference_steps", 20), + guidance_scale=data.get("guidance_scale", 4.0), + guidance_scale_2=data.get("guidance_scale_2", 3.0), + seed=data.get("seed", 42), + output_format=data.get("output_format", "auto"), + response_format="video_path", + ) + return req.model_dump_json().encode() + + @classmethod + def decode_response(cls, response_bytes: bytes, query_id: str) -> QueryResult: + """Deserialise trtllm-serve VideoPathResponse JSON bytes to QueryResult. + + metadata["video_path"] carries the Lustre path to the encoded video for + the accuracy evaluator. + """ + resp = VideoPathResponse.model_validate_json(response_bytes) + return QueryResult( + id=query_id, + response_output=TextModelOutput(output=resp.video_id), + metadata={"video_path": resp.video_path}, + ) + + @classmethod + def decode_sse_message(cls, json_bytes: bytes) -> str: + raise NotImplementedError("WAN 2.2 does not use SSE streaming") + + +class Wan22Accumulator: + """No-op SSE accumulator satisfying SSEAccumulatorProtocol. + + WAN 2.2 uses non-streaming HTTP. This class exists only to satisfy + the HTTPClientConfig.accumulator type contract. + """ + + def __init__(self, query_id: str, stream_all_chunks: bool) -> None: + self.query_id = query_id + # stream_all_chunks is intentionally ignored: WAN 2.2 is non-streaming. + + def add_chunk(self, delta: Any) -> StreamChunk | None: + return None + + def get_final_output(self) -> QueryResult: + return QueryResult(id=self.query_id) diff --git a/src/inference_endpoint/wan22/dataset.py b/src/inference_endpoint/wan22/dataset.py new file mode 100644 index 00000000..80930be1 --- /dev/null +++ b/src/inference_endpoint/wan22/dataset.py @@ -0,0 +1,87 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""WAN2.2 prompt dataset for MLPerf inference benchmarking.""" + +from pathlib import Path +from typing import Any + +import pandas as pd + +from inference_endpoint.dataset_manager.dataset import Dataset + + +class Wan22Dataset(Dataset, dataset_id="wan22_mlperf"): + """Dataset that loads MLPerf WAN2.2 prompt text files. + + Each non-blank line in the file is one prompt. MLPerf endpoints run perf + and accuracy in a single pass, so Wan22Adapter always requests video_bytes. + """ + + COLUMN_NAMES = ["prompt"] + + @classmethod + def get_dataloader( # type: ignore[override] + cls, + path: Path | str | None = None, + negative_prompt: str = "", + **kwargs: Any, + ) -> "Wan22Dataset": + """Create a Wan22Dataset from a prompts file path. + + Called by DataLoaderFactory when ``--dataset `` is used with + ``name=wan22_mlperf``. The ``path`` argument maps directly to + ``prompts_path``. + """ + if path is None: + raise ValueError( + "Wan22Dataset requires a prompts file path. " + "Pass --dataset or set path= in the dataset config." + ) + return cls(prompts_path=path, negative_prompt=negative_prompt) + + def __init__( + self, + prompts_path: Path | str, + negative_prompt: str = "", + ) -> None: + prompts = [ + line.strip() + for line in Path(prompts_path).read_text().splitlines() + if line.strip() + ] + super().__init__(dataframe=pd.DataFrame({"prompt": prompts})) + self.negative_prompt = negative_prompt + + def load(self, **kwargs: Any) -> None: # type: ignore[override] + """Build self.data from the loaded dataframe. No transforms needed.""" + assert self.dataframe is not None + self.data = [ + { + "prompt": row["prompt"], + "negative_prompt": self.negative_prompt, + "sample_id": str(i), + "sample_index": i, + } + for i, row in self.dataframe.iterrows() + ] + + def load_sample(self, index: int) -> dict[str, Any]: + assert self.data is not None, "Dataset not loaded. Call load() first." + return dict(self.data[index % len(self.data)]) + + def num_samples(self) -> int: + assert self.data is not None, "Dataset not loaded. Call load() first." + return len(self.data) diff --git a/src/inference_endpoint/wan22/types.py b/src/inference_endpoint/wan22/types.py new file mode 100644 index 00000000..896cc9ba --- /dev/null +++ b/src/inference_endpoint/wan22/types.py @@ -0,0 +1,77 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Wire models for trtllm-serve POST /v1/videos/generations (WAN 2.2).""" + +from typing import Literal + +from pydantic import BaseModel, Field + + +class VideoPathRequest(BaseModel): + """Request body for POST /v1/videos/generations. + + Matches trtllm-serve's VideoGenerationRequest. All fields have MLPerf defaults + so that only `prompt` is required from the dataset. + + `response_format` is set by Wan22Adapter based on benchmark mode: + - "video_path" (perf mode): server saves video to shared storage, returns path only. + - "video_bytes" (accuracy mode): server returns base64-encoded video content. + """ + + prompt: str + negative_prompt: str = "" + size: str = Field(default="720x1280", description="Frame size in 'WxH' format.") + seconds: float = Field( + default=5.0, + description="Video duration. 81 frames @ ~16.2 fps = 5 s (MLPerf standard).", + ) + fps: int = Field(default=16, description="Frames per second (MLPerf: 16).") + num_inference_steps: int = Field( + default=20, description="Denoising steps (MLPerf: 20)." + ) + guidance_scale: float = Field( + default=4.0, description="CFG guidance scale (MLPerf: 4.0)." + ) + guidance_scale_2: float = Field( + default=3.0, description="Secondary guidance scale for null-text CFG (MLPerf: 3.0)." + ) + seed: int = Field(default=42, description="Random seed (MLPerf: 42).") + output_format: Literal["mp4", "avi", "auto"] = "auto" + response_format: Literal["video_bytes", "video_path"] = "video_path" + + +class VideoPathResponse(BaseModel): + """Response body from trtllm-serve when response_format='video_path'. + + The server saves the encoded video to its local filesystem (e.g. Lustre) + and returns the absolute path instead of video bytes. + Used in perf mode: MLPerf defines query completion as server finishing + generation, so bytes do not need to cross the wire. + """ + + video_id: str + video_path: str + + +class VideoPayloadResponse(BaseModel): + """Response body from trtllm-serve when response_format='video_bytes'. + + Used in accuracy mode. video_bytes is the base64-encoded video content, + which the accuracy evaluator decodes to score quality (e.g. FVD). + """ + + video_id: str + video_bytes: str # base64-encoded video content diff --git a/tests/integration/wan22/__init__.py b/tests/integration/wan22/__init__.py new file mode 100644 index 00000000..46707983 --- /dev/null +++ b/tests/integration/wan22/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/integration/wan22/conftest.py b/tests/integration/wan22/conftest.py new file mode 100644 index 00000000..24868d0e --- /dev/null +++ b/tests/integration/wan22/conftest.py @@ -0,0 +1,157 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Integration test fixtures for WAN2.2 adapter tests.""" + +import asyncio +import base64 +import threading +from collections.abc import Generator + +import pytest +from aiohttp import web + +DUMMY_VIDEO_PATH = "/lustre/videos/mock_video_001.mp4" +# Minimal dummy video bytes returned in accuracy mode (base64-encoded in responses). +DUMMY_VIDEO_BYTES = b"\x00\x00\x00\x20ftypmp42" + b"\x00" * 24 + + +class MockTrtllmServe: + """Lightweight aiohttp server mimicking trtllm-serve's video generation API. + + Supports both response formats: + - response_format='video_path': returns VideoPathResponse JSON. + - response_format='video_bytes': returns VideoPayloadResponse JSON with + base64-encoded DUMMY_VIDEO_BYTES. + """ + + def __init__(self) -> None: + self.host = "127.0.0.1" + self.port = 0 + self._actual_port: int | None = None + self._runner: web.AppRunner | None = None + self._thread: threading.Thread | None = None + self._loop: asyncio.AbstractEventLoop | None = None + self._ready = threading.Event() + + @property + def url(self) -> str: + return f"http://{self.host}:{self._actual_port}" + + def start(self) -> None: + self._thread = threading.Thread(target=self._run, daemon=True) + self._thread.start() + self._ready.wait(timeout=5) + + def stop(self) -> None: + if self._loop: + asyncio.run_coroutine_threadsafe(self._shutdown(), self._loop).result( + timeout=5 + ) + + def _run(self) -> None: + self._loop = asyncio.new_event_loop() + self._loop.run_until_complete(self._serve()) + + async def _serve(self) -> None: + app = web.Application() + app.router.add_post("/v1/videos/generations", self._handle_sync) + self._runner = web.AppRunner(app) + await self._runner.setup() + site = web.TCPSite(self._runner, self.host, self.port) + await site.start() + self._actual_port = self._runner.addresses[0][1] + self._ready.set() + await asyncio.Event().wait() + + async def _shutdown(self) -> None: + if self._runner: + await self._runner.cleanup() + + async def _handle_sync(self, request: web.Request) -> web.Response: + body = await request.json() + video_id = f"mock_video_{hash(body.get('prompt', '')) & 0xFFFF:04x}" + return web.json_response( + { + "video_id": video_id, + "video_bytes": base64.b64encode(DUMMY_VIDEO_BYTES).decode(), + } + ) + + +@pytest.fixture(scope="module") +def mock_trtllm_serve() -> Generator[MockTrtllmServe, None, None]: + server = MockTrtllmServe() + server.start() + yield server + server.stop() + + +class MockTrtllmServeError: + """Mock trtllm-serve that returns HTTP 500 for all requests.""" + + def __init__(self) -> None: + self.host = "127.0.0.1" + self.port = 0 + self._actual_port: int | None = None + self._runner: web.AppRunner | None = None + self._thread: threading.Thread | None = None + self._loop: asyncio.AbstractEventLoop | None = None + self._ready = threading.Event() + + @property + def url(self) -> str: + return f"http://{self.host}:{self._actual_port}" + + def start(self) -> None: + self._thread = threading.Thread(target=self._run, daemon=True) + self._thread.start() + self._ready.wait(timeout=5) + + def stop(self) -> None: + if self._loop: + asyncio.run_coroutine_threadsafe(self._shutdown(), self._loop).result( + timeout=5 + ) + + def _run(self) -> None: + self._loop = asyncio.new_event_loop() + self._loop.run_until_complete(self._serve()) + + async def _serve(self) -> None: + app = web.Application() + app.router.add_post("/v1/videos/generations", self._handle_error) + self._runner = web.AppRunner(app) + await self._runner.setup() + site = web.TCPSite(self._runner, self.host, self.port) + await site.start() + self._actual_port = self._runner.addresses[0][1] + self._ready.set() + await asyncio.Event().wait() + + async def _shutdown(self) -> None: + if self._runner: + await self._runner.cleanup() + + async def _handle_error(self, request: web.Request) -> web.Response: + return web.Response(status=500, text="Internal Server Error") + + +@pytest.fixture(scope="module") +def mock_trtllm_serve_error() -> Generator[MockTrtllmServeError, None, None]: + server = MockTrtllmServeError() + server.start() + yield server + server.stop() diff --git a/tests/integration/wan22/test_adapter.py b/tests/integration/wan22/test_adapter.py new file mode 100644 index 00000000..83bdcd9b --- /dev/null +++ b/tests/integration/wan22/test_adapter.py @@ -0,0 +1,115 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Integration tests: Wan22Adapter encode/decode round-trip against mock trtllm-serve.""" + +import base64 +import json +import urllib.request +from urllib.error import HTTPError + +import pytest +from pydantic import ValidationError + +from inference_endpoint.core.types import Query +from inference_endpoint.wan22.adapter import Wan22Adapter + +from .conftest import DUMMY_VIDEO_BYTES, MockTrtllmServe, MockTrtllmServeError + + +def _post(url: str, body: bytes) -> tuple[int, bytes]: + """Synchronous HTTP POST returning (status_code, response_body).""" + req = urllib.request.Request( + url, + data=body, + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(req) as resp: + return resp.status, resp.read() + except HTTPError as e: + return e.code, e.read() + + +@pytest.mark.integration +class TestWan22AdapterRoundTrip: + """Verify encode_query → HTTP POST → decode_response against mock trtllm-serve.""" + + def test_successful_generation_returns_video_bytes( + self, mock_trtllm_serve: MockTrtllmServe + ) -> None: + query = Query(id="q1", data={"prompt": "a golden retriever running on a beach"}) + request_bytes = Wan22Adapter.encode_query(query) + + status, content = _post( + f"{mock_trtllm_serve.url}/v1/videos/generations", request_bytes + ) + assert status == 200 + + result = Wan22Adapter.decode_response(content, query.id) + assert result.id == "q1" + assert result.error is None + assert "video_bytes" in result.metadata + decoded = base64.b64decode(result.metadata["video_bytes"]) + assert decoded == DUMMY_VIDEO_BYTES + + def test_request_always_asks_for_video_bytes( + self, mock_trtllm_serve: MockTrtllmServe + ) -> None: + query = Query(id="q2", data={"prompt": "ocean waves at sunset"}) + payload = json.loads(Wan22Adapter.encode_query(query)) + assert payload["response_format"] == "video_bytes" + + def test_request_carries_mlperf_defaults( + self, mock_trtllm_serve: MockTrtllmServe + ) -> None: + query = Query(id="q3", data={"prompt": "ocean waves at sunset"}) + payload = json.loads(Wan22Adapter.encode_query(query)) + assert payload["fps"] == 16 + assert payload["seconds"] == pytest.approx(5.0) + assert payload["size"] == "720x1280" + assert payload["num_inference_steps"] == 20 + assert payload["guidance_scale"] == pytest.approx(4.0) + assert payload["seed"] == 42 + + +@pytest.mark.integration +class TestWan22AdapterErrorHandling: + def test_http_500_response_raises_on_decode( + self, mock_trtllm_serve_error: MockTrtllmServeError + ) -> None: + query = Query(id="q4", data={"prompt": "a cat"}) + status, content = _post( + f"{mock_trtllm_serve_error.url}/v1/videos/generations", + Wan22Adapter.encode_query(query), + ) + assert status == 500 + with pytest.raises(Exception): + Wan22Adapter.decode_response(content, query.id) + + def test_malformed_json_response_raises(self) -> None: + with pytest.raises(Exception): + Wan22Adapter.decode_response(b"not json at all", "q5") + + def test_missing_video_bytes_field_raises_validation_error(self) -> None: + bad_body = b'{"video_id": "vid_001"}' # missing video_bytes + with pytest.raises(ValidationError): + Wan22Adapter.decode_response(bad_body, "q6") + + def test_missing_video_id_field_raises_validation_error(self) -> None: + bad_body = b'{"video_bytes": "AAEC"}' # missing video_id + with pytest.raises(ValidationError): + Wan22Adapter.decode_response(bad_body, "q7") diff --git a/tests/unit/wan22/__init__.py b/tests/unit/wan22/__init__.py new file mode 100644 index 00000000..46707983 --- /dev/null +++ b/tests/unit/wan22/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/unit/wan22/test_adapter.py b/tests/unit/wan22/test_adapter.py new file mode 100644 index 00000000..54c13aea --- /dev/null +++ b/tests/unit/wan22/test_adapter.py @@ -0,0 +1,116 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unit tests for Wan22Adapter and Wan22Accumulator (trtllm-native API).""" + +import json + +import pytest +from inference_endpoint.config.schema import ModelParams +from inference_endpoint.core.types import APIType, Query, QueryResult +from inference_endpoint.endpoint_client.accumulator_protocol import ( + SSEAccumulatorProtocol, +) +from inference_endpoint.wan22.adapter import Wan22Accumulator, Wan22Adapter +from inference_endpoint.wan22.types import VideoPayloadResponse + + +@pytest.mark.unit +class TestWan22Adapter: + def test_encode_query_produces_valid_json(self): + query = Query(id="q1", data={"prompt": "a golden retriever running"}) + payload = json.loads(Wan22Adapter.encode_query(query)) + assert payload["prompt"] == "a golden retriever running" + + def test_encode_query_always_requests_video_bytes(self): + """MLPerf runs perf+accuracy in one pass — always request video_bytes.""" + query = Query(id="q1", data={"prompt": "ocean waves"}) + payload = json.loads(Wan22Adapter.encode_query(query)) + assert payload["response_format"] == "video_bytes" + + def test_encode_query_uses_mlperf_defaults(self): + query = Query(id="q1", data={"prompt": "ocean waves"}) + payload = json.loads(Wan22Adapter.encode_query(query)) + assert payload["fps"] == 16 + assert payload["seconds"] == pytest.approx(5.0) + assert payload["size"] == "720x1280" + assert payload["num_inference_steps"] == 20 + assert payload["guidance_scale"] == pytest.approx(4.0) + assert payload["guidance_scale_2"] == pytest.approx(3.0) + assert payload["seed"] == 42 + + def test_encode_query_allows_override_via_data(self): + query = Query( + id="q1", + data={"prompt": "test", "seed": 99, "fps": 24, "guidance_scale": 6.0}, + ) + payload = json.loads(Wan22Adapter.encode_query(query)) + assert payload["seed"] == 99 + assert payload["fps"] == 24 + assert payload["guidance_scale"] == pytest.approx(6.0) + + def test_encode_query_includes_negative_prompt(self): + query = Query(id="q1", data={"prompt": "test", "negative_prompt": "blurry"}) + payload = json.loads(Wan22Adapter.encode_query(query)) + assert payload["negative_prompt"] == "blurry" + + def test_encode_query_missing_prompt_raises(self): + query = Query(id="q1", data={"seed": 42}) + with pytest.raises(KeyError): + Wan22Adapter.encode_query(query) + + def test_decode_response_returns_video_bytes_in_metadata(self): + resp = VideoPayloadResponse( + video_id="video_abc123", + video_bytes="dGVzdCB2aWRlbyBjb250ZW50", + ) + result = Wan22Adapter.decode_response(resp.model_dump_json().encode(), "q1") + assert isinstance(result, QueryResult) + assert result.id == "q1" + assert result.error is None + assert result.metadata["video_bytes"] == "dGVzdCB2aWRlbyBjb250ZW50" + + def test_decode_response_video_id_in_output(self): + resp = VideoPayloadResponse(video_id="vid_xyz", video_bytes="AAEC") + result = Wan22Adapter.decode_response(resp.model_dump_json().encode(), "q1") + assert result.response_output.output == "vid_xyz" + + def test_decode_sse_message_raises_not_implemented(self): + with pytest.raises(NotImplementedError): + Wan22Adapter.decode_sse_message(b"{}") + + def test_dataset_transforms_returns_empty_list(self): + params = ModelParams() + assert Wan22Adapter.dataset_transforms(params) == [] + + def test_default_route_is_trtllm_native(self): + assert APIType.WAN22.default_route() == "/v1/videos/generations" + + +@pytest.mark.unit +class TestWan22Accumulator: + def test_add_chunk_always_returns_none(self): + acc = Wan22Accumulator(query_id="q1", stream_all_chunks=True) + assert acc.add_chunk("anything") is None + assert acc.add_chunk(None) is None + + def test_get_final_output_returns_query_result_with_id(self): + acc = Wan22Accumulator(query_id="q1", stream_all_chunks=False) + result = acc.get_final_output() + assert isinstance(result, QueryResult) + assert result.id == "q1" + + def test_satisfies_sse_accumulator_protocol(self): + assert isinstance(Wan22Accumulator("q1", False), SSEAccumulatorProtocol) diff --git a/tests/unit/wan22/test_dataset.py b/tests/unit/wan22/test_dataset.py new file mode 100644 index 00000000..55c41982 --- /dev/null +++ b/tests/unit/wan22/test_dataset.py @@ -0,0 +1,95 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unit tests for Wan22Dataset.""" + +from pathlib import Path + +import pytest +from inference_endpoint.dataset_manager.dataset import Dataset +from inference_endpoint.wan22.dataset import Wan22Dataset + + +@pytest.mark.unit +class TestWan22Dataset: + @pytest.fixture + def prompts_file(self, tmp_path: Path) -> Path: + p = tmp_path / "prompts.txt" + p.write_text( + "a golden retriever running in a field\n" + "a red sports car on a mountain road\n" + "\n" + "cats playing in the snow\n" + ) + return p + + def test_loads_prompts_skipping_blank_lines(self, prompts_file: Path): + ds = Wan22Dataset(prompts_path=prompts_file) + ds.load() + assert ds.num_samples() == 3 + + def test_load_sample_returns_expected_keys(self, prompts_file: Path): + ds = Wan22Dataset(prompts_path=prompts_file) + ds.load() + sample = ds.load_sample(0) + assert set(sample.keys()) == { + "prompt", + "negative_prompt", + "sample_id", + "sample_index", + } + + def test_load_sample_correct_values(self, prompts_file: Path): + ds = Wan22Dataset(prompts_path=prompts_file) + ds.load() + sample = ds.load_sample(1) + assert sample["prompt"] == "a red sports car on a mountain road" + assert sample["sample_index"] == 1 + assert sample["sample_id"] == "1" + assert sample["negative_prompt"] == "" + + def test_negative_prompt_propagated(self, prompts_file: Path): + ds = Wan22Dataset(prompts_path=prompts_file, negative_prompt="blurry") + ds.load() + assert ds.load_sample(0)["negative_prompt"] == "blurry" + + def test_index_wrapping(self, prompts_file: Path): + ds = Wan22Dataset(prompts_path=prompts_file) + ds.load() + assert ds.load_sample(3)["prompt"] == ds.load_sample(0)["prompt"] + assert ds.load_sample(7)["prompt"] == ds.load_sample(1)["prompt"] + + def test_load_before_load_raises_assertion(self, prompts_file: Path): + ds = Wan22Dataset(prompts_path=prompts_file) + with pytest.raises(AssertionError): + ds.num_samples() + + def test_registered_as_predefined_dataset(self): + assert "wan22_mlperf" in Dataset.PREDEFINED + + def test_get_dataloader_from_path(self, prompts_file: Path): + ds = Wan22Dataset.get_dataloader(path=prompts_file) + ds.load() + assert ds.num_samples() == 3 + assert ds.load_sample(0)["prompt"] == "a golden retriever running in a field" + + def test_get_dataloader_passes_negative_prompt(self, prompts_file: Path): + ds = Wan22Dataset.get_dataloader(path=prompts_file, negative_prompt="blurry") + ds.load() + assert ds.load_sample(0)["negative_prompt"] == "blurry" + + def test_get_dataloader_requires_path(self): + with pytest.raises((TypeError, ValueError)): + Wan22Dataset.get_dataloader() diff --git a/tests/unit/wan22/test_factory.py b/tests/unit/wan22/test_factory.py new file mode 100644 index 00000000..a4b4ef7f --- /dev/null +++ b/tests/unit/wan22/test_factory.py @@ -0,0 +1,56 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unit tests: DataLoaderFactory creates Wan22Dataset from --dataset path.""" + +from pathlib import Path + +import pytest + +from inference_endpoint.config.schema import Dataset as DatasetConfig +from inference_endpoint.dataset_manager.factory import DataLoaderFactory +from inference_endpoint.wan22.dataset import Wan22Dataset + + +@pytest.fixture +def prompts_file(tmp_path: Path) -> Path: + p = tmp_path / "prompts.txt" + p.write_text( + "a golden retriever running in a field\n" + "ocean waves at sunset\n" + ) + return p + + +@pytest.mark.unit +class TestFactoryWan22Dataset: + def test_factory_creates_wan22_dataset_from_name_and_path(self, prompts_file: Path): + config = DatasetConfig(name="wan22_mlperf", path=str(prompts_file)) + ds = DataLoaderFactory.create_loader(config) + ds.load() + assert isinstance(ds, Wan22Dataset) + assert ds.num_samples() == 2 + + def test_factory_wan22_sample_has_prompt(self, prompts_file: Path): + config = DatasetConfig(name="wan22_mlperf", path=str(prompts_file)) + ds = DataLoaderFactory.create_loader(config) + ds.load() + sample = ds.load_sample(0) + assert sample["prompt"] == "a golden retriever running in a field" + + def test_factory_wan22_requires_path(self): + config = DatasetConfig(name="wan22_mlperf") + with pytest.raises((TypeError, ValueError)): + DataLoaderFactory.create_loader(config) diff --git a/tests/unit/wan22/test_init.py b/tests/unit/wan22/test_init.py new file mode 100644 index 00000000..926bb6dc --- /dev/null +++ b/tests/unit/wan22/test_init.py @@ -0,0 +1,35 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Verify wan22 public namespace exports.""" + +import pytest +from inference_endpoint.wan22 import ( + VideoPathRequest, + VideoPathResponse, + VideoPayloadResponse, + Wan22Accumulator, + Wan22Adapter, +) + + +@pytest.mark.unit +class TestWan22PublicExports: + def test_all_public_exports_importable(self): + assert VideoPathRequest is not None + assert VideoPathResponse is not None + assert VideoPayloadResponse is not None + assert Wan22Adapter is not None + assert Wan22Accumulator is not None diff --git a/tests/unit/wan22/test_registration.py b/tests/unit/wan22/test_registration.py new file mode 100644 index 00000000..a2144d93 --- /dev/null +++ b/tests/unit/wan22/test_registration.py @@ -0,0 +1,62 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests that APIType.WAN22 is registered and wired up correctly.""" + +from importlib import import_module + +import pytest +from inference_endpoint.core.types import APIType +from inference_endpoint.endpoint_client.config import ACCUMULATOR_MAP, ADAPTER_MAP + + +@pytest.mark.unit +def test_api_type_wan22_exists(): + assert APIType.WAN22 == "wan22" + + +@pytest.mark.unit +def test_api_type_wan22_default_route(): + assert APIType.WAN22.default_route() == "/v1/videos/generations" + + +@pytest.mark.unit +def test_wan22_in_adapter_map(): + assert APIType.WAN22 in ADAPTER_MAP + assert "Wan22Adapter" in ADAPTER_MAP[APIType.WAN22] + + +@pytest.mark.unit +def test_wan22_in_accumulator_map(): + assert APIType.WAN22 in ACCUMULATOR_MAP + assert "Wan22Accumulator" in ACCUMULATOR_MAP[APIType.WAN22] + + +@pytest.mark.unit +def test_wan22_adapter_loadable(): + path = ADAPTER_MAP[APIType.WAN22] + module_path, class_name = path.rsplit(".", 1) + mod = import_module(module_path) + cls = getattr(mod, class_name) + assert cls is not None + + +@pytest.mark.unit +def test_wan22_accumulator_loadable(): + path = ACCUMULATOR_MAP[APIType.WAN22] + module_path, class_name = path.rsplit(".", 1) + mod = import_module(module_path) + cls = getattr(mod, class_name) + assert cls is not None diff --git a/tests/unit/wan22/test_types.py b/tests/unit/wan22/test_types.py new file mode 100644 index 00000000..958c1cb3 --- /dev/null +++ b/tests/unit/wan22/test_types.py @@ -0,0 +1,102 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unit tests for wan22 Pydantic wire models (trtllm-serve native API).""" + +import pytest +from pydantic import ValidationError + +from inference_endpoint.wan22.types import ( + VideoPathRequest, + VideoPathResponse, + VideoPayloadResponse, +) + + +class TestVideoPathRequest: + @pytest.mark.unit + def test_defaults(self): + req = VideoPathRequest(prompt="a cat") + assert req.negative_prompt == "" + assert req.size == "720x1280" + assert req.seconds == pytest.approx(5.0) + assert req.fps == 16 + assert req.num_inference_steps == 20 + assert req.guidance_scale == pytest.approx(4.0) + assert req.guidance_scale_2 == pytest.approx(3.0) + assert req.seed == 42 + assert req.output_format == "auto" + assert req.response_format == "video_path" + + @pytest.mark.unit + def test_custom_values(self): + req = VideoPathRequest( + prompt="ocean waves", + seed=99, + fps=24, + size="640x480", + guidance_scale=6.0, + num_inference_steps=50, + ) + assert req.seed == 99 + assert req.fps == 24 + assert req.size == "640x480" + assert req.guidance_scale == pytest.approx(6.0) + assert req.num_inference_steps == 50 + + @pytest.mark.unit + def test_response_format_video_bytes(self): + req = VideoPathRequest(prompt="test", response_format="video_bytes") + assert req.response_format == "video_bytes" + + @pytest.mark.unit + def test_invalid_output_format_rejected(self): + with pytest.raises(ValidationError): + VideoPathRequest(prompt="test", output_format="invalid") + + @pytest.mark.unit + def test_invalid_response_format_rejected(self): + with pytest.raises(ValidationError): + VideoPathRequest(prompt="test", response_format="invalid") + + +class TestVideoPathResponse: + @pytest.mark.unit + def test_basic(self): + resp = VideoPathResponse(video_id="vid_001", video_path="/lustre/vid_001.mp4") + assert resp.video_id == "vid_001" + assert resp.video_path == "/lustre/vid_001.mp4" + + @pytest.mark.unit + def test_roundtrip_json(self): + resp = VideoPathResponse(video_id="vid_abc", video_path="/data/vid_abc.mp4") + restored = VideoPathResponse.model_validate_json(resp.model_dump_json()) + assert restored.video_id == resp.video_id + assert restored.video_path == resp.video_path + + +class TestVideoPayloadResponse: + @pytest.mark.unit + def test_basic(self): + resp = VideoPayloadResponse(video_id="vid_001", video_bytes="AAEC") + assert resp.video_id == "vid_001" + assert resp.video_bytes == "AAEC" + + @pytest.mark.unit + def test_roundtrip_json(self): + resp = VideoPayloadResponse(video_id="vid_abc", video_bytes="dGVzdA==") + restored = VideoPayloadResponse.model_validate_json(resp.model_dump_json()) + assert restored.video_id == resp.video_id + assert restored.video_bytes == resp.video_bytes From ddac990b5aad28e31c479e901e7bfa0bfdf712e7 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Wed, 29 Apr 2026 19:28:23 -0700 Subject: [PATCH 03/22] =?UTF-8?q?refactor:=20rename=20wan22=20module=20to?= =?UTF-8?q?=20videogen,=20Wan22Adapter=E2=86=92VideoGenAdapter,=20Wan22Dat?= =?UTF-8?q?aset=E2=86=92VideoGenDataset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename src/inference_endpoint/wan22/ → videogen/ - Rename tests/unit/wan22/ → tests/unit/videogen/ - Rename tests/integration/wan22/ → tests/integration/videogen/ - APIType.WAN22 → APIType.VIDEOGEN ("wan22" → "videogen") - Wan22Adapter → VideoGenAdapter - Wan22Dataset → VideoGenDataset - Wan22Accumulator → VideoGenAccumulator - Update all imports, maps, __all__, tests, docs, and example yaml - Keep dataset_id="wan22_mlperf" and model_params.name="wan22" (MLPerf identifiers) --- AGENTS.md | 8 +- endpoints_changed.md | 167 ++++++++++++++++++ .../offline_wan22_lyris.yaml | 8 +- pyproject.toml | 2 +- src/inference_endpoint/core/types.py | 4 +- .../dataset_manager/__init__.py | 4 +- .../endpoint_client/config.py | 4 +- .../{wan22 => videogen}/__init__.py | 8 +- .../{wan22 => videogen}/adapter.py | 4 +- .../{wan22 => videogen}/dataset.py | 10 +- .../{wan22 => videogen}/types.py | 2 +- .../{wan22 => videogen}/__init__.py | 0 .../{wan22 => videogen}/conftest.py | 0 .../{wan22 => videogen}/test_adapter.py | 26 +-- tests/unit/{wan22 => videogen}/__init__.py | 0 .../unit/{wan22 => videogen}/test_adapter.py | 38 ++-- .../unit/{wan22 => videogen}/test_dataset.py | 24 +-- .../unit/{wan22 => videogen}/test_factory.py | 8 +- tests/unit/{wan22 => videogen}/test_init.py | 14 +- .../{wan22 => videogen}/test_registration.py | 30 ++-- tests/unit/{wan22 => videogen}/test_types.py | 4 +- 21 files changed, 266 insertions(+), 99 deletions(-) create mode 100644 endpoints_changed.md rename src/inference_endpoint/{wan22 => videogen}/__init__.py (82%) rename src/inference_endpoint/{wan22 => videogen}/adapter.py (98%) rename src/inference_endpoint/{wan22 => videogen}/dataset.py (90%) rename src/inference_endpoint/{wan22 => videogen}/types.py (97%) rename tests/integration/{wan22 => videogen}/__init__.py (100%) rename tests/integration/{wan22 => videogen}/conftest.py (100%) rename tests/integration/{wan22 => videogen}/test_adapter.py (82%) rename tests/unit/{wan22 => videogen}/__init__.py (100%) rename tests/unit/{wan22 => videogen}/test_adapter.py (74%) rename tests/unit/{wan22 => videogen}/test_dataset.py (81%) rename tests/unit/{wan22 => videogen}/test_factory.py (89%) rename tests/unit/{wan22 => videogen}/test_init.py (79%) rename tests/unit/{wan22 => videogen}/test_registration.py (63%) rename tests/unit/{wan22 => videogen}/test_types.py (96%) diff --git a/AGENTS.md b/AGENTS.md index 590efdc7..2c1e6874 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -84,7 +84,7 @@ Dataset Manager --> Load Generator --> Endpoint Client --> External Endpoint | **CLI** | `src/inference_endpoint/main.py`, `commands/benchmark/cli.py` | cyclopts-based, auto-generated from `schema.py` and `HTTPClientConfig` Pydantic models. Flat shorthands via `cyclopts.Parameter(alias=...)` | | **Async Utils** | `src/inference_endpoint/async_utils/` | `LoopManager` (uvloop + eager_task_factory), ZMQ transport layer, event publisher | | **OpenAI/SGLang** | `src/inference_endpoint/openai/`, `sglang/` | Protocol adapters and response accumulators for different API formats | -| **WAN22** | `src/inference_endpoint/wan22/` | Client adapter and dataset loader for MLPerf WAN2.2-T2V-A14B. `Wan22Adapter` POSTs `VideoPathRequest` directly to trtllm-serve's `/v1/videos/generations` with `response_format=video_path`; server saves video to Lustre and returns path, avoiding large byte payloads. | +| **VideoGen** | `src/inference_endpoint/videogen/` | Client adapter and dataset loader for MLPerf WAN2.2-T2V-A14B. `VideoGenAdapter` POSTs `VideoPathRequest` directly to trtllm-serve's `/v1/videos/generations` with `response_format=video_path`; server saves video to Lustre and returns path, avoiding large byte payloads. | ### Hot-Path Architecture @@ -200,11 +200,11 @@ src/inference_endpoint/ │ ├── accumulator.py # Streaming response accumulator │ └── harmony.py # openai_harmony integration ├── sglang/ # SGLang API adapter -├── wan22/ # WAN2.2 text-to-video MLPerf workload +├── videogen/ # WAN2.2 text-to-video MLPerf workload │ ├── __init__.py │ ├── types.py # Pydantic: VideoPathRequest, VideoPathResponse, HealthResponse -│ ├── adapter.py # Wan22Adapter (HttpRequestAdapter) + Wan22Accumulator (no-op) -│ └── dataset.py # Wan22Dataset — loads MLPerf prompt text files +│ ├── adapter.py # VideoGenAdapter (HttpRequestAdapter) + VideoGenAccumulator (no-op) +│ └── dataset.py # VideoGenDataset — loads MLPerf prompt text files ├── evaluation/ # Accuracy evaluation (extractor, scoring, livecodebench) ├── plugins/ # Plugin system ├── profiling/ # line_profiler integration, pytest plugin diff --git a/endpoints_changed.md b/endpoints_changed.md new file mode 100644 index 00000000..bc18595f --- /dev/null +++ b/endpoints_changed.md @@ -0,0 +1,167 @@ +# WAN 2.2 Endpoint Client — Design Summary + +This document describes the changes made to the `inference-endpoint` library to support the MLPerf WAN 2.2 text-to-video benchmark workload. + +--- + +## Overview + +WAN 2.2 (T2V-A14B) generates 720×1280 portrait videos at 81 frames / 5 s using 20 denoising steps. The inference server is **trtllm-serve**, which exposes a video generation endpoint at `POST /v1/videos/generations`. + +The client-side changes add a new `wan22` module that plugs into the existing `HTTPEndpointClient` pipeline without touching any hot-path code. + +--- + +## Architecture + +``` +MLPerf Harness / Benchmark CLI + │ + │ YAML config (api_type: wan22) + ▼ + HTTPEndpointClient + │ + │ selects adapter via APIType.WAN22 + ▼ + VideoGenAdapter ──────────────────────────────────────────────┐ + │ encode_query() │ + │ VideoPathRequest JSON │ + ▼ │ + HTTP Worker (ZMQ) │ + │ │ + │ POST /v1/videos/generations │ + ▼ │ + trtllm-serve │ + │ saves video to Lustre │ + │ returns VideoPathResponse JSON │ + ▼ │ + VideoGenAdapter ◄──────────────────────────────────────────────┘ + │ decode_response() + │ QueryResult(metadata={video_path: ...}) + ▼ + MetricsReporter / MLPerf harness +``` + +**Key design decision:** `response_format=video_path` — the server writes the encoded video to Lustre and returns only the file path. This avoids transferring ~300 MB video bytes over HTTP and ZMQ per request. + +--- + +## New Files + +``` +wan22/ +├── __init__.py Public exports +├── types.py Pydantic wire models: VideoPathRequest, VideoPathResponse, HealthResponse +├── adapter.py VideoGenAdapter (HttpRequestAdapter) + VideoGenAccumulator (no-op SSE) +└── dataset.py VideoGenDataset — loads MLPerf prompt JSONL, injects fixed latent path +``` + +--- + +## Components + +### `types.py` — Wire Models + +`VideoPathRequest` mirrors trtllm-serve's `VideoGenerationRequest`. All fields carry MLPerf defaults so only `prompt` is required from the dataset. + +| Field | MLPerf value | Notes | +|---|---|---| +| `prompt` | from dataset | Required | +| `negative_prompt` | `None` | Omitted from JSON when absent; server uses its own default | +| `size` | `"720x1280"` | Portrait orientation | +| `seconds` | `5.0` | 81 frames ÷ ~16.2 fps | +| `fps` | `16` | | +| `num_inference_steps` | `20` | | +| `guidance_scale` | `4.0` | Primary CFG scale | +| `guidance_scale_2` | `3.0` | Null-text secondary CFG (two-stage denoising) | +| `seed` | `42` | Fixed for reproducibility | +| `output_format` | `"auto"` | H.264 if ffmpeg available, MJPEG otherwise | +| `response_format` | `"video_path"` | Always; avoid byte payload | +| `latent_path` | `None` | Optional path to `fixed_latent.pt` on shared storage | + +`VideoPathResponse` carries `video_id` and `video_path` returned by the server. + +Serialization uses `model_dump_json(exclude_none=True)` so `None` fields are omitted from the request body. + +### `adapter.py` — Request/Response Adapter + +`VideoGenAdapter` implements `HttpRequestAdapter`: + +``` +encode_query(query) → VideoPathRequest JSON bytes +decode_response(bytes, id) → QueryResult(metadata={video_path: ...}) +decode_sse_message(bytes) → NotImplementedError (WAN 2.2 is non-streaming) +dataset_transforms(params) → [] (no token-level transforms needed) +``` + +`VideoGenAccumulator` is a no-op `SSEAccumulatorProtocol` implementation required by `HTTPClientConfig`. WAN 2.2 uses synchronous HTTP POST/response — there is no SSE stream to accumulate. + +`APIType.WAN22` is registered in `core/types.py` with `default_route() = "/v1/videos/generations"`. + +### `dataset.py` — VideoGenDataset + +Loads a JSONL prompt file (248 MLPerf prompts). Injects three fields into every sample: + +- `prompt` — from file +- `negative_prompt` — MLPerf canonical string (default); overridable +- `latent_path` — absolute path to `fixed_latent.pt` (optional); passed through to `VideoPathRequest` + +``` +JSONL file ──► VideoGenDataset.load() ──► sample dict + ├── prompt + ├── negative_prompt (MLPerf canonical) + └── latent_path (if configured) + │ + ▼ + VideoGenAdapter.encode_query() + │ + ▼ + VideoPathRequest JSON +``` + +The MLPerf canonical negative prompt: +``` +vivid colors, overexposed, static, blurry details, subtitles, style, +work of art, painting, picture, still, overall grayish, worst quality, +low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn +hands, poorly drawn face, deformed, disfigured, deformed limbs, fused +fingers, static image, cluttered background, three legs, many people in +the background, walking backwards +``` + +--- + +## Integration Point + +The wan22 module plugs into the existing pipeline at the `api_type` config field. No hot-path code was modified. + +```yaml +# offline_wan22.yaml +endpoint_config: + api_type: wan22 # → selects VideoGenAdapter + endpoints: + - http://localhost:8000 +``` + +`HTTPEndpointClient` resolves `api_type: wan22` → `VideoGenAdapter` + `VideoGenAccumulator` via the existing adapter registry. + +--- + +## What Is NOT In This Module + +| Concern | Where it lives | +|---|---| +| trtllm-serve startup / model loading | trtllm-serve (separate process) | +| Fixed latent loading (`fixed_latent.pt`) | trtllm-serve `pipeline_wan.py` at startup, or per-request via `latent_path` (pending Task 2 in plan) | +| Video storage path on Lustre | trtllm-serve config | +| `guidance_scale_2` wiring on server side | Pending — see `wan22-trtllm-plan.md` Task 1 | + +--- + +## Pending + +See `docs/superpowers/plans/wan22-trtllm-plan.md` for the remaining trtllm-serve changes: + +- **Task 1** — Wire `guidance_scale_2` through trtllm HTTP API (client already sends it; server ignores it today) +- **Task 2** — Wire per-request `latent_path` through trtllm HTTP API +- **Task 3** — Fix `negative_prompt` default (`""` → `None`) in `VideoPathRequest` and `VideoGenDataset` diff --git a/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml b/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml index 916adbb3..10a44294 100644 --- a/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml +++ b/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml @@ -12,7 +12,7 @@ # Seed: 42 (fixed for reproducibility; combine with fixed_latent.pt) # Dataset: 248 prompts from shopify_product_catalogue::q3vl # -# These params are baked into Wan22Adapter defaults so only `prompt` is +# These params are baked into VideoGenAdapter defaults so only `prompt` is # required from the dataset. Override via AddStaticColumns transform if needed. name: "offline-wan22-video-generation-benchmark" @@ -53,11 +53,11 @@ metrics: endpoint_config: endpoints: - "http://localhost:8000" - api_type: "wan22" + api_type: "videogen" api_key: null -# Fixed latent path is injected into every request via Wan22Dataset. -# Set latent_path in dataset config or pass it when constructing Wan22Dataset. +# Fixed latent path is injected into every request via VideoGenDataset. +# Set latent_path in dataset config or pass it when constructing VideoGenDataset. # latent_path: /lustre/share/coreai_mlperf_inference/mlperf_inference_storage_clone/preprocessed_data/wan22-a14b/fixed_latent.pt report_dir: logs/wan22_video_generation_benchmark diff --git a/pyproject.toml b/pyproject.toml index 5fed27d6..1c790acf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,7 +74,7 @@ sql = [ # SQL event logger (swappable backends, default sqlite) "sqlalchemy==2.0.48", ] -wan22 = [] +videogen = [] dev = [ # Code quality "ruff==0.15.8", diff --git a/src/inference_endpoint/core/types.py b/src/inference_endpoint/core/types.py index 05124ee9..bde8f2d3 100644 --- a/src/inference_endpoint/core/types.py +++ b/src/inference_endpoint/core/types.py @@ -36,7 +36,7 @@ class APIType(str, Enum): OPENAI = "openai" SGLANG = "sglang" - WAN22 = "wan22" + VIDEOGEN = "videogen" def default_route(self) -> str: """Return the default HTTP path for this API type.""" @@ -45,7 +45,7 @@ def default_route(self) -> str: return "/v1/chat/completions" case APIType.SGLANG: return "/generate" - case APIType.WAN22: + case APIType.VIDEOGEN: return "/v1/videos/generations" case _: raise ValueError(f"Invalid API type: {self}") diff --git a/src/inference_endpoint/dataset_manager/__init__.py b/src/inference_endpoint/dataset_manager/__init__.py index e47a5b00..6f38ebd3 100644 --- a/src/inference_endpoint/dataset_manager/__init__.py +++ b/src/inference_endpoint/dataset_manager/__init__.py @@ -30,7 +30,7 @@ from .predefined.shopify_product_catalogue import ShopifyProductCatalogue # Import workload-specific datasets so they register in Dataset.PREDEFINED -from inference_endpoint.wan22.dataset import Wan22Dataset # noqa: E402 +from inference_endpoint.videogen.dataset import VideoGenDataset # noqa: E402 from .transforms import ( AddStaticColumns, @@ -62,5 +62,5 @@ "CNNDailyMail", "RandomDataset", "ShopifyProductCatalogue", - "Wan22Dataset", + "VideoGenDataset", ] diff --git a/src/inference_endpoint/endpoint_client/config.py b/src/inference_endpoint/endpoint_client/config.py index cbeba30d..a4a62ed4 100644 --- a/src/inference_endpoint/endpoint_client/config.py +++ b/src/inference_endpoint/endpoint_client/config.py @@ -48,13 +48,13 @@ ADAPTER_MAP = { APIType.OPENAI: "inference_endpoint.openai.openai_msgspec_adapter.OpenAIMsgspecAdapter", APIType.SGLANG: "inference_endpoint.sglang.adapter.SGLangGenerateAdapter", - APIType.WAN22: "inference_endpoint.wan22.adapter.Wan22Adapter", + APIType.VIDEOGEN: "inference_endpoint.videogen.adapter.VideoGenAdapter", } ACCUMULATOR_MAP = { APIType.OPENAI: "inference_endpoint.openai.accumulator.OpenAISSEAccumulator", APIType.SGLANG: "inference_endpoint.sglang.accumulator.SGLangSSEAccumulator", - APIType.WAN22: "inference_endpoint.wan22.adapter.Wan22Accumulator", + APIType.VIDEOGEN: "inference_endpoint.videogen.adapter.VideoGenAccumulator", } diff --git a/src/inference_endpoint/wan22/__init__.py b/src/inference_endpoint/videogen/__init__.py similarity index 82% rename from src/inference_endpoint/wan22/__init__.py rename to src/inference_endpoint/videogen/__init__.py index e485b4fd..ad5fbeca 100644 --- a/src/inference_endpoint/wan22/__init__.py +++ b/src/inference_endpoint/videogen/__init__.py @@ -13,14 +13,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Public API for the WAN 2.2 inference module.""" +"""Public API for the WAN 2.2 video generation inference module.""" -from .adapter import Wan22Accumulator, Wan22Adapter +from .adapter import VideoGenAccumulator, VideoGenAdapter from .types import VideoPathRequest, VideoPathResponse, VideoPayloadResponse __all__ = [ - "Wan22Adapter", - "Wan22Accumulator", + "VideoGenAdapter", + "VideoGenAccumulator", "VideoPathRequest", "VideoPathResponse", "VideoPayloadResponse", diff --git a/src/inference_endpoint/wan22/adapter.py b/src/inference_endpoint/videogen/adapter.py similarity index 98% rename from src/inference_endpoint/wan22/adapter.py rename to src/inference_endpoint/videogen/adapter.py index 73e78994..f71f8552 100644 --- a/src/inference_endpoint/wan22/adapter.py +++ b/src/inference_endpoint/videogen/adapter.py @@ -32,7 +32,7 @@ from inference_endpoint.dataset_manager.transforms import Transform -class Wan22Adapter(HttpRequestAdapter): +class VideoGenAdapter(HttpRequestAdapter): """Adapter for trtllm-serve POST /v1/videos/generations. Uses response_format='video_path': the server saves the encoded video to @@ -94,7 +94,7 @@ def decode_sse_message(cls, json_bytes: bytes) -> str: raise NotImplementedError("WAN 2.2 does not use SSE streaming") -class Wan22Accumulator: +class VideoGenAccumulator: """No-op SSE accumulator satisfying SSEAccumulatorProtocol. WAN 2.2 uses non-streaming HTTP. This class exists only to satisfy diff --git a/src/inference_endpoint/wan22/dataset.py b/src/inference_endpoint/videogen/dataset.py similarity index 90% rename from src/inference_endpoint/wan22/dataset.py rename to src/inference_endpoint/videogen/dataset.py index 80930be1..dd12565c 100644 --- a/src/inference_endpoint/wan22/dataset.py +++ b/src/inference_endpoint/videogen/dataset.py @@ -23,11 +23,11 @@ from inference_endpoint.dataset_manager.dataset import Dataset -class Wan22Dataset(Dataset, dataset_id="wan22_mlperf"): +class VideoGenDataset(Dataset, dataset_id="wan22_mlperf"): """Dataset that loads MLPerf WAN2.2 prompt text files. Each non-blank line in the file is one prompt. MLPerf endpoints run perf - and accuracy in a single pass, so Wan22Adapter always requests video_bytes. + and accuracy in a single pass, so VideoGenAdapter always requests video_bytes. """ COLUMN_NAMES = ["prompt"] @@ -38,8 +38,8 @@ def get_dataloader( # type: ignore[override] path: Path | str | None = None, negative_prompt: str = "", **kwargs: Any, - ) -> "Wan22Dataset": - """Create a Wan22Dataset from a prompts file path. + ) -> "VideoGenDataset": + """Create a VideoGenDataset from a prompts file path. Called by DataLoaderFactory when ``--dataset `` is used with ``name=wan22_mlperf``. The ``path`` argument maps directly to @@ -47,7 +47,7 @@ def get_dataloader( # type: ignore[override] """ if path is None: raise ValueError( - "Wan22Dataset requires a prompts file path. " + "VideoGenDataset requires a prompts file path. " "Pass --dataset or set path= in the dataset config." ) return cls(prompts_path=path, negative_prompt=negative_prompt) diff --git a/src/inference_endpoint/wan22/types.py b/src/inference_endpoint/videogen/types.py similarity index 97% rename from src/inference_endpoint/wan22/types.py rename to src/inference_endpoint/videogen/types.py index 896cc9ba..b4173a18 100644 --- a/src/inference_endpoint/wan22/types.py +++ b/src/inference_endpoint/videogen/types.py @@ -26,7 +26,7 @@ class VideoPathRequest(BaseModel): Matches trtllm-serve's VideoGenerationRequest. All fields have MLPerf defaults so that only `prompt` is required from the dataset. - `response_format` is set by Wan22Adapter based on benchmark mode: + `response_format` is set by VideoGenAdapter based on benchmark mode: - "video_path" (perf mode): server saves video to shared storage, returns path only. - "video_bytes" (accuracy mode): server returns base64-encoded video content. """ diff --git a/tests/integration/wan22/__init__.py b/tests/integration/videogen/__init__.py similarity index 100% rename from tests/integration/wan22/__init__.py rename to tests/integration/videogen/__init__.py diff --git a/tests/integration/wan22/conftest.py b/tests/integration/videogen/conftest.py similarity index 100% rename from tests/integration/wan22/conftest.py rename to tests/integration/videogen/conftest.py diff --git a/tests/integration/wan22/test_adapter.py b/tests/integration/videogen/test_adapter.py similarity index 82% rename from tests/integration/wan22/test_adapter.py rename to tests/integration/videogen/test_adapter.py index 83bdcd9b..6b2d7b42 100644 --- a/tests/integration/wan22/test_adapter.py +++ b/tests/integration/videogen/test_adapter.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Integration tests: Wan22Adapter encode/decode round-trip against mock trtllm-serve.""" +"""Integration tests: VideoGenAdapter encode/decode round-trip against mock trtllm-serve.""" import base64 import json @@ -24,7 +24,7 @@ from pydantic import ValidationError from inference_endpoint.core.types import Query -from inference_endpoint.wan22.adapter import Wan22Adapter +from inference_endpoint.videogen.adapter import VideoGenAdapter from .conftest import DUMMY_VIDEO_BYTES, MockTrtllmServe, MockTrtllmServeError @@ -45,21 +45,21 @@ def _post(url: str, body: bytes) -> tuple[int, bytes]: @pytest.mark.integration -class TestWan22AdapterRoundTrip: +class TestVideoGenAdapterRoundTrip: """Verify encode_query → HTTP POST → decode_response against mock trtllm-serve.""" def test_successful_generation_returns_video_bytes( self, mock_trtllm_serve: MockTrtllmServe ) -> None: query = Query(id="q1", data={"prompt": "a golden retriever running on a beach"}) - request_bytes = Wan22Adapter.encode_query(query) + request_bytes = VideoGenAdapter.encode_query(query) status, content = _post( f"{mock_trtllm_serve.url}/v1/videos/generations", request_bytes ) assert status == 200 - result = Wan22Adapter.decode_response(content, query.id) + result = VideoGenAdapter.decode_response(content, query.id) assert result.id == "q1" assert result.error is None assert "video_bytes" in result.metadata @@ -70,14 +70,14 @@ def test_request_always_asks_for_video_bytes( self, mock_trtllm_serve: MockTrtllmServe ) -> None: query = Query(id="q2", data={"prompt": "ocean waves at sunset"}) - payload = json.loads(Wan22Adapter.encode_query(query)) + payload = json.loads(VideoGenAdapter.encode_query(query)) assert payload["response_format"] == "video_bytes" def test_request_carries_mlperf_defaults( self, mock_trtllm_serve: MockTrtllmServe ) -> None: query = Query(id="q3", data={"prompt": "ocean waves at sunset"}) - payload = json.loads(Wan22Adapter.encode_query(query)) + payload = json.loads(VideoGenAdapter.encode_query(query)) assert payload["fps"] == 16 assert payload["seconds"] == pytest.approx(5.0) assert payload["size"] == "720x1280" @@ -87,29 +87,29 @@ def test_request_carries_mlperf_defaults( @pytest.mark.integration -class TestWan22AdapterErrorHandling: +class TestVideoGenAdapterErrorHandling: def test_http_500_response_raises_on_decode( self, mock_trtllm_serve_error: MockTrtllmServeError ) -> None: query = Query(id="q4", data={"prompt": "a cat"}) status, content = _post( f"{mock_trtllm_serve_error.url}/v1/videos/generations", - Wan22Adapter.encode_query(query), + VideoGenAdapter.encode_query(query), ) assert status == 500 with pytest.raises(Exception): - Wan22Adapter.decode_response(content, query.id) + VideoGenAdapter.decode_response(content, query.id) def test_malformed_json_response_raises(self) -> None: with pytest.raises(Exception): - Wan22Adapter.decode_response(b"not json at all", "q5") + VideoGenAdapter.decode_response(b"not json at all", "q5") def test_missing_video_bytes_field_raises_validation_error(self) -> None: bad_body = b'{"video_id": "vid_001"}' # missing video_bytes with pytest.raises(ValidationError): - Wan22Adapter.decode_response(bad_body, "q6") + VideoGenAdapter.decode_response(bad_body, "q6") def test_missing_video_id_field_raises_validation_error(self) -> None: bad_body = b'{"video_bytes": "AAEC"}' # missing video_id with pytest.raises(ValidationError): - Wan22Adapter.decode_response(bad_body, "q7") + VideoGenAdapter.decode_response(bad_body, "q7") diff --git a/tests/unit/wan22/__init__.py b/tests/unit/videogen/__init__.py similarity index 100% rename from tests/unit/wan22/__init__.py rename to tests/unit/videogen/__init__.py diff --git a/tests/unit/wan22/test_adapter.py b/tests/unit/videogen/test_adapter.py similarity index 74% rename from tests/unit/wan22/test_adapter.py rename to tests/unit/videogen/test_adapter.py index 54c13aea..6b4e4ece 100644 --- a/tests/unit/wan22/test_adapter.py +++ b/tests/unit/videogen/test_adapter.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unit tests for Wan22Adapter and Wan22Accumulator (trtllm-native API).""" +"""Unit tests for VideoGenAdapter and VideoGenAccumulator (trtllm-native API).""" import json @@ -23,26 +23,26 @@ from inference_endpoint.endpoint_client.accumulator_protocol import ( SSEAccumulatorProtocol, ) -from inference_endpoint.wan22.adapter import Wan22Accumulator, Wan22Adapter -from inference_endpoint.wan22.types import VideoPayloadResponse +from inference_endpoint.videogen.adapter import VideoGenAccumulator, VideoGenAdapter +from inference_endpoint.videogen.types import VideoPayloadResponse @pytest.mark.unit -class TestWan22Adapter: +class TestVideoGenAdapter: def test_encode_query_produces_valid_json(self): query = Query(id="q1", data={"prompt": "a golden retriever running"}) - payload = json.loads(Wan22Adapter.encode_query(query)) + payload = json.loads(VideoGenAdapter.encode_query(query)) assert payload["prompt"] == "a golden retriever running" def test_encode_query_always_requests_video_bytes(self): """MLPerf runs perf+accuracy in one pass — always request video_bytes.""" query = Query(id="q1", data={"prompt": "ocean waves"}) - payload = json.loads(Wan22Adapter.encode_query(query)) + payload = json.loads(VideoGenAdapter.encode_query(query)) assert payload["response_format"] == "video_bytes" def test_encode_query_uses_mlperf_defaults(self): query = Query(id="q1", data={"prompt": "ocean waves"}) - payload = json.loads(Wan22Adapter.encode_query(query)) + payload = json.loads(VideoGenAdapter.encode_query(query)) assert payload["fps"] == 16 assert payload["seconds"] == pytest.approx(5.0) assert payload["size"] == "720x1280" @@ -56,27 +56,27 @@ def test_encode_query_allows_override_via_data(self): id="q1", data={"prompt": "test", "seed": 99, "fps": 24, "guidance_scale": 6.0}, ) - payload = json.loads(Wan22Adapter.encode_query(query)) + payload = json.loads(VideoGenAdapter.encode_query(query)) assert payload["seed"] == 99 assert payload["fps"] == 24 assert payload["guidance_scale"] == pytest.approx(6.0) def test_encode_query_includes_negative_prompt(self): query = Query(id="q1", data={"prompt": "test", "negative_prompt": "blurry"}) - payload = json.loads(Wan22Adapter.encode_query(query)) + payload = json.loads(VideoGenAdapter.encode_query(query)) assert payload["negative_prompt"] == "blurry" def test_encode_query_missing_prompt_raises(self): query = Query(id="q1", data={"seed": 42}) with pytest.raises(KeyError): - Wan22Adapter.encode_query(query) + VideoGenAdapter.encode_query(query) def test_decode_response_returns_video_bytes_in_metadata(self): resp = VideoPayloadResponse( video_id="video_abc123", video_bytes="dGVzdCB2aWRlbyBjb250ZW50", ) - result = Wan22Adapter.decode_response(resp.model_dump_json().encode(), "q1") + result = VideoGenAdapter.decode_response(resp.model_dump_json().encode(), "q1") assert isinstance(result, QueryResult) assert result.id == "q1" assert result.error is None @@ -84,33 +84,33 @@ def test_decode_response_returns_video_bytes_in_metadata(self): def test_decode_response_video_id_in_output(self): resp = VideoPayloadResponse(video_id="vid_xyz", video_bytes="AAEC") - result = Wan22Adapter.decode_response(resp.model_dump_json().encode(), "q1") + result = VideoGenAdapter.decode_response(resp.model_dump_json().encode(), "q1") assert result.response_output.output == "vid_xyz" def test_decode_sse_message_raises_not_implemented(self): with pytest.raises(NotImplementedError): - Wan22Adapter.decode_sse_message(b"{}") + VideoGenAdapter.decode_sse_message(b"{}") def test_dataset_transforms_returns_empty_list(self): params = ModelParams() - assert Wan22Adapter.dataset_transforms(params) == [] + assert VideoGenAdapter.dataset_transforms(params) == [] def test_default_route_is_trtllm_native(self): - assert APIType.WAN22.default_route() == "/v1/videos/generations" + assert APIType.VIDEOGEN.default_route() == "/v1/videos/generations" @pytest.mark.unit -class TestWan22Accumulator: +class TestVideoGenAccumulator: def test_add_chunk_always_returns_none(self): - acc = Wan22Accumulator(query_id="q1", stream_all_chunks=True) + acc = VideoGenAccumulator(query_id="q1", stream_all_chunks=True) assert acc.add_chunk("anything") is None assert acc.add_chunk(None) is None def test_get_final_output_returns_query_result_with_id(self): - acc = Wan22Accumulator(query_id="q1", stream_all_chunks=False) + acc = VideoGenAccumulator(query_id="q1", stream_all_chunks=False) result = acc.get_final_output() assert isinstance(result, QueryResult) assert result.id == "q1" def test_satisfies_sse_accumulator_protocol(self): - assert isinstance(Wan22Accumulator("q1", False), SSEAccumulatorProtocol) + assert isinstance(VideoGenAccumulator("q1", False), SSEAccumulatorProtocol) diff --git a/tests/unit/wan22/test_dataset.py b/tests/unit/videogen/test_dataset.py similarity index 81% rename from tests/unit/wan22/test_dataset.py rename to tests/unit/videogen/test_dataset.py index 55c41982..19ebfb3a 100644 --- a/tests/unit/wan22/test_dataset.py +++ b/tests/unit/videogen/test_dataset.py @@ -13,17 +13,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unit tests for Wan22Dataset.""" +"""Unit tests for VideoGenDataset.""" from pathlib import Path import pytest from inference_endpoint.dataset_manager.dataset import Dataset -from inference_endpoint.wan22.dataset import Wan22Dataset +from inference_endpoint.videogen.dataset import VideoGenDataset @pytest.mark.unit -class TestWan22Dataset: +class TestVideoGenDataset: @pytest.fixture def prompts_file(self, tmp_path: Path) -> Path: p = tmp_path / "prompts.txt" @@ -36,12 +36,12 @@ def prompts_file(self, tmp_path: Path) -> Path: return p def test_loads_prompts_skipping_blank_lines(self, prompts_file: Path): - ds = Wan22Dataset(prompts_path=prompts_file) + ds = VideoGenDataset(prompts_path=prompts_file) ds.load() assert ds.num_samples() == 3 def test_load_sample_returns_expected_keys(self, prompts_file: Path): - ds = Wan22Dataset(prompts_path=prompts_file) + ds = VideoGenDataset(prompts_path=prompts_file) ds.load() sample = ds.load_sample(0) assert set(sample.keys()) == { @@ -52,7 +52,7 @@ def test_load_sample_returns_expected_keys(self, prompts_file: Path): } def test_load_sample_correct_values(self, prompts_file: Path): - ds = Wan22Dataset(prompts_path=prompts_file) + ds = VideoGenDataset(prompts_path=prompts_file) ds.load() sample = ds.load_sample(1) assert sample["prompt"] == "a red sports car on a mountain road" @@ -61,18 +61,18 @@ def test_load_sample_correct_values(self, prompts_file: Path): assert sample["negative_prompt"] == "" def test_negative_prompt_propagated(self, prompts_file: Path): - ds = Wan22Dataset(prompts_path=prompts_file, negative_prompt="blurry") + ds = VideoGenDataset(prompts_path=prompts_file, negative_prompt="blurry") ds.load() assert ds.load_sample(0)["negative_prompt"] == "blurry" def test_index_wrapping(self, prompts_file: Path): - ds = Wan22Dataset(prompts_path=prompts_file) + ds = VideoGenDataset(prompts_path=prompts_file) ds.load() assert ds.load_sample(3)["prompt"] == ds.load_sample(0)["prompt"] assert ds.load_sample(7)["prompt"] == ds.load_sample(1)["prompt"] def test_load_before_load_raises_assertion(self, prompts_file: Path): - ds = Wan22Dataset(prompts_path=prompts_file) + ds = VideoGenDataset(prompts_path=prompts_file) with pytest.raises(AssertionError): ds.num_samples() @@ -80,16 +80,16 @@ def test_registered_as_predefined_dataset(self): assert "wan22_mlperf" in Dataset.PREDEFINED def test_get_dataloader_from_path(self, prompts_file: Path): - ds = Wan22Dataset.get_dataloader(path=prompts_file) + ds = VideoGenDataset.get_dataloader(path=prompts_file) ds.load() assert ds.num_samples() == 3 assert ds.load_sample(0)["prompt"] == "a golden retriever running in a field" def test_get_dataloader_passes_negative_prompt(self, prompts_file: Path): - ds = Wan22Dataset.get_dataloader(path=prompts_file, negative_prompt="blurry") + ds = VideoGenDataset.get_dataloader(path=prompts_file, negative_prompt="blurry") ds.load() assert ds.load_sample(0)["negative_prompt"] == "blurry" def test_get_dataloader_requires_path(self): with pytest.raises((TypeError, ValueError)): - Wan22Dataset.get_dataloader() + VideoGenDataset.get_dataloader() diff --git a/tests/unit/wan22/test_factory.py b/tests/unit/videogen/test_factory.py similarity index 89% rename from tests/unit/wan22/test_factory.py rename to tests/unit/videogen/test_factory.py index a4b4ef7f..3ead80da 100644 --- a/tests/unit/wan22/test_factory.py +++ b/tests/unit/videogen/test_factory.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unit tests: DataLoaderFactory creates Wan22Dataset from --dataset path.""" +"""Unit tests: DataLoaderFactory creates VideoGenDataset from --dataset path.""" from pathlib import Path @@ -21,7 +21,7 @@ from inference_endpoint.config.schema import Dataset as DatasetConfig from inference_endpoint.dataset_manager.factory import DataLoaderFactory -from inference_endpoint.wan22.dataset import Wan22Dataset +from inference_endpoint.videogen.dataset import VideoGenDataset @pytest.fixture @@ -35,12 +35,12 @@ def prompts_file(tmp_path: Path) -> Path: @pytest.mark.unit -class TestFactoryWan22Dataset: +class TestFactoryVideoGenDataset: def test_factory_creates_wan22_dataset_from_name_and_path(self, prompts_file: Path): config = DatasetConfig(name="wan22_mlperf", path=str(prompts_file)) ds = DataLoaderFactory.create_loader(config) ds.load() - assert isinstance(ds, Wan22Dataset) + assert isinstance(ds, VideoGenDataset) assert ds.num_samples() == 2 def test_factory_wan22_sample_has_prompt(self, prompts_file: Path): diff --git a/tests/unit/wan22/test_init.py b/tests/unit/videogen/test_init.py similarity index 79% rename from tests/unit/wan22/test_init.py rename to tests/unit/videogen/test_init.py index 926bb6dc..d437a1dd 100644 --- a/tests/unit/wan22/test_init.py +++ b/tests/unit/videogen/test_init.py @@ -13,23 +13,23 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Verify wan22 public namespace exports.""" +"""Verify videogen public namespace exports.""" import pytest -from inference_endpoint.wan22 import ( +from inference_endpoint.videogen import ( VideoPathRequest, VideoPathResponse, VideoPayloadResponse, - Wan22Accumulator, - Wan22Adapter, + VideoGenAccumulator, + VideoGenAdapter, ) @pytest.mark.unit -class TestWan22PublicExports: +class TestVideoGenPublicExports: def test_all_public_exports_importable(self): assert VideoPathRequest is not None assert VideoPathResponse is not None assert VideoPayloadResponse is not None - assert Wan22Adapter is not None - assert Wan22Accumulator is not None + assert VideoGenAdapter is not None + assert VideoGenAccumulator is not None diff --git a/tests/unit/wan22/test_registration.py b/tests/unit/videogen/test_registration.py similarity index 63% rename from tests/unit/wan22/test_registration.py rename to tests/unit/videogen/test_registration.py index a2144d93..08f8bea3 100644 --- a/tests/unit/wan22/test_registration.py +++ b/tests/unit/videogen/test_registration.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Tests that APIType.WAN22 is registered and wired up correctly.""" +"""Tests that APIType.VIDEOGEN is registered and wired up correctly.""" from importlib import import_module @@ -23,30 +23,30 @@ @pytest.mark.unit -def test_api_type_wan22_exists(): - assert APIType.WAN22 == "wan22" +def test_api_type_videogen_exists(): + assert APIType.VIDEOGEN == "videogen" @pytest.mark.unit -def test_api_type_wan22_default_route(): - assert APIType.WAN22.default_route() == "/v1/videos/generations" +def test_api_type_videogen_default_route(): + assert APIType.VIDEOGEN.default_route() == "/v1/videos/generations" @pytest.mark.unit -def test_wan22_in_adapter_map(): - assert APIType.WAN22 in ADAPTER_MAP - assert "Wan22Adapter" in ADAPTER_MAP[APIType.WAN22] +def test_videogen_in_adapter_map(): + assert APIType.VIDEOGEN in ADAPTER_MAP + assert "VideoGenAdapter" in ADAPTER_MAP[APIType.VIDEOGEN] @pytest.mark.unit -def test_wan22_in_accumulator_map(): - assert APIType.WAN22 in ACCUMULATOR_MAP - assert "Wan22Accumulator" in ACCUMULATOR_MAP[APIType.WAN22] +def test_videogen_in_accumulator_map(): + assert APIType.VIDEOGEN in ACCUMULATOR_MAP + assert "VideoGenAccumulator" in ACCUMULATOR_MAP[APIType.VIDEOGEN] @pytest.mark.unit -def test_wan22_adapter_loadable(): - path = ADAPTER_MAP[APIType.WAN22] +def test_videogen_adapter_loadable(): + path = ADAPTER_MAP[APIType.VIDEOGEN] module_path, class_name = path.rsplit(".", 1) mod = import_module(module_path) cls = getattr(mod, class_name) @@ -54,8 +54,8 @@ def test_wan22_adapter_loadable(): @pytest.mark.unit -def test_wan22_accumulator_loadable(): - path = ACCUMULATOR_MAP[APIType.WAN22] +def test_videogen_accumulator_loadable(): + path = ACCUMULATOR_MAP[APIType.VIDEOGEN] module_path, class_name = path.rsplit(".", 1) mod = import_module(module_path) cls = getattr(mod, class_name) diff --git a/tests/unit/wan22/test_types.py b/tests/unit/videogen/test_types.py similarity index 96% rename from tests/unit/wan22/test_types.py rename to tests/unit/videogen/test_types.py index 958c1cb3..964a91be 100644 --- a/tests/unit/wan22/test_types.py +++ b/tests/unit/videogen/test_types.py @@ -13,12 +13,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unit tests for wan22 Pydantic wire models (trtllm-serve native API).""" +"""Unit tests for videogen Pydantic wire models (trtllm-serve native API).""" import pytest from pydantic import ValidationError -from inference_endpoint.wan22.types import ( +from inference_endpoint.videogen.types import ( VideoPathRequest, VideoPathResponse, VideoPayloadResponse, From fe068e4ee10d595980af446b3ec7e241a172eeac Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Wed, 29 Apr 2026 19:28:24 -0700 Subject: [PATCH 04/22] fix: make response_format optional in VideoGenAdapter (default video_bytes) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit encode_query: response_format defaults to "video_bytes" but can be overridden via query.data["response_format"] = "video_path" for Lustre-path mode. decode_response: dispatches on response shape — "video_bytes" key → VideoPayloadResponse, otherwise → VideoPathResponse. --- src/inference_endpoint/videogen/adapter.py | 36 ++++++++++++++-------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/inference_endpoint/videogen/adapter.py b/src/inference_endpoint/videogen/adapter.py index f71f8552..7ac92db4 100644 --- a/src/inference_endpoint/videogen/adapter.py +++ b/src/inference_endpoint/videogen/adapter.py @@ -15,6 +15,7 @@ """Adapter for the WAN 2.2 trtllm-serve POST /v1/videos/generations endpoint.""" +import json from typing import TYPE_CHECKING, Any from inference_endpoint.core.types import ( @@ -25,7 +26,7 @@ ) from inference_endpoint.endpoint_client.adapter_protocol import HttpRequestAdapter -from .types import VideoPathRequest, VideoPathResponse +from .types import VideoPathRequest, VideoPathResponse, VideoPayloadResponse if TYPE_CHECKING: from inference_endpoint.config.schema import ModelParams @@ -35,11 +36,11 @@ class VideoGenAdapter(HttpRequestAdapter): """Adapter for trtllm-serve POST /v1/videos/generations. - Uses response_format='video_path': the server saves the encoded video to - shared storage (Lustre) and returns only the file path. This avoids - transferring 3-5 MB of base64 video bytes over HTTP and ZMQ per request. - MLPerf defines query completion as server finishing generation (spec option 2), - so latency measurement ends when the response is received regardless of format. + Supports both server response formats via query.data["response_format"]: + - "video_bytes" (default): server returns base64-encoded video content. + Suitable for accuracy evaluation in a single pass. + - "video_path": server saves video to shared storage (Lustre) and returns + only the file path. Avoids 3-5 MB payloads over HTTP + ZMQ per request. """ @classmethod @@ -52,8 +53,8 @@ def encode_query(cls, query: Query) -> bytes: Only `prompt` is required. All other fields fall back to MLPerf defaults defined in VideoPathRequest but can be overridden via query.data. - response_format is always 'video_path': avoids large byte payloads over - the HTTP + ZMQ transport path. + Pass response_format="video_path" in query.data to request a Lustre path + instead of inline video bytes. """ data = query.data if "prompt" not in data: @@ -71,18 +72,27 @@ def encode_query(cls, query: Query) -> bytes: guidance_scale_2=data.get("guidance_scale_2", 3.0), seed=data.get("seed", 42), output_format=data.get("output_format", "auto"), - response_format="video_path", + response_format=data.get("response_format", "video_bytes"), ) return req.model_dump_json().encode() @classmethod def decode_response(cls, response_bytes: bytes, query_id: str) -> QueryResult: - """Deserialise trtllm-serve VideoPathResponse JSON bytes to QueryResult. + """Deserialise trtllm-serve response JSON bytes to QueryResult. - metadata["video_path"] carries the Lustre path to the encoded video for - the accuracy evaluator. + Dispatches on the response shape: + - "video_bytes" response: metadata["video_bytes"] holds the base64 payload. + - "video_path" response: metadata["video_path"] holds the Lustre file path. """ - resp = VideoPathResponse.model_validate_json(response_bytes) + raw = json.loads(response_bytes) + if "video_bytes" in raw: + resp = VideoPayloadResponse.model_validate(raw) + return QueryResult( + id=query_id, + response_output=TextModelOutput(output=resp.video_id), + metadata={"video_bytes": resp.video_bytes}, + ) + resp = VideoPathResponse.model_validate(raw) return QueryResult( id=query_id, response_output=TextModelOutput(output=resp.video_id), From a9d17034f55b8c86be199ca411deb879f3767549 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Wed, 29 Apr 2026 19:28:24 -0700 Subject: [PATCH 05/22] chore(wan22): add MLPerf WAN2.2 prompt dataset (248 samples) --- datasets/wan22_prompts.jsonl | 248 +++++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 datasets/wan22_prompts.jsonl diff --git a/datasets/wan22_prompts.jsonl b/datasets/wan22_prompts.jsonl new file mode 100644 index 00000000..e3521acc --- /dev/null +++ b/datasets/wan22_prompts.jsonl @@ -0,0 +1,248 @@ +{"prompt": "a person swimming in ocean", "sample_id": "0", "sample_index": 0, "negative_prompt": "", "mode": "perf"} +{"prompt": "a person giving a presentation to a room full of colleagues", "sample_id": "1", "sample_index": 1, "negative_prompt": "", "mode": "perf"} +{"prompt": "a person washing the dishes", "sample_id": "2", "sample_index": 2, "negative_prompt": "", "mode": "perf"} +{"prompt": "a person eating a burger", "sample_id": "3", "sample_index": 3, "negative_prompt": "", "mode": "perf"} +{"prompt": "a person walking in the snowstorm", "sample_id": "4", "sample_index": 4, "negative_prompt": "", "mode": "perf"} +{"prompt": "a person drinking coffee in a cafe", "sample_id": "5", "sample_index": 5, "negative_prompt": "", "mode": "perf"} +{"prompt": "a person playing guitar", "sample_id": "6", "sample_index": 6, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bicycle leaning against a tree", "sample_id": "7", "sample_index": 7, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bicycle gliding through a snowy field", "sample_id": "8", "sample_index": 8, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bicycle slowing down to stop", "sample_id": "9", "sample_index": 9, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bicycle accelerating to gain speed", "sample_id": "10", "sample_index": 10, "negative_prompt": "", "mode": "perf"} +{"prompt": "a car stuck in traffic during rush hour", "sample_id": "11", "sample_index": 11, "negative_prompt": "", "mode": "perf"} +{"prompt": "a car turning a corner", "sample_id": "12", "sample_index": 12, "negative_prompt": "", "mode": "perf"} +{"prompt": "a car slowing down to stop", "sample_id": "13", "sample_index": 13, "negative_prompt": "", "mode": "perf"} +{"prompt": "a car accelerating to gain speed", "sample_id": "14", "sample_index": 14, "negative_prompt": "", "mode": "perf"} +{"prompt": "a motorcycle cruising along a coastal highway", "sample_id": "15", "sample_index": 15, "negative_prompt": "", "mode": "perf"} +{"prompt": "a motorcycle turning a corner", "sample_id": "16", "sample_index": 16, "negative_prompt": "", "mode": "perf"} +{"prompt": "a motorcycle slowing down to stop", "sample_id": "17", "sample_index": 17, "negative_prompt": "", "mode": "perf"} +{"prompt": "a motorcycle gliding through a snowy field", "sample_id": "18", "sample_index": 18, "negative_prompt": "", "mode": "perf"} +{"prompt": "a motorcycle accelerating to gain speed", "sample_id": "19", "sample_index": 19, "negative_prompt": "", "mode": "perf"} +{"prompt": "an airplane soaring through a clear blue sky", "sample_id": "20", "sample_index": 20, "negative_prompt": "", "mode": "perf"} +{"prompt": "an airplane taking off", "sample_id": "21", "sample_index": 21, "negative_prompt": "", "mode": "perf"} +{"prompt": "an airplane landing smoothly on a runway", "sample_id": "22", "sample_index": 22, "negative_prompt": "", "mode": "perf"} +{"prompt": "an airplane accelerating to gain speed", "sample_id": "23", "sample_index": 23, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bus turning a corner", "sample_id": "24", "sample_index": 24, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bus stuck in traffic during rush hour", "sample_id": "25", "sample_index": 25, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bus accelerating to gain speed", "sample_id": "26", "sample_index": 26, "negative_prompt": "", "mode": "perf"} +{"prompt": "a train speeding down the tracks", "sample_id": "27", "sample_index": 27, "negative_prompt": "", "mode": "perf"} +{"prompt": "a train crossing over a tall bridge", "sample_id": "28", "sample_index": 28, "negative_prompt": "", "mode": "perf"} +{"prompt": "a train accelerating to gain speed", "sample_id": "29", "sample_index": 29, "negative_prompt": "", "mode": "perf"} +{"prompt": "a truck turning a corner", "sample_id": "30", "sample_index": 30, "negative_prompt": "", "mode": "perf"} +{"prompt": "a truck anchored in a tranquil bay", "sample_id": "31", "sample_index": 31, "negative_prompt": "", "mode": "perf"} +{"prompt": "a truck stuck in traffic during rush hour", "sample_id": "32", "sample_index": 32, "negative_prompt": "", "mode": "perf"} +{"prompt": "a truck slowing down to stop", "sample_id": "33", "sample_index": 33, "negative_prompt": "", "mode": "perf"} +{"prompt": "a truck accelerating to gain speed", "sample_id": "34", "sample_index": 34, "negative_prompt": "", "mode": "perf"} +{"prompt": "a boat sailing smoothly on a calm lake", "sample_id": "35", "sample_index": 35, "negative_prompt": "", "mode": "perf"} +{"prompt": "a boat slowing down to stop", "sample_id": "36", "sample_index": 36, "negative_prompt": "", "mode": "perf"} +{"prompt": "a boat accelerating to gain speed", "sample_id": "37", "sample_index": 37, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bird soaring gracefully in the sky", "sample_id": "38", "sample_index": 38, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bird building a nest from twigs and leaves", "sample_id": "39", "sample_index": 39, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bird flying over a snowy forest", "sample_id": "40", "sample_index": 40, "negative_prompt": "", "mode": "perf"} +{"prompt": "a cat grooming itself meticulously with its tongue", "sample_id": "41", "sample_index": 41, "negative_prompt": "", "mode": "perf"} +{"prompt": "a cat playing in park", "sample_id": "42", "sample_index": 42, "negative_prompt": "", "mode": "perf"} +{"prompt": "a cat drinking water", "sample_id": "43", "sample_index": 43, "negative_prompt": "", "mode": "perf"} +{"prompt": "a cat running happily", "sample_id": "44", "sample_index": 44, "negative_prompt": "", "mode": "perf"} +{"prompt": "a dog enjoying a peaceful walk", "sample_id": "45", "sample_index": 45, "negative_prompt": "", "mode": "perf"} +{"prompt": "a dog playing in park", "sample_id": "46", "sample_index": 46, "negative_prompt": "", "mode": "perf"} +{"prompt": "a dog drinking water", "sample_id": "47", "sample_index": 47, "negative_prompt": "", "mode": "perf"} +{"prompt": "a dog running happily", "sample_id": "48", "sample_index": 48, "negative_prompt": "", "mode": "perf"} +{"prompt": "a horse bending down to drink water from a river", "sample_id": "49", "sample_index": 49, "negative_prompt": "", "mode": "perf"} +{"prompt": "a horse galloping across an open field", "sample_id": "50", "sample_index": 50, "negative_prompt": "", "mode": "perf"} +{"prompt": "a horse taking a peaceful walk", "sample_id": "51", "sample_index": 51, "negative_prompt": "", "mode": "perf"} +{"prompt": "a horse running to join a herd of its kind", "sample_id": "52", "sample_index": 52, "negative_prompt": "", "mode": "perf"} +{"prompt": "a sheep bending down to drink water from a river", "sample_id": "53", "sample_index": 53, "negative_prompt": "", "mode": "perf"} +{"prompt": "a sheep taking a peaceful walk", "sample_id": "54", "sample_index": 54, "negative_prompt": "", "mode": "perf"} +{"prompt": "a sheep running to join a herd of its kind", "sample_id": "55", "sample_index": 55, "negative_prompt": "", "mode": "perf"} +{"prompt": "a cow bending down to drink water from a river", "sample_id": "56", "sample_index": 56, "negative_prompt": "", "mode": "perf"} +{"prompt": "a cow chewing cud while resting in a tranquil barn", "sample_id": "57", "sample_index": 57, "negative_prompt": "", "mode": "perf"} +{"prompt": "a cow running to join a herd of its kind", "sample_id": "58", "sample_index": 58, "negative_prompt": "", "mode": "perf"} +{"prompt": "an elephant spraying itself with water using its trunk to cool down", "sample_id": "59", "sample_index": 59, "negative_prompt": "", "mode": "perf"} +{"prompt": "an elephant taking a peaceful walk", "sample_id": "60", "sample_index": 60, "negative_prompt": "", "mode": "perf"} +{"prompt": "an elephant running to join a herd of its kind", "sample_id": "61", "sample_index": 61, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bear catching a salmon in its powerful jaws", "sample_id": "62", "sample_index": 62, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bear sniffing the air for scents of food", "sample_id": "63", "sample_index": 63, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bear climbing a tree", "sample_id": "64", "sample_index": 64, "negative_prompt": "", "mode": "perf"} +{"prompt": "a bear hunting for prey", "sample_id": "65", "sample_index": 65, "negative_prompt": "", "mode": "perf"} +{"prompt": "a zebra bending down to drink water from a river", "sample_id": "66", "sample_index": 66, "negative_prompt": "", "mode": "perf"} +{"prompt": "a zebra running to join a herd of its kind", "sample_id": "67", "sample_index": 67, "negative_prompt": "", "mode": "perf"} +{"prompt": "a zebra taking a peaceful walk", "sample_id": "68", "sample_index": 68, "negative_prompt": "", "mode": "perf"} +{"prompt": "a giraffe bending down to drink water from a river", "sample_id": "69", "sample_index": 69, "negative_prompt": "", "mode": "perf"} +{"prompt": "a giraffe taking a peaceful walk", "sample_id": "70", "sample_index": 70, "negative_prompt": "", "mode": "perf"} +{"prompt": "a giraffe running to join a herd of its kind", "sample_id": "71", "sample_index": 71, "negative_prompt": "", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, Van Gogh style", "sample_id": "72", "sample_index": 72, "negative_prompt": "", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, oil painting", "sample_id": "73", "sample_index": 73, "negative_prompt": "", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand by Hokusai, in the style of Ukiyo", "sample_id": "74", "sample_index": 74, "negative_prompt": "", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, black and white", "sample_id": "75", "sample_index": 75, "negative_prompt": "", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, pixel art", "sample_id": "76", "sample_index": 76, "negative_prompt": "", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, in cyberpunk style", "sample_id": "77", "sample_index": 77, "negative_prompt": "", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, animated style", "sample_id": "78", "sample_index": 78, "negative_prompt": "", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, watercolor painting", "sample_id": "79", "sample_index": 79, "negative_prompt": "", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, surrealism style", "sample_id": "80", "sample_index": 80, "negative_prompt": "", "mode": "perf"} +{"prompt": "The bund Shanghai, Van Gogh style", "sample_id": "81", "sample_index": 81, "negative_prompt": "", "mode": "perf"} +{"prompt": "The bund Shanghai, oil painting", "sample_id": "82", "sample_index": 82, "negative_prompt": "", "mode": "perf"} +{"prompt": "The bund Shanghai by Hokusai, in the style of Ukiyo", "sample_id": "83", "sample_index": 83, "negative_prompt": "", "mode": "perf"} +{"prompt": "The bund Shanghai, black and white", "sample_id": "84", "sample_index": 84, "negative_prompt": "", "mode": "perf"} +{"prompt": "The bund Shanghai, pixel art", "sample_id": "85", "sample_index": 85, "negative_prompt": "", "mode": "perf"} +{"prompt": "The bund Shanghai, in cyberpunk style", "sample_id": "86", "sample_index": 86, "negative_prompt": "", "mode": "perf"} +{"prompt": "The bund Shanghai, animated style", "sample_id": "87", "sample_index": 87, "negative_prompt": "", "mode": "perf"} +{"prompt": "The bund Shanghai, watercolor painting", "sample_id": "88", "sample_index": 88, "negative_prompt": "", "mode": "perf"} +{"prompt": "The bund Shanghai, surrealism style", "sample_id": "89", "sample_index": 89, "negative_prompt": "", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, Van Gogh style", "sample_id": "90", "sample_index": 90, "negative_prompt": "", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, oil painting", "sample_id": "91", "sample_index": 91, "negative_prompt": "", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean by Hokusai, in the style of Ukiyo", "sample_id": "92", "sample_index": 92, "negative_prompt": "", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, black and white", "sample_id": "93", "sample_index": 93, "negative_prompt": "", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, pixel art", "sample_id": "94", "sample_index": 94, "negative_prompt": "", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, in cyberpunk style", "sample_id": "95", "sample_index": 95, "negative_prompt": "", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, animated style", "sample_id": "96", "sample_index": 96, "negative_prompt": "", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, watercolor painting", "sample_id": "97", "sample_index": 97, "negative_prompt": "", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, surrealism style", "sample_id": "98", "sample_index": 98, "negative_prompt": "", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, Van Gogh style", "sample_id": "99", "sample_index": 99, "negative_prompt": "", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, oil painting", "sample_id": "100", "sample_index": 100, "negative_prompt": "", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris by Hokusai, in the style of Ukiyo", "sample_id": "101", "sample_index": 101, "negative_prompt": "", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, black and white", "sample_id": "102", "sample_index": 102, "negative_prompt": "", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, pixel art", "sample_id": "103", "sample_index": 103, "negative_prompt": "", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, in cyberpunk style", "sample_id": "104", "sample_index": 104, "negative_prompt": "", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, animated style", "sample_id": "105", "sample_index": 105, "negative_prompt": "", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, watercolor painting", "sample_id": "106", "sample_index": 106, "negative_prompt": "", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, surrealism style", "sample_id": "107", "sample_index": 107, "negative_prompt": "", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, Van Gogh style", "sample_id": "108", "sample_index": 108, "negative_prompt": "", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, oil painting", "sample_id": "109", "sample_index": 109, "negative_prompt": "", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset by Hokusai, in the style of Ukiyo", "sample_id": "110", "sample_index": 110, "negative_prompt": "", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, black and white", "sample_id": "111", "sample_index": 111, "negative_prompt": "", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, pixel art", "sample_id": "112", "sample_index": 112, "negative_prompt": "", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, in cyberpunk style", "sample_id": "113", "sample_index": 113, "negative_prompt": "", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, animated style", "sample_id": "114", "sample_index": 114, "negative_prompt": "", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, watercolor painting", "sample_id": "115", "sample_index": 115, "negative_prompt": "", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, surrealism style", "sample_id": "116", "sample_index": 116, "negative_prompt": "", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, Van Gogh style", "sample_id": "117", "sample_index": 117, "negative_prompt": "", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, oil painting", "sample_id": "118", "sample_index": 118, "negative_prompt": "", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book by Hokusai, in the style of Ukiyo", "sample_id": "119", "sample_index": 119, "negative_prompt": "", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, black and white", "sample_id": "120", "sample_index": 120, "negative_prompt": "", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, pixel art", "sample_id": "121", "sample_index": 121, "negative_prompt": "", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, in cyberpunk style", "sample_id": "122", "sample_index": 122, "negative_prompt": "", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, animated style", "sample_id": "123", "sample_index": 123, "negative_prompt": "", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, watercolor painting", "sample_id": "124", "sample_index": 124, "negative_prompt": "", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, surrealism style", "sample_id": "125", "sample_index": 125, "negative_prompt": "", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, Van Gogh style", "sample_id": "126", "sample_index": 126, "negative_prompt": "", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, oil painting", "sample_id": "127", "sample_index": 127, "negative_prompt": "", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background by Hokusai, in the style of Ukiyo", "sample_id": "128", "sample_index": 128, "negative_prompt": "", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, black and white", "sample_id": "129", "sample_index": 129, "negative_prompt": "", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, pixel art", "sample_id": "130", "sample_index": 130, "negative_prompt": "", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, in cyberpunk style", "sample_id": "131", "sample_index": 131, "negative_prompt": "", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, animated style", "sample_id": "132", "sample_index": 132, "negative_prompt": "", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, watercolor painting", "sample_id": "133", "sample_index": 133, "negative_prompt": "", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, surrealism style", "sample_id": "134", "sample_index": 134, "negative_prompt": "", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, Van Gogh style", "sample_id": "135", "sample_index": 135, "negative_prompt": "", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, oil painting", "sample_id": "136", "sample_index": 136, "negative_prompt": "", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas by Hokusai, in the style of Ukiyo", "sample_id": "137", "sample_index": 137, "negative_prompt": "", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, black and white", "sample_id": "138", "sample_index": 138, "negative_prompt": "", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, pixel art", "sample_id": "139", "sample_index": 139, "negative_prompt": "", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, in cyberpunk style", "sample_id": "140", "sample_index": 140, "negative_prompt": "", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, animated style", "sample_id": "141", "sample_index": 141, "negative_prompt": "", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, watercolor painting", "sample_id": "142", "sample_index": 142, "negative_prompt": "", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, surrealism style", "sample_id": "143", "sample_index": 143, "negative_prompt": "", "mode": "perf"} +{"prompt": "An astronaut flying in space, Van Gogh style", "sample_id": "144", "sample_index": 144, "negative_prompt": "", "mode": "perf"} +{"prompt": "An astronaut flying in space, oil painting", "sample_id": "145", "sample_index": 145, "negative_prompt": "", "mode": "perf"} +{"prompt": "An astronaut flying in space by Hokusai, in the style of Ukiyo", "sample_id": "146", "sample_index": 146, "negative_prompt": "", "mode": "perf"} +{"prompt": "An astronaut flying in space, black and white", "sample_id": "147", "sample_index": 147, "negative_prompt": "", "mode": "perf"} +{"prompt": "An astronaut flying in space, pixel art", "sample_id": "148", "sample_index": 148, "negative_prompt": "", "mode": "perf"} +{"prompt": "An astronaut flying in space, in cyberpunk style", "sample_id": "149", "sample_index": 149, "negative_prompt": "", "mode": "perf"} +{"prompt": "An astronaut flying in space, animated style", "sample_id": "150", "sample_index": 150, "negative_prompt": "", "mode": "perf"} +{"prompt": "An astronaut flying in space, watercolor painting", "sample_id": "151", "sample_index": 151, "negative_prompt": "", "mode": "perf"} +{"prompt": "An astronaut flying in space, surrealism style", "sample_id": "152", "sample_index": 152, "negative_prompt": "", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, Van Gogh style", "sample_id": "153", "sample_index": 153, "negative_prompt": "", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, oil painting", "sample_id": "154", "sample_index": 154, "negative_prompt": "", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks by Hokusai, in the style of Ukiyo", "sample_id": "155", "sample_index": 155, "negative_prompt": "", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, black and white", "sample_id": "156", "sample_index": 156, "negative_prompt": "", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, pixel art", "sample_id": "157", "sample_index": 157, "negative_prompt": "", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, in cyberpunk style", "sample_id": "158", "sample_index": 158, "negative_prompt": "", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, animated style", "sample_id": "159", "sample_index": 159, "negative_prompt": "", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, watercolor painting", "sample_id": "160", "sample_index": 160, "negative_prompt": "", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, surrealism style", "sample_id": "161", "sample_index": 161, "negative_prompt": "", "mode": "perf"} +{"prompt": "alley", "sample_id": "162", "sample_index": 162, "negative_prompt": "", "mode": "perf"} +{"prompt": "amusement park", "sample_id": "163", "sample_index": 163, "negative_prompt": "", "mode": "perf"} +{"prompt": "aquarium", "sample_id": "164", "sample_index": 164, "negative_prompt": "", "mode": "perf"} +{"prompt": "arch", "sample_id": "165", "sample_index": 165, "negative_prompt": "", "mode": "perf"} +{"prompt": "art gallery", "sample_id": "166", "sample_index": 166, "negative_prompt": "", "mode": "perf"} +{"prompt": "bathroom", "sample_id": "167", "sample_index": 167, "negative_prompt": "", "mode": "perf"} +{"prompt": "bakery shop", "sample_id": "168", "sample_index": 168, "negative_prompt": "", "mode": "perf"} +{"prompt": "ballroom", "sample_id": "169", "sample_index": 169, "negative_prompt": "", "mode": "perf"} +{"prompt": "bar", "sample_id": "170", "sample_index": 170, "negative_prompt": "", "mode": "perf"} +{"prompt": "barn", "sample_id": "171", "sample_index": 171, "negative_prompt": "", "mode": "perf"} +{"prompt": "basement", "sample_id": "172", "sample_index": 172, "negative_prompt": "", "mode": "perf"} +{"prompt": "beach", "sample_id": "173", "sample_index": 173, "negative_prompt": "", "mode": "perf"} +{"prompt": "bedroom", "sample_id": "174", "sample_index": 174, "negative_prompt": "", "mode": "perf"} +{"prompt": "bridge", "sample_id": "175", "sample_index": 175, "negative_prompt": "", "mode": "perf"} +{"prompt": "botanical garden", "sample_id": "176", "sample_index": 176, "negative_prompt": "", "mode": "perf"} +{"prompt": "cafeteria", "sample_id": "177", "sample_index": 177, "negative_prompt": "", "mode": "perf"} +{"prompt": "campsite", "sample_id": "178", "sample_index": 178, "negative_prompt": "", "mode": "perf"} +{"prompt": "campus", "sample_id": "179", "sample_index": 179, "negative_prompt": "", "mode": "perf"} +{"prompt": "carrousel", "sample_id": "180", "sample_index": 180, "negative_prompt": "", "mode": "perf"} +{"prompt": "castle", "sample_id": "181", "sample_index": 181, "negative_prompt": "", "mode": "perf"} +{"prompt": "cemetery", "sample_id": "182", "sample_index": 182, "negative_prompt": "", "mode": "perf"} +{"prompt": "classroom", "sample_id": "183", "sample_index": 183, "negative_prompt": "", "mode": "perf"} +{"prompt": "cliff", "sample_id": "184", "sample_index": 184, "negative_prompt": "", "mode": "perf"} +{"prompt": "crosswalk", "sample_id": "185", "sample_index": 185, "negative_prompt": "", "mode": "perf"} +{"prompt": "construction site", "sample_id": "186", "sample_index": 186, "negative_prompt": "", "mode": "perf"} +{"prompt": "corridor", "sample_id": "187", "sample_index": 187, "negative_prompt": "", "mode": "perf"} +{"prompt": "courtyard", "sample_id": "188", "sample_index": 188, "negative_prompt": "", "mode": "perf"} +{"prompt": "desert", "sample_id": "189", "sample_index": 189, "negative_prompt": "", "mode": "perf"} +{"prompt": "downtown", "sample_id": "190", "sample_index": 190, "negative_prompt": "", "mode": "perf"} +{"prompt": "driveway", "sample_id": "191", "sample_index": 191, "negative_prompt": "", "mode": "perf"} +{"prompt": "farm", "sample_id": "192", "sample_index": 192, "negative_prompt": "", "mode": "perf"} +{"prompt": "food court", "sample_id": "193", "sample_index": 193, "negative_prompt": "", "mode": "perf"} +{"prompt": "football field", "sample_id": "194", "sample_index": 194, "negative_prompt": "", "mode": "perf"} +{"prompt": "forest road", "sample_id": "195", "sample_index": 195, "negative_prompt": "", "mode": "perf"} +{"prompt": "fountain", "sample_id": "196", "sample_index": 196, "negative_prompt": "", "mode": "perf"} +{"prompt": "gas station", "sample_id": "197", "sample_index": 197, "negative_prompt": "", "mode": "perf"} +{"prompt": "glacier", "sample_id": "198", "sample_index": 198, "negative_prompt": "", "mode": "perf"} +{"prompt": "golf course", "sample_id": "199", "sample_index": 199, "negative_prompt": "", "mode": "perf"} +{"prompt": "indoor gymnasium", "sample_id": "200", "sample_index": 200, "negative_prompt": "", "mode": "perf"} +{"prompt": "harbor", "sample_id": "201", "sample_index": 201, "negative_prompt": "", "mode": "perf"} +{"prompt": "highway", "sample_id": "202", "sample_index": 202, "negative_prompt": "", "mode": "perf"} +{"prompt": "hospital", "sample_id": "203", "sample_index": 203, "negative_prompt": "", "mode": "perf"} +{"prompt": "house", "sample_id": "204", "sample_index": 204, "negative_prompt": "", "mode": "perf"} +{"prompt": "iceberg", "sample_id": "205", "sample_index": 205, "negative_prompt": "", "mode": "perf"} +{"prompt": "industrial area", "sample_id": "206", "sample_index": 206, "negative_prompt": "", "mode": "perf"} +{"prompt": "jail cell", "sample_id": "207", "sample_index": 207, "negative_prompt": "", "mode": "perf"} +{"prompt": "junkyard", "sample_id": "208", "sample_index": 208, "negative_prompt": "", "mode": "perf"} +{"prompt": "kitchen", "sample_id": "209", "sample_index": 209, "negative_prompt": "", "mode": "perf"} +{"prompt": "indoor library", "sample_id": "210", "sample_index": 210, "negative_prompt": "", "mode": "perf"} +{"prompt": "lighthouse", "sample_id": "211", "sample_index": 211, "negative_prompt": "", "mode": "perf"} +{"prompt": "laboratory", "sample_id": "212", "sample_index": 212, "negative_prompt": "", "mode": "perf"} +{"prompt": "mansion", "sample_id": "213", "sample_index": 213, "negative_prompt": "", "mode": "perf"} +{"prompt": "marsh", "sample_id": "214", "sample_index": 214, "negative_prompt": "", "mode": "perf"} +{"prompt": "mountain", "sample_id": "215", "sample_index": 215, "negative_prompt": "", "mode": "perf"} +{"prompt": "indoor movie theater", "sample_id": "216", "sample_index": 216, "negative_prompt": "", "mode": "perf"} +{"prompt": "indoor museum", "sample_id": "217", "sample_index": 217, "negative_prompt": "", "mode": "perf"} +{"prompt": "music studio", "sample_id": "218", "sample_index": 218, "negative_prompt": "", "mode": "perf"} +{"prompt": "nursery", "sample_id": "219", "sample_index": 219, "negative_prompt": "", "mode": "perf"} +{"prompt": "ocean", "sample_id": "220", "sample_index": 220, "negative_prompt": "", "mode": "perf"} +{"prompt": "office", "sample_id": "221", "sample_index": 221, "negative_prompt": "", "mode": "perf"} +{"prompt": "palace", "sample_id": "222", "sample_index": 222, "negative_prompt": "", "mode": "perf"} +{"prompt": "parking lot", "sample_id": "223", "sample_index": 223, "negative_prompt": "", "mode": "perf"} +{"prompt": "pharmacy", "sample_id": "224", "sample_index": 224, "negative_prompt": "", "mode": "perf"} +{"prompt": "phone booth", "sample_id": "225", "sample_index": 225, "negative_prompt": "", "mode": "perf"} +{"prompt": "raceway", "sample_id": "226", "sample_index": 226, "negative_prompt": "", "mode": "perf"} +{"prompt": "restaurant", "sample_id": "227", "sample_index": 227, "negative_prompt": "", "mode": "perf"} +{"prompt": "river", "sample_id": "228", "sample_index": 228, "negative_prompt": "", "mode": "perf"} +{"prompt": "science museum", "sample_id": "229", "sample_index": 229, "negative_prompt": "", "mode": "perf"} +{"prompt": "shower", "sample_id": "230", "sample_index": 230, "negative_prompt": "", "mode": "perf"} +{"prompt": "ski slope", "sample_id": "231", "sample_index": 231, "negative_prompt": "", "mode": "perf"} +{"prompt": "sky", "sample_id": "232", "sample_index": 232, "negative_prompt": "", "mode": "perf"} +{"prompt": "skyscraper", "sample_id": "233", "sample_index": 233, "negative_prompt": "", "mode": "perf"} +{"prompt": "baseball stadium", "sample_id": "234", "sample_index": 234, "negative_prompt": "", "mode": "perf"} +{"prompt": "staircase", "sample_id": "235", "sample_index": 235, "negative_prompt": "", "mode": "perf"} +{"prompt": "street", "sample_id": "236", "sample_index": 236, "negative_prompt": "", "mode": "perf"} +{"prompt": "supermarket", "sample_id": "237", "sample_index": 237, "negative_prompt": "", "mode": "perf"} +{"prompt": "indoor swimming pool", "sample_id": "238", "sample_index": 238, "negative_prompt": "", "mode": "perf"} +{"prompt": "tower", "sample_id": "239", "sample_index": 239, "negative_prompt": "", "mode": "perf"} +{"prompt": "outdoor track", "sample_id": "240", "sample_index": 240, "negative_prompt": "", "mode": "perf"} +{"prompt": "train railway", "sample_id": "241", "sample_index": 241, "negative_prompt": "", "mode": "perf"} +{"prompt": "train station platform", "sample_id": "242", "sample_index": 242, "negative_prompt": "", "mode": "perf"} +{"prompt": "underwater coral reef", "sample_id": "243", "sample_index": 243, "negative_prompt": "", "mode": "perf"} +{"prompt": "valley", "sample_id": "244", "sample_index": 244, "negative_prompt": "", "mode": "perf"} +{"prompt": "volcano", "sample_id": "245", "sample_index": 245, "negative_prompt": "", "mode": "perf"} +{"prompt": "waterfall", "sample_id": "246", "sample_index": 246, "negative_prompt": "", "mode": "perf"} +{"prompt": "windmill", "sample_id": "247", "sample_index": 247, "negative_prompt": "", "mode": "perf"} From cb1fe6778983964eb5191710bb091111c621d981 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Wed, 29 Apr 2026 19:28:24 -0700 Subject: [PATCH 06/22] chore: apply post-rebase pre-commit autofixes After rebasing onto origin/main, these files needed updates from: - ruff lint/format (test imports, line wrapping) - prettier (markdown table formatting, YAML alignment) - regenerate-templates (api_type docstring now lists "videogen") - uv lock refresh (pyproject.toml now has "videogen" optional group) Also tightens an over-broad pytest.raises(Exception) in the videogen integration tests to (ValidationError, json.JSONDecodeError) for the 500-response case and json.JSONDecodeError for the malformed-JSON case (B017). --- AGENTS.md | 42 +++++++++---------- endpoints_changed.md | 41 +++++++++--------- .../offline_wan22_lyris.yaml | 8 ++-- .../templates/concurrency_template_full.yaml | 2 +- .../templates/offline_template_full.yaml | 2 +- .../templates/online_template_full.yaml | 2 +- .../dataset_manager/__init__.py | 7 ++-- .../dataset_manager/dataset.py | 1 - .../shopify_product_catalogue/__init__.py | 3 +- .../evaluation/livecodebench/generate.py | 1 - src/inference_endpoint/videogen/types.py | 3 +- tests/integration/videogen/test_adapter.py | 7 ++-- tests/unit/videogen/test_factory.py | 6 +-- tests/unit/videogen/test_init.py | 4 +- tests/unit/videogen/test_types.py | 3 +- uv.lock | 10 ++--- 16 files changed, 67 insertions(+), 75 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 2c1e6874..ec70673f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -74,17 +74,17 @@ Dataset Manager --> Load Generator --> Endpoint Client --> External Endpoint ### Key Components -| Component | Location | Purpose | -| ------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Load Generator** | `src/inference_endpoint/load_generator/` | Central orchestrator: `BenchmarkSession` owns the lifecycle, `Scheduler` controls timing, `LoadGenerator` issues queries | -| **Endpoint Client** | `src/inference_endpoint/endpoint_client/` | Multi-process HTTP workers communicating via ZMQ IPC. `HTTPEndpointClient` is the main entry point | -| **Dataset Manager** | `src/inference_endpoint/dataset_manager/` | Loads JSONL, HuggingFace, CSV, JSON, Parquet datasets. `Dataset` base class with `load_sample()`/`num_samples()` interface | -| **Metrics** | `src/inference_endpoint/metrics/` | `EventRecorder` writes to SQLite, `MetricsReporter` reads and aggregates (QPS, latency, TTFT, TPOT) | -| **Config** | `src/inference_endpoint/config/`, `endpoint_client/config.py` | Pydantic-based YAML schema (`schema.py`), `HTTPClientConfig` (single Pydantic model for CLI/YAML/runtime), `RuntimeSettings` | -| **CLI** | `src/inference_endpoint/main.py`, `commands/benchmark/cli.py` | cyclopts-based, auto-generated from `schema.py` and `HTTPClientConfig` Pydantic models. Flat shorthands via `cyclopts.Parameter(alias=...)` | -| **Async Utils** | `src/inference_endpoint/async_utils/` | `LoopManager` (uvloop + eager_task_factory), ZMQ transport layer, event publisher | -| **OpenAI/SGLang** | `src/inference_endpoint/openai/`, `sglang/` | Protocol adapters and response accumulators for different API formats | -| **VideoGen** | `src/inference_endpoint/videogen/` | Client adapter and dataset loader for MLPerf WAN2.2-T2V-A14B. `VideoGenAdapter` POSTs `VideoPathRequest` directly to trtllm-serve's `/v1/videos/generations` with `response_format=video_path`; server saves video to Lustre and returns path, avoiding large byte payloads. | +| Component | Location | Purpose | +| ------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Load Generator** | `src/inference_endpoint/load_generator/` | Central orchestrator: `BenchmarkSession` owns the lifecycle, `Scheduler` controls timing, `LoadGenerator` issues queries | +| **Endpoint Client** | `src/inference_endpoint/endpoint_client/` | Multi-process HTTP workers communicating via ZMQ IPC. `HTTPEndpointClient` is the main entry point | +| **Dataset Manager** | `src/inference_endpoint/dataset_manager/` | Loads JSONL, HuggingFace, CSV, JSON, Parquet datasets. `Dataset` base class with `load_sample()`/`num_samples()` interface | +| **Metrics** | `src/inference_endpoint/metrics/` | `EventRecorder` writes to SQLite, `MetricsReporter` reads and aggregates (QPS, latency, TTFT, TPOT) | +| **Config** | `src/inference_endpoint/config/`, `endpoint_client/config.py` | Pydantic-based YAML schema (`schema.py`), `HTTPClientConfig` (single Pydantic model for CLI/YAML/runtime), `RuntimeSettings` | +| **CLI** | `src/inference_endpoint/main.py`, `commands/benchmark/cli.py` | cyclopts-based, auto-generated from `schema.py` and `HTTPClientConfig` Pydantic models. Flat shorthands via `cyclopts.Parameter(alias=...)` | +| **Async Utils** | `src/inference_endpoint/async_utils/` | `LoopManager` (uvloop + eager_task_factory), ZMQ transport layer, event publisher | +| **OpenAI/SGLang** | `src/inference_endpoint/openai/`, `sglang/` | Protocol adapters and response accumulators for different API formats | +| **VideoGen** | `src/inference_endpoint/videogen/` | Client adapter and dataset loader for MLPerf WAN2.2-T2V-A14B. `VideoGenAdapter` POSTs `VideoPathRequest` directly to trtllm-serve's `/v1/videos/generations` with `response_format=video_path`; server saves video to Lustre and returns path, avoiding large byte payloads. | ### Hot-Path Architecture @@ -304,16 +304,16 @@ These apply especially to code in the hot path (load generator, endpoint client, ### Key Dependencies -| Package | Purpose | -| --------------------- | -------------------------------------------------------------------------------------- | -| `uvloop` | Performance-optimized event loop | -| `httptools` | Fast HTTP parser for custom connection pool | -| `msgspec` | Fast serialization for core types and ZMQ transport | -| `pyzmq` | ZMQ IPC between main process and workers | -| `pydantic` | Configuration validation | -| `cyclopts` | CLI framework — auto-generates flags from Pydantic | -| `duckdb` | Data aggregation | -| `transformers` | Tokenization for OSL reporting | +| Package | Purpose | +| -------------- | --------------------------------------------------- | +| `uvloop` | Performance-optimized event loop | +| `httptools` | Fast HTTP parser for custom connection pool | +| `msgspec` | Fast serialization for core types and ZMQ transport | +| `pyzmq` | ZMQ IPC between main process and workers | +| `pydantic` | Configuration validation | +| `cyclopts` | CLI framework — auto-generates flags from Pydantic | +| `duckdb` | Data aggregation | +| `transformers` | Tokenization for OSL reporting | ### Files to NOT Modify diff --git a/endpoints_changed.md b/endpoints_changed.md index bc18595f..68db5d56 100644 --- a/endpoints_changed.md +++ b/endpoints_changed.md @@ -64,20 +64,20 @@ wan22/ `VideoPathRequest` mirrors trtllm-serve's `VideoGenerationRequest`. All fields carry MLPerf defaults so only `prompt` is required from the dataset. -| Field | MLPerf value | Notes | -|---|---|---| -| `prompt` | from dataset | Required | -| `negative_prompt` | `None` | Omitted from JSON when absent; server uses its own default | -| `size` | `"720x1280"` | Portrait orientation | -| `seconds` | `5.0` | 81 frames ÷ ~16.2 fps | -| `fps` | `16` | | -| `num_inference_steps` | `20` | | -| `guidance_scale` | `4.0` | Primary CFG scale | -| `guidance_scale_2` | `3.0` | Null-text secondary CFG (two-stage denoising) | -| `seed` | `42` | Fixed for reproducibility | -| `output_format` | `"auto"` | H.264 if ffmpeg available, MJPEG otherwise | -| `response_format` | `"video_path"` | Always; avoid byte payload | -| `latent_path` | `None` | Optional path to `fixed_latent.pt` on shared storage | +| Field | MLPerf value | Notes | +| --------------------- | -------------- | ---------------------------------------------------------- | +| `prompt` | from dataset | Required | +| `negative_prompt` | `None` | Omitted from JSON when absent; server uses its own default | +| `size` | `"720x1280"` | Portrait orientation | +| `seconds` | `5.0` | 81 frames ÷ ~16.2 fps | +| `fps` | `16` | | +| `num_inference_steps` | `20` | | +| `guidance_scale` | `4.0` | Primary CFG scale | +| `guidance_scale_2` | `3.0` | Null-text secondary CFG (two-stage denoising) | +| `seed` | `42` | Fixed for reproducibility | +| `output_format` | `"auto"` | H.264 if ffmpeg available, MJPEG otherwise | +| `response_format` | `"video_path"` | Always; avoid byte payload | +| `latent_path` | `None` | Optional path to `fixed_latent.pt` on shared storage | `VideoPathResponse` carries `video_id` and `video_path` returned by the server. @@ -120,6 +120,7 @@ JSONL file ──► VideoGenDataset.load() ──► sample dict ``` The MLPerf canonical negative prompt: + ``` vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, @@ -138,7 +139,7 @@ The wan22 module plugs into the existing pipeline at the `api_type` config field ```yaml # offline_wan22.yaml endpoint_config: - api_type: wan22 # → selects VideoGenAdapter + api_type: wan22 # → selects VideoGenAdapter endpoints: - http://localhost:8000 ``` @@ -149,12 +150,12 @@ endpoint_config: ## What Is NOT In This Module -| Concern | Where it lives | -|---|---| -| trtllm-serve startup / model loading | trtllm-serve (separate process) | +| Concern | Where it lives | +| ---------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| trtllm-serve startup / model loading | trtllm-serve (separate process) | | Fixed latent loading (`fixed_latent.pt`) | trtllm-serve `pipeline_wan.py` at startup, or per-request via `latent_path` (pending Task 2 in plan) | -| Video storage path on Lustre | trtllm-serve config | -| `guidance_scale_2` wiring on server side | Pending — see `wan22-trtllm-plan.md` Task 1 | +| Video storage path on Lustre | trtllm-serve config | +| `guidance_scale_2` wiring on server side | Pending — see `wan22-trtllm-plan.md` Task 1 | --- diff --git a/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml b/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml index 10a44294..2f0b7bd5 100644 --- a/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml +++ b/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml @@ -21,8 +21,8 @@ type: "offline" model_params: name: "wan22" - max_new_tokens: 0 # Video generation does not produce tokens - streaming: "off" # WAN 2.2 uses non-streaming HTTP POST/response + max_new_tokens: 0 # Video generation does not produce tokens + streaming: "off" # WAN 2.2 uses non-streaming HTTP POST/response datasets: - name: wan22_prompts @@ -33,8 +33,8 @@ datasets: settings: runtime: - min_duration_ms: 60000 # 1 minute warm-up - max_duration_ms: 600000 # 10 minute cap + min_duration_ms: 60000 # 1 minute warm-up + max_duration_ms: 600000 # 10 minute cap scheduler_random_seed: 42 dataloader_random_seed: 42 n_samples_to_issue: 248 diff --git a/src/inference_endpoint/config/templates/concurrency_template_full.yaml b/src/inference_endpoint/config/templates/concurrency_template_full.yaml index 3a8e004f..b1030d67 100644 --- a/src/inference_endpoint/config/templates/concurrency_template_full.yaml +++ b/src/inference_endpoint/config/templates/concurrency_template_full.yaml @@ -72,7 +72,7 @@ endpoint_config: endpoints: # Endpoint URL(s). Must include scheme, e.g. 'http://host:port'. - http://localhost:8000 api_key: null # API key - api_type: openai # API type: openai or sglang | options: openai, sglang + api_type: openai # API type: openai or sglang | options: openai, sglang, videogen report_dir: null # Report output directory timeout: null # Global timeout in seconds verbose: false # Enable verbose logging diff --git a/src/inference_endpoint/config/templates/offline_template_full.yaml b/src/inference_endpoint/config/templates/offline_template_full.yaml index faabffde..5f0a6384 100644 --- a/src/inference_endpoint/config/templates/offline_template_full.yaml +++ b/src/inference_endpoint/config/templates/offline_template_full.yaml @@ -72,7 +72,7 @@ endpoint_config: endpoints: # Endpoint URL(s). Must include scheme, e.g. 'http://host:port'. - http://localhost:8000 api_key: null # API key - api_type: openai # API type: openai or sglang | options: openai, sglang + api_type: openai # API type: openai or sglang | options: openai, sglang, videogen report_dir: null # Report output directory timeout: null # Global timeout in seconds verbose: false # Enable verbose logging diff --git a/src/inference_endpoint/config/templates/online_template_full.yaml b/src/inference_endpoint/config/templates/online_template_full.yaml index e9b7a673..854edefb 100644 --- a/src/inference_endpoint/config/templates/online_template_full.yaml +++ b/src/inference_endpoint/config/templates/online_template_full.yaml @@ -72,7 +72,7 @@ endpoint_config: endpoints: # Endpoint URL(s). Must include scheme, e.g. 'http://host:port'. - http://localhost:8000 api_key: null # API key - api_type: openai # API type: openai or sglang | options: openai, sglang + api_type: openai # API type: openai or sglang | options: openai, sglang, videogen report_dir: null # Report output directory timeout: null # Global timeout in seconds verbose: false # Enable verbose logging diff --git a/src/inference_endpoint/dataset_manager/__init__.py b/src/inference_endpoint/dataset_manager/__init__.py index 6f38ebd3..dd15f3ce 100644 --- a/src/inference_endpoint/dataset_manager/__init__.py +++ b/src/inference_endpoint/dataset_manager/__init__.py @@ -19,6 +19,9 @@ This module handles dataset loading, preprocessing, and management. """ +# Import workload-specific datasets so they register in Dataset.PREDEFINED +from inference_endpoint.videogen.dataset import VideoGenDataset # noqa: E402 + from .dataset import Dataset, EmptyDataset from .factory import DataLoaderFactory from .predefined.aime25 import AIME25 @@ -28,10 +31,6 @@ from .predefined.open_orca import OpenOrca from .predefined.random import RandomDataset from .predefined.shopify_product_catalogue import ShopifyProductCatalogue - -# Import workload-specific datasets so they register in Dataset.PREDEFINED -from inference_endpoint.videogen.dataset import VideoGenDataset # noqa: E402 - from .transforms import ( AddStaticColumns, ColumnFilter, diff --git a/src/inference_endpoint/dataset_manager/dataset.py b/src/inference_endpoint/dataset_manager/dataset.py index 1da2e997..7896eb83 100644 --- a/src/inference_endpoint/dataset_manager/dataset.py +++ b/src/inference_endpoint/dataset_manager/dataset.py @@ -24,7 +24,6 @@ import numpy as np import pandas as pd - from datasets import load_dataset, load_from_disk # type: ignore[attr-defined] from ..config.schema import APIType, ModelParams diff --git a/src/inference_endpoint/dataset_manager/predefined/shopify_product_catalogue/__init__.py b/src/inference_endpoint/dataset_manager/predefined/shopify_product_catalogue/__init__.py index c659d1cf..59d22bf6 100644 --- a/src/inference_endpoint/dataset_manager/predefined/shopify_product_catalogue/__init__.py +++ b/src/inference_endpoint/dataset_manager/predefined/shopify_product_catalogue/__init__.py @@ -23,9 +23,8 @@ from typing import Any import pandas as pd -from tqdm import tqdm - from datasets import load_dataset # type: ignore[attr-defined] +from tqdm import tqdm from ...dataset import Dataset from . import presets diff --git a/src/inference_endpoint/evaluation/livecodebench/generate.py b/src/inference_endpoint/evaluation/livecodebench/generate.py index 5eec2b70..6aff8669 100644 --- a/src/inference_endpoint/evaluation/livecodebench/generate.py +++ b/src/inference_endpoint/evaluation/livecodebench/generate.py @@ -40,7 +40,6 @@ from typing import Any import pandas as pd - from datasets import load_dataset # type: ignore[attr-defined] logger = logging.getLogger(__name__) diff --git a/src/inference_endpoint/videogen/types.py b/src/inference_endpoint/videogen/types.py index b4173a18..44224c5b 100644 --- a/src/inference_endpoint/videogen/types.py +++ b/src/inference_endpoint/videogen/types.py @@ -46,7 +46,8 @@ class VideoPathRequest(BaseModel): default=4.0, description="CFG guidance scale (MLPerf: 4.0)." ) guidance_scale_2: float = Field( - default=3.0, description="Secondary guidance scale for null-text CFG (MLPerf: 3.0)." + default=3.0, + description="Secondary guidance scale for null-text CFG (MLPerf: 3.0).", ) seed: int = Field(default=42, description="Random seed (MLPerf: 42).") output_format: Literal["mp4", "avi", "auto"] = "auto" diff --git a/tests/integration/videogen/test_adapter.py b/tests/integration/videogen/test_adapter.py index 6b2d7b42..e936050d 100644 --- a/tests/integration/videogen/test_adapter.py +++ b/tests/integration/videogen/test_adapter.py @@ -21,10 +21,9 @@ from urllib.error import HTTPError import pytest -from pydantic import ValidationError - from inference_endpoint.core.types import Query from inference_endpoint.videogen.adapter import VideoGenAdapter +from pydantic import ValidationError from .conftest import DUMMY_VIDEO_BYTES, MockTrtllmServe, MockTrtllmServeError @@ -97,11 +96,11 @@ def test_http_500_response_raises_on_decode( VideoGenAdapter.encode_query(query), ) assert status == 500 - with pytest.raises(Exception): + with pytest.raises((ValidationError, json.JSONDecodeError)): VideoGenAdapter.decode_response(content, query.id) def test_malformed_json_response_raises(self) -> None: - with pytest.raises(Exception): + with pytest.raises(json.JSONDecodeError): VideoGenAdapter.decode_response(b"not json at all", "q5") def test_missing_video_bytes_field_raises_validation_error(self) -> None: diff --git a/tests/unit/videogen/test_factory.py b/tests/unit/videogen/test_factory.py index 3ead80da..f30511f1 100644 --- a/tests/unit/videogen/test_factory.py +++ b/tests/unit/videogen/test_factory.py @@ -18,7 +18,6 @@ from pathlib import Path import pytest - from inference_endpoint.config.schema import Dataset as DatasetConfig from inference_endpoint.dataset_manager.factory import DataLoaderFactory from inference_endpoint.videogen.dataset import VideoGenDataset @@ -27,10 +26,7 @@ @pytest.fixture def prompts_file(tmp_path: Path) -> Path: p = tmp_path / "prompts.txt" - p.write_text( - "a golden retriever running in a field\n" - "ocean waves at sunset\n" - ) + p.write_text("a golden retriever running in a field\n" "ocean waves at sunset\n") return p diff --git a/tests/unit/videogen/test_init.py b/tests/unit/videogen/test_init.py index d437a1dd..c29ea42e 100644 --- a/tests/unit/videogen/test_init.py +++ b/tests/unit/videogen/test_init.py @@ -17,11 +17,11 @@ import pytest from inference_endpoint.videogen import ( + VideoGenAccumulator, + VideoGenAdapter, VideoPathRequest, VideoPathResponse, VideoPayloadResponse, - VideoGenAccumulator, - VideoGenAdapter, ) diff --git a/tests/unit/videogen/test_types.py b/tests/unit/videogen/test_types.py index 964a91be..018c581b 100644 --- a/tests/unit/videogen/test_types.py +++ b/tests/unit/videogen/test_types.py @@ -16,13 +16,12 @@ """Unit tests for videogen Pydantic wire models (trtllm-serve native API).""" import pytest -from pydantic import ValidationError - from inference_endpoint.videogen.types import ( VideoPathRequest, VideoPathResponse, VideoPayloadResponse, ) +from pydantic import ValidationError class TestVideoPathRequest: diff --git a/uv.lock b/uv.lock index ed84bd7e..95b9a0f6 100644 --- a/uv.lock +++ b/uv.lock @@ -877,12 +877,12 @@ requires-dist = [ { name = "sphinx-autodoc-typehints", marker = "extra == 'dev'", specifier = "==3.9.11" }, { name = "sphinx-rtd-theme", marker = "extra == 'dev'", specifier = "==3.1.0" }, { name = "sqlalchemy", marker = "extra == 'sql'", specifier = "==2.0.48" }, - { name = "transformers", specifier = "==5.4.0" }, + { name = "transformers", specifier = "==5.5.0" }, { name = "typing-extensions", specifier = "==4.15.0" }, { name = "uvloop", specifier = "==0.22.1" }, { name = "websocket-client", specifier = "==1.9.0" }, ] -provides-extras = ["sql", "dev", "test", "performance"] +provides-extras = ["sql", "videogen", "dev", "test", "performance"] [[package]] name = "iniconfig" @@ -2403,7 +2403,7 @@ wheels = [ [[package]] name = "transformers" -version = "5.4.0" +version = "5.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -2416,9 +2416,9 @@ dependencies = [ { name = "tqdm", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0b/4c/42a8e1c7bbe668d8e073941ec3205263afb1cd02683fa5a8a75e615fdfbe/transformers-5.4.0.tar.gz", hash = "sha256:cb34ca89dce345ae3224b290346b9c0fa9694b951d54f3ed16334a4b1bfe3d04", size = 8152836, upload-time = "2026-03-27T00:24:24.692Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/9d/fb46e729b461985f41a5740167688b924a4019141e5c164bea77548d3d9e/transformers-5.5.0.tar.gz", hash = "sha256:c8db656cf51c600cd8c75f06b20ef85c72e8b8ff9abc880c5d3e8bc70e0ddcbd", size = 8237745, upload-time = "2026-04-02T16:13:08.113Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/a0/0a87883e564e364baab32adcacb4bec2e200b28a568423c8cf7fde316461/transformers-5.4.0-py3-none-any.whl", hash = "sha256:9fbe50602d2a4e6d0aa8a35a605433dfac72d595ee2192eae192590a6cc2df86", size = 10105556, upload-time = "2026-03-27T00:24:21.735Z" }, + { url = "https://files.pythonhosted.org/packages/e7/28/35f7411ff80a3640c1f4fc907dcbb6a65061ebb82f66950e38bfc9f7f740/transformers-5.5.0-py3-none-any.whl", hash = "sha256:821a9ff0961abbb29eb1eb686d78df1c85929fdf213a3fe49dc6bd94f9efa944", size = 10245591, upload-time = "2026-04-02T16:13:03.462Z" }, ] [[package]] From 62b8dfbaaaec31c802717fdfa134e17d4836c800 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Wed, 29 Apr 2026 19:28:25 -0700 Subject: [PATCH 07/22] fix(videogen): negative_prompt None default + exclude_none, add latent_path Address MR review feedback (Task 3 of wan22-trtllm-plan.md): types.py: - VideoPathRequest.negative_prompt: str = "" -> str | None = None - Add VideoPathRequest.latent_path: str | None = None field (per-request fixed latent tensor path for MLPerf reproducibility) adapter.py: - encode_query: read negative_prompt and latent_path with .get() (no default), and serialise with model_dump_json(exclude_none=True) so optional fields fall back to server-side defaults when absent. dataset.py: - Add _MLPERF_NEGATIVE_PROMPT module constant (canonical MLPerf string). - VideoGenDataset injects this negative prompt into every sample by default; pass negative_prompt=None to omit. Accepts latent_path as a per-dataset config so all samples share the same fixed latent. - load() conditionally includes negative_prompt and latent_path in each sample dict only when set, so adapter exclude_none does the right thing end-to-end. Tests: - Update test_types defaults (negative_prompt None, latent_path None) - Update test_dataset for the canonical negative-prompt default, add coverage for negative_prompt=None and latent_path propagation. - Add adapter tests for exclude_none behaviour and latent_path forwarding. Note for reviewer: the other two review comments (response_format hardcoded to video_path; decode_response only handling VideoPathResponse) are stale; both were addressed in 7a1b4d3 "fix: make response_format optional in VideoGenAdapter (default video_bytes)". Current adapter already defaults response_format to video_bytes and dispatches in decode_response on whether "video_bytes" is present in the response. --- src/inference_endpoint/videogen/adapter.py | 7 +++- src/inference_endpoint/videogen/dataset.py | 49 +++++++++++++++++++--- src/inference_endpoint/videogen/types.py | 18 +++++++- tests/unit/videogen/test_adapter.py | 18 ++++++++ tests/unit/videogen/test_dataset.py | 27 ++++++++++-- tests/unit/videogen/test_types.py | 3 +- 6 files changed, 109 insertions(+), 13 deletions(-) diff --git a/src/inference_endpoint/videogen/adapter.py b/src/inference_endpoint/videogen/adapter.py index 7ac92db4..6ad056ad 100644 --- a/src/inference_endpoint/videogen/adapter.py +++ b/src/inference_endpoint/videogen/adapter.py @@ -63,7 +63,7 @@ def encode_query(cls, query: Query) -> bytes: ) req = VideoPathRequest( prompt=data["prompt"], - negative_prompt=data.get("negative_prompt", ""), + negative_prompt=data.get("negative_prompt"), size=data.get("size", "720x1280"), seconds=data.get("seconds", 5.0), fps=data.get("fps", 16), @@ -71,10 +71,13 @@ def encode_query(cls, query: Query) -> bytes: guidance_scale=data.get("guidance_scale", 4.0), guidance_scale_2=data.get("guidance_scale_2", 3.0), seed=data.get("seed", 42), + latent_path=data.get("latent_path"), output_format=data.get("output_format", "auto"), response_format=data.get("response_format", "video_bytes"), ) - return req.model_dump_json().encode() + # exclude_none so optional fields fall back to server-side defaults + # (MLPerf: omit negative_prompt and latent_path unless explicitly set). + return req.model_dump_json(exclude_none=True).encode() @classmethod def decode_response(cls, response_bytes: bytes, query_id: str) -> QueryResult: diff --git a/src/inference_endpoint/videogen/dataset.py b/src/inference_endpoint/videogen/dataset.py index dd12565c..66e4c13d 100644 --- a/src/inference_endpoint/videogen/dataset.py +++ b/src/inference_endpoint/videogen/dataset.py @@ -22,12 +22,29 @@ from inference_endpoint.dataset_manager.dataset import Dataset +# MLPerf canonical negative prompt for WAN2.2-T2V-A14B. +# Injected into every sample's query.data so the server receives the exact +# string MLPerf expects, rather than relying on the server's internal default. +_MLPERF_NEGATIVE_PROMPT = ( + "vivid colors, overexposed, static, blurry details, subtitles, style, " + "work of art, painting, picture, still, overall grayish, worst quality, " + "low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, " + "poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, " + "static image, cluttered background, three legs, many people in the background, " + "walking backwards" +) + class VideoGenDataset(Dataset, dataset_id="wan22_mlperf"): """Dataset that loads MLPerf WAN2.2 prompt text files. Each non-blank line in the file is one prompt. MLPerf endpoints run perf and accuracy in a single pass, so VideoGenAdapter always requests video_bytes. + + By default, the MLPerf canonical negative prompt is injected into every sample. + Pass ``negative_prompt=None`` to omit the field and let the server apply its + own default. Pass ``latent_path=`` to use a fixed pre-computed latent + tensor for reproducibility. """ COLUMN_NAMES = ["prompt"] @@ -36,7 +53,8 @@ class VideoGenDataset(Dataset, dataset_id="wan22_mlperf"): def get_dataloader( # type: ignore[override] cls, path: Path | str | None = None, - negative_prompt: str = "", + negative_prompt: str | None = _MLPERF_NEGATIVE_PROMPT, + latent_path: Path | str | None = None, **kwargs: Any, ) -> "VideoGenDataset": """Create a VideoGenDataset from a prompts file path. @@ -50,12 +68,17 @@ def get_dataloader( # type: ignore[override] "VideoGenDataset requires a prompts file path. " "Pass --dataset or set path= in the dataset config." ) - return cls(prompts_path=path, negative_prompt=negative_prompt) + return cls( + prompts_path=path, + negative_prompt=negative_prompt, + latent_path=latent_path, + ) def __init__( self, prompts_path: Path | str, - negative_prompt: str = "", + negative_prompt: str | None = _MLPERF_NEGATIVE_PROMPT, + latent_path: Path | str | None = None, ) -> None: prompts = [ line.strip() @@ -64,14 +87,30 @@ def __init__( ] super().__init__(dataframe=pd.DataFrame({"prompt": prompts})) self.negative_prompt = negative_prompt + self.latent_path = str(latent_path) if latent_path is not None else None def load(self, **kwargs: Any) -> None: # type: ignore[override] - """Build self.data from the loaded dataframe. No transforms needed.""" + """Build self.data from the loaded dataframe. No transforms needed. + + Optional fields (``negative_prompt``, ``latent_path``) are omitted from + each sample dict when their dataset-level value is ``None``, so the + adapter's ``exclude_none=True`` serialisation falls back to server-side + defaults. + """ assert self.dataframe is not None self.data = [ { "prompt": row["prompt"], - "negative_prompt": self.negative_prompt, + **( + {"negative_prompt": self.negative_prompt} + if self.negative_prompt is not None + else {} + ), + **( + {"latent_path": self.latent_path} + if self.latent_path is not None + else {} + ), "sample_id": str(i), "sample_index": i, } diff --git a/src/inference_endpoint/videogen/types.py b/src/inference_endpoint/videogen/types.py index 44224c5b..6d33b225 100644 --- a/src/inference_endpoint/videogen/types.py +++ b/src/inference_endpoint/videogen/types.py @@ -32,7 +32,14 @@ class VideoPathRequest(BaseModel): """ prompt: str - negative_prompt: str = "" + negative_prompt: str | None = Field( + default=None, + description=( + "Text describing what to avoid. None means the field is omitted " + "from the JSON payload so trtllm-serve can apply its model default. " + "VideoGenDataset injects the MLPerf canonical negative prompt by default." + ), + ) size: str = Field(default="720x1280", description="Frame size in 'WxH' format.") seconds: float = Field( default=5.0, @@ -50,6 +57,15 @@ class VideoPathRequest(BaseModel): description="Secondary guidance scale for null-text CFG (MLPerf: 3.0).", ) seed: int = Field(default=42, description="Random seed (MLPerf: 42).") + latent_path: str | None = Field( + default=None, + description=( + "Absolute path to a pre-computed latent tensor (.pt file) on shared " + "storage accessible to the server (e.g. Lustre). When provided, the " + "server uses this tensor as the initial denoising noise instead of " + "sampling random noise. MLPerf uses a fixed latent for reproducibility." + ), + ) output_format: Literal["mp4", "avi", "auto"] = "auto" response_format: Literal["video_bytes", "video_path"] = "video_path" diff --git a/tests/unit/videogen/test_adapter.py b/tests/unit/videogen/test_adapter.py index 6b4e4ece..11f4dce3 100644 --- a/tests/unit/videogen/test_adapter.py +++ b/tests/unit/videogen/test_adapter.py @@ -66,6 +66,24 @@ def test_encode_query_includes_negative_prompt(self): payload = json.loads(VideoGenAdapter.encode_query(query)) assert payload["negative_prompt"] == "blurry" + def test_encode_query_omits_negative_prompt_when_absent(self): + """exclude_none=True so server can apply its own default.""" + query = Query(id="q1", data={"prompt": "test"}) + payload = json.loads(VideoGenAdapter.encode_query(query)) + assert "negative_prompt" not in payload + + def test_encode_query_includes_latent_path(self): + query = Query( + id="q1", data={"prompt": "test", "latent_path": "/lustre/fixed_latent.pt"} + ) + payload = json.loads(VideoGenAdapter.encode_query(query)) + assert payload["latent_path"] == "/lustre/fixed_latent.pt" + + def test_encode_query_omits_latent_path_when_absent(self): + query = Query(id="q1", data={"prompt": "test"}) + payload = json.loads(VideoGenAdapter.encode_query(query)) + assert "latent_path" not in payload + def test_encode_query_missing_prompt_raises(self): query = Query(id="q1", data={"seed": 42}) with pytest.raises(KeyError): diff --git a/tests/unit/videogen/test_dataset.py b/tests/unit/videogen/test_dataset.py index 19ebfb3a..d39e59d4 100644 --- a/tests/unit/videogen/test_dataset.py +++ b/tests/unit/videogen/test_dataset.py @@ -19,7 +19,7 @@ import pytest from inference_endpoint.dataset_manager.dataset import Dataset -from inference_endpoint.videogen.dataset import VideoGenDataset +from inference_endpoint.videogen.dataset import _MLPERF_NEGATIVE_PROMPT, VideoGenDataset @pytest.mark.unit @@ -40,7 +40,9 @@ def test_loads_prompts_skipping_blank_lines(self, prompts_file: Path): ds.load() assert ds.num_samples() == 3 - def test_load_sample_returns_expected_keys(self, prompts_file: Path): + def test_load_sample_default_includes_mlperf_negative_prompt( + self, prompts_file: Path + ): ds = VideoGenDataset(prompts_path=prompts_file) ds.load() sample = ds.load_sample(0) @@ -50,6 +52,7 @@ def test_load_sample_returns_expected_keys(self, prompts_file: Path): "sample_id", "sample_index", } + assert sample["negative_prompt"] == _MLPERF_NEGATIVE_PROMPT def test_load_sample_correct_values(self, prompts_file: Path): ds = VideoGenDataset(prompts_path=prompts_file) @@ -58,13 +61,29 @@ def test_load_sample_correct_values(self, prompts_file: Path): assert sample["prompt"] == "a red sports car on a mountain road" assert sample["sample_index"] == 1 assert sample["sample_id"] == "1" - assert sample["negative_prompt"] == "" + assert sample["negative_prompt"] == _MLPERF_NEGATIVE_PROMPT - def test_negative_prompt_propagated(self, prompts_file: Path): + def test_negative_prompt_override(self, prompts_file: Path): ds = VideoGenDataset(prompts_path=prompts_file, negative_prompt="blurry") ds.load() assert ds.load_sample(0)["negative_prompt"] == "blurry" + def test_negative_prompt_none_omits_field(self, prompts_file: Path): + ds = VideoGenDataset(prompts_path=prompts_file, negative_prompt=None) + ds.load() + assert "negative_prompt" not in ds.load_sample(0) + + def test_latent_path_propagated(self, prompts_file: Path, tmp_path: Path): + latent = tmp_path / "fixed_latent.pt" + ds = VideoGenDataset(prompts_path=prompts_file, latent_path=latent) + ds.load() + assert ds.load_sample(0)["latent_path"] == str(latent) + + def test_latent_path_default_omitted(self, prompts_file: Path): + ds = VideoGenDataset(prompts_path=prompts_file) + ds.load() + assert "latent_path" not in ds.load_sample(0) + def test_index_wrapping(self, prompts_file: Path): ds = VideoGenDataset(prompts_path=prompts_file) ds.load() diff --git a/tests/unit/videogen/test_types.py b/tests/unit/videogen/test_types.py index 018c581b..f70aa82d 100644 --- a/tests/unit/videogen/test_types.py +++ b/tests/unit/videogen/test_types.py @@ -28,7 +28,8 @@ class TestVideoPathRequest: @pytest.mark.unit def test_defaults(self): req = VideoPathRequest(prompt="a cat") - assert req.negative_prompt == "" + assert req.negative_prompt is None + assert req.latent_path is None assert req.size == "720x1280" assert req.seconds == pytest.approx(5.0) assert req.fps == 16 From 806166809c8645e96f022bd3a3dfd934b6ce365a Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Thu, 30 Apr 2026 10:46:56 -0700 Subject: [PATCH 08/22] remove path in offline_wan22_lyris.yaml --- examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml b/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml index 2f0b7bd5..5f808640 100644 --- a/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml +++ b/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml @@ -58,6 +58,5 @@ endpoint_config: # Fixed latent path is injected into every request via VideoGenDataset. # Set latent_path in dataset config or pass it when constructing VideoGenDataset. -# latent_path: /lustre/share/coreai_mlperf_inference/mlperf_inference_storage_clone/preprocessed_data/wan22-a14b/fixed_latent.pt report_dir: logs/wan22_video_generation_benchmark From 32d79437b2ce0d851d91cabf94dd96bf1fa13791 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Thu, 30 Apr 2026 10:48:08 -0700 Subject: [PATCH 09/22] Remove name of the datacenter setup_and_test.sh --- examples/09_Wan22_VideoGen_Example/setup_and_test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/09_Wan22_VideoGen_Example/setup_and_test.sh b/examples/09_Wan22_VideoGen_Example/setup_and_test.sh index 77cd7a56..d06e9a95 100755 --- a/examples/09_Wan22_VideoGen_Example/setup_and_test.sh +++ b/examples/09_Wan22_VideoGen_Example/setup_and_test.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash -# setup_and_test.sh — Set up the WAN2.2 environment on Lyris and run unit tests. +# setup_and_test.sh — Set up the WAN2.2 environment and run unit tests. # # Usage: # bash setup_and_test.sh [--skip-setup] # # --skip-setup Skip venv creation and pip install (use existing venv). # -# Prerequisites on Lyris: +# Prerequisites: # - Python 3.12 available as python3.12 # - Access to the repo root (this script lives in examples/09_Wan22_VideoGen_Example/) From e345c5ba88643121091559dedf67e362a7717a4d Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Thu, 30 Apr 2026 10:50:37 -0700 Subject: [PATCH 10/22] Update and rename offline_wan22_lyris.yaml to offline_wan22.yaml --- .../{offline_wan22_lyris.yaml => offline_wan22.yaml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename examples/09_Wan22_VideoGen_Example/{offline_wan22_lyris.yaml => offline_wan22.yaml} (96%) diff --git a/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml b/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml similarity index 96% rename from examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml rename to examples/09_Wan22_VideoGen_Example/offline_wan22.yaml index 5f808640..06e7e705 100644 --- a/examples/09_Wan22_VideoGen_Example/offline_wan22_lyris.yaml +++ b/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml @@ -1,4 +1,4 @@ -# Offline Video Generation Benchmark for WAN 2.2 on Lyris (GB200/GB300) +# Offline Video Generation Benchmark for WAN 2.2 (GB200/GB300) # # Targets trtllm-serve POST /v1/videos/generations directly (no proxy). # Uses response_format=video_path: server saves video to Lustre and returns From e0ae775cdfae4ec0ff4b70d424ece9996c77c175 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Thu, 30 Apr 2026 11:35:06 -0700 Subject: [PATCH 11/22] fix(videogen): default response_format to video_path; align docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aligns three previously-inconsistent statements about the request default: - Adapter `encode_query` previously fell back to "video_bytes" when query.data did not specify a response_format, but the Pydantic field default on VideoPathRequest was "video_path" — the latter was dead because the adapter always supplied a value. - Dataset docstring claimed "always requests video_bytes"; types docstring described a perf/accuracy split. Pick the perf/accuracy split (Option A): default = video_path (perf), opt-in to video_bytes via query.data["response_format"] (accuracy). - adapter.py: flip `data.get("response_format", ...)` default to "video_path"; rewrite class + encode_query docstrings to match. - dataset.py: drop the "always requests video_bytes" line. - test_adapter.py (unit + integration): split the old test_encode_query_always_requests_video_bytes test into default-is-video_path + accuracy-mode-override tests. Also rewrite endpoints_changed.md: - Replace the "always video_path" framing with the dual-mode reality. - Document VideoPayloadResponse and the decode_response shape dispatch. - Fix the payload-size claim (300 MB -> 3-5 MB; 300 MB was raw uncompressed). - Drop stale "Pending" tasks 2 (latent_path -- already wired) and 3 (negative_prompt None -- already done). - Update module name `wan22` -> `videogen` and `api_type` example. Verified on aarch64 GB200: 58 unit+integration videogen tests pass. --- endpoints_changed.md | 109 ++++++++++++--------- src/inference_endpoint/videogen/adapter.py | 15 +-- src/inference_endpoint/videogen/dataset.py | 3 +- tests/integration/videogen/test_adapter.py | 12 ++- tests/unit/videogen/test_adapter.py | 12 ++- 5 files changed, 91 insertions(+), 60 deletions(-) diff --git a/endpoints_changed.md b/endpoints_changed.md index 68db5d56..34443d1e 100644 --- a/endpoints_changed.md +++ b/endpoints_changed.md @@ -8,7 +8,7 @@ This document describes the changes made to the `inference-endpoint` library to WAN 2.2 (T2V-A14B) generates 720×1280 portrait videos at 81 frames / 5 s using 20 denoising steps. The inference server is **trtllm-serve**, which exposes a video generation endpoint at `POST /v1/videos/generations`. -The client-side changes add a new `wan22` module that plugs into the existing `HTTPEndpointClient` pipeline without touching any hot-path code. +The client-side changes add a new `videogen` module that plugs into the existing `HTTPEndpointClient` pipeline without touching any hot-path code. --- @@ -17,7 +17,7 @@ The client-side changes add a new `wan22` module that plugs into the existing `H ``` MLPerf Harness / Benchmark CLI │ - │ YAML config (api_type: wan22) + │ YAML config (api_type: videogen) ▼ HTTPEndpointClient │ @@ -32,28 +32,35 @@ MLPerf Harness / Benchmark CLI │ POST /v1/videos/generations │ ▼ │ trtllm-serve │ - │ saves video to Lustre │ - │ returns VideoPathResponse JSON │ + │ perf mode: saves video to Lustre, returns path │ + │ accuracy mode: returns base64 video bytes inline │ ▼ │ VideoGenAdapter ◄──────────────────────────────────────────────┘ - │ decode_response() - │ QueryResult(metadata={video_path: ...}) + │ decode_response() (dispatches on response shape) + │ QueryResult(metadata={video_path | video_bytes: ...}) ▼ MetricsReporter / MLPerf harness ``` -**Key design decision:** `response_format=video_path` — the server writes the encoded video to Lustre and returns only the file path. This avoids transferring ~300 MB video bytes over HTTP and ZMQ per request. +**Key design decision:** the adapter supports two `response_format` values selected per-request via `query.data["response_format"]`: + +- **`video_path` (default, perf mode)** — server writes the encoded video to Lustre and returns only the file path. Avoids 3–5 MB payloads over HTTP + ZMQ per request. +- **`video_bytes` (accuracy mode)** — server returns the base64-encoded H.264/MJPEG payload inline so the accuracy evaluator can score the video content directly. + +`VideoGenAdapter.decode_response` dispatches on the response shape: if `video_bytes` is present the body is parsed as `VideoPayloadResponse`; otherwise it is parsed as `VideoPathResponse`. --- ## New Files ``` -wan22/ +videogen/ ├── __init__.py Public exports -├── types.py Pydantic wire models: VideoPathRequest, VideoPathResponse, HealthResponse +├── types.py Pydantic wire models: VideoPathRequest, +│ VideoPathResponse, VideoPayloadResponse, HealthResponse ├── adapter.py VideoGenAdapter (HttpRequestAdapter) + VideoGenAccumulator (no-op SSE) -└── dataset.py VideoGenDataset — loads MLPerf prompt JSONL, injects fixed latent path +└── dataset.py VideoGenDataset — loads MLPerf prompt JSONL, injects negative + prompt and optional latent path ``` --- @@ -64,22 +71,25 @@ wan22/ `VideoPathRequest` mirrors trtllm-serve's `VideoGenerationRequest`. All fields carry MLPerf defaults so only `prompt` is required from the dataset. -| Field | MLPerf value | Notes | -| --------------------- | -------------- | ---------------------------------------------------------- | -| `prompt` | from dataset | Required | -| `negative_prompt` | `None` | Omitted from JSON when absent; server uses its own default | -| `size` | `"720x1280"` | Portrait orientation | -| `seconds` | `5.0` | 81 frames ÷ ~16.2 fps | -| `fps` | `16` | | -| `num_inference_steps` | `20` | | -| `guidance_scale` | `4.0` | Primary CFG scale | -| `guidance_scale_2` | `3.0` | Null-text secondary CFG (two-stage denoising) | -| `seed` | `42` | Fixed for reproducibility | -| `output_format` | `"auto"` | H.264 if ffmpeg available, MJPEG otherwise | -| `response_format` | `"video_path"` | Always; avoid byte payload | -| `latent_path` | `None` | Optional path to `fixed_latent.pt` on shared storage | - -`VideoPathResponse` carries `video_id` and `video_path` returned by the server. +| Field | MLPerf value | Notes | +| --------------------- | -------------- | ---------------------------------------------------------------------- | +| `prompt` | from dataset | Required | +| `negative_prompt` | `None` | Omitted from JSON when absent; server uses its own default | +| `size` | `"720x1280"` | Portrait orientation | +| `seconds` | `5.0` | 81 frames ÷ ~16.2 fps | +| `fps` | `16` | | +| `num_inference_steps` | `20` | | +| `guidance_scale` | `4.0` | Primary CFG scale | +| `guidance_scale_2` | `3.0` | Null-text secondary CFG (two-stage denoising) | +| `seed` | `42` | Fixed for reproducibility | +| `latent_path` | `None` | Optional path to a fixed latent tensor on shared storage | +| `output_format` | `"auto"` | H.264 if ffmpeg available, MJPEG otherwise | +| `response_format` | `"video_path"` | Default = perf mode (Lustre path); set to `"video_bytes"` for accuracy | + +Two response models cover the two `response_format` values: + +- `VideoPathResponse` — `video_id`, `video_path` (perf mode). +- `VideoPayloadResponse` — `video_id`, `video_bytes` (accuracy mode; base64-encoded). Serialization uses `model_dump_json(exclude_none=True)` so `None` fields are omitted from the request body. @@ -88,9 +98,13 @@ Serialization uses `model_dump_json(exclude_none=True)` so `None` fields are omi `VideoGenAdapter` implements `HttpRequestAdapter`: ``` -encode_query(query) → VideoPathRequest JSON bytes -decode_response(bytes, id) → QueryResult(metadata={video_path: ...}) -decode_sse_message(bytes) → NotImplementedError (WAN 2.2 is non-streaming) +encode_query(query) → VideoPathRequest JSON bytes + (response_format defaults to "video_path"; + override via query.data["response_format"]) +decode_response(bytes, id) → QueryResult with metadata={video_path: ...} + or metadata={video_bytes: ...} depending on + the response shape +decode_sse_message(bytes) → NotImplementedError (WAN 2.2 is non-streaming) dataset_transforms(params) → [] (no token-level transforms needed) ``` @@ -100,23 +114,24 @@ dataset_transforms(params) → [] (no token-level transforms needed) ### `dataset.py` — VideoGenDataset -Loads a JSONL prompt file (248 MLPerf prompts). Injects three fields into every sample: +Loads a prompt text file (one prompt per non-blank line; the MLPerf dataset bundled at `datasets/wan22_prompts.jsonl` has 248 prompts). Injects up to two extra fields into every sample: - `prompt` — from file -- `negative_prompt` — MLPerf canonical string (default); overridable -- `latent_path` — absolute path to `fixed_latent.pt` (optional); passed through to `VideoPathRequest` +- `negative_prompt` — MLPerf canonical string by default; pass `negative_prompt=None` to omit +- `latent_path` — optional absolute path to a pre-computed latent tensor (`fixed_latent.pt`); omitted when not configured ``` JSONL file ──► VideoGenDataset.load() ──► sample dict ├── prompt - ├── negative_prompt (MLPerf canonical) - └── latent_path (if configured) + ├── negative_prompt (MLPerf canonical, optional) + └── latent_path (optional) │ ▼ VideoGenAdapter.encode_query() │ ▼ VideoPathRequest JSON + (response_format=video_path by default) ``` The MLPerf canonical negative prompt: @@ -134,35 +149,33 @@ the background, walking backwards ## Integration Point -The wan22 module plugs into the existing pipeline at the `api_type` config field. No hot-path code was modified. +The videogen module plugs into the existing pipeline at the `api_type` config field. No hot-path code was modified. ```yaml # offline_wan22.yaml endpoint_config: - api_type: wan22 # → selects VideoGenAdapter + api_type: videogen # → selects VideoGenAdapter endpoints: - http://localhost:8000 ``` -`HTTPEndpointClient` resolves `api_type: wan22` → `VideoGenAdapter` + `VideoGenAccumulator` via the existing adapter registry. +`HTTPEndpointClient` resolves `api_type: videogen` → `VideoGenAdapter` + `VideoGenAccumulator` via the existing adapter registry. + +To run accuracy mode (server returns video bytes inline), set `response_format: video_bytes` in the dataset config so it is injected into every `query.data`. --- ## What Is NOT In This Module -| Concern | Where it lives | -| ---------------------------------------- | ---------------------------------------------------------------------------------------------------- | -| trtllm-serve startup / model loading | trtllm-serve (separate process) | -| Fixed latent loading (`fixed_latent.pt`) | trtllm-serve `pipeline_wan.py` at startup, or per-request via `latent_path` (pending Task 2 in plan) | -| Video storage path on Lustre | trtllm-serve config | -| `guidance_scale_2` wiring on server side | Pending — see `wan22-trtllm-plan.md` Task 1 | +| Concern | Where it lives | +| ---------------------------------------- | ------------------------------------------------------ | +| trtllm-serve startup / model loading | trtllm-serve (separate process) | +| Fixed latent loading (`fixed_latent.pt`) | trtllm-serve, optionally per-request via `latent_path` | +| Video storage path on Lustre | trtllm-serve config | +| `guidance_scale_2` wiring on server side | Pending — see "Pending" below | --- ## Pending -See `docs/superpowers/plans/wan22-trtllm-plan.md` for the remaining trtllm-serve changes: - -- **Task 1** — Wire `guidance_scale_2` through trtllm HTTP API (client already sends it; server ignores it today) -- **Task 2** — Wire per-request `latent_path` through trtllm HTTP API -- **Task 3** — Fix `negative_prompt` default (`""` → `None`) in `VideoPathRequest` and `VideoGenDataset` +- **`guidance_scale_2` server-side wiring** — the client already serializes `guidance_scale_2` (MLPerf default 3.0); trtllm-serve currently ignores the field and uses a single CFG scale. Tracking on the server side. diff --git a/src/inference_endpoint/videogen/adapter.py b/src/inference_endpoint/videogen/adapter.py index 6ad056ad..954434a0 100644 --- a/src/inference_endpoint/videogen/adapter.py +++ b/src/inference_endpoint/videogen/adapter.py @@ -37,10 +37,11 @@ class VideoGenAdapter(HttpRequestAdapter): """Adapter for trtllm-serve POST /v1/videos/generations. Supports both server response formats via query.data["response_format"]: - - "video_bytes" (default): server returns base64-encoded video content. - Suitable for accuracy evaluation in a single pass. - - "video_path": server saves video to shared storage (Lustre) and returns - only the file path. Avoids 3-5 MB payloads over HTTP + ZMQ per request. + - "video_path" (default): server saves video to shared storage (Lustre) + and returns only the file path. Used in perf mode — avoids 3-5 MB + payloads over HTTP + ZMQ per request. + - "video_bytes": server returns base64-encoded video content. Used in + accuracy mode where the evaluator needs the video content directly. """ @classmethod @@ -53,8 +54,8 @@ def encode_query(cls, query: Query) -> bytes: Only `prompt` is required. All other fields fall back to MLPerf defaults defined in VideoPathRequest but can be overridden via query.data. - Pass response_format="video_path" in query.data to request a Lustre path - instead of inline video bytes. + Pass response_format="video_bytes" in query.data to request inline video + bytes (accuracy mode) instead of the default Lustre path (perf mode). """ data = query.data if "prompt" not in data: @@ -73,7 +74,7 @@ def encode_query(cls, query: Query) -> bytes: seed=data.get("seed", 42), latent_path=data.get("latent_path"), output_format=data.get("output_format", "auto"), - response_format=data.get("response_format", "video_bytes"), + response_format=data.get("response_format", "video_path"), ) # exclude_none so optional fields fall back to server-side defaults # (MLPerf: omit negative_prompt and latent_path unless explicitly set). diff --git a/src/inference_endpoint/videogen/dataset.py b/src/inference_endpoint/videogen/dataset.py index 66e4c13d..5b0c64b2 100644 --- a/src/inference_endpoint/videogen/dataset.py +++ b/src/inference_endpoint/videogen/dataset.py @@ -38,8 +38,7 @@ class VideoGenDataset(Dataset, dataset_id="wan22_mlperf"): """Dataset that loads MLPerf WAN2.2 prompt text files. - Each non-blank line in the file is one prompt. MLPerf endpoints run perf - and accuracy in a single pass, so VideoGenAdapter always requests video_bytes. + Each non-blank line in the file is one prompt. By default, the MLPerf canonical negative prompt is injected into every sample. Pass ``negative_prompt=None`` to omit the field and let the server apply its diff --git a/tests/integration/videogen/test_adapter.py b/tests/integration/videogen/test_adapter.py index e936050d..4b8ac95c 100644 --- a/tests/integration/videogen/test_adapter.py +++ b/tests/integration/videogen/test_adapter.py @@ -65,11 +65,21 @@ def test_successful_generation_returns_video_bytes( decoded = base64.b64decode(result.metadata["video_bytes"]) assert decoded == DUMMY_VIDEO_BYTES - def test_request_always_asks_for_video_bytes( + def test_request_default_response_format_is_video_path( self, mock_trtllm_serve: MockTrtllmServe ) -> None: query = Query(id="q2", data={"prompt": "ocean waves at sunset"}) payload = json.loads(VideoGenAdapter.encode_query(query)) + assert payload["response_format"] == "video_path" + + def test_request_accuracy_mode_asks_for_video_bytes( + self, mock_trtllm_serve: MockTrtllmServe + ) -> None: + query = Query( + id="q2b", + data={"prompt": "ocean waves at sunset", "response_format": "video_bytes"}, + ) + payload = json.loads(VideoGenAdapter.encode_query(query)) assert payload["response_format"] == "video_bytes" def test_request_carries_mlperf_defaults( diff --git a/tests/unit/videogen/test_adapter.py b/tests/unit/videogen/test_adapter.py index 11f4dce3..28ba3ff4 100644 --- a/tests/unit/videogen/test_adapter.py +++ b/tests/unit/videogen/test_adapter.py @@ -34,10 +34,18 @@ def test_encode_query_produces_valid_json(self): payload = json.loads(VideoGenAdapter.encode_query(query)) assert payload["prompt"] == "a golden retriever running" - def test_encode_query_always_requests_video_bytes(self): - """MLPerf runs perf+accuracy in one pass — always request video_bytes.""" + def test_encode_query_default_response_format_is_video_path(self): + """Perf mode default — server saves to Lustre, returns path only.""" query = Query(id="q1", data={"prompt": "ocean waves"}) payload = json.loads(VideoGenAdapter.encode_query(query)) + assert payload["response_format"] == "video_path" + + def test_encode_query_accuracy_mode_requests_video_bytes(self): + """Accuracy mode override — query.data opts in to inline bytes.""" + query = Query( + id="q1", data={"prompt": "ocean waves", "response_format": "video_bytes"} + ) + payload = json.loads(VideoGenAdapter.encode_query(query)) assert payload["response_format"] == "video_bytes" def test_encode_query_uses_mlperf_defaults(self): From 8295afc0f4bcbcf4e3ecf0c8d2ecdbc038ab0434 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Thu, 30 Apr 2026 11:49:43 -0700 Subject: [PATCH 12/22] chore(wan22): bundle prompts dataset under example folder; fix stale wan22 refs Move datasets/wan22_prompts.jsonl into the example folder so the example is self-contained and drop the absolute Lustre path baked into the setup script. setup_and_test.sh: - Remove PROMPTS_TXT (hardcoded /lustre/share/... path) and the entire prompts.txt -> JSONL conversion block. The JSONL is now bundled with the example, so regeneration from a Lustre source is no longer needed. - Retarget PROMPTS_JSONL to ${SCRIPT_DIR}/wan22_prompts.jsonl. - Drop the now-orphaned PYTHON variable (only used by the conversion heredoc). - Fix stale post-rename references that were left over from ddac990 (wan22 -> videogen): pip extras [wan22,test] -> [videogen,test] and test paths tests/unit/wan22 / tests/integration/wan22 -> tests/unit/videogen / tests/integration/videogen. Without these the script failed on a fresh setup (no [wan22] extra) and collected zero tests. offline_wan22.yaml: dataset path -> examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl. endpoints_changed.md: update bundled-dataset path reference. --- endpoints_changed.md | 2 +- .../offline_wan22.yaml | 2 +- .../setup_and_test.sh | 35 ++++--------------- .../wan22_prompts.jsonl | 0 4 files changed, 9 insertions(+), 30 deletions(-) rename {datasets => examples/09_Wan22_VideoGen_Example}/wan22_prompts.jsonl (100%) diff --git a/endpoints_changed.md b/endpoints_changed.md index 34443d1e..594a2f3d 100644 --- a/endpoints_changed.md +++ b/endpoints_changed.md @@ -114,7 +114,7 @@ dataset_transforms(params) → [] (no token-level transforms needed) ### `dataset.py` — VideoGenDataset -Loads a prompt text file (one prompt per non-blank line; the MLPerf dataset bundled at `datasets/wan22_prompts.jsonl` has 248 prompts). Injects up to two extra fields into every sample: +Loads a prompt text file (one prompt per non-blank line; the MLPerf dataset bundled at `examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl` has 248 prompts). Injects up to two extra fields into every sample: - `prompt` — from file - `negative_prompt` — MLPerf canonical string by default; pass `negative_prompt=None` to omit diff --git a/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml b/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml index 06e7e705..a81e23a1 100644 --- a/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml +++ b/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml @@ -26,7 +26,7 @@ model_params: datasets: - name: wan22_prompts - path: datasets/wan22_prompts.jsonl + path: examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl format: jsonl type: "performance" samples: 248 diff --git a/examples/09_Wan22_VideoGen_Example/setup_and_test.sh b/examples/09_Wan22_VideoGen_Example/setup_and_test.sh index d06e9a95..7ea050d6 100755 --- a/examples/09_Wan22_VideoGen_Example/setup_and_test.sh +++ b/examples/09_Wan22_VideoGen_Example/setup_and_test.sh @@ -30,14 +30,13 @@ if [[ "$SKIP_SETUP" == false ]]; then echo "==> Creating virtual environment at ${VENV_DIR}" python3.12 -m venv "${VENV_DIR}" - echo "==> Installing package with [wan22,test] extras" + echo "==> Installing package with [videogen,test] extras" "${VENV_DIR}/bin/pip" install --upgrade pip --quiet - "${VENV_DIR}/bin/pip" install -e ".[wan22,test]" --quiet + "${VENV_DIR}/bin/pip" install -e ".[videogen,test]" --quiet else echo "==> Skipping setup (--skip-setup)" fi -PYTHON="${VENV_DIR}/bin/python" PYTEST="${VENV_DIR}/bin/pytest" if [[ ! -x "$PYTEST" ]]; then @@ -46,37 +45,17 @@ if [[ ! -x "$PYTEST" ]]; then fi # --------------------------------------------------------------------------- -# 2. Generate JSONL dataset from prompts.txt (idempotent) +# 2. Locate bundled prompts dataset # --------------------------------------------------------------------------- -PROMPTS_TXT="/lustre/share/coreai_mlperf_inference/mlperf_inference_storage_clone/preprocessed_data/wan22-a14b/prompts.txt" -PROMPTS_JSONL="${REPO_ROOT}/datasets/wan22_prompts.jsonl" - -if [[ -f "$PROMPTS_TXT" && ! -f "$PROMPTS_JSONL" ]]; then - echo "==> Converting prompts.txt -> wan22_prompts.jsonl" - mkdir -p "$(dirname "$PROMPTS_JSONL")" - PROMPTS_TXT="$PROMPTS_TXT" PROMPTS_JSONL="$PROMPTS_JSONL" "$PYTHON" - <<'EOF' -import json, pathlib, os -src = pathlib.Path(os.environ["PROMPTS_TXT"]) -dst = pathlib.Path(os.environ["PROMPTS_JSONL"]) -lines = [l.strip() for l in src.read_text().splitlines() if l.strip()] -with dst.open("w") as f: - for i, p in enumerate(lines): - f.write(json.dumps({"prompt": p, "sample_id": str(i), "sample_index": i, - "negative_prompt": "", "mode": "perf"}) + "\n") -print(f"Written {len(lines)} prompts to {dst}") -EOF -elif [[ -f "$PROMPTS_JSONL" ]]; then - echo "==> wan22_prompts.jsonl already exists, skipping conversion" -else - echo "WARNING: prompts.txt not found at ${PROMPTS_TXT}, skipping JSONL generation" -fi +PROMPTS_JSONL="${SCRIPT_DIR}/wan22_prompts.jsonl" +echo "==> Using bundled prompts dataset: ${PROMPTS_JSONL}" # --------------------------------------------------------------------------- # 3. Run WAN2.2 unit tests # --------------------------------------------------------------------------- echo "" echo "==> Running WAN2.2 unit tests" -"$PYTEST" tests/unit/wan22/ \ +"$PYTEST" tests/unit/videogen/ \ -v \ --tb=short \ --no-cov \ @@ -84,7 +63,7 @@ echo "==> Running WAN2.2 unit tests" echo "" echo "==> Running WAN2.2 integration tests" -"$PYTEST" tests/integration/wan22/ \ +"$PYTEST" tests/integration/videogen/ \ -v \ --tb=short \ --no-cov \ diff --git a/datasets/wan22_prompts.jsonl b/examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl similarity index 100% rename from datasets/wan22_prompts.jsonl rename to examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl From 9b6b70a53370fef0d2d410fd3d5bf7e91e7cb125 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Fri, 1 May 2026 10:51:26 -0700 Subject: [PATCH 13/22] refactor(videogen): drop VideoGenDataset, ingest JSONL via generic loader VideoGenDataset duplicated functionality the generic JsonlLoader already provides, was bugged on JSONL input (read each line as a raw text prompt instead of parsing JSON), and wasn't actually invoked by the example config: offline_wan22.yaml uses `name: wan22_prompts`, which doesn't match its dataset_id (`wan22_mlperf`), so DataLoaderFactory already routed to JsonlLoader. The class was dead code in the only path the example exercises. Bake the MLPerf canonical negative_prompt into every row of the bundled JSONL so runtime injection is unnecessary, then delete the workload- specific dataset class. - examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl: replace empty negative_prompt with canonical MLPerf string in all 248 rows. - src/inference_endpoint/videogen/dataset.py: deleted. - src/inference_endpoint/dataset_manager/__init__.py: drop the side-effect VideoGenDataset import and __all__ entry. - tests/unit/videogen/test_dataset.py, test_factory.py: deleted. - src/inference_endpoint/videogen/types.py: update negative_prompt field docstring to point at the bundled JSONL instead of VideoGenDataset. - examples/09_Wan22_VideoGen_Example/offline_wan22.yaml: drop `format: jsonl` (the factory tries DatasetFormat("jsonl") and crashes because enum values are `.jsonl`; auto-detection from the path extension works), and update the comment block. - endpoints_changed.md: replace the dataset.py / VideoGenDataset section with a brief note about the bundled JSONL + JsonlLoader. Verified on aarch64 GB200: - pre-commit run --all-files: all hooks pass - 42 videogen tests pass (down from 58: 14 dataset tests + 3 factory tests removed; adapter/types/init/registration tests retained) - end-to-end smoke: DataLoaderFactory creates a Dataset with 248 samples, each carrying prompt + canonical negative_prompt; VideoGenAdapter.encode_query produces a valid request with response_format=video_path. --- endpoints_changed.md | 52 +- .../offline_wan22.yaml | 5 +- .../wan22_prompts.jsonl | 496 +++++++++--------- .../dataset_manager/__init__.py | 4 - src/inference_endpoint/videogen/dataset.py | 125 ----- src/inference_endpoint/videogen/types.py | 3 +- tests/unit/videogen/test_dataset.py | 114 ---- tests/unit/videogen/test_factory.py | 52 -- 8 files changed, 275 insertions(+), 576 deletions(-) delete mode 100644 src/inference_endpoint/videogen/dataset.py delete mode 100644 tests/unit/videogen/test_dataset.py delete mode 100644 tests/unit/videogen/test_factory.py diff --git a/endpoints_changed.md b/endpoints_changed.md index 594a2f3d..122cc52e 100644 --- a/endpoints_changed.md +++ b/endpoints_changed.md @@ -58,11 +58,15 @@ videogen/ ├── __init__.py Public exports ├── types.py Pydantic wire models: VideoPathRequest, │ VideoPathResponse, VideoPayloadResponse, HealthResponse -├── adapter.py VideoGenAdapter (HttpRequestAdapter) + VideoGenAccumulator (no-op SSE) -└── dataset.py VideoGenDataset — loads MLPerf prompt JSONL, injects negative - prompt and optional latent path +└── adapter.py VideoGenAdapter (HttpRequestAdapter) + VideoGenAccumulator (no-op SSE) ``` +The MLPerf prompts dataset is shipped as plain JSONL at +`examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl` (248 rows, each row +carries `prompt`, `negative_prompt` (MLPerf canonical), `sample_id`, +`sample_index`). The generic `JsonlLoader` ingests it directly — no +workload-specific dataset class is needed. + --- ## Components @@ -112,37 +116,27 @@ dataset_transforms(params) → [] (no token-level transforms needed) `APIType.WAN22` is registered in `core/types.py` with `default_route() = "/v1/videos/generations"`. -### `dataset.py` — VideoGenDataset - -Loads a prompt text file (one prompt per non-blank line; the MLPerf dataset bundled at `examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl` has 248 prompts). Injects up to two extra fields into every sample: +### Dataset ingest — generic `JsonlLoader` -- `prompt` — from file -- `negative_prompt` — MLPerf canonical string by default; pass `negative_prompt=None` to omit -- `latent_path` — optional absolute path to a pre-computed latent tensor (`fixed_latent.pt`); omitted when not configured +The bundled `examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl` (248 rows) is consumed by the generic JSONL loader registered in `dataset_manager`. Each row carries everything the adapter needs: -``` -JSONL file ──► VideoGenDataset.load() ──► sample dict - ├── prompt - ├── negative_prompt (MLPerf canonical, optional) - └── latent_path (optional) - │ - ▼ - VideoGenAdapter.encode_query() - │ - ▼ - VideoPathRequest JSON - (response_format=video_path by default) -``` +- `prompt` — the MLPerf prompt string +- `negative_prompt` — the MLPerf canonical negative prompt, baked into every row +- `sample_id`, `sample_index` — used by the load generator for tracking -The MLPerf canonical negative prompt: +`latent_path` is optional and not present in the bundled dataset. To inject a fixed latent into every request, add it via `AddStaticColumns` (in `dataset_manager.transforms`) or extend the JSONL. ``` -vivid colors, overexposed, static, blurry details, subtitles, style, -work of art, painting, picture, still, overall grayish, worst quality, -low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn -hands, poorly drawn face, deformed, disfigured, deformed limbs, fused -fingers, static image, cluttered background, three legs, many people in -the background, walking backwards +wan22_prompts.jsonl ──► JsonlLoader ──► Dataset.load() ──► sample dict + ├── prompt + └── negative_prompt + │ + ▼ + VideoGenAdapter.encode_query() + │ + ▼ + VideoPathRequest JSON + (response_format=video_path by default) ``` --- diff --git a/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml b/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml index a81e23a1..c2c46b6b 100644 --- a/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml +++ b/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml @@ -27,7 +27,6 @@ model_params: datasets: - name: wan22_prompts path: examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl - format: jsonl type: "performance" samples: 248 @@ -56,7 +55,7 @@ endpoint_config: api_type: "videogen" api_key: null -# Fixed latent path is injected into every request via VideoGenDataset. -# Set latent_path in dataset config or pass it when constructing VideoGenDataset. +# Per-request fields (negative_prompt, optional latent_path) come from the +# bundled JSONL — the canonical MLPerf negative prompt is baked into every row. report_dir: logs/wan22_video_generation_benchmark diff --git a/examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl b/examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl index e3521acc..3059739b 100644 --- a/examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl +++ b/examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl @@ -1,248 +1,248 @@ -{"prompt": "a person swimming in ocean", "sample_id": "0", "sample_index": 0, "negative_prompt": "", "mode": "perf"} -{"prompt": "a person giving a presentation to a room full of colleagues", "sample_id": "1", "sample_index": 1, "negative_prompt": "", "mode": "perf"} -{"prompt": "a person washing the dishes", "sample_id": "2", "sample_index": 2, "negative_prompt": "", "mode": "perf"} -{"prompt": "a person eating a burger", "sample_id": "3", "sample_index": 3, "negative_prompt": "", "mode": "perf"} -{"prompt": "a person walking in the snowstorm", "sample_id": "4", "sample_index": 4, "negative_prompt": "", "mode": "perf"} -{"prompt": "a person drinking coffee in a cafe", "sample_id": "5", "sample_index": 5, "negative_prompt": "", "mode": "perf"} -{"prompt": "a person playing guitar", "sample_id": "6", "sample_index": 6, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bicycle leaning against a tree", "sample_id": "7", "sample_index": 7, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bicycle gliding through a snowy field", "sample_id": "8", "sample_index": 8, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bicycle slowing down to stop", "sample_id": "9", "sample_index": 9, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bicycle accelerating to gain speed", "sample_id": "10", "sample_index": 10, "negative_prompt": "", "mode": "perf"} -{"prompt": "a car stuck in traffic during rush hour", "sample_id": "11", "sample_index": 11, "negative_prompt": "", "mode": "perf"} -{"prompt": "a car turning a corner", "sample_id": "12", "sample_index": 12, "negative_prompt": "", "mode": "perf"} -{"prompt": "a car slowing down to stop", "sample_id": "13", "sample_index": 13, "negative_prompt": "", "mode": "perf"} -{"prompt": "a car accelerating to gain speed", "sample_id": "14", "sample_index": 14, "negative_prompt": "", "mode": "perf"} -{"prompt": "a motorcycle cruising along a coastal highway", "sample_id": "15", "sample_index": 15, "negative_prompt": "", "mode": "perf"} -{"prompt": "a motorcycle turning a corner", "sample_id": "16", "sample_index": 16, "negative_prompt": "", "mode": "perf"} -{"prompt": "a motorcycle slowing down to stop", "sample_id": "17", "sample_index": 17, "negative_prompt": "", "mode": "perf"} -{"prompt": "a motorcycle gliding through a snowy field", "sample_id": "18", "sample_index": 18, "negative_prompt": "", "mode": "perf"} -{"prompt": "a motorcycle accelerating to gain speed", "sample_id": "19", "sample_index": 19, "negative_prompt": "", "mode": "perf"} -{"prompt": "an airplane soaring through a clear blue sky", "sample_id": "20", "sample_index": 20, "negative_prompt": "", "mode": "perf"} -{"prompt": "an airplane taking off", "sample_id": "21", "sample_index": 21, "negative_prompt": "", "mode": "perf"} -{"prompt": "an airplane landing smoothly on a runway", "sample_id": "22", "sample_index": 22, "negative_prompt": "", "mode": "perf"} -{"prompt": "an airplane accelerating to gain speed", "sample_id": "23", "sample_index": 23, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bus turning a corner", "sample_id": "24", "sample_index": 24, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bus stuck in traffic during rush hour", "sample_id": "25", "sample_index": 25, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bus accelerating to gain speed", "sample_id": "26", "sample_index": 26, "negative_prompt": "", "mode": "perf"} -{"prompt": "a train speeding down the tracks", "sample_id": "27", "sample_index": 27, "negative_prompt": "", "mode": "perf"} -{"prompt": "a train crossing over a tall bridge", "sample_id": "28", "sample_index": 28, "negative_prompt": "", "mode": "perf"} -{"prompt": "a train accelerating to gain speed", "sample_id": "29", "sample_index": 29, "negative_prompt": "", "mode": "perf"} -{"prompt": "a truck turning a corner", "sample_id": "30", "sample_index": 30, "negative_prompt": "", "mode": "perf"} -{"prompt": "a truck anchored in a tranquil bay", "sample_id": "31", "sample_index": 31, "negative_prompt": "", "mode": "perf"} -{"prompt": "a truck stuck in traffic during rush hour", "sample_id": "32", "sample_index": 32, "negative_prompt": "", "mode": "perf"} -{"prompt": "a truck slowing down to stop", "sample_id": "33", "sample_index": 33, "negative_prompt": "", "mode": "perf"} -{"prompt": "a truck accelerating to gain speed", "sample_id": "34", "sample_index": 34, "negative_prompt": "", "mode": "perf"} -{"prompt": "a boat sailing smoothly on a calm lake", "sample_id": "35", "sample_index": 35, "negative_prompt": "", "mode": "perf"} -{"prompt": "a boat slowing down to stop", "sample_id": "36", "sample_index": 36, "negative_prompt": "", "mode": "perf"} -{"prompt": "a boat accelerating to gain speed", "sample_id": "37", "sample_index": 37, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bird soaring gracefully in the sky", "sample_id": "38", "sample_index": 38, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bird building a nest from twigs and leaves", "sample_id": "39", "sample_index": 39, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bird flying over a snowy forest", "sample_id": "40", "sample_index": 40, "negative_prompt": "", "mode": "perf"} -{"prompt": "a cat grooming itself meticulously with its tongue", "sample_id": "41", "sample_index": 41, "negative_prompt": "", "mode": "perf"} -{"prompt": "a cat playing in park", "sample_id": "42", "sample_index": 42, "negative_prompt": "", "mode": "perf"} -{"prompt": "a cat drinking water", "sample_id": "43", "sample_index": 43, "negative_prompt": "", "mode": "perf"} -{"prompt": "a cat running happily", "sample_id": "44", "sample_index": 44, "negative_prompt": "", "mode": "perf"} -{"prompt": "a dog enjoying a peaceful walk", "sample_id": "45", "sample_index": 45, "negative_prompt": "", "mode": "perf"} -{"prompt": "a dog playing in park", "sample_id": "46", "sample_index": 46, "negative_prompt": "", "mode": "perf"} -{"prompt": "a dog drinking water", "sample_id": "47", "sample_index": 47, "negative_prompt": "", "mode": "perf"} -{"prompt": "a dog running happily", "sample_id": "48", "sample_index": 48, "negative_prompt": "", "mode": "perf"} -{"prompt": "a horse bending down to drink water from a river", "sample_id": "49", "sample_index": 49, "negative_prompt": "", "mode": "perf"} -{"prompt": "a horse galloping across an open field", "sample_id": "50", "sample_index": 50, "negative_prompt": "", "mode": "perf"} -{"prompt": "a horse taking a peaceful walk", "sample_id": "51", "sample_index": 51, "negative_prompt": "", "mode": "perf"} -{"prompt": "a horse running to join a herd of its kind", "sample_id": "52", "sample_index": 52, "negative_prompt": "", "mode": "perf"} -{"prompt": "a sheep bending down to drink water from a river", "sample_id": "53", "sample_index": 53, "negative_prompt": "", "mode": "perf"} -{"prompt": "a sheep taking a peaceful walk", "sample_id": "54", "sample_index": 54, "negative_prompt": "", "mode": "perf"} -{"prompt": "a sheep running to join a herd of its kind", "sample_id": "55", "sample_index": 55, "negative_prompt": "", "mode": "perf"} -{"prompt": "a cow bending down to drink water from a river", "sample_id": "56", "sample_index": 56, "negative_prompt": "", "mode": "perf"} -{"prompt": "a cow chewing cud while resting in a tranquil barn", "sample_id": "57", "sample_index": 57, "negative_prompt": "", "mode": "perf"} -{"prompt": "a cow running to join a herd of its kind", "sample_id": "58", "sample_index": 58, "negative_prompt": "", "mode": "perf"} -{"prompt": "an elephant spraying itself with water using its trunk to cool down", "sample_id": "59", "sample_index": 59, "negative_prompt": "", "mode": "perf"} -{"prompt": "an elephant taking a peaceful walk", "sample_id": "60", "sample_index": 60, "negative_prompt": "", "mode": "perf"} -{"prompt": "an elephant running to join a herd of its kind", "sample_id": "61", "sample_index": 61, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bear catching a salmon in its powerful jaws", "sample_id": "62", "sample_index": 62, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bear sniffing the air for scents of food", "sample_id": "63", "sample_index": 63, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bear climbing a tree", "sample_id": "64", "sample_index": 64, "negative_prompt": "", "mode": "perf"} -{"prompt": "a bear hunting for prey", "sample_id": "65", "sample_index": 65, "negative_prompt": "", "mode": "perf"} -{"prompt": "a zebra bending down to drink water from a river", "sample_id": "66", "sample_index": 66, "negative_prompt": "", "mode": "perf"} -{"prompt": "a zebra running to join a herd of its kind", "sample_id": "67", "sample_index": 67, "negative_prompt": "", "mode": "perf"} -{"prompt": "a zebra taking a peaceful walk", "sample_id": "68", "sample_index": 68, "negative_prompt": "", "mode": "perf"} -{"prompt": "a giraffe bending down to drink water from a river", "sample_id": "69", "sample_index": 69, "negative_prompt": "", "mode": "perf"} -{"prompt": "a giraffe taking a peaceful walk", "sample_id": "70", "sample_index": 70, "negative_prompt": "", "mode": "perf"} -{"prompt": "a giraffe running to join a herd of its kind", "sample_id": "71", "sample_index": 71, "negative_prompt": "", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, Van Gogh style", "sample_id": "72", "sample_index": 72, "negative_prompt": "", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, oil painting", "sample_id": "73", "sample_index": 73, "negative_prompt": "", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand by Hokusai, in the style of Ukiyo", "sample_id": "74", "sample_index": 74, "negative_prompt": "", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, black and white", "sample_id": "75", "sample_index": 75, "negative_prompt": "", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, pixel art", "sample_id": "76", "sample_index": 76, "negative_prompt": "", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, in cyberpunk style", "sample_id": "77", "sample_index": 77, "negative_prompt": "", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, animated style", "sample_id": "78", "sample_index": 78, "negative_prompt": "", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, watercolor painting", "sample_id": "79", "sample_index": 79, "negative_prompt": "", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, surrealism style", "sample_id": "80", "sample_index": 80, "negative_prompt": "", "mode": "perf"} -{"prompt": "The bund Shanghai, Van Gogh style", "sample_id": "81", "sample_index": 81, "negative_prompt": "", "mode": "perf"} -{"prompt": "The bund Shanghai, oil painting", "sample_id": "82", "sample_index": 82, "negative_prompt": "", "mode": "perf"} -{"prompt": "The bund Shanghai by Hokusai, in the style of Ukiyo", "sample_id": "83", "sample_index": 83, "negative_prompt": "", "mode": "perf"} -{"prompt": "The bund Shanghai, black and white", "sample_id": "84", "sample_index": 84, "negative_prompt": "", "mode": "perf"} -{"prompt": "The bund Shanghai, pixel art", "sample_id": "85", "sample_index": 85, "negative_prompt": "", "mode": "perf"} -{"prompt": "The bund Shanghai, in cyberpunk style", "sample_id": "86", "sample_index": 86, "negative_prompt": "", "mode": "perf"} -{"prompt": "The bund Shanghai, animated style", "sample_id": "87", "sample_index": 87, "negative_prompt": "", "mode": "perf"} -{"prompt": "The bund Shanghai, watercolor painting", "sample_id": "88", "sample_index": 88, "negative_prompt": "", "mode": "perf"} -{"prompt": "The bund Shanghai, surrealism style", "sample_id": "89", "sample_index": 89, "negative_prompt": "", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, Van Gogh style", "sample_id": "90", "sample_index": 90, "negative_prompt": "", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, oil painting", "sample_id": "91", "sample_index": 91, "negative_prompt": "", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean by Hokusai, in the style of Ukiyo", "sample_id": "92", "sample_index": 92, "negative_prompt": "", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, black and white", "sample_id": "93", "sample_index": 93, "negative_prompt": "", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, pixel art", "sample_id": "94", "sample_index": 94, "negative_prompt": "", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, in cyberpunk style", "sample_id": "95", "sample_index": 95, "negative_prompt": "", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, animated style", "sample_id": "96", "sample_index": 96, "negative_prompt": "", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, watercolor painting", "sample_id": "97", "sample_index": 97, "negative_prompt": "", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, surrealism style", "sample_id": "98", "sample_index": 98, "negative_prompt": "", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, Van Gogh style", "sample_id": "99", "sample_index": 99, "negative_prompt": "", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, oil painting", "sample_id": "100", "sample_index": 100, "negative_prompt": "", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris by Hokusai, in the style of Ukiyo", "sample_id": "101", "sample_index": 101, "negative_prompt": "", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, black and white", "sample_id": "102", "sample_index": 102, "negative_prompt": "", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, pixel art", "sample_id": "103", "sample_index": 103, "negative_prompt": "", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, in cyberpunk style", "sample_id": "104", "sample_index": 104, "negative_prompt": "", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, animated style", "sample_id": "105", "sample_index": 105, "negative_prompt": "", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, watercolor painting", "sample_id": "106", "sample_index": 106, "negative_prompt": "", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, surrealism style", "sample_id": "107", "sample_index": 107, "negative_prompt": "", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, Van Gogh style", "sample_id": "108", "sample_index": 108, "negative_prompt": "", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, oil painting", "sample_id": "109", "sample_index": 109, "negative_prompt": "", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset by Hokusai, in the style of Ukiyo", "sample_id": "110", "sample_index": 110, "negative_prompt": "", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, black and white", "sample_id": "111", "sample_index": 111, "negative_prompt": "", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, pixel art", "sample_id": "112", "sample_index": 112, "negative_prompt": "", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, in cyberpunk style", "sample_id": "113", "sample_index": 113, "negative_prompt": "", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, animated style", "sample_id": "114", "sample_index": 114, "negative_prompt": "", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, watercolor painting", "sample_id": "115", "sample_index": 115, "negative_prompt": "", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, surrealism style", "sample_id": "116", "sample_index": 116, "negative_prompt": "", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, Van Gogh style", "sample_id": "117", "sample_index": 117, "negative_prompt": "", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, oil painting", "sample_id": "118", "sample_index": 118, "negative_prompt": "", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book by Hokusai, in the style of Ukiyo", "sample_id": "119", "sample_index": 119, "negative_prompt": "", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, black and white", "sample_id": "120", "sample_index": 120, "negative_prompt": "", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, pixel art", "sample_id": "121", "sample_index": 121, "negative_prompt": "", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, in cyberpunk style", "sample_id": "122", "sample_index": 122, "negative_prompt": "", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, animated style", "sample_id": "123", "sample_index": 123, "negative_prompt": "", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, watercolor painting", "sample_id": "124", "sample_index": 124, "negative_prompt": "", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, surrealism style", "sample_id": "125", "sample_index": 125, "negative_prompt": "", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, Van Gogh style", "sample_id": "126", "sample_index": 126, "negative_prompt": "", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, oil painting", "sample_id": "127", "sample_index": 127, "negative_prompt": "", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background by Hokusai, in the style of Ukiyo", "sample_id": "128", "sample_index": 128, "negative_prompt": "", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, black and white", "sample_id": "129", "sample_index": 129, "negative_prompt": "", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, pixel art", "sample_id": "130", "sample_index": 130, "negative_prompt": "", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, in cyberpunk style", "sample_id": "131", "sample_index": 131, "negative_prompt": "", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, animated style", "sample_id": "132", "sample_index": 132, "negative_prompt": "", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, watercolor painting", "sample_id": "133", "sample_index": 133, "negative_prompt": "", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, surrealism style", "sample_id": "134", "sample_index": 134, "negative_prompt": "", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, Van Gogh style", "sample_id": "135", "sample_index": 135, "negative_prompt": "", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, oil painting", "sample_id": "136", "sample_index": 136, "negative_prompt": "", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas by Hokusai, in the style of Ukiyo", "sample_id": "137", "sample_index": 137, "negative_prompt": "", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, black and white", "sample_id": "138", "sample_index": 138, "negative_prompt": "", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, pixel art", "sample_id": "139", "sample_index": 139, "negative_prompt": "", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, in cyberpunk style", "sample_id": "140", "sample_index": 140, "negative_prompt": "", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, animated style", "sample_id": "141", "sample_index": 141, "negative_prompt": "", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, watercolor painting", "sample_id": "142", "sample_index": 142, "negative_prompt": "", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, surrealism style", "sample_id": "143", "sample_index": 143, "negative_prompt": "", "mode": "perf"} -{"prompt": "An astronaut flying in space, Van Gogh style", "sample_id": "144", "sample_index": 144, "negative_prompt": "", "mode": "perf"} -{"prompt": "An astronaut flying in space, oil painting", "sample_id": "145", "sample_index": 145, "negative_prompt": "", "mode": "perf"} -{"prompt": "An astronaut flying in space by Hokusai, in the style of Ukiyo", "sample_id": "146", "sample_index": 146, "negative_prompt": "", "mode": "perf"} -{"prompt": "An astronaut flying in space, black and white", "sample_id": "147", "sample_index": 147, "negative_prompt": "", "mode": "perf"} -{"prompt": "An astronaut flying in space, pixel art", "sample_id": "148", "sample_index": 148, "negative_prompt": "", "mode": "perf"} -{"prompt": "An astronaut flying in space, in cyberpunk style", "sample_id": "149", "sample_index": 149, "negative_prompt": "", "mode": "perf"} -{"prompt": "An astronaut flying in space, animated style", "sample_id": "150", "sample_index": 150, "negative_prompt": "", "mode": "perf"} -{"prompt": "An astronaut flying in space, watercolor painting", "sample_id": "151", "sample_index": 151, "negative_prompt": "", "mode": "perf"} -{"prompt": "An astronaut flying in space, surrealism style", "sample_id": "152", "sample_index": 152, "negative_prompt": "", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, Van Gogh style", "sample_id": "153", "sample_index": 153, "negative_prompt": "", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, oil painting", "sample_id": "154", "sample_index": 154, "negative_prompt": "", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks by Hokusai, in the style of Ukiyo", "sample_id": "155", "sample_index": 155, "negative_prompt": "", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, black and white", "sample_id": "156", "sample_index": 156, "negative_prompt": "", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, pixel art", "sample_id": "157", "sample_index": 157, "negative_prompt": "", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, in cyberpunk style", "sample_id": "158", "sample_index": 158, "negative_prompt": "", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, animated style", "sample_id": "159", "sample_index": 159, "negative_prompt": "", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, watercolor painting", "sample_id": "160", "sample_index": 160, "negative_prompt": "", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, surrealism style", "sample_id": "161", "sample_index": 161, "negative_prompt": "", "mode": "perf"} -{"prompt": "alley", "sample_id": "162", "sample_index": 162, "negative_prompt": "", "mode": "perf"} -{"prompt": "amusement park", "sample_id": "163", "sample_index": 163, "negative_prompt": "", "mode": "perf"} -{"prompt": "aquarium", "sample_id": "164", "sample_index": 164, "negative_prompt": "", "mode": "perf"} -{"prompt": "arch", "sample_id": "165", "sample_index": 165, "negative_prompt": "", "mode": "perf"} -{"prompt": "art gallery", "sample_id": "166", "sample_index": 166, "negative_prompt": "", "mode": "perf"} -{"prompt": "bathroom", "sample_id": "167", "sample_index": 167, "negative_prompt": "", "mode": "perf"} -{"prompt": "bakery shop", "sample_id": "168", "sample_index": 168, "negative_prompt": "", "mode": "perf"} -{"prompt": "ballroom", "sample_id": "169", "sample_index": 169, "negative_prompt": "", "mode": "perf"} -{"prompt": "bar", "sample_id": "170", "sample_index": 170, "negative_prompt": "", "mode": "perf"} -{"prompt": "barn", "sample_id": "171", "sample_index": 171, "negative_prompt": "", "mode": "perf"} -{"prompt": "basement", "sample_id": "172", "sample_index": 172, "negative_prompt": "", "mode": "perf"} -{"prompt": "beach", "sample_id": "173", "sample_index": 173, "negative_prompt": "", "mode": "perf"} -{"prompt": "bedroom", "sample_id": "174", "sample_index": 174, "negative_prompt": "", "mode": "perf"} -{"prompt": "bridge", "sample_id": "175", "sample_index": 175, "negative_prompt": "", "mode": "perf"} -{"prompt": "botanical garden", "sample_id": "176", "sample_index": 176, "negative_prompt": "", "mode": "perf"} -{"prompt": "cafeteria", "sample_id": "177", "sample_index": 177, "negative_prompt": "", "mode": "perf"} -{"prompt": "campsite", "sample_id": "178", "sample_index": 178, "negative_prompt": "", "mode": "perf"} -{"prompt": "campus", "sample_id": "179", "sample_index": 179, "negative_prompt": "", "mode": "perf"} -{"prompt": "carrousel", "sample_id": "180", "sample_index": 180, "negative_prompt": "", "mode": "perf"} -{"prompt": "castle", "sample_id": "181", "sample_index": 181, "negative_prompt": "", "mode": "perf"} -{"prompt": "cemetery", "sample_id": "182", "sample_index": 182, "negative_prompt": "", "mode": "perf"} -{"prompt": "classroom", "sample_id": "183", "sample_index": 183, "negative_prompt": "", "mode": "perf"} -{"prompt": "cliff", "sample_id": "184", "sample_index": 184, "negative_prompt": "", "mode": "perf"} -{"prompt": "crosswalk", "sample_id": "185", "sample_index": 185, "negative_prompt": "", "mode": "perf"} -{"prompt": "construction site", "sample_id": "186", "sample_index": 186, "negative_prompt": "", "mode": "perf"} -{"prompt": "corridor", "sample_id": "187", "sample_index": 187, "negative_prompt": "", "mode": "perf"} -{"prompt": "courtyard", "sample_id": "188", "sample_index": 188, "negative_prompt": "", "mode": "perf"} -{"prompt": "desert", "sample_id": "189", "sample_index": 189, "negative_prompt": "", "mode": "perf"} -{"prompt": "downtown", "sample_id": "190", "sample_index": 190, "negative_prompt": "", "mode": "perf"} -{"prompt": "driveway", "sample_id": "191", "sample_index": 191, "negative_prompt": "", "mode": "perf"} -{"prompt": "farm", "sample_id": "192", "sample_index": 192, "negative_prompt": "", "mode": "perf"} -{"prompt": "food court", "sample_id": "193", "sample_index": 193, "negative_prompt": "", "mode": "perf"} -{"prompt": "football field", "sample_id": "194", "sample_index": 194, "negative_prompt": "", "mode": "perf"} -{"prompt": "forest road", "sample_id": "195", "sample_index": 195, "negative_prompt": "", "mode": "perf"} -{"prompt": "fountain", "sample_id": "196", "sample_index": 196, "negative_prompt": "", "mode": "perf"} -{"prompt": "gas station", "sample_id": "197", "sample_index": 197, "negative_prompt": "", "mode": "perf"} -{"prompt": "glacier", "sample_id": "198", "sample_index": 198, "negative_prompt": "", "mode": "perf"} -{"prompt": "golf course", "sample_id": "199", "sample_index": 199, "negative_prompt": "", "mode": "perf"} -{"prompt": "indoor gymnasium", "sample_id": "200", "sample_index": 200, "negative_prompt": "", "mode": "perf"} -{"prompt": "harbor", "sample_id": "201", "sample_index": 201, "negative_prompt": "", "mode": "perf"} -{"prompt": "highway", "sample_id": "202", "sample_index": 202, "negative_prompt": "", "mode": "perf"} -{"prompt": "hospital", "sample_id": "203", "sample_index": 203, "negative_prompt": "", "mode": "perf"} -{"prompt": "house", "sample_id": "204", "sample_index": 204, "negative_prompt": "", "mode": "perf"} -{"prompt": "iceberg", "sample_id": "205", "sample_index": 205, "negative_prompt": "", "mode": "perf"} -{"prompt": "industrial area", "sample_id": "206", "sample_index": 206, "negative_prompt": "", "mode": "perf"} -{"prompt": "jail cell", "sample_id": "207", "sample_index": 207, "negative_prompt": "", "mode": "perf"} -{"prompt": "junkyard", "sample_id": "208", "sample_index": 208, "negative_prompt": "", "mode": "perf"} -{"prompt": "kitchen", "sample_id": "209", "sample_index": 209, "negative_prompt": "", "mode": "perf"} -{"prompt": "indoor library", "sample_id": "210", "sample_index": 210, "negative_prompt": "", "mode": "perf"} -{"prompt": "lighthouse", "sample_id": "211", "sample_index": 211, "negative_prompt": "", "mode": "perf"} -{"prompt": "laboratory", "sample_id": "212", "sample_index": 212, "negative_prompt": "", "mode": "perf"} -{"prompt": "mansion", "sample_id": "213", "sample_index": 213, "negative_prompt": "", "mode": "perf"} -{"prompt": "marsh", "sample_id": "214", "sample_index": 214, "negative_prompt": "", "mode": "perf"} -{"prompt": "mountain", "sample_id": "215", "sample_index": 215, "negative_prompt": "", "mode": "perf"} -{"prompt": "indoor movie theater", "sample_id": "216", "sample_index": 216, "negative_prompt": "", "mode": "perf"} -{"prompt": "indoor museum", "sample_id": "217", "sample_index": 217, "negative_prompt": "", "mode": "perf"} -{"prompt": "music studio", "sample_id": "218", "sample_index": 218, "negative_prompt": "", "mode": "perf"} -{"prompt": "nursery", "sample_id": "219", "sample_index": 219, "negative_prompt": "", "mode": "perf"} -{"prompt": "ocean", "sample_id": "220", "sample_index": 220, "negative_prompt": "", "mode": "perf"} -{"prompt": "office", "sample_id": "221", "sample_index": 221, "negative_prompt": "", "mode": "perf"} -{"prompt": "palace", "sample_id": "222", "sample_index": 222, "negative_prompt": "", "mode": "perf"} -{"prompt": "parking lot", "sample_id": "223", "sample_index": 223, "negative_prompt": "", "mode": "perf"} -{"prompt": "pharmacy", "sample_id": "224", "sample_index": 224, "negative_prompt": "", "mode": "perf"} -{"prompt": "phone booth", "sample_id": "225", "sample_index": 225, "negative_prompt": "", "mode": "perf"} -{"prompt": "raceway", "sample_id": "226", "sample_index": 226, "negative_prompt": "", "mode": "perf"} -{"prompt": "restaurant", "sample_id": "227", "sample_index": 227, "negative_prompt": "", "mode": "perf"} -{"prompt": "river", "sample_id": "228", "sample_index": 228, "negative_prompt": "", "mode": "perf"} -{"prompt": "science museum", "sample_id": "229", "sample_index": 229, "negative_prompt": "", "mode": "perf"} -{"prompt": "shower", "sample_id": "230", "sample_index": 230, "negative_prompt": "", "mode": "perf"} -{"prompt": "ski slope", "sample_id": "231", "sample_index": 231, "negative_prompt": "", "mode": "perf"} -{"prompt": "sky", "sample_id": "232", "sample_index": 232, "negative_prompt": "", "mode": "perf"} -{"prompt": "skyscraper", "sample_id": "233", "sample_index": 233, "negative_prompt": "", "mode": "perf"} -{"prompt": "baseball stadium", "sample_id": "234", "sample_index": 234, "negative_prompt": "", "mode": "perf"} -{"prompt": "staircase", "sample_id": "235", "sample_index": 235, "negative_prompt": "", "mode": "perf"} -{"prompt": "street", "sample_id": "236", "sample_index": 236, "negative_prompt": "", "mode": "perf"} -{"prompt": "supermarket", "sample_id": "237", "sample_index": 237, "negative_prompt": "", "mode": "perf"} -{"prompt": "indoor swimming pool", "sample_id": "238", "sample_index": 238, "negative_prompt": "", "mode": "perf"} -{"prompt": "tower", "sample_id": "239", "sample_index": 239, "negative_prompt": "", "mode": "perf"} -{"prompt": "outdoor track", "sample_id": "240", "sample_index": 240, "negative_prompt": "", "mode": "perf"} -{"prompt": "train railway", "sample_id": "241", "sample_index": 241, "negative_prompt": "", "mode": "perf"} -{"prompt": "train station platform", "sample_id": "242", "sample_index": 242, "negative_prompt": "", "mode": "perf"} -{"prompt": "underwater coral reef", "sample_id": "243", "sample_index": 243, "negative_prompt": "", "mode": "perf"} -{"prompt": "valley", "sample_id": "244", "sample_index": 244, "negative_prompt": "", "mode": "perf"} -{"prompt": "volcano", "sample_id": "245", "sample_index": 245, "negative_prompt": "", "mode": "perf"} -{"prompt": "waterfall", "sample_id": "246", "sample_index": 246, "negative_prompt": "", "mode": "perf"} -{"prompt": "windmill", "sample_id": "247", "sample_index": 247, "negative_prompt": "", "mode": "perf"} +{"prompt": "a person swimming in ocean", "sample_id": "0", "sample_index": 0, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a person giving a presentation to a room full of colleagues", "sample_id": "1", "sample_index": 1, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a person washing the dishes", "sample_id": "2", "sample_index": 2, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a person eating a burger", "sample_id": "3", "sample_index": 3, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a person walking in the snowstorm", "sample_id": "4", "sample_index": 4, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a person drinking coffee in a cafe", "sample_id": "5", "sample_index": 5, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a person playing guitar", "sample_id": "6", "sample_index": 6, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bicycle leaning against a tree", "sample_id": "7", "sample_index": 7, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bicycle gliding through a snowy field", "sample_id": "8", "sample_index": 8, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bicycle slowing down to stop", "sample_id": "9", "sample_index": 9, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bicycle accelerating to gain speed", "sample_id": "10", "sample_index": 10, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a car stuck in traffic during rush hour", "sample_id": "11", "sample_index": 11, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a car turning a corner", "sample_id": "12", "sample_index": 12, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a car slowing down to stop", "sample_id": "13", "sample_index": 13, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a car accelerating to gain speed", "sample_id": "14", "sample_index": 14, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a motorcycle cruising along a coastal highway", "sample_id": "15", "sample_index": 15, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a motorcycle turning a corner", "sample_id": "16", "sample_index": 16, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a motorcycle slowing down to stop", "sample_id": "17", "sample_index": 17, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a motorcycle gliding through a snowy field", "sample_id": "18", "sample_index": 18, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a motorcycle accelerating to gain speed", "sample_id": "19", "sample_index": 19, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "an airplane soaring through a clear blue sky", "sample_id": "20", "sample_index": 20, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "an airplane taking off", "sample_id": "21", "sample_index": 21, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "an airplane landing smoothly on a runway", "sample_id": "22", "sample_index": 22, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "an airplane accelerating to gain speed", "sample_id": "23", "sample_index": 23, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bus turning a corner", "sample_id": "24", "sample_index": 24, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bus stuck in traffic during rush hour", "sample_id": "25", "sample_index": 25, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bus accelerating to gain speed", "sample_id": "26", "sample_index": 26, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a train speeding down the tracks", "sample_id": "27", "sample_index": 27, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a train crossing over a tall bridge", "sample_id": "28", "sample_index": 28, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a train accelerating to gain speed", "sample_id": "29", "sample_index": 29, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a truck turning a corner", "sample_id": "30", "sample_index": 30, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a truck anchored in a tranquil bay", "sample_id": "31", "sample_index": 31, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a truck stuck in traffic during rush hour", "sample_id": "32", "sample_index": 32, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a truck slowing down to stop", "sample_id": "33", "sample_index": 33, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a truck accelerating to gain speed", "sample_id": "34", "sample_index": 34, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a boat sailing smoothly on a calm lake", "sample_id": "35", "sample_index": 35, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a boat slowing down to stop", "sample_id": "36", "sample_index": 36, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a boat accelerating to gain speed", "sample_id": "37", "sample_index": 37, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bird soaring gracefully in the sky", "sample_id": "38", "sample_index": 38, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bird building a nest from twigs and leaves", "sample_id": "39", "sample_index": 39, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bird flying over a snowy forest", "sample_id": "40", "sample_index": 40, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a cat grooming itself meticulously with its tongue", "sample_id": "41", "sample_index": 41, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a cat playing in park", "sample_id": "42", "sample_index": 42, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a cat drinking water", "sample_id": "43", "sample_index": 43, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a cat running happily", "sample_id": "44", "sample_index": 44, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a dog enjoying a peaceful walk", "sample_id": "45", "sample_index": 45, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a dog playing in park", "sample_id": "46", "sample_index": 46, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a dog drinking water", "sample_id": "47", "sample_index": 47, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a dog running happily", "sample_id": "48", "sample_index": 48, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a horse bending down to drink water from a river", "sample_id": "49", "sample_index": 49, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a horse galloping across an open field", "sample_id": "50", "sample_index": 50, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a horse taking a peaceful walk", "sample_id": "51", "sample_index": 51, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a horse running to join a herd of its kind", "sample_id": "52", "sample_index": 52, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a sheep bending down to drink water from a river", "sample_id": "53", "sample_index": 53, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a sheep taking a peaceful walk", "sample_id": "54", "sample_index": 54, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a sheep running to join a herd of its kind", "sample_id": "55", "sample_index": 55, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a cow bending down to drink water from a river", "sample_id": "56", "sample_index": 56, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a cow chewing cud while resting in a tranquil barn", "sample_id": "57", "sample_index": 57, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a cow running to join a herd of its kind", "sample_id": "58", "sample_index": 58, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "an elephant spraying itself with water using its trunk to cool down", "sample_id": "59", "sample_index": 59, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "an elephant taking a peaceful walk", "sample_id": "60", "sample_index": 60, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "an elephant running to join a herd of its kind", "sample_id": "61", "sample_index": 61, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bear catching a salmon in its powerful jaws", "sample_id": "62", "sample_index": 62, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bear sniffing the air for scents of food", "sample_id": "63", "sample_index": 63, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bear climbing a tree", "sample_id": "64", "sample_index": 64, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a bear hunting for prey", "sample_id": "65", "sample_index": 65, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a zebra bending down to drink water from a river", "sample_id": "66", "sample_index": 66, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a zebra running to join a herd of its kind", "sample_id": "67", "sample_index": 67, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a zebra taking a peaceful walk", "sample_id": "68", "sample_index": 68, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a giraffe bending down to drink water from a river", "sample_id": "69", "sample_index": 69, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a giraffe taking a peaceful walk", "sample_id": "70", "sample_index": 70, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a giraffe running to join a herd of its kind", "sample_id": "71", "sample_index": 71, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, Van Gogh style", "sample_id": "72", "sample_index": 72, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, oil painting", "sample_id": "73", "sample_index": 73, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand by Hokusai, in the style of Ukiyo", "sample_id": "74", "sample_index": 74, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, black and white", "sample_id": "75", "sample_index": 75, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, pixel art", "sample_id": "76", "sample_index": 76, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, in cyberpunk style", "sample_id": "77", "sample_index": 77, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, animated style", "sample_id": "78", "sample_index": 78, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, watercolor painting", "sample_id": "79", "sample_index": 79, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, surrealism style", "sample_id": "80", "sample_index": 80, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "The bund Shanghai, Van Gogh style", "sample_id": "81", "sample_index": 81, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "The bund Shanghai, oil painting", "sample_id": "82", "sample_index": 82, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "The bund Shanghai by Hokusai, in the style of Ukiyo", "sample_id": "83", "sample_index": 83, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "The bund Shanghai, black and white", "sample_id": "84", "sample_index": 84, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "The bund Shanghai, pixel art", "sample_id": "85", "sample_index": 85, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "The bund Shanghai, in cyberpunk style", "sample_id": "86", "sample_index": 86, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "The bund Shanghai, animated style", "sample_id": "87", "sample_index": 87, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "The bund Shanghai, watercolor painting", "sample_id": "88", "sample_index": 88, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "The bund Shanghai, surrealism style", "sample_id": "89", "sample_index": 89, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, Van Gogh style", "sample_id": "90", "sample_index": 90, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, oil painting", "sample_id": "91", "sample_index": 91, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean by Hokusai, in the style of Ukiyo", "sample_id": "92", "sample_index": 92, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, black and white", "sample_id": "93", "sample_index": 93, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, pixel art", "sample_id": "94", "sample_index": 94, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, in cyberpunk style", "sample_id": "95", "sample_index": 95, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, animated style", "sample_id": "96", "sample_index": 96, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, watercolor painting", "sample_id": "97", "sample_index": 97, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a shark is swimming in the ocean, surrealism style", "sample_id": "98", "sample_index": 98, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, Van Gogh style", "sample_id": "99", "sample_index": 99, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, oil painting", "sample_id": "100", "sample_index": 100, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris by Hokusai, in the style of Ukiyo", "sample_id": "101", "sample_index": 101, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, black and white", "sample_id": "102", "sample_index": 102, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, pixel art", "sample_id": "103", "sample_index": 103, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, in cyberpunk style", "sample_id": "104", "sample_index": 104, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, animated style", "sample_id": "105", "sample_index": 105, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, watercolor painting", "sample_id": "106", "sample_index": 106, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A panda drinking coffee in a cafe in Paris, surrealism style", "sample_id": "107", "sample_index": 107, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, Van Gogh style", "sample_id": "108", "sample_index": 108, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, oil painting", "sample_id": "109", "sample_index": 109, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset by Hokusai, in the style of Ukiyo", "sample_id": "110", "sample_index": 110, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, black and white", "sample_id": "111", "sample_index": 111, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, pixel art", "sample_id": "112", "sample_index": 112, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, in cyberpunk style", "sample_id": "113", "sample_index": 113, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, animated style", "sample_id": "114", "sample_index": 114, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, watercolor painting", "sample_id": "115", "sample_index": 115, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A cute happy Corgi playing in park, sunset, surrealism style", "sample_id": "116", "sample_index": 116, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, Van Gogh style", "sample_id": "117", "sample_index": 117, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, oil painting", "sample_id": "118", "sample_index": 118, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book by Hokusai, in the style of Ukiyo", "sample_id": "119", "sample_index": 119, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, black and white", "sample_id": "120", "sample_index": 120, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, pixel art", "sample_id": "121", "sample_index": 121, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, in cyberpunk style", "sample_id": "122", "sample_index": 122, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, animated style", "sample_id": "123", "sample_index": 123, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, watercolor painting", "sample_id": "124", "sample_index": 124, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Gwen Stacy reading a book, surrealism style", "sample_id": "125", "sample_index": 125, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, Van Gogh style", "sample_id": "126", "sample_index": 126, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, oil painting", "sample_id": "127", "sample_index": 127, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background by Hokusai, in the style of Ukiyo", "sample_id": "128", "sample_index": 128, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, black and white", "sample_id": "129", "sample_index": 129, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, pixel art", "sample_id": "130", "sample_index": 130, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, in cyberpunk style", "sample_id": "131", "sample_index": 131, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, animated style", "sample_id": "132", "sample_index": 132, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, watercolor painting", "sample_id": "133", "sample_index": 133, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, surrealism style", "sample_id": "134", "sample_index": 134, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, Van Gogh style", "sample_id": "135", "sample_index": 135, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, oil painting", "sample_id": "136", "sample_index": 136, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas by Hokusai, in the style of Ukiyo", "sample_id": "137", "sample_index": 137, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, black and white", "sample_id": "138", "sample_index": 138, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, pixel art", "sample_id": "139", "sample_index": 139, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, in cyberpunk style", "sample_id": "140", "sample_index": 140, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, animated style", "sample_id": "141", "sample_index": 141, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, watercolor painting", "sample_id": "142", "sample_index": 142, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, surrealism style", "sample_id": "143", "sample_index": 143, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "An astronaut flying in space, Van Gogh style", "sample_id": "144", "sample_index": 144, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "An astronaut flying in space, oil painting", "sample_id": "145", "sample_index": 145, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "An astronaut flying in space by Hokusai, in the style of Ukiyo", "sample_id": "146", "sample_index": 146, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "An astronaut flying in space, black and white", "sample_id": "147", "sample_index": 147, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "An astronaut flying in space, pixel art", "sample_id": "148", "sample_index": 148, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "An astronaut flying in space, in cyberpunk style", "sample_id": "149", "sample_index": 149, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "An astronaut flying in space, animated style", "sample_id": "150", "sample_index": 150, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "An astronaut flying in space, watercolor painting", "sample_id": "151", "sample_index": 151, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "An astronaut flying in space, surrealism style", "sample_id": "152", "sample_index": 152, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, Van Gogh style", "sample_id": "153", "sample_index": 153, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, oil painting", "sample_id": "154", "sample_index": 154, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks by Hokusai, in the style of Ukiyo", "sample_id": "155", "sample_index": 155, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, black and white", "sample_id": "156", "sample_index": 156, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, pixel art", "sample_id": "157", "sample_index": 157, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, in cyberpunk style", "sample_id": "158", "sample_index": 158, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, animated style", "sample_id": "159", "sample_index": 159, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, watercolor painting", "sample_id": "160", "sample_index": 160, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, surrealism style", "sample_id": "161", "sample_index": 161, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "alley", "sample_id": "162", "sample_index": 162, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "amusement park", "sample_id": "163", "sample_index": 163, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "aquarium", "sample_id": "164", "sample_index": 164, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "arch", "sample_id": "165", "sample_index": 165, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "art gallery", "sample_id": "166", "sample_index": 166, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "bathroom", "sample_id": "167", "sample_index": 167, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "bakery shop", "sample_id": "168", "sample_index": 168, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "ballroom", "sample_id": "169", "sample_index": 169, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "bar", "sample_id": "170", "sample_index": 170, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "barn", "sample_id": "171", "sample_index": 171, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "basement", "sample_id": "172", "sample_index": 172, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "beach", "sample_id": "173", "sample_index": 173, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "bedroom", "sample_id": "174", "sample_index": 174, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "bridge", "sample_id": "175", "sample_index": 175, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "botanical garden", "sample_id": "176", "sample_index": 176, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "cafeteria", "sample_id": "177", "sample_index": 177, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "campsite", "sample_id": "178", "sample_index": 178, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "campus", "sample_id": "179", "sample_index": 179, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "carrousel", "sample_id": "180", "sample_index": 180, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "castle", "sample_id": "181", "sample_index": 181, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "cemetery", "sample_id": "182", "sample_index": 182, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "classroom", "sample_id": "183", "sample_index": 183, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "cliff", "sample_id": "184", "sample_index": 184, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "crosswalk", "sample_id": "185", "sample_index": 185, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "construction site", "sample_id": "186", "sample_index": 186, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "corridor", "sample_id": "187", "sample_index": 187, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "courtyard", "sample_id": "188", "sample_index": 188, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "desert", "sample_id": "189", "sample_index": 189, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "downtown", "sample_id": "190", "sample_index": 190, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "driveway", "sample_id": "191", "sample_index": 191, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "farm", "sample_id": "192", "sample_index": 192, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "food court", "sample_id": "193", "sample_index": 193, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "football field", "sample_id": "194", "sample_index": 194, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "forest road", "sample_id": "195", "sample_index": 195, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "fountain", "sample_id": "196", "sample_index": 196, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "gas station", "sample_id": "197", "sample_index": 197, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "glacier", "sample_id": "198", "sample_index": 198, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "golf course", "sample_id": "199", "sample_index": 199, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "indoor gymnasium", "sample_id": "200", "sample_index": 200, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "harbor", "sample_id": "201", "sample_index": 201, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "highway", "sample_id": "202", "sample_index": 202, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "hospital", "sample_id": "203", "sample_index": 203, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "house", "sample_id": "204", "sample_index": 204, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "iceberg", "sample_id": "205", "sample_index": 205, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "industrial area", "sample_id": "206", "sample_index": 206, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "jail cell", "sample_id": "207", "sample_index": 207, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "junkyard", "sample_id": "208", "sample_index": 208, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "kitchen", "sample_id": "209", "sample_index": 209, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "indoor library", "sample_id": "210", "sample_index": 210, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "lighthouse", "sample_id": "211", "sample_index": 211, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "laboratory", "sample_id": "212", "sample_index": 212, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "mansion", "sample_id": "213", "sample_index": 213, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "marsh", "sample_id": "214", "sample_index": 214, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "mountain", "sample_id": "215", "sample_index": 215, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "indoor movie theater", "sample_id": "216", "sample_index": 216, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "indoor museum", "sample_id": "217", "sample_index": 217, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "music studio", "sample_id": "218", "sample_index": 218, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "nursery", "sample_id": "219", "sample_index": 219, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "ocean", "sample_id": "220", "sample_index": 220, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "office", "sample_id": "221", "sample_index": 221, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "palace", "sample_id": "222", "sample_index": 222, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "parking lot", "sample_id": "223", "sample_index": 223, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "pharmacy", "sample_id": "224", "sample_index": 224, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "phone booth", "sample_id": "225", "sample_index": 225, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "raceway", "sample_id": "226", "sample_index": 226, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "restaurant", "sample_id": "227", "sample_index": 227, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "river", "sample_id": "228", "sample_index": 228, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "science museum", "sample_id": "229", "sample_index": 229, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "shower", "sample_id": "230", "sample_index": 230, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "ski slope", "sample_id": "231", "sample_index": 231, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "sky", "sample_id": "232", "sample_index": 232, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "skyscraper", "sample_id": "233", "sample_index": 233, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "baseball stadium", "sample_id": "234", "sample_index": 234, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "staircase", "sample_id": "235", "sample_index": 235, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "street", "sample_id": "236", "sample_index": 236, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "supermarket", "sample_id": "237", "sample_index": 237, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "indoor swimming pool", "sample_id": "238", "sample_index": 238, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "tower", "sample_id": "239", "sample_index": 239, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "outdoor track", "sample_id": "240", "sample_index": 240, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "train railway", "sample_id": "241", "sample_index": 241, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "train station platform", "sample_id": "242", "sample_index": 242, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "underwater coral reef", "sample_id": "243", "sample_index": 243, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "valley", "sample_id": "244", "sample_index": 244, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "volcano", "sample_id": "245", "sample_index": 245, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "waterfall", "sample_id": "246", "sample_index": 246, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "windmill", "sample_id": "247", "sample_index": 247, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} diff --git a/src/inference_endpoint/dataset_manager/__init__.py b/src/inference_endpoint/dataset_manager/__init__.py index dd15f3ce..4bb6c575 100644 --- a/src/inference_endpoint/dataset_manager/__init__.py +++ b/src/inference_endpoint/dataset_manager/__init__.py @@ -19,9 +19,6 @@ This module handles dataset loading, preprocessing, and management. """ -# Import workload-specific datasets so they register in Dataset.PREDEFINED -from inference_endpoint.videogen.dataset import VideoGenDataset # noqa: E402 - from .dataset import Dataset, EmptyDataset from .factory import DataLoaderFactory from .predefined.aime25 import AIME25 @@ -61,5 +58,4 @@ "CNNDailyMail", "RandomDataset", "ShopifyProductCatalogue", - "VideoGenDataset", ] diff --git a/src/inference_endpoint/videogen/dataset.py b/src/inference_endpoint/videogen/dataset.py deleted file mode 100644 index 5b0c64b2..00000000 --- a/src/inference_endpoint/videogen/dataset.py +++ /dev/null @@ -1,125 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""WAN2.2 prompt dataset for MLPerf inference benchmarking.""" - -from pathlib import Path -from typing import Any - -import pandas as pd - -from inference_endpoint.dataset_manager.dataset import Dataset - -# MLPerf canonical negative prompt for WAN2.2-T2V-A14B. -# Injected into every sample's query.data so the server receives the exact -# string MLPerf expects, rather than relying on the server's internal default. -_MLPERF_NEGATIVE_PROMPT = ( - "vivid colors, overexposed, static, blurry details, subtitles, style, " - "work of art, painting, picture, still, overall grayish, worst quality, " - "low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, " - "poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, " - "static image, cluttered background, three legs, many people in the background, " - "walking backwards" -) - - -class VideoGenDataset(Dataset, dataset_id="wan22_mlperf"): - """Dataset that loads MLPerf WAN2.2 prompt text files. - - Each non-blank line in the file is one prompt. - - By default, the MLPerf canonical negative prompt is injected into every sample. - Pass ``negative_prompt=None`` to omit the field and let the server apply its - own default. Pass ``latent_path=`` to use a fixed pre-computed latent - tensor for reproducibility. - """ - - COLUMN_NAMES = ["prompt"] - - @classmethod - def get_dataloader( # type: ignore[override] - cls, - path: Path | str | None = None, - negative_prompt: str | None = _MLPERF_NEGATIVE_PROMPT, - latent_path: Path | str | None = None, - **kwargs: Any, - ) -> "VideoGenDataset": - """Create a VideoGenDataset from a prompts file path. - - Called by DataLoaderFactory when ``--dataset `` is used with - ``name=wan22_mlperf``. The ``path`` argument maps directly to - ``prompts_path``. - """ - if path is None: - raise ValueError( - "VideoGenDataset requires a prompts file path. " - "Pass --dataset or set path= in the dataset config." - ) - return cls( - prompts_path=path, - negative_prompt=negative_prompt, - latent_path=latent_path, - ) - - def __init__( - self, - prompts_path: Path | str, - negative_prompt: str | None = _MLPERF_NEGATIVE_PROMPT, - latent_path: Path | str | None = None, - ) -> None: - prompts = [ - line.strip() - for line in Path(prompts_path).read_text().splitlines() - if line.strip() - ] - super().__init__(dataframe=pd.DataFrame({"prompt": prompts})) - self.negative_prompt = negative_prompt - self.latent_path = str(latent_path) if latent_path is not None else None - - def load(self, **kwargs: Any) -> None: # type: ignore[override] - """Build self.data from the loaded dataframe. No transforms needed. - - Optional fields (``negative_prompt``, ``latent_path``) are omitted from - each sample dict when their dataset-level value is ``None``, so the - adapter's ``exclude_none=True`` serialisation falls back to server-side - defaults. - """ - assert self.dataframe is not None - self.data = [ - { - "prompt": row["prompt"], - **( - {"negative_prompt": self.negative_prompt} - if self.negative_prompt is not None - else {} - ), - **( - {"latent_path": self.latent_path} - if self.latent_path is not None - else {} - ), - "sample_id": str(i), - "sample_index": i, - } - for i, row in self.dataframe.iterrows() - ] - - def load_sample(self, index: int) -> dict[str, Any]: - assert self.data is not None, "Dataset not loaded. Call load() first." - return dict(self.data[index % len(self.data)]) - - def num_samples(self) -> int: - assert self.data is not None, "Dataset not loaded. Call load() first." - return len(self.data) diff --git a/src/inference_endpoint/videogen/types.py b/src/inference_endpoint/videogen/types.py index 6d33b225..64443c14 100644 --- a/src/inference_endpoint/videogen/types.py +++ b/src/inference_endpoint/videogen/types.py @@ -37,7 +37,8 @@ class VideoPathRequest(BaseModel): description=( "Text describing what to avoid. None means the field is omitted " "from the JSON payload so trtllm-serve can apply its model default. " - "VideoGenDataset injects the MLPerf canonical negative prompt by default." + "The bundled MLPerf prompts dataset carries the canonical negative " + "prompt per row." ), ) size: str = Field(default="720x1280", description="Frame size in 'WxH' format.") diff --git a/tests/unit/videogen/test_dataset.py b/tests/unit/videogen/test_dataset.py deleted file mode 100644 index d39e59d4..00000000 --- a/tests/unit/videogen/test_dataset.py +++ /dev/null @@ -1,114 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Unit tests for VideoGenDataset.""" - -from pathlib import Path - -import pytest -from inference_endpoint.dataset_manager.dataset import Dataset -from inference_endpoint.videogen.dataset import _MLPERF_NEGATIVE_PROMPT, VideoGenDataset - - -@pytest.mark.unit -class TestVideoGenDataset: - @pytest.fixture - def prompts_file(self, tmp_path: Path) -> Path: - p = tmp_path / "prompts.txt" - p.write_text( - "a golden retriever running in a field\n" - "a red sports car on a mountain road\n" - "\n" - "cats playing in the snow\n" - ) - return p - - def test_loads_prompts_skipping_blank_lines(self, prompts_file: Path): - ds = VideoGenDataset(prompts_path=prompts_file) - ds.load() - assert ds.num_samples() == 3 - - def test_load_sample_default_includes_mlperf_negative_prompt( - self, prompts_file: Path - ): - ds = VideoGenDataset(prompts_path=prompts_file) - ds.load() - sample = ds.load_sample(0) - assert set(sample.keys()) == { - "prompt", - "negative_prompt", - "sample_id", - "sample_index", - } - assert sample["negative_prompt"] == _MLPERF_NEGATIVE_PROMPT - - def test_load_sample_correct_values(self, prompts_file: Path): - ds = VideoGenDataset(prompts_path=prompts_file) - ds.load() - sample = ds.load_sample(1) - assert sample["prompt"] == "a red sports car on a mountain road" - assert sample["sample_index"] == 1 - assert sample["sample_id"] == "1" - assert sample["negative_prompt"] == _MLPERF_NEGATIVE_PROMPT - - def test_negative_prompt_override(self, prompts_file: Path): - ds = VideoGenDataset(prompts_path=prompts_file, negative_prompt="blurry") - ds.load() - assert ds.load_sample(0)["negative_prompt"] == "blurry" - - def test_negative_prompt_none_omits_field(self, prompts_file: Path): - ds = VideoGenDataset(prompts_path=prompts_file, negative_prompt=None) - ds.load() - assert "negative_prompt" not in ds.load_sample(0) - - def test_latent_path_propagated(self, prompts_file: Path, tmp_path: Path): - latent = tmp_path / "fixed_latent.pt" - ds = VideoGenDataset(prompts_path=prompts_file, latent_path=latent) - ds.load() - assert ds.load_sample(0)["latent_path"] == str(latent) - - def test_latent_path_default_omitted(self, prompts_file: Path): - ds = VideoGenDataset(prompts_path=prompts_file) - ds.load() - assert "latent_path" not in ds.load_sample(0) - - def test_index_wrapping(self, prompts_file: Path): - ds = VideoGenDataset(prompts_path=prompts_file) - ds.load() - assert ds.load_sample(3)["prompt"] == ds.load_sample(0)["prompt"] - assert ds.load_sample(7)["prompt"] == ds.load_sample(1)["prompt"] - - def test_load_before_load_raises_assertion(self, prompts_file: Path): - ds = VideoGenDataset(prompts_path=prompts_file) - with pytest.raises(AssertionError): - ds.num_samples() - - def test_registered_as_predefined_dataset(self): - assert "wan22_mlperf" in Dataset.PREDEFINED - - def test_get_dataloader_from_path(self, prompts_file: Path): - ds = VideoGenDataset.get_dataloader(path=prompts_file) - ds.load() - assert ds.num_samples() == 3 - assert ds.load_sample(0)["prompt"] == "a golden retriever running in a field" - - def test_get_dataloader_passes_negative_prompt(self, prompts_file: Path): - ds = VideoGenDataset.get_dataloader(path=prompts_file, negative_prompt="blurry") - ds.load() - assert ds.load_sample(0)["negative_prompt"] == "blurry" - - def test_get_dataloader_requires_path(self): - with pytest.raises((TypeError, ValueError)): - VideoGenDataset.get_dataloader() diff --git a/tests/unit/videogen/test_factory.py b/tests/unit/videogen/test_factory.py deleted file mode 100644 index f30511f1..00000000 --- a/tests/unit/videogen/test_factory.py +++ /dev/null @@ -1,52 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Unit tests: DataLoaderFactory creates VideoGenDataset from --dataset path.""" - -from pathlib import Path - -import pytest -from inference_endpoint.config.schema import Dataset as DatasetConfig -from inference_endpoint.dataset_manager.factory import DataLoaderFactory -from inference_endpoint.videogen.dataset import VideoGenDataset - - -@pytest.fixture -def prompts_file(tmp_path: Path) -> Path: - p = tmp_path / "prompts.txt" - p.write_text("a golden retriever running in a field\n" "ocean waves at sunset\n") - return p - - -@pytest.mark.unit -class TestFactoryVideoGenDataset: - def test_factory_creates_wan22_dataset_from_name_and_path(self, prompts_file: Path): - config = DatasetConfig(name="wan22_mlperf", path=str(prompts_file)) - ds = DataLoaderFactory.create_loader(config) - ds.load() - assert isinstance(ds, VideoGenDataset) - assert ds.num_samples() == 2 - - def test_factory_wan22_sample_has_prompt(self, prompts_file: Path): - config = DatasetConfig(name="wan22_mlperf", path=str(prompts_file)) - ds = DataLoaderFactory.create_loader(config) - ds.load() - sample = ds.load_sample(0) - assert sample["prompt"] == "a golden retriever running in a field" - - def test_factory_wan22_requires_path(self): - config = DatasetConfig(name="wan22_mlperf") - with pytest.raises((TypeError, ValueError)): - DataLoaderFactory.create_loader(config) From 837397dab55469efeadd56ca32ccfde553b3a7a0 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Fri, 1 May 2026 13:56:42 -0700 Subject: [PATCH 14/22] fix(wan22): remove invalid metrics block from offline_wan22.yaml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `metrics:` top-level block was rejected by `BenchmarkConfig` (extra="forbid", no `metrics` field in the schema), so loading the YAML via `BenchmarkConfig.from_yaml_file()` failed validation. The block had no effect on metrics collection — that's controlled by `settings.runtime` and the metrics aggregator service. Caught by an end-to-end functional smoke test that loads the YAML, runs encode → POST → decode against an inline mock trtllm-serve in both perf (video_path) and accuracy (video_bytes) modes, and bulk- encodes all 248 samples. --- examples/09_Wan22_VideoGen_Example/offline_wan22.yaml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml b/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml index c2c46b6b..35ecb153 100644 --- a/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml +++ b/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml @@ -44,11 +44,6 @@ settings: client: num_workers: 4 -metrics: - collect: - - "throughput" - - "latency" - endpoint_config: endpoints: - "http://localhost:8000" From 763f65ab01c2730e816d3185fd78883efa83fc80 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Fri, 1 May 2026 15:43:35 -0700 Subject: [PATCH 15/22] =?UTF-8?q?refactor(videogen):=20review=20polish=20?= =?UTF-8?q?=E2=80=94=20revert=20latent=20factory=20regression,=20simplify?= =?UTF-8?q?=20adapter,=20broaden=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Five small fixes from a pre-review pass: - factory.py: drop `path=dataset_path` kwarg on the predefined-dataset branch. It was added in 9ded0e6 to feed VideoGenDataset (since deleted in 6ce6bfa); none of the remaining predefined datasets' generate() signatures accept `path`, so any user passing both `name=` and `path=` would TypeError. Restores the pre-9ded0e6 behavior. Verified the videogen example still loads end-to-end (it routes through Dataset.load_from_file, not the predefined branch). - adapter.py encode_query: replace the 12-line data.get() boilerplate with `VideoPathRequest.model_validate({k: data[k] for k in known if k in data})`. Pydantic applies defaults, eliminating the drift risk between adapter.py and types.py. Extra keys in query.data (sample_id, sample_index, mode, ...) are now ignored cleanly. - integration mock: MockTrtllmServe._handle_sync now honors body["response_format"] and routes to a VideoPathResponse when the request asks for video_path. Previously the mock always returned video_bytes regardless of the request, so the integration tests never exercised the perf-mode decode branch end-to-end. - integration tests: add test_perf_mode_round_trip_returns_video_path asserting result.metadata == {video_path: ...} via real HTTP. Rename the renamed counterpart to test_accuracy_mode_round_trip_returns_video_bytes. Replace the misleadingly named test_missing_video_bytes_field_raises_validation_error with two targeted tests, one per decode dispatch branch. - endpoints_changed.md: drop two stale references — `HealthResponse` (never existed in types.py) and `APIType.WAN22` (the actual enum is APIType.VIDEOGEN). Trim the doc from 155 → 84 lines (~46% reduction) by collapsing the architecture diagram and removing repetition; factual content is unchanged. Verified on aarch64 GB200: - pre-commit run --all-files: all hooks pass - 43 videogen tests pass (one new perf-mode round-trip test added) - end-to-end smoke (load YAML → factory → JsonlLoader → adapter → mock server) passes both perf and accuracy modes; encode_query ignores extra keys cleanly --- endpoints_changed.md | 177 +++++------------- .../dataset_manager/factory.py | 1 - src/inference_endpoint/videogen/adapter.py | 19 +- tests/integration/videogen/conftest.py | 14 +- tests/integration/videogen/test_adapter.py | 43 ++++- 5 files changed, 92 insertions(+), 162 deletions(-) diff --git a/endpoints_changed.md b/endpoints_changed.md index 122cc52e..dc5ec0ae 100644 --- a/endpoints_changed.md +++ b/endpoints_changed.md @@ -1,175 +1,84 @@ # WAN 2.2 Endpoint Client — Design Summary -This document describes the changes made to the `inference-endpoint` library to support the MLPerf WAN 2.2 text-to-video benchmark workload. - ---- +Client-side changes that add an `inference-endpoint` adapter for the MLPerf WAN 2.2 text-to-video benchmark. ## Overview -WAN 2.2 (T2V-A14B) generates 720×1280 portrait videos at 81 frames / 5 s using 20 denoising steps. The inference server is **trtllm-serve**, which exposes a video generation endpoint at `POST /v1/videos/generations`. - -The client-side changes add a new `videogen` module that plugs into the existing `HTTPEndpointClient` pipeline without touching any hot-path code. - ---- - -## Architecture +WAN 2.2 (T2V-A14B) generates 720×1280 portrait videos at 81 frames / 5 s using 20 denoising steps. The inference server is **trtllm-serve**, exposing `POST /v1/videos/generations`. The new `videogen` module plugs into the existing `HTTPEndpointClient` pipeline via the `api_type` config field — no hot-path code is touched. ``` -MLPerf Harness / Benchmark CLI - │ - │ YAML config (api_type: videogen) - ▼ - HTTPEndpointClient - │ - │ selects adapter via APIType.WAN22 - ▼ - VideoGenAdapter ──────────────────────────────────────────────┐ - │ encode_query() │ - │ VideoPathRequest JSON │ - ▼ │ - HTTP Worker (ZMQ) │ - │ │ - │ POST /v1/videos/generations │ - ▼ │ - trtllm-serve │ - │ perf mode: saves video to Lustre, returns path │ - │ accuracy mode: returns base64 video bytes inline │ - ▼ │ - VideoGenAdapter ◄──────────────────────────────────────────────┘ - │ decode_response() (dispatches on response shape) - │ QueryResult(metadata={video_path | video_bytes: ...}) - ▼ - MetricsReporter / MLPerf harness +YAML ──► HTTPEndpointClient ──► VideoGenAdapter ──► HTTP Worker (ZMQ) + │ │ + │ POST /v1/videos/generations + ▼ ▼ + QueryResult trtllm-serve + (metadata holds (perf: saves to Lustre, returns path + video_path or accuracy: returns base64 bytes inline) + video_bytes) ``` -**Key design decision:** the adapter supports two `response_format` values selected per-request via `query.data["response_format"]`: - -- **`video_path` (default, perf mode)** — server writes the encoded video to Lustre and returns only the file path. Avoids 3–5 MB payloads over HTTP + ZMQ per request. -- **`video_bytes` (accuracy mode)** — server returns the base64-encoded H.264/MJPEG payload inline so the accuracy evaluator can score the video content directly. - -`VideoGenAdapter.decode_response` dispatches on the response shape: if `video_bytes` is present the body is parsed as `VideoPayloadResponse`; otherwise it is parsed as `VideoPathResponse`. - ---- - -## New Files +## `videogen/` module layout ``` videogen/ ├── __init__.py Public exports -├── types.py Pydantic wire models: VideoPathRequest, -│ VideoPathResponse, VideoPayloadResponse, HealthResponse -└── adapter.py VideoGenAdapter (HttpRequestAdapter) + VideoGenAccumulator (no-op SSE) +├── types.py Pydantic wire models (VideoPathRequest, VideoPathResponse, VideoPayloadResponse) +└── adapter.py VideoGenAdapter + VideoGenAccumulator (no-op SSE) ``` -The MLPerf prompts dataset is shipped as plain JSONL at -`examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl` (248 rows, each row -carries `prompt`, `negative_prompt` (MLPerf canonical), `sample_id`, -`sample_index`). The generic `JsonlLoader` ingests it directly — no -workload-specific dataset class is needed. +The MLPerf prompts dataset ships as plain JSONL at `examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl` (248 rows; each row carries `prompt`, `negative_prompt` (MLPerf canonical), `sample_id`, `sample_index`). The generic `JsonlLoader` ingests it directly — no workload-specific dataset class is needed. ---- +## Two response formats -## Components +The adapter supports both server response formats, selected per-request via `query.data["response_format"]`: -### `types.py` — Wire Models +- **`video_path`** (default, perf mode) — server saves the encoded video to Lustre and returns only the path. Avoids 3–5 MB payloads over HTTP + ZMQ per request. +- **`video_bytes`** (accuracy mode) — server returns the base64-encoded H.264/MJPEG payload inline so the accuracy evaluator can score directly. -`VideoPathRequest` mirrors trtllm-serve's `VideoGenerationRequest`. All fields carry MLPerf defaults so only `prompt` is required from the dataset. - -| Field | MLPerf value | Notes | -| --------------------- | -------------- | ---------------------------------------------------------------------- | -| `prompt` | from dataset | Required | -| `negative_prompt` | `None` | Omitted from JSON when absent; server uses its own default | -| `size` | `"720x1280"` | Portrait orientation | -| `seconds` | `5.0` | 81 frames ÷ ~16.2 fps | -| `fps` | `16` | | -| `num_inference_steps` | `20` | | -| `guidance_scale` | `4.0` | Primary CFG scale | -| `guidance_scale_2` | `3.0` | Null-text secondary CFG (two-stage denoising) | -| `seed` | `42` | Fixed for reproducibility | -| `latent_path` | `None` | Optional path to a fixed latent tensor on shared storage | -| `output_format` | `"auto"` | H.264 if ffmpeg available, MJPEG otherwise | -| `response_format` | `"video_path"` | Default = perf mode (Lustre path); set to `"video_bytes"` for accuracy | +`decode_response` dispatches on the response body shape: `video_bytes` key present → `VideoPayloadResponse`; otherwise → `VideoPathResponse`. To run accuracy mode, set `response_format: video_bytes` in the per-row dataset data so it is injected into every `query.data`. -Two response models cover the two `response_format` values: +## Wire model defaults (`types.py`) -- `VideoPathResponse` — `video_id`, `video_path` (perf mode). -- `VideoPayloadResponse` — `video_id`, `video_bytes` (accuracy mode; base64-encoded). - -Serialization uses `model_dump_json(exclude_none=True)` so `None` fields are omitted from the request body. +`VideoPathRequest` mirrors trtllm-serve's `VideoGenerationRequest`. All fields carry MLPerf defaults so only `prompt` is required from the dataset. -### `adapter.py` — Request/Response Adapter +| Field | MLPerf default | Notes | +| --------------------- | -------------- | ----------------------------------------------------------------------- | +| `prompt` | from dataset | Required | +| `negative_prompt` | `None` | Omitted from JSON when `None`; bundled JSONL carries the canonical text | +| `size` | `"720x1280"` | Portrait | +| `seconds` | `5.0` | 81 frames ÷ ~16.2 fps | +| `fps` | `16` | | +| `num_inference_steps` | `20` | | +| `guidance_scale` | `4.0` | Primary CFG | +| `guidance_scale_2` | `3.0` | Null-text secondary CFG (two-stage denoising) | +| `seed` | `42` | Fixed for reproducibility | +| `latent_path` | `None` | Optional path to a fixed latent tensor on shared storage | +| `output_format` | `"auto"` | H.264 if ffmpeg available, MJPEG otherwise | +| `response_format` | `"video_path"` | See "Two response formats" above | + +Serialization uses `model_dump_json(exclude_none=True)` so `None` fields fall back to server-side defaults. + +## Adapter contract (`adapter.py`) `VideoGenAdapter` implements `HttpRequestAdapter`: ``` encode_query(query) → VideoPathRequest JSON bytes - (response_format defaults to "video_path"; - override via query.data["response_format"]) -decode_response(bytes, id) → QueryResult with metadata={video_path: ...} - or metadata={video_bytes: ...} depending on - the response shape +decode_response(bytes, id) → QueryResult with metadata={video_path: ...} or {video_bytes: ...} decode_sse_message(bytes) → NotImplementedError (WAN 2.2 is non-streaming) dataset_transforms(params) → [] (no token-level transforms needed) ``` -`VideoGenAccumulator` is a no-op `SSEAccumulatorProtocol` implementation required by `HTTPClientConfig`. WAN 2.2 uses synchronous HTTP POST/response — there is no SSE stream to accumulate. - -`APIType.WAN22` is registered in `core/types.py` with `default_route() = "/v1/videos/generations"`. - -### Dataset ingest — generic `JsonlLoader` - -The bundled `examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl` (248 rows) is consumed by the generic JSONL loader registered in `dataset_manager`. Each row carries everything the adapter needs: +`VideoGenAccumulator` is a no-op `SSEAccumulatorProtocol` to satisfy `HTTPClientConfig`'s type contract. `APIType.VIDEOGEN` is registered in `core/types.py` with `default_route() = "/v1/videos/generations"`. -- `prompt` — the MLPerf prompt string -- `negative_prompt` — the MLPerf canonical negative prompt, baked into every row -- `sample_id`, `sample_index` — used by the load generator for tracking - -`latent_path` is optional and not present in the bundled dataset. To inject a fixed latent into every request, add it via `AddStaticColumns` (in `dataset_manager.transforms`) or extend the JSONL. - -``` -wan22_prompts.jsonl ──► JsonlLoader ──► Dataset.load() ──► sample dict - ├── prompt - └── negative_prompt - │ - ▼ - VideoGenAdapter.encode_query() - │ - ▼ - VideoPathRequest JSON - (response_format=video_path by default) -``` - ---- - -## Integration Point - -The videogen module plugs into the existing pipeline at the `api_type` config field. No hot-path code was modified. - -```yaml -# offline_wan22.yaml -endpoint_config: - api_type: videogen # → selects VideoGenAdapter - endpoints: - - http://localhost:8000 -``` - -`HTTPEndpointClient` resolves `api_type: videogen` → `VideoGenAdapter` + `VideoGenAccumulator` via the existing adapter registry. - -To run accuracy mode (server returns video bytes inline), set `response_format: video_bytes` in the dataset config so it is injected into every `query.data`. - ---- - -## What Is NOT In This Module +## Out of scope | Concern | Where it lives | | ---------------------------------------- | ------------------------------------------------------ | | trtllm-serve startup / model loading | trtllm-serve (separate process) | | Fixed latent loading (`fixed_latent.pt`) | trtllm-serve, optionally per-request via `latent_path` | | Video storage path on Lustre | trtllm-serve config | -| `guidance_scale_2` wiring on server side | Pending — see "Pending" below | - ---- ## Pending -- **`guidance_scale_2` server-side wiring** — the client already serializes `guidance_scale_2` (MLPerf default 3.0); trtllm-serve currently ignores the field and uses a single CFG scale. Tracking on the server side. +- **`guidance_scale_2` server-side wiring** — the client serializes the field (MLPerf default 3.0); trtllm-serve currently ignores it and uses a single CFG scale. diff --git a/src/inference_endpoint/dataset_manager/factory.py b/src/inference_endpoint/dataset_manager/factory.py index 291b8c3a..6ed1674a 100644 --- a/src/inference_endpoint/dataset_manager/factory.py +++ b/src/inference_endpoint/dataset_manager/factory.py @@ -83,7 +83,6 @@ def create_loader(config: DatasetConfig, num_repeats: int = 1, **kwargs) -> Data return ds_cls.get_dataloader( transforms=preset_transforms, num_repeats=num_repeats, - path=dataset_path, **kwargs, ) diff --git a/src/inference_endpoint/videogen/adapter.py b/src/inference_endpoint/videogen/adapter.py index 954434a0..8af26812 100644 --- a/src/inference_endpoint/videogen/adapter.py +++ b/src/inference_endpoint/videogen/adapter.py @@ -53,29 +53,18 @@ def encode_query(cls, query: Query) -> bytes: """Serialise query.data to VideoPathRequest JSON bytes. Only `prompt` is required. All other fields fall back to MLPerf defaults - defined in VideoPathRequest but can be overridden via query.data. + declared on VideoPathRequest but can be overridden via query.data. Pass response_format="video_bytes" in query.data to request inline video bytes (accuracy mode) instead of the default Lustre path (perf mode). + Extra keys in query.data (e.g. sample_id, sample_index) are ignored. """ data = query.data if "prompt" not in data: raise KeyError( f"'prompt' not found in query.data keys: {list(data.keys())}" ) - req = VideoPathRequest( - prompt=data["prompt"], - negative_prompt=data.get("negative_prompt"), - size=data.get("size", "720x1280"), - seconds=data.get("seconds", 5.0), - fps=data.get("fps", 16), - num_inference_steps=data.get("num_inference_steps", 20), - guidance_scale=data.get("guidance_scale", 4.0), - guidance_scale_2=data.get("guidance_scale_2", 3.0), - seed=data.get("seed", 42), - latent_path=data.get("latent_path"), - output_format=data.get("output_format", "auto"), - response_format=data.get("response_format", "video_path"), - ) + known = VideoPathRequest.model_fields.keys() + req = VideoPathRequest.model_validate({k: data[k] for k in known if k in data}) # exclude_none so optional fields fall back to server-side defaults # (MLPerf: omit negative_prompt and latent_path unless explicitly set). return req.model_dump_json(exclude_none=True).encode() diff --git a/tests/integration/videogen/conftest.py b/tests/integration/videogen/conftest.py index 24868d0e..ab88a3fb 100644 --- a/tests/integration/videogen/conftest.py +++ b/tests/integration/videogen/conftest.py @@ -83,12 +83,14 @@ async def _shutdown(self) -> None: async def _handle_sync(self, request: web.Request) -> web.Response: body = await request.json() video_id = f"mock_video_{hash(body.get('prompt', '')) & 0xFFFF:04x}" - return web.json_response( - { - "video_id": video_id, - "video_bytes": base64.b64encode(DUMMY_VIDEO_BYTES).decode(), - } - ) + if body.get("response_format") == "video_bytes": + return web.json_response( + { + "video_id": video_id, + "video_bytes": base64.b64encode(DUMMY_VIDEO_BYTES).decode(), + } + ) + return web.json_response({"video_id": video_id, "video_path": DUMMY_VIDEO_PATH}) @pytest.fixture(scope="module") diff --git a/tests/integration/videogen/test_adapter.py b/tests/integration/videogen/test_adapter.py index 4b8ac95c..57e359f8 100644 --- a/tests/integration/videogen/test_adapter.py +++ b/tests/integration/videogen/test_adapter.py @@ -25,7 +25,12 @@ from inference_endpoint.videogen.adapter import VideoGenAdapter from pydantic import ValidationError -from .conftest import DUMMY_VIDEO_BYTES, MockTrtllmServe, MockTrtllmServeError +from .conftest import ( + DUMMY_VIDEO_BYTES, + DUMMY_VIDEO_PATH, + MockTrtllmServe, + MockTrtllmServeError, +) def _post(url: str, body: bytes) -> tuple[int, bytes]: @@ -47,9 +52,10 @@ def _post(url: str, body: bytes) -> tuple[int, bytes]: class TestVideoGenAdapterRoundTrip: """Verify encode_query → HTTP POST → decode_response against mock trtllm-serve.""" - def test_successful_generation_returns_video_bytes( + def test_perf_mode_round_trip_returns_video_path( self, mock_trtllm_serve: MockTrtllmServe ) -> None: + """Default response_format=video_path → server returns Lustre path.""" query = Query(id="q1", data={"prompt": "a golden retriever running on a beach"}) request_bytes = VideoGenAdapter.encode_query(query) @@ -61,6 +67,29 @@ def test_successful_generation_returns_video_bytes( result = VideoGenAdapter.decode_response(content, query.id) assert result.id == "q1" assert result.error is None + assert result.metadata == {"video_path": DUMMY_VIDEO_PATH} + + def test_accuracy_mode_round_trip_returns_video_bytes( + self, mock_trtllm_serve: MockTrtllmServe + ) -> None: + """response_format=video_bytes → server returns base64 payload inline.""" + query = Query( + id="q1b", + data={ + "prompt": "a golden retriever running on a beach", + "response_format": "video_bytes", + }, + ) + request_bytes = VideoGenAdapter.encode_query(query) + + status, content = _post( + f"{mock_trtllm_serve.url}/v1/videos/generations", request_bytes + ) + assert status == 200 + + result = VideoGenAdapter.decode_response(content, query.id) + assert result.id == "q1b" + assert result.error is None assert "video_bytes" in result.metadata decoded = base64.b64decode(result.metadata["video_bytes"]) assert decoded == DUMMY_VIDEO_BYTES @@ -113,12 +142,14 @@ def test_malformed_json_response_raises(self) -> None: with pytest.raises(json.JSONDecodeError): VideoGenAdapter.decode_response(b"not json at all", "q5") - def test_missing_video_bytes_field_raises_validation_error(self) -> None: - bad_body = b'{"video_id": "vid_001"}' # missing video_bytes + def test_video_path_branch_missing_video_path_raises(self) -> None: + """No video_bytes key → dispatch to VideoPathResponse → video_path required.""" + bad_body = b'{"video_id": "vid_001"}' with pytest.raises(ValidationError): VideoGenAdapter.decode_response(bad_body, "q6") - def test_missing_video_id_field_raises_validation_error(self) -> None: - bad_body = b'{"video_bytes": "AAEC"}' # missing video_id + def test_video_bytes_branch_missing_video_id_raises(self) -> None: + """video_bytes key present → dispatch to VideoPayloadResponse → video_id required.""" + bad_body = b'{"video_bytes": "AAEC"}' with pytest.raises(ValidationError): VideoGenAdapter.decode_response(bad_body, "q7") From e960fa047ad26b699e1fe3495fa47bb6df41182f Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Tue, 5 May 2026 15:28:12 -0700 Subject: [PATCH 16/22] docs(videogen): align references with current module layout - AGENTS.md: drop stale HealthResponse, removed VideoGenDataset row; rephrase Key Components blurb to be model-agnostic. - Delete endpoints_changed.md per author note (kept internally). - schema.py / probe.py: api_type help now lists videogen alongside openai and sglang; regenerated full-template YAMLs accordingly. - offline_wan22.yaml: rewrite the comment block to match the bundled JSONL contents; drop misleading min_duration_ms warm-up annotation. - adapter.py: clarify that exclude_none falls back only when the query.data value is None, not unconditionally. Co-Authored-By: Claude Opus 4.7 --- AGENTS.md | 29 ++++--- endpoints_changed.md | 84 ------------------- .../offline_wan22.yaml | 10 +-- src/inference_endpoint/commands/probe.py | 4 +- src/inference_endpoint/config/schema.py | 4 +- .../templates/concurrency_template_full.yaml | 2 +- .../templates/offline_template_full.yaml | 2 +- .../templates/online_template_full.yaml | 2 +- src/inference_endpoint/videogen/adapter.py | 15 ++-- 9 files changed, 35 insertions(+), 117 deletions(-) delete mode 100644 endpoints_changed.md diff --git a/AGENTS.md b/AGENTS.md index ec70673f..efd4228f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -74,17 +74,17 @@ Dataset Manager --> Load Generator --> Endpoint Client --> External Endpoint ### Key Components -| Component | Location | Purpose | -| ------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Load Generator** | `src/inference_endpoint/load_generator/` | Central orchestrator: `BenchmarkSession` owns the lifecycle, `Scheduler` controls timing, `LoadGenerator` issues queries | -| **Endpoint Client** | `src/inference_endpoint/endpoint_client/` | Multi-process HTTP workers communicating via ZMQ IPC. `HTTPEndpointClient` is the main entry point | -| **Dataset Manager** | `src/inference_endpoint/dataset_manager/` | Loads JSONL, HuggingFace, CSV, JSON, Parquet datasets. `Dataset` base class with `load_sample()`/`num_samples()` interface | -| **Metrics** | `src/inference_endpoint/metrics/` | `EventRecorder` writes to SQLite, `MetricsReporter` reads and aggregates (QPS, latency, TTFT, TPOT) | -| **Config** | `src/inference_endpoint/config/`, `endpoint_client/config.py` | Pydantic-based YAML schema (`schema.py`), `HTTPClientConfig` (single Pydantic model for CLI/YAML/runtime), `RuntimeSettings` | -| **CLI** | `src/inference_endpoint/main.py`, `commands/benchmark/cli.py` | cyclopts-based, auto-generated from `schema.py` and `HTTPClientConfig` Pydantic models. Flat shorthands via `cyclopts.Parameter(alias=...)` | -| **Async Utils** | `src/inference_endpoint/async_utils/` | `LoopManager` (uvloop + eager_task_factory), ZMQ transport layer, event publisher | -| **OpenAI/SGLang** | `src/inference_endpoint/openai/`, `sglang/` | Protocol adapters and response accumulators for different API formats | -| **VideoGen** | `src/inference_endpoint/videogen/` | Client adapter and dataset loader for MLPerf WAN2.2-T2V-A14B. `VideoGenAdapter` POSTs `VideoPathRequest` directly to trtllm-serve's `/v1/videos/generations` with `response_format=video_path`; server saves video to Lustre and returns path, avoiding large byte payloads. | +| Component | Location | Purpose | +| ------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Load Generator** | `src/inference_endpoint/load_generator/` | Central orchestrator: `BenchmarkSession` owns the lifecycle, `Scheduler` controls timing, `LoadGenerator` issues queries | +| **Endpoint Client** | `src/inference_endpoint/endpoint_client/` | Multi-process HTTP workers communicating via ZMQ IPC. `HTTPEndpointClient` is the main entry point | +| **Dataset Manager** | `src/inference_endpoint/dataset_manager/` | Loads JSONL, HuggingFace, CSV, JSON, Parquet datasets. `Dataset` base class with `load_sample()`/`num_samples()` interface | +| **Metrics** | `src/inference_endpoint/metrics/` | `EventRecorder` writes to SQLite, `MetricsReporter` reads and aggregates (QPS, latency, TTFT, TPOT) | +| **Config** | `src/inference_endpoint/config/`, `endpoint_client/config.py` | Pydantic-based YAML schema (`schema.py`), `HTTPClientConfig` (single Pydantic model for CLI/YAML/runtime), `RuntimeSettings` | +| **CLI** | `src/inference_endpoint/main.py`, `commands/benchmark/cli.py` | cyclopts-based, auto-generated from `schema.py` and `HTTPClientConfig` Pydantic models. Flat shorthands via `cyclopts.Parameter(alias=...)` | +| **Async Utils** | `src/inference_endpoint/async_utils/` | `LoopManager` (uvloop + eager_task_factory), ZMQ transport layer, event publisher | +| **OpenAI/SGLang** | `src/inference_endpoint/openai/`, `sglang/` | Protocol adapters and response accumulators for different API formats | +| **VideoGen** | `src/inference_endpoint/videogen/` | Adapter for video-generation endpoints (e.g. trtllm-serve `POST /v1/videos/generations`, used by MLPerf WAN2.2-T2V-A14B). Defaults to `response_format=video_path` (server saves video to shared storage and returns path) to avoid large byte payloads; switch to `video_bytes` for accuracy mode. Dataset is ingested via the generic JSONL loader. | ### Hot-Path Architecture @@ -200,11 +200,10 @@ src/inference_endpoint/ │ ├── accumulator.py # Streaming response accumulator │ └── harmony.py # openai_harmony integration ├── sglang/ # SGLang API adapter -├── videogen/ # WAN2.2 text-to-video MLPerf workload +├── videogen/ # Video generation adapter (e.g. WAN2.2 T2V workload) │ ├── __init__.py -│ ├── types.py # Pydantic: VideoPathRequest, VideoPathResponse, HealthResponse -│ ├── adapter.py # VideoGenAdapter (HttpRequestAdapter) + VideoGenAccumulator (no-op) -│ └── dataset.py # VideoGenDataset — loads MLPerf prompt text files +│ ├── types.py # Pydantic: VideoPathRequest, VideoPathResponse, VideoPayloadResponse +│ └── adapter.py # VideoGenAdapter (HttpRequestAdapter) + VideoGenAccumulator (no-op) ├── evaluation/ # Accuracy evaluation (extractor, scoring, livecodebench) ├── plugins/ # Plugin system ├── profiling/ # line_profiler integration, pytest plugin diff --git a/endpoints_changed.md b/endpoints_changed.md deleted file mode 100644 index dc5ec0ae..00000000 --- a/endpoints_changed.md +++ /dev/null @@ -1,84 +0,0 @@ -# WAN 2.2 Endpoint Client — Design Summary - -Client-side changes that add an `inference-endpoint` adapter for the MLPerf WAN 2.2 text-to-video benchmark. - -## Overview - -WAN 2.2 (T2V-A14B) generates 720×1280 portrait videos at 81 frames / 5 s using 20 denoising steps. The inference server is **trtllm-serve**, exposing `POST /v1/videos/generations`. The new `videogen` module plugs into the existing `HTTPEndpointClient` pipeline via the `api_type` config field — no hot-path code is touched. - -``` -YAML ──► HTTPEndpointClient ──► VideoGenAdapter ──► HTTP Worker (ZMQ) - │ │ - │ POST /v1/videos/generations - ▼ ▼ - QueryResult trtllm-serve - (metadata holds (perf: saves to Lustre, returns path - video_path or accuracy: returns base64 bytes inline) - video_bytes) -``` - -## `videogen/` module layout - -``` -videogen/ -├── __init__.py Public exports -├── types.py Pydantic wire models (VideoPathRequest, VideoPathResponse, VideoPayloadResponse) -└── adapter.py VideoGenAdapter + VideoGenAccumulator (no-op SSE) -``` - -The MLPerf prompts dataset ships as plain JSONL at `examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl` (248 rows; each row carries `prompt`, `negative_prompt` (MLPerf canonical), `sample_id`, `sample_index`). The generic `JsonlLoader` ingests it directly — no workload-specific dataset class is needed. - -## Two response formats - -The adapter supports both server response formats, selected per-request via `query.data["response_format"]`: - -- **`video_path`** (default, perf mode) — server saves the encoded video to Lustre and returns only the path. Avoids 3–5 MB payloads over HTTP + ZMQ per request. -- **`video_bytes`** (accuracy mode) — server returns the base64-encoded H.264/MJPEG payload inline so the accuracy evaluator can score directly. - -`decode_response` dispatches on the response body shape: `video_bytes` key present → `VideoPayloadResponse`; otherwise → `VideoPathResponse`. To run accuracy mode, set `response_format: video_bytes` in the per-row dataset data so it is injected into every `query.data`. - -## Wire model defaults (`types.py`) - -`VideoPathRequest` mirrors trtllm-serve's `VideoGenerationRequest`. All fields carry MLPerf defaults so only `prompt` is required from the dataset. - -| Field | MLPerf default | Notes | -| --------------------- | -------------- | ----------------------------------------------------------------------- | -| `prompt` | from dataset | Required | -| `negative_prompt` | `None` | Omitted from JSON when `None`; bundled JSONL carries the canonical text | -| `size` | `"720x1280"` | Portrait | -| `seconds` | `5.0` | 81 frames ÷ ~16.2 fps | -| `fps` | `16` | | -| `num_inference_steps` | `20` | | -| `guidance_scale` | `4.0` | Primary CFG | -| `guidance_scale_2` | `3.0` | Null-text secondary CFG (two-stage denoising) | -| `seed` | `42` | Fixed for reproducibility | -| `latent_path` | `None` | Optional path to a fixed latent tensor on shared storage | -| `output_format` | `"auto"` | H.264 if ffmpeg available, MJPEG otherwise | -| `response_format` | `"video_path"` | See "Two response formats" above | - -Serialization uses `model_dump_json(exclude_none=True)` so `None` fields fall back to server-side defaults. - -## Adapter contract (`adapter.py`) - -`VideoGenAdapter` implements `HttpRequestAdapter`: - -``` -encode_query(query) → VideoPathRequest JSON bytes -decode_response(bytes, id) → QueryResult with metadata={video_path: ...} or {video_bytes: ...} -decode_sse_message(bytes) → NotImplementedError (WAN 2.2 is non-streaming) -dataset_transforms(params) → [] (no token-level transforms needed) -``` - -`VideoGenAccumulator` is a no-op `SSEAccumulatorProtocol` to satisfy `HTTPClientConfig`'s type contract. `APIType.VIDEOGEN` is registered in `core/types.py` with `default_route() = "/v1/videos/generations"`. - -## Out of scope - -| Concern | Where it lives | -| ---------------------------------------- | ------------------------------------------------------ | -| trtllm-serve startup / model loading | trtllm-serve (separate process) | -| Fixed latent loading (`fixed_latent.pt`) | trtllm-serve, optionally per-request via `latent_path` | -| Video storage path on Lustre | trtllm-serve config | - -## Pending - -- **`guidance_scale_2` server-side wiring** — the client serializes the field (MLPerf default 3.0); trtllm-serve currently ignores it and uses a single CFG scale. diff --git a/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml b/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml index 35ecb153..b39c5a5e 100644 --- a/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml +++ b/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml @@ -12,8 +12,10 @@ # Seed: 42 (fixed for reproducibility; combine with fixed_latent.pt) # Dataset: 248 prompts from shopify_product_catalogue::q3vl # -# These params are baked into VideoGenAdapter defaults so only `prompt` is -# required from the dataset. Override via AddStaticColumns transform if needed. +# Resolution / duration / steps / guidance / seed are defaulted on +# `VideoPathRequest`. Each JSONL row carries `prompt` plus the canonical +# MLPerf `negative_prompt`; both flow into `query.data` and serialise into +# the request body, while unset fields fall back to the request defaults. name: "offline-wan22-video-generation-benchmark" version: "1.0" @@ -32,7 +34,6 @@ datasets: settings: runtime: - min_duration_ms: 60000 # 1 minute warm-up max_duration_ms: 600000 # 10 minute cap scheduler_random_seed: 42 dataloader_random_seed: 42 @@ -50,7 +51,4 @@ endpoint_config: api_type: "videogen" api_key: null -# Per-request fields (negative_prompt, optional latent_path) come from the -# bundled JSONL — the canonical MLPerf negative prompt is baked into every row. - report_dir: logs/wan22_video_generation_benchmark diff --git a/src/inference_endpoint/commands/probe.py b/src/inference_endpoint/commands/probe.py index e74361ee..07ae9f18 100644 --- a/src/inference_endpoint/commands/probe.py +++ b/src/inference_endpoint/commands/probe.py @@ -50,7 +50,9 @@ class ProbeConfig(BaseModel): model: str api_type: Annotated[ APIType, - cyclopts.Parameter(alias="--api-type", help="API type: openai or sglang"), + cyclopts.Parameter( + alias="--api-type", help="API type: openai, sglang, or videogen" + ), ] = APIType.OPENAI requests: int = Field(10, ge=1) prompt: str = Field( diff --git a/src/inference_endpoint/config/schema.py b/src/inference_endpoint/config/schema.py index 6a1884b4..8ab8f3b0 100644 --- a/src/inference_endpoint/config/schema.py +++ b/src/inference_endpoint/config/schema.py @@ -439,7 +439,9 @@ class EndpointConfig(BaseModel): ] = None api_type: Annotated[ APIType, - cyclopts.Parameter(alias="--api-type", help="API type: openai or sglang"), + cyclopts.Parameter( + alias="--api-type", help="API type: openai, sglang, or videogen" + ), ] = APIType.OPENAI @field_validator("endpoints", mode="after") diff --git a/src/inference_endpoint/config/templates/concurrency_template_full.yaml b/src/inference_endpoint/config/templates/concurrency_template_full.yaml index b1030d67..835300a8 100644 --- a/src/inference_endpoint/config/templates/concurrency_template_full.yaml +++ b/src/inference_endpoint/config/templates/concurrency_template_full.yaml @@ -72,7 +72,7 @@ endpoint_config: endpoints: # Endpoint URL(s). Must include scheme, e.g. 'http://host:port'. - http://localhost:8000 api_key: null # API key - api_type: openai # API type: openai or sglang | options: openai, sglang, videogen + api_type: openai # API type: openai, sglang, or videogen | options: openai, sglang, videogen report_dir: null # Report output directory timeout: null # Global timeout in seconds verbose: false # Enable verbose logging diff --git a/src/inference_endpoint/config/templates/offline_template_full.yaml b/src/inference_endpoint/config/templates/offline_template_full.yaml index 5f0a6384..5f4dd50c 100644 --- a/src/inference_endpoint/config/templates/offline_template_full.yaml +++ b/src/inference_endpoint/config/templates/offline_template_full.yaml @@ -72,7 +72,7 @@ endpoint_config: endpoints: # Endpoint URL(s). Must include scheme, e.g. 'http://host:port'. - http://localhost:8000 api_key: null # API key - api_type: openai # API type: openai or sglang | options: openai, sglang, videogen + api_type: openai # API type: openai, sglang, or videogen | options: openai, sglang, videogen report_dir: null # Report output directory timeout: null # Global timeout in seconds verbose: false # Enable verbose logging diff --git a/src/inference_endpoint/config/templates/online_template_full.yaml b/src/inference_endpoint/config/templates/online_template_full.yaml index 854edefb..434b1778 100644 --- a/src/inference_endpoint/config/templates/online_template_full.yaml +++ b/src/inference_endpoint/config/templates/online_template_full.yaml @@ -72,7 +72,7 @@ endpoint_config: endpoints: # Endpoint URL(s). Must include scheme, e.g. 'http://host:port'. - http://localhost:8000 api_key: null # API key - api_type: openai # API type: openai or sglang | options: openai, sglang, videogen + api_type: openai # API type: openai, sglang, or videogen | options: openai, sglang, videogen report_dir: null # Report output directory timeout: null # Global timeout in seconds verbose: false # Enable verbose logging diff --git a/src/inference_endpoint/videogen/adapter.py b/src/inference_endpoint/videogen/adapter.py index 8af26812..f780193e 100644 --- a/src/inference_endpoint/videogen/adapter.py +++ b/src/inference_endpoint/videogen/adapter.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Adapter for the WAN 2.2 trtllm-serve POST /v1/videos/generations endpoint.""" +"""Adapter for trtllm-serve's POST /v1/videos/generations endpoint.""" import json from typing import TYPE_CHECKING, Any @@ -65,8 +65,9 @@ def encode_query(cls, query: Query) -> bytes: ) known = VideoPathRequest.model_fields.keys() req = VideoPathRequest.model_validate({k: data[k] for k in known if k in data}) - # exclude_none so optional fields fall back to server-side defaults - # (MLPerf: omit negative_prompt and latent_path unless explicitly set). + # exclude_none so optional fields with value None fall back to + # server-side defaults; fields explicitly set in query.data + # (e.g. negative_prompt from the bundled JSONL) are forwarded. return req.model_dump_json(exclude_none=True).encode() @classmethod @@ -94,19 +95,19 @@ def decode_response(cls, response_bytes: bytes, query_id: str) -> QueryResult: @classmethod def decode_sse_message(cls, json_bytes: bytes) -> str: - raise NotImplementedError("WAN 2.2 does not use SSE streaming") + raise NotImplementedError("VideoGenAdapter does not use SSE streaming") class VideoGenAccumulator: """No-op SSE accumulator satisfying SSEAccumulatorProtocol. - WAN 2.2 uses non-streaming HTTP. This class exists only to satisfy - the HTTPClientConfig.accumulator type contract. + Video generation requests are non-streaming HTTP. This class exists + only to satisfy the HTTPClientConfig.accumulator type contract. """ def __init__(self, query_id: str, stream_all_chunks: bool) -> None: self.query_id = query_id - # stream_all_chunks is intentionally ignored: WAN 2.2 is non-streaming. + # stream_all_chunks is intentionally ignored: non-streaming endpoint. def add_chunk(self, delta: Any) -> StreamChunk | None: return None From 7f645e3cec4a9b48187cb2dd05baf60a92255420 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Tue, 5 May 2026 15:28:18 -0700 Subject: [PATCH 17/22] refactor(videogen): drop hardcoded WAN 2.2 strings, trim example dataset - Replace WAN 2.2 references in module docstrings, error messages, and comments with model-agnostic wording (the adapter can serve other video-generation models behind the same trtllm-serve route). - Trim wan22_prompts.jsonl to prompt + canonical MLPerf negative_prompt; drop unused mode/sample_id/sample_index columns the loader synthesises. Co-Authored-By: Claude Opus 4.7 --- .../wan22_prompts.jsonl | 496 +++++++++--------- src/inference_endpoint/videogen/__init__.py | 2 +- src/inference_endpoint/videogen/types.py | 2 +- 3 files changed, 250 insertions(+), 250 deletions(-) diff --git a/examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl b/examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl index 3059739b..9b469e89 100644 --- a/examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl +++ b/examples/09_Wan22_VideoGen_Example/wan22_prompts.jsonl @@ -1,248 +1,248 @@ -{"prompt": "a person swimming in ocean", "sample_id": "0", "sample_index": 0, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a person giving a presentation to a room full of colleagues", "sample_id": "1", "sample_index": 1, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a person washing the dishes", "sample_id": "2", "sample_index": 2, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a person eating a burger", "sample_id": "3", "sample_index": 3, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a person walking in the snowstorm", "sample_id": "4", "sample_index": 4, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a person drinking coffee in a cafe", "sample_id": "5", "sample_index": 5, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a person playing guitar", "sample_id": "6", "sample_index": 6, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bicycle leaning against a tree", "sample_id": "7", "sample_index": 7, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bicycle gliding through a snowy field", "sample_id": "8", "sample_index": 8, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bicycle slowing down to stop", "sample_id": "9", "sample_index": 9, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bicycle accelerating to gain speed", "sample_id": "10", "sample_index": 10, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a car stuck in traffic during rush hour", "sample_id": "11", "sample_index": 11, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a car turning a corner", "sample_id": "12", "sample_index": 12, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a car slowing down to stop", "sample_id": "13", "sample_index": 13, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a car accelerating to gain speed", "sample_id": "14", "sample_index": 14, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a motorcycle cruising along a coastal highway", "sample_id": "15", "sample_index": 15, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a motorcycle turning a corner", "sample_id": "16", "sample_index": 16, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a motorcycle slowing down to stop", "sample_id": "17", "sample_index": 17, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a motorcycle gliding through a snowy field", "sample_id": "18", "sample_index": 18, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a motorcycle accelerating to gain speed", "sample_id": "19", "sample_index": 19, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "an airplane soaring through a clear blue sky", "sample_id": "20", "sample_index": 20, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "an airplane taking off", "sample_id": "21", "sample_index": 21, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "an airplane landing smoothly on a runway", "sample_id": "22", "sample_index": 22, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "an airplane accelerating to gain speed", "sample_id": "23", "sample_index": 23, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bus turning a corner", "sample_id": "24", "sample_index": 24, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bus stuck in traffic during rush hour", "sample_id": "25", "sample_index": 25, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bus accelerating to gain speed", "sample_id": "26", "sample_index": 26, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a train speeding down the tracks", "sample_id": "27", "sample_index": 27, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a train crossing over a tall bridge", "sample_id": "28", "sample_index": 28, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a train accelerating to gain speed", "sample_id": "29", "sample_index": 29, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a truck turning a corner", "sample_id": "30", "sample_index": 30, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a truck anchored in a tranquil bay", "sample_id": "31", "sample_index": 31, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a truck stuck in traffic during rush hour", "sample_id": "32", "sample_index": 32, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a truck slowing down to stop", "sample_id": "33", "sample_index": 33, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a truck accelerating to gain speed", "sample_id": "34", "sample_index": 34, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a boat sailing smoothly on a calm lake", "sample_id": "35", "sample_index": 35, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a boat slowing down to stop", "sample_id": "36", "sample_index": 36, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a boat accelerating to gain speed", "sample_id": "37", "sample_index": 37, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bird soaring gracefully in the sky", "sample_id": "38", "sample_index": 38, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bird building a nest from twigs and leaves", "sample_id": "39", "sample_index": 39, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bird flying over a snowy forest", "sample_id": "40", "sample_index": 40, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a cat grooming itself meticulously with its tongue", "sample_id": "41", "sample_index": 41, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a cat playing in park", "sample_id": "42", "sample_index": 42, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a cat drinking water", "sample_id": "43", "sample_index": 43, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a cat running happily", "sample_id": "44", "sample_index": 44, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a dog enjoying a peaceful walk", "sample_id": "45", "sample_index": 45, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a dog playing in park", "sample_id": "46", "sample_index": 46, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a dog drinking water", "sample_id": "47", "sample_index": 47, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a dog running happily", "sample_id": "48", "sample_index": 48, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a horse bending down to drink water from a river", "sample_id": "49", "sample_index": 49, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a horse galloping across an open field", "sample_id": "50", "sample_index": 50, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a horse taking a peaceful walk", "sample_id": "51", "sample_index": 51, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a horse running to join a herd of its kind", "sample_id": "52", "sample_index": 52, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a sheep bending down to drink water from a river", "sample_id": "53", "sample_index": 53, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a sheep taking a peaceful walk", "sample_id": "54", "sample_index": 54, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a sheep running to join a herd of its kind", "sample_id": "55", "sample_index": 55, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a cow bending down to drink water from a river", "sample_id": "56", "sample_index": 56, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a cow chewing cud while resting in a tranquil barn", "sample_id": "57", "sample_index": 57, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a cow running to join a herd of its kind", "sample_id": "58", "sample_index": 58, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "an elephant spraying itself with water using its trunk to cool down", "sample_id": "59", "sample_index": 59, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "an elephant taking a peaceful walk", "sample_id": "60", "sample_index": 60, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "an elephant running to join a herd of its kind", "sample_id": "61", "sample_index": 61, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bear catching a salmon in its powerful jaws", "sample_id": "62", "sample_index": 62, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bear sniffing the air for scents of food", "sample_id": "63", "sample_index": 63, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bear climbing a tree", "sample_id": "64", "sample_index": 64, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a bear hunting for prey", "sample_id": "65", "sample_index": 65, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a zebra bending down to drink water from a river", "sample_id": "66", "sample_index": 66, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a zebra running to join a herd of its kind", "sample_id": "67", "sample_index": 67, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a zebra taking a peaceful walk", "sample_id": "68", "sample_index": 68, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a giraffe bending down to drink water from a river", "sample_id": "69", "sample_index": 69, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a giraffe taking a peaceful walk", "sample_id": "70", "sample_index": 70, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a giraffe running to join a herd of its kind", "sample_id": "71", "sample_index": 71, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, Van Gogh style", "sample_id": "72", "sample_index": 72, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, oil painting", "sample_id": "73", "sample_index": 73, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand by Hokusai, in the style of Ukiyo", "sample_id": "74", "sample_index": 74, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, black and white", "sample_id": "75", "sample_index": 75, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, pixel art", "sample_id": "76", "sample_index": 76, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, in cyberpunk style", "sample_id": "77", "sample_index": 77, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, animated style", "sample_id": "78", "sample_index": 78, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, watercolor painting", "sample_id": "79", "sample_index": 79, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, surrealism style", "sample_id": "80", "sample_index": 80, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "The bund Shanghai, Van Gogh style", "sample_id": "81", "sample_index": 81, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "The bund Shanghai, oil painting", "sample_id": "82", "sample_index": 82, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "The bund Shanghai by Hokusai, in the style of Ukiyo", "sample_id": "83", "sample_index": 83, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "The bund Shanghai, black and white", "sample_id": "84", "sample_index": 84, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "The bund Shanghai, pixel art", "sample_id": "85", "sample_index": 85, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "The bund Shanghai, in cyberpunk style", "sample_id": "86", "sample_index": 86, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "The bund Shanghai, animated style", "sample_id": "87", "sample_index": 87, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "The bund Shanghai, watercolor painting", "sample_id": "88", "sample_index": 88, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "The bund Shanghai, surrealism style", "sample_id": "89", "sample_index": 89, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, Van Gogh style", "sample_id": "90", "sample_index": 90, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, oil painting", "sample_id": "91", "sample_index": 91, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean by Hokusai, in the style of Ukiyo", "sample_id": "92", "sample_index": 92, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, black and white", "sample_id": "93", "sample_index": 93, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, pixel art", "sample_id": "94", "sample_index": 94, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, in cyberpunk style", "sample_id": "95", "sample_index": 95, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, animated style", "sample_id": "96", "sample_index": 96, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, watercolor painting", "sample_id": "97", "sample_index": 97, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "a shark is swimming in the ocean, surrealism style", "sample_id": "98", "sample_index": 98, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, Van Gogh style", "sample_id": "99", "sample_index": 99, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, oil painting", "sample_id": "100", "sample_index": 100, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris by Hokusai, in the style of Ukiyo", "sample_id": "101", "sample_index": 101, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, black and white", "sample_id": "102", "sample_index": 102, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, pixel art", "sample_id": "103", "sample_index": 103, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, in cyberpunk style", "sample_id": "104", "sample_index": 104, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, animated style", "sample_id": "105", "sample_index": 105, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, watercolor painting", "sample_id": "106", "sample_index": 106, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A panda drinking coffee in a cafe in Paris, surrealism style", "sample_id": "107", "sample_index": 107, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, Van Gogh style", "sample_id": "108", "sample_index": 108, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, oil painting", "sample_id": "109", "sample_index": 109, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset by Hokusai, in the style of Ukiyo", "sample_id": "110", "sample_index": 110, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, black and white", "sample_id": "111", "sample_index": 111, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, pixel art", "sample_id": "112", "sample_index": 112, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, in cyberpunk style", "sample_id": "113", "sample_index": 113, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, animated style", "sample_id": "114", "sample_index": 114, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, watercolor painting", "sample_id": "115", "sample_index": 115, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A cute happy Corgi playing in park, sunset, surrealism style", "sample_id": "116", "sample_index": 116, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, Van Gogh style", "sample_id": "117", "sample_index": 117, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, oil painting", "sample_id": "118", "sample_index": 118, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book by Hokusai, in the style of Ukiyo", "sample_id": "119", "sample_index": 119, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, black and white", "sample_id": "120", "sample_index": 120, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, pixel art", "sample_id": "121", "sample_index": 121, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, in cyberpunk style", "sample_id": "122", "sample_index": 122, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, animated style", "sample_id": "123", "sample_index": 123, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, watercolor painting", "sample_id": "124", "sample_index": 124, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Gwen Stacy reading a book, surrealism style", "sample_id": "125", "sample_index": 125, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, Van Gogh style", "sample_id": "126", "sample_index": 126, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, oil painting", "sample_id": "127", "sample_index": 127, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background by Hokusai, in the style of Ukiyo", "sample_id": "128", "sample_index": 128, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, black and white", "sample_id": "129", "sample_index": 129, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, pixel art", "sample_id": "130", "sample_index": 130, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, in cyberpunk style", "sample_id": "131", "sample_index": 131, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, animated style", "sample_id": "132", "sample_index": 132, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, watercolor painting", "sample_id": "133", "sample_index": 133, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, surrealism style", "sample_id": "134", "sample_index": 134, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, Van Gogh style", "sample_id": "135", "sample_index": 135, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, oil painting", "sample_id": "136", "sample_index": 136, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas by Hokusai, in the style of Ukiyo", "sample_id": "137", "sample_index": 137, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, black and white", "sample_id": "138", "sample_index": 138, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, pixel art", "sample_id": "139", "sample_index": 139, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, in cyberpunk style", "sample_id": "140", "sample_index": 140, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, animated style", "sample_id": "141", "sample_index": 141, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, watercolor painting", "sample_id": "142", "sample_index": 142, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, surrealism style", "sample_id": "143", "sample_index": 143, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "An astronaut flying in space, Van Gogh style", "sample_id": "144", "sample_index": 144, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "An astronaut flying in space, oil painting", "sample_id": "145", "sample_index": 145, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "An astronaut flying in space by Hokusai, in the style of Ukiyo", "sample_id": "146", "sample_index": 146, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "An astronaut flying in space, black and white", "sample_id": "147", "sample_index": 147, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "An astronaut flying in space, pixel art", "sample_id": "148", "sample_index": 148, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "An astronaut flying in space, in cyberpunk style", "sample_id": "149", "sample_index": 149, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "An astronaut flying in space, animated style", "sample_id": "150", "sample_index": 150, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "An astronaut flying in space, watercolor painting", "sample_id": "151", "sample_index": 151, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "An astronaut flying in space, surrealism style", "sample_id": "152", "sample_index": 152, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, Van Gogh style", "sample_id": "153", "sample_index": 153, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, oil painting", "sample_id": "154", "sample_index": 154, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks by Hokusai, in the style of Ukiyo", "sample_id": "155", "sample_index": 155, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, black and white", "sample_id": "156", "sample_index": 156, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, pixel art", "sample_id": "157", "sample_index": 157, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, in cyberpunk style", "sample_id": "158", "sample_index": 158, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, animated style", "sample_id": "159", "sample_index": 159, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, watercolor painting", "sample_id": "160", "sample_index": 160, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, surrealism style", "sample_id": "161", "sample_index": 161, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "alley", "sample_id": "162", "sample_index": 162, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "amusement park", "sample_id": "163", "sample_index": 163, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "aquarium", "sample_id": "164", "sample_index": 164, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "arch", "sample_id": "165", "sample_index": 165, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "art gallery", "sample_id": "166", "sample_index": 166, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "bathroom", "sample_id": "167", "sample_index": 167, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "bakery shop", "sample_id": "168", "sample_index": 168, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "ballroom", "sample_id": "169", "sample_index": 169, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "bar", "sample_id": "170", "sample_index": 170, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "barn", "sample_id": "171", "sample_index": 171, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "basement", "sample_id": "172", "sample_index": 172, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "beach", "sample_id": "173", "sample_index": 173, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "bedroom", "sample_id": "174", "sample_index": 174, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "bridge", "sample_id": "175", "sample_index": 175, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "botanical garden", "sample_id": "176", "sample_index": 176, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "cafeteria", "sample_id": "177", "sample_index": 177, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "campsite", "sample_id": "178", "sample_index": 178, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "campus", "sample_id": "179", "sample_index": 179, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "carrousel", "sample_id": "180", "sample_index": 180, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "castle", "sample_id": "181", "sample_index": 181, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "cemetery", "sample_id": "182", "sample_index": 182, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "classroom", "sample_id": "183", "sample_index": 183, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "cliff", "sample_id": "184", "sample_index": 184, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "crosswalk", "sample_id": "185", "sample_index": 185, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "construction site", "sample_id": "186", "sample_index": 186, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "corridor", "sample_id": "187", "sample_index": 187, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "courtyard", "sample_id": "188", "sample_index": 188, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "desert", "sample_id": "189", "sample_index": 189, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "downtown", "sample_id": "190", "sample_index": 190, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "driveway", "sample_id": "191", "sample_index": 191, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "farm", "sample_id": "192", "sample_index": 192, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "food court", "sample_id": "193", "sample_index": 193, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "football field", "sample_id": "194", "sample_index": 194, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "forest road", "sample_id": "195", "sample_index": 195, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "fountain", "sample_id": "196", "sample_index": 196, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "gas station", "sample_id": "197", "sample_index": 197, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "glacier", "sample_id": "198", "sample_index": 198, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "golf course", "sample_id": "199", "sample_index": 199, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "indoor gymnasium", "sample_id": "200", "sample_index": 200, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "harbor", "sample_id": "201", "sample_index": 201, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "highway", "sample_id": "202", "sample_index": 202, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "hospital", "sample_id": "203", "sample_index": 203, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "house", "sample_id": "204", "sample_index": 204, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "iceberg", "sample_id": "205", "sample_index": 205, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "industrial area", "sample_id": "206", "sample_index": 206, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "jail cell", "sample_id": "207", "sample_index": 207, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "junkyard", "sample_id": "208", "sample_index": 208, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "kitchen", "sample_id": "209", "sample_index": 209, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "indoor library", "sample_id": "210", "sample_index": 210, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "lighthouse", "sample_id": "211", "sample_index": 211, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "laboratory", "sample_id": "212", "sample_index": 212, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "mansion", "sample_id": "213", "sample_index": 213, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "marsh", "sample_id": "214", "sample_index": 214, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "mountain", "sample_id": "215", "sample_index": 215, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "indoor movie theater", "sample_id": "216", "sample_index": 216, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "indoor museum", "sample_id": "217", "sample_index": 217, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "music studio", "sample_id": "218", "sample_index": 218, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "nursery", "sample_id": "219", "sample_index": 219, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "ocean", "sample_id": "220", "sample_index": 220, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "office", "sample_id": "221", "sample_index": 221, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "palace", "sample_id": "222", "sample_index": 222, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "parking lot", "sample_id": "223", "sample_index": 223, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "pharmacy", "sample_id": "224", "sample_index": 224, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "phone booth", "sample_id": "225", "sample_index": 225, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "raceway", "sample_id": "226", "sample_index": 226, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "restaurant", "sample_id": "227", "sample_index": 227, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "river", "sample_id": "228", "sample_index": 228, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "science museum", "sample_id": "229", "sample_index": 229, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "shower", "sample_id": "230", "sample_index": 230, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "ski slope", "sample_id": "231", "sample_index": 231, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "sky", "sample_id": "232", "sample_index": 232, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "skyscraper", "sample_id": "233", "sample_index": 233, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "baseball stadium", "sample_id": "234", "sample_index": 234, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "staircase", "sample_id": "235", "sample_index": 235, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "street", "sample_id": "236", "sample_index": 236, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "supermarket", "sample_id": "237", "sample_index": 237, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "indoor swimming pool", "sample_id": "238", "sample_index": 238, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "tower", "sample_id": "239", "sample_index": 239, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "outdoor track", "sample_id": "240", "sample_index": 240, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "train railway", "sample_id": "241", "sample_index": 241, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "train station platform", "sample_id": "242", "sample_index": 242, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "underwater coral reef", "sample_id": "243", "sample_index": 243, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "valley", "sample_id": "244", "sample_index": 244, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "volcano", "sample_id": "245", "sample_index": 245, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "waterfall", "sample_id": "246", "sample_index": 246, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} -{"prompt": "windmill", "sample_id": "247", "sample_index": 247, "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards", "mode": "perf"} +{"prompt": "a person swimming in ocean", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a person giving a presentation to a room full of colleagues", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a person washing the dishes", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a person eating a burger", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a person walking in the snowstorm", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a person drinking coffee in a cafe", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a person playing guitar", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bicycle leaning against a tree", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bicycle gliding through a snowy field", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bicycle slowing down to stop", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bicycle accelerating to gain speed", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a car stuck in traffic during rush hour", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a car turning a corner", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a car slowing down to stop", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a car accelerating to gain speed", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a motorcycle cruising along a coastal highway", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a motorcycle turning a corner", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a motorcycle slowing down to stop", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a motorcycle gliding through a snowy field", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a motorcycle accelerating to gain speed", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "an airplane soaring through a clear blue sky", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "an airplane taking off", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "an airplane landing smoothly on a runway", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "an airplane accelerating to gain speed", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bus turning a corner", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bus stuck in traffic during rush hour", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bus accelerating to gain speed", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a train speeding down the tracks", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a train crossing over a tall bridge", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a train accelerating to gain speed", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a truck turning a corner", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a truck anchored in a tranquil bay", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a truck stuck in traffic during rush hour", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a truck slowing down to stop", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a truck accelerating to gain speed", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a boat sailing smoothly on a calm lake", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a boat slowing down to stop", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a boat accelerating to gain speed", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bird soaring gracefully in the sky", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bird building a nest from twigs and leaves", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bird flying over a snowy forest", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a cat grooming itself meticulously with its tongue", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a cat playing in park", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a cat drinking water", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a cat running happily", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a dog enjoying a peaceful walk", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a dog playing in park", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a dog drinking water", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a dog running happily", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a horse bending down to drink water from a river", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a horse galloping across an open field", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a horse taking a peaceful walk", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a horse running to join a herd of its kind", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a sheep bending down to drink water from a river", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a sheep taking a peaceful walk", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a sheep running to join a herd of its kind", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a cow bending down to drink water from a river", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a cow chewing cud while resting in a tranquil barn", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a cow running to join a herd of its kind", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "an elephant spraying itself with water using its trunk to cool down", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "an elephant taking a peaceful walk", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "an elephant running to join a herd of its kind", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bear catching a salmon in its powerful jaws", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bear sniffing the air for scents of food", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bear climbing a tree", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a bear hunting for prey", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a zebra bending down to drink water from a river", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a zebra running to join a herd of its kind", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a zebra taking a peaceful walk", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a giraffe bending down to drink water from a river", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a giraffe taking a peaceful walk", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a giraffe running to join a herd of its kind", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, Van Gogh style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, oil painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand by Hokusai, in the style of Ukiyo", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, black and white", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, pixel art", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, in cyberpunk style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, animated style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, watercolor painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A beautiful coastal beach in spring, waves lapping on sand, surrealism style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "The bund Shanghai, Van Gogh style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "The bund Shanghai, oil painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "The bund Shanghai by Hokusai, in the style of Ukiyo", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "The bund Shanghai, black and white", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "The bund Shanghai, pixel art", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "The bund Shanghai, in cyberpunk style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "The bund Shanghai, animated style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "The bund Shanghai, watercolor painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "The bund Shanghai, surrealism style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a shark is swimming in the ocean, Van Gogh style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a shark is swimming in the ocean, oil painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a shark is swimming in the ocean by Hokusai, in the style of Ukiyo", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a shark is swimming in the ocean, black and white", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a shark is swimming in the ocean, pixel art", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a shark is swimming in the ocean, in cyberpunk style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a shark is swimming in the ocean, animated style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a shark is swimming in the ocean, watercolor painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "a shark is swimming in the ocean, surrealism style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A panda drinking coffee in a cafe in Paris, Van Gogh style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A panda drinking coffee in a cafe in Paris, oil painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A panda drinking coffee in a cafe in Paris by Hokusai, in the style of Ukiyo", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A panda drinking coffee in a cafe in Paris, black and white", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A panda drinking coffee in a cafe in Paris, pixel art", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A panda drinking coffee in a cafe in Paris, in cyberpunk style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A panda drinking coffee in a cafe in Paris, animated style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A panda drinking coffee in a cafe in Paris, watercolor painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A panda drinking coffee in a cafe in Paris, surrealism style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A cute happy Corgi playing in park, sunset, Van Gogh style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A cute happy Corgi playing in park, sunset, oil painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A cute happy Corgi playing in park, sunset by Hokusai, in the style of Ukiyo", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A cute happy Corgi playing in park, sunset, black and white", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A cute happy Corgi playing in park, sunset, pixel art", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A cute happy Corgi playing in park, sunset, in cyberpunk style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A cute happy Corgi playing in park, sunset, animated style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A cute happy Corgi playing in park, sunset, watercolor painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A cute happy Corgi playing in park, sunset, surrealism style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Gwen Stacy reading a book, Van Gogh style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Gwen Stacy reading a book, oil painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Gwen Stacy reading a book by Hokusai, in the style of Ukiyo", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Gwen Stacy reading a book, black and white", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Gwen Stacy reading a book, pixel art", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Gwen Stacy reading a book, in cyberpunk style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Gwen Stacy reading a book, animated style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Gwen Stacy reading a book, watercolor painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Gwen Stacy reading a book, surrealism style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, Van Gogh style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, oil painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background by Hokusai, in the style of Ukiyo", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, black and white", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, pixel art", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, in cyberpunk style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, animated style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, watercolor painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A boat sailing leisurely along the Seine River with the Eiffel Tower in background, surrealism style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, Van Gogh style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, oil painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas by Hokusai, in the style of Ukiyo", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, black and white", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, pixel art", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, in cyberpunk style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, animated style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, watercolor painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "A couple in formal evening wear going home get caught in a heavy downpour with umbrellas, surrealism style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "An astronaut flying in space, Van Gogh style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "An astronaut flying in space, oil painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "An astronaut flying in space by Hokusai, in the style of Ukiyo", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "An astronaut flying in space, black and white", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "An astronaut flying in space, pixel art", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "An astronaut flying in space, in cyberpunk style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "An astronaut flying in space, animated style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "An astronaut flying in space, watercolor painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "An astronaut flying in space, surrealism style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, Van Gogh style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, oil painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks by Hokusai, in the style of Ukiyo", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, black and white", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, pixel art", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, in cyberpunk style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, animated style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, watercolor painting", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "Snow rocky mountains peaks canyon. snow blanketed rocky mountains surround and shadow deep canyons. the canyons twist and bend through the high elevated mountain peaks, surrealism style", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "alley", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "amusement park", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "aquarium", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "arch", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "art gallery", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "bathroom", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "bakery shop", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "ballroom", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "bar", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "barn", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "basement", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "beach", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "bedroom", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "bridge", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "botanical garden", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "cafeteria", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "campsite", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "campus", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "carrousel", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "castle", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "cemetery", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "classroom", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "cliff", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "crosswalk", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "construction site", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "corridor", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "courtyard", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "desert", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "downtown", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "driveway", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "farm", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "food court", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "football field", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "forest road", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "fountain", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "gas station", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "glacier", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "golf course", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "indoor gymnasium", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "harbor", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "highway", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "hospital", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "house", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "iceberg", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "industrial area", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "jail cell", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "junkyard", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "kitchen", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "indoor library", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "lighthouse", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "laboratory", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "mansion", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "marsh", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "mountain", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "indoor movie theater", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "indoor museum", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "music studio", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "nursery", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "ocean", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "office", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "palace", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "parking lot", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "pharmacy", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "phone booth", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "raceway", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "restaurant", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "river", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "science museum", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "shower", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "ski slope", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "sky", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "skyscraper", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "baseball stadium", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "staircase", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "street", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "supermarket", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "indoor swimming pool", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "tower", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "outdoor track", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "train railway", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "train station platform", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "underwater coral reef", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "valley", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "volcano", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "waterfall", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} +{"prompt": "windmill", "negative_prompt": "vivid colors, overexposed, static, blurry details, subtitles, style, work of art, painting, picture, still, overall grayish, worst quality, low quality, JPEG artifacts, ugly, deformed, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, deformed limbs, fused fingers, static image, cluttered background, three legs, many people in the background, walking backwards"} diff --git a/src/inference_endpoint/videogen/__init__.py b/src/inference_endpoint/videogen/__init__.py index ad5fbeca..2ecd71ed 100644 --- a/src/inference_endpoint/videogen/__init__.py +++ b/src/inference_endpoint/videogen/__init__.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Public API for the WAN 2.2 video generation inference module.""" +"""Public API for the video generation inference module.""" from .adapter import VideoGenAccumulator, VideoGenAdapter from .types import VideoPathRequest, VideoPathResponse, VideoPayloadResponse diff --git a/src/inference_endpoint/videogen/types.py b/src/inference_endpoint/videogen/types.py index 64443c14..b0e1f333 100644 --- a/src/inference_endpoint/videogen/types.py +++ b/src/inference_endpoint/videogen/types.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Wire models for trtllm-serve POST /v1/videos/generations (WAN 2.2).""" +"""Wire models for trtllm-serve POST /v1/videos/generations.""" from typing import Literal From 0a7d314ec365a713d9a2f78e3ce250173d465361 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Tue, 5 May 2026 15:28:21 -0700 Subject: [PATCH 18/22] test(videogen): tmp_path mock video, drop unused videogen extra and stray type-ignores MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - conftest.py: replace hardcoded /lustre/.../mock_video_001.mp4 with a tmp_path_factory-driven fixture; thread it through the integration test. - pyproject.toml: drop the empty videogen optional-dependencies extra; uv.lock regenerated to match. - Revert three unrelated # type: ignore[attr-defined] additions on the datasets imports (dataset.py, shopify, livecodebench) — out of scope. - setup_and_test.sh: replace the test-runner-only script with a brief end-to-end runbook (HF download, server launch hint, benchmark). Co-Authored-By: Claude Opus 4.7 --- .../setup_and_test.sh | 80 +++++-------------- pyproject.toml | 1 - .../dataset_manager/dataset.py | 2 +- .../shopify_product_catalogue/__init__.py | 2 +- .../evaluation/livecodebench/generate.py | 2 +- tests/integration/videogen/conftest.py | 23 ++++-- tests/integration/videogen/test_adapter.py | 5 +- uv.lock | 2 +- 8 files changed, 43 insertions(+), 74 deletions(-) diff --git a/examples/09_Wan22_VideoGen_Example/setup_and_test.sh b/examples/09_Wan22_VideoGen_Example/setup_and_test.sh index 7ea050d6..a5014f96 100755 --- a/examples/09_Wan22_VideoGen_Example/setup_and_test.sh +++ b/examples/09_Wan22_VideoGen_Example/setup_and_test.sh @@ -1,73 +1,33 @@ #!/usr/bin/env bash -# setup_and_test.sh — Set up the WAN2.2 environment and run unit tests. +# setup_and_test.sh — End-to-end runbook for the WAN 2.2 video-generation example. # -# Usage: -# bash setup_and_test.sh [--skip-setup] +# Steps: +# 1. Download the WAN 2.2 weights from HuggingFace. +# 2. Launch trtllm-serve in a separate shell. +# 3. Run the offline benchmark from this script. # -# --skip-setup Skip venv creation and pip install (use existing venv). -# -# Prerequisites: -# - Python 3.12 available as python3.12 -# - Access to the repo root (this script lives in examples/09_Wan22_VideoGen_Example/) +# Prerequisites: Python 3.12, a GPU host with trtllm-serve installed, +# and HuggingFace credentials (`huggingface-cli login`) — the WAN 2.2 +# weights are gated. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" -VENV_DIR="${REPO_ROOT}/.venv" -SKIP_SETUP=false -for arg in "$@"; do - [[ "$arg" == "--skip-setup" ]] && SKIP_SETUP=true -done +MODEL_REPO="Wan-AI/Wan2.2-T2V-A14B" # https://huggingface.co/Wan-AI/Wan2.2-T2V-A14B +MODEL_DIR="${MODEL_DIR:-${HOME}/models/wan2.2-t2v-a14b}" cd "${REPO_ROOT}" -# --------------------------------------------------------------------------- -# 1. Environment setup -# --------------------------------------------------------------------------- -if [[ "$SKIP_SETUP" == false ]]; then - echo "==> Creating virtual environment at ${VENV_DIR}" - python3.12 -m venv "${VENV_DIR}" - - echo "==> Installing package with [videogen,test] extras" - "${VENV_DIR}/bin/pip" install --upgrade pip --quiet - "${VENV_DIR}/bin/pip" install -e ".[videogen,test]" --quiet -else - echo "==> Skipping setup (--skip-setup)" -fi - -PYTEST="${VENV_DIR}/bin/pytest" - -if [[ ! -x "$PYTEST" ]]; then - echo "ERROR: pytest not found at ${PYTEST}. Run without --skip-setup first." - exit 1 -fi - -# --------------------------------------------------------------------------- -# 2. Locate bundled prompts dataset -# --------------------------------------------------------------------------- -PROMPTS_JSONL="${SCRIPT_DIR}/wan22_prompts.jsonl" -echo "==> Using bundled prompts dataset: ${PROMPTS_JSONL}" +# 1. Download model weights (~28 GB). +huggingface-cli download "${MODEL_REPO}" --local-dir "${MODEL_DIR}" -# --------------------------------------------------------------------------- -# 3. Run WAN2.2 unit tests -# --------------------------------------------------------------------------- -echo "" -echo "==> Running WAN2.2 unit tests" -"$PYTEST" tests/unit/videogen/ \ - -v \ - --tb=short \ - --no-cov \ - -q - -echo "" -echo "==> Running WAN2.2 integration tests" -"$PYTEST" tests/integration/videogen/ \ - -v \ - --tb=short \ - --no-cov \ - -q || { code=$?; [ $code -eq 5 ] && echo "No integration tests collected (skipped)" || exit $code; } - -echo "" -echo "All tests passed." +# 2. Launch the server in a separate shell, then re-run this script: +# +# trtllm-serve "${MODEL_DIR}" --host 0.0.0.0 --port 8000 \ +# --backend pytorch --task text_to_video +# +# 3. Run the offline benchmark. +inference-endpoint benchmark from-config \ + --config "${SCRIPT_DIR}/offline_wan22.yaml" diff --git a/pyproject.toml b/pyproject.toml index 1c790acf..8b227a5a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,7 +74,6 @@ sql = [ # SQL event logger (swappable backends, default sqlite) "sqlalchemy==2.0.48", ] -videogen = [] dev = [ # Code quality "ruff==0.15.8", diff --git a/src/inference_endpoint/dataset_manager/dataset.py b/src/inference_endpoint/dataset_manager/dataset.py index 7896eb83..93e3cfa6 100644 --- a/src/inference_endpoint/dataset_manager/dataset.py +++ b/src/inference_endpoint/dataset_manager/dataset.py @@ -24,7 +24,7 @@ import numpy as np import pandas as pd -from datasets import load_dataset, load_from_disk # type: ignore[attr-defined] +from datasets import load_dataset, load_from_disk from ..config.schema import APIType, ModelParams from .transforms import Transform, apply_transforms, get_transforms_for_api_type diff --git a/src/inference_endpoint/dataset_manager/predefined/shopify_product_catalogue/__init__.py b/src/inference_endpoint/dataset_manager/predefined/shopify_product_catalogue/__init__.py index 59d22bf6..6bae9f43 100644 --- a/src/inference_endpoint/dataset_manager/predefined/shopify_product_catalogue/__init__.py +++ b/src/inference_endpoint/dataset_manager/predefined/shopify_product_catalogue/__init__.py @@ -23,7 +23,7 @@ from typing import Any import pandas as pd -from datasets import load_dataset # type: ignore[attr-defined] +from datasets import load_dataset from tqdm import tqdm from ...dataset import Dataset diff --git a/src/inference_endpoint/evaluation/livecodebench/generate.py b/src/inference_endpoint/evaluation/livecodebench/generate.py index 6aff8669..02c2ff3b 100644 --- a/src/inference_endpoint/evaluation/livecodebench/generate.py +++ b/src/inference_endpoint/evaluation/livecodebench/generate.py @@ -40,7 +40,7 @@ from typing import Any import pandas as pd -from datasets import load_dataset # type: ignore[attr-defined] +from datasets import load_dataset logger = logging.getLogger(__name__) diff --git a/tests/integration/videogen/conftest.py b/tests/integration/videogen/conftest.py index ab88a3fb..b1d1a68f 100644 --- a/tests/integration/videogen/conftest.py +++ b/tests/integration/videogen/conftest.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Integration test fixtures for WAN2.2 adapter tests.""" +"""Integration test fixtures for the videogen adapter.""" import asyncio import base64 @@ -23,11 +23,21 @@ import pytest from aiohttp import web -DUMMY_VIDEO_PATH = "/lustre/videos/mock_video_001.mp4" # Minimal dummy video bytes returned in accuracy mode (base64-encoded in responses). DUMMY_VIDEO_BYTES = b"\x00\x00\x00\x20ftypmp42" + b"\x00" * 24 +@pytest.fixture(scope="module") +def mock_video_path(tmp_path_factory: pytest.TempPathFactory) -> str: + """Stable per-module path string the mock server returns for video_path mode. + + The mock never writes a real file — the path only needs to be a unique + string the adapter and tests can assert against. Using tmp_path_factory + avoids hardcoding shared-storage locations like /lustre/.... + """ + return str(tmp_path_factory.mktemp("videogen") / "mock_video_001.mp4") + + class MockTrtllmServe: """Lightweight aiohttp server mimicking trtllm-serve's video generation API. @@ -37,9 +47,10 @@ class MockTrtllmServe: base64-encoded DUMMY_VIDEO_BYTES. """ - def __init__(self) -> None: + def __init__(self, video_path: str) -> None: self.host = "127.0.0.1" self.port = 0 + self.video_path = video_path self._actual_port: int | None = None self._runner: web.AppRunner | None = None self._thread: threading.Thread | None = None @@ -90,12 +101,12 @@ async def _handle_sync(self, request: web.Request) -> web.Response: "video_bytes": base64.b64encode(DUMMY_VIDEO_BYTES).decode(), } ) - return web.json_response({"video_id": video_id, "video_path": DUMMY_VIDEO_PATH}) + return web.json_response({"video_id": video_id, "video_path": self.video_path}) @pytest.fixture(scope="module") -def mock_trtllm_serve() -> Generator[MockTrtllmServe, None, None]: - server = MockTrtllmServe() +def mock_trtllm_serve(mock_video_path: str) -> Generator[MockTrtllmServe, None, None]: + server = MockTrtllmServe(video_path=mock_video_path) server.start() yield server server.stop() diff --git a/tests/integration/videogen/test_adapter.py b/tests/integration/videogen/test_adapter.py index 57e359f8..f028946b 100644 --- a/tests/integration/videogen/test_adapter.py +++ b/tests/integration/videogen/test_adapter.py @@ -27,7 +27,6 @@ from .conftest import ( DUMMY_VIDEO_BYTES, - DUMMY_VIDEO_PATH, MockTrtllmServe, MockTrtllmServeError, ) @@ -55,7 +54,7 @@ class TestVideoGenAdapterRoundTrip: def test_perf_mode_round_trip_returns_video_path( self, mock_trtllm_serve: MockTrtllmServe ) -> None: - """Default response_format=video_path → server returns Lustre path.""" + """Default response_format=video_path → server returns the saved-video path.""" query = Query(id="q1", data={"prompt": "a golden retriever running on a beach"}) request_bytes = VideoGenAdapter.encode_query(query) @@ -67,7 +66,7 @@ def test_perf_mode_round_trip_returns_video_path( result = VideoGenAdapter.decode_response(content, query.id) assert result.id == "q1" assert result.error is None - assert result.metadata == {"video_path": DUMMY_VIDEO_PATH} + assert result.metadata == {"video_path": mock_trtllm_serve.video_path} def test_accuracy_mode_round_trip_returns_video_bytes( self, mock_trtllm_serve: MockTrtllmServe diff --git a/uv.lock b/uv.lock index 95b9a0f6..9017350e 100644 --- a/uv.lock +++ b/uv.lock @@ -882,7 +882,7 @@ requires-dist = [ { name = "uvloop", specifier = "==0.22.1" }, { name = "websocket-client", specifier = "==1.9.0" }, ] -provides-extras = ["sql", "videogen", "dev", "test", "performance"] +provides-extras = ["sql", "dev", "test", "performance"] [[package]] name = "iniconfig" From d0b9a0046411b9b9a2689f6b4f43071611d65d5d Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Tue, 5 May 2026 16:15:51 -0700 Subject: [PATCH 19/22] refactor(testing): expose route hook on EchoServer; videogen mocks reuse it - Extract route registration in EchoServer into _register_routes(app) so subclasses can swap the OpenAI-shaped routes for a different wire contract while reusing the background-thread aiohttp lifecycle. - Convert MockTrtllmServe and MockTrtllmServeError into EchoServer subclasses; drops ~80 lines of duplicated start/stop/port plumbing from tests/integration/videogen/conftest.py. Addresses arekay-nv's review comment on conftest.py asking whether the existing echo server can be reused with a video-gen route. Co-Authored-By: Claude Opus 4.7 --- src/inference_endpoint/testing/echo_server.py | 17 ++- tests/integration/videogen/conftest.py | 116 ++++-------------- 2 files changed, 36 insertions(+), 97 deletions(-) diff --git a/src/inference_endpoint/testing/echo_server.py b/src/inference_endpoint/testing/echo_server.py index 6555f2e6..980c613e 100644 --- a/src/inference_endpoint/testing/echo_server.py +++ b/src/inference_endpoint/testing/echo_server.py @@ -311,16 +311,23 @@ def _run_server(self): asyncio.set_event_loop(self._loop) self._loop.run_until_complete(self._start_server()) + def _register_routes(self, app: "web.Application") -> None: + """Register HTTP routes on the aiohttp app. + + Subclasses can override to swap out the OpenAI-shaped routes for + a different wire contract while reusing the lifecycle plumbing. + """ + app.router.add_post( + "/v1/chat/completions", self._handle_echo_chat_completions_request + ) + app.router.add_post("/echo", self._handle_echo_request) + async def _start_server(self): """Start the HTTP server.""" try: # Create the web application self.app = web.Application() - - self.app.router.add_post( - "/v1/chat/completions", self._handle_echo_chat_completions_request - ) - self.app.router.add_post("/echo", self._handle_echo_request) + self._register_routes(self.app) # Start the server self.runner = web.AppRunner(self.app) diff --git a/tests/integration/videogen/conftest.py b/tests/integration/videogen/conftest.py index b1d1a68f..8f8ab0f5 100644 --- a/tests/integration/videogen/conftest.py +++ b/tests/integration/videogen/conftest.py @@ -13,15 +13,20 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Integration test fixtures for the videogen adapter.""" +"""Integration test fixtures for the videogen adapter. + +The two mocks subclass `EchoServer` to reuse its background-thread +aiohttp lifecycle (port discovery, start/stop, ready event). Only the +route registration differs — videogen serves `/v1/videos/generations` +instead of OpenAI's `/v1/chat/completions`. +""" -import asyncio import base64 -import threading from collections.abc import Generator import pytest from aiohttp import web +from inference_endpoint.testing.echo_server import EchoServer # Minimal dummy video bytes returned in accuracy mode (base64-encoded in responses). DUMMY_VIDEO_BYTES = b"\x00\x00\x00\x20ftypmp42" + b"\x00" * 24 @@ -38,60 +43,24 @@ def mock_video_path(tmp_path_factory: pytest.TempPathFactory) -> str: return str(tmp_path_factory.mktemp("videogen") / "mock_video_001.mp4") -class MockTrtllmServe: - """Lightweight aiohttp server mimicking trtllm-serve's video generation API. +class MockTrtllmServe(EchoServer): + """trtllm-serve-shaped mock for `/v1/videos/generations`. - Supports both response formats: - - response_format='video_path': returns VideoPathResponse JSON. - - response_format='video_bytes': returns VideoPayloadResponse JSON with - base64-encoded DUMMY_VIDEO_BYTES. + Branches on the request body's `response_format` field: + - "video_bytes": returns VideoPayloadResponse JSON with base64-encoded + DUMMY_VIDEO_BYTES. + - anything else (default): returns VideoPathResponse JSON pointing at + the configured `video_path`. """ def __init__(self, video_path: str) -> None: - self.host = "127.0.0.1" - self.port = 0 + super().__init__(port=0) self.video_path = video_path - self._actual_port: int | None = None - self._runner: web.AppRunner | None = None - self._thread: threading.Thread | None = None - self._loop: asyncio.AbstractEventLoop | None = None - self._ready = threading.Event() - - @property - def url(self) -> str: - return f"http://{self.host}:{self._actual_port}" - - def start(self) -> None: - self._thread = threading.Thread(target=self._run, daemon=True) - self._thread.start() - self._ready.wait(timeout=5) - - def stop(self) -> None: - if self._loop: - asyncio.run_coroutine_threadsafe(self._shutdown(), self._loop).result( - timeout=5 - ) - def _run(self) -> None: - self._loop = asyncio.new_event_loop() - self._loop.run_until_complete(self._serve()) - - async def _serve(self) -> None: - app = web.Application() - app.router.add_post("/v1/videos/generations", self._handle_sync) - self._runner = web.AppRunner(app) - await self._runner.setup() - site = web.TCPSite(self._runner, self.host, self.port) - await site.start() - self._actual_port = self._runner.addresses[0][1] - self._ready.set() - await asyncio.Event().wait() - - async def _shutdown(self) -> None: - if self._runner: - await self._runner.cleanup() - - async def _handle_sync(self, request: web.Request) -> web.Response: + def _register_routes(self, app: web.Application) -> None: + app.router.add_post("/v1/videos/generations", self._handle_videogen) + + async def _handle_videogen(self, request: web.Request) -> web.Response: body = await request.json() video_id = f"mock_video_{hash(body.get('prompt', '')) & 0xFFFF:04x}" if body.get("response_format") == "video_bytes": @@ -112,51 +81,14 @@ def mock_trtllm_serve(mock_video_path: str) -> Generator[MockTrtllmServe, None, server.stop() -class MockTrtllmServeError: - """Mock trtllm-serve that returns HTTP 500 for all requests.""" +class MockTrtllmServeError(EchoServer): + """Mock trtllm-serve that returns HTTP 500 for `/v1/videos/generations`.""" def __init__(self) -> None: - self.host = "127.0.0.1" - self.port = 0 - self._actual_port: int | None = None - self._runner: web.AppRunner | None = None - self._thread: threading.Thread | None = None - self._loop: asyncio.AbstractEventLoop | None = None - self._ready = threading.Event() - - @property - def url(self) -> str: - return f"http://{self.host}:{self._actual_port}" - - def start(self) -> None: - self._thread = threading.Thread(target=self._run, daemon=True) - self._thread.start() - self._ready.wait(timeout=5) - - def stop(self) -> None: - if self._loop: - asyncio.run_coroutine_threadsafe(self._shutdown(), self._loop).result( - timeout=5 - ) - - def _run(self) -> None: - self._loop = asyncio.new_event_loop() - self._loop.run_until_complete(self._serve()) + super().__init__(port=0) - async def _serve(self) -> None: - app = web.Application() + def _register_routes(self, app: web.Application) -> None: app.router.add_post("/v1/videos/generations", self._handle_error) - self._runner = web.AppRunner(app) - await self._runner.setup() - site = web.TCPSite(self._runner, self.host, self.port) - await site.start() - self._actual_port = self._runner.addresses[0][1] - self._ready.set() - await asyncio.Event().wait() - - async def _shutdown(self) -> None: - if self._runner: - await self._runner.cleanup() async def _handle_error(self, request: web.Request) -> web.Response: return web.Response(status=500, text="Internal Server Error") From 7b6f128b3dc236f0e2ca3d25dd4a745c8caf8a29 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Wed, 6 May 2026 11:37:20 -0700 Subject: [PATCH 20/22] fix(videogen): tighten request/response wiring and fail loud on streaming MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses arekay-nv [Claude] review batch on PR #293. - adapter.py: * dataset_transforms now ships a ColumnFilter (required: prompt, optional: VideoPathRequest fields) — satisfies the abstract-base contract and turns typo'd column names into hard errors at dataset load time instead of silent server-side fallbacks. * decode_response dispatches on `isinstance(raw.get('video_bytes'), str)` rather than key presence, so a server reply with `video_bytes: null` falls through to the video_path branch instead of crashing VideoPayloadResponse validation. * encode_query rejects `stream=True` upfront with a clear ValueError; VideoGenAccumulator.get_final_output now raises instead of returning an empty QueryResult, since the worker SSE path swallows NotImplementedError from decode_sse_message and would otherwise silently report zero-output queries as successful. * Class docstring rewritten — adapter does not auto-derive response_format from BenchmarkConfig.benchmark_mode; callers must inject `response_format=video_bytes` via the dataset to opt in. - types.py: VideoPathResponse and VideoPayloadResponse now use `extra='forbid'` so server shape drift (e.g. both video_path and video_bytes populated, or unknown fields) fails loud at deserialise time instead of silently picking the wrong branch. - offline_wan22.yaml: max_new_tokens 0 → 1 with a comment explaining the field is ignored by VideoGenAdapter; copying the YAML and switching api_type to openai/sglang for debugging no longer yields a 400 from a zero-completion-token request. - tests/unit/videogen/test_adapter.py: update locked-in assertions for the new contract (ColumnFilter present, accumulator raises) and add coverage for the stream=True rejection. Co-Authored-By: Claude Opus 4.7 --- .../offline_wan22.yaml | 2 +- src/inference_endpoint/videogen/adapter.py | 56 ++++++++++++------- src/inference_endpoint/videogen/types.py | 15 +++-- tests/unit/videogen/test_adapter.py | 26 +++++++-- 4 files changed, 69 insertions(+), 30 deletions(-) diff --git a/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml b/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml index b39c5a5e..508af97c 100644 --- a/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml +++ b/examples/09_Wan22_VideoGen_Example/offline_wan22.yaml @@ -23,7 +23,7 @@ type: "offline" model_params: name: "wan22" - max_new_tokens: 0 # Video generation does not produce tokens + max_new_tokens: 1 # Ignored by VideoGenAdapter; kept >0 so swapping api_type to openai/sglang for debugging doesn't yield a 400. streaming: "off" # WAN 2.2 uses non-streaming HTTP POST/response datasets: diff --git a/src/inference_endpoint/videogen/adapter.py b/src/inference_endpoint/videogen/adapter.py index f780193e..7ae84cca 100644 --- a/src/inference_endpoint/videogen/adapter.py +++ b/src/inference_endpoint/videogen/adapter.py @@ -24,6 +24,7 @@ StreamChunk, TextModelOutput, ) +from inference_endpoint.dataset_manager.transforms import ColumnFilter from inference_endpoint.endpoint_client.adapter_protocol import HttpRequestAdapter from .types import VideoPathRequest, VideoPathResponse, VideoPayloadResponse @@ -36,33 +37,42 @@ class VideoGenAdapter(HttpRequestAdapter): """Adapter for trtllm-serve POST /v1/videos/generations. - Supports both server response formats via query.data["response_format"]: - - "video_path" (default): server saves video to shared storage (Lustre) - and returns only the file path. Used in perf mode — avoids 3-5 MB - payloads over HTTP + ZMQ per request. - - "video_bytes": server returns base64-encoded video content. Used in - accuracy mode where the evaluator needs the video content directly. + `response_format` is read from `query.data` (default "video_path") and + is *not* derived from BenchmarkConfig.benchmark_mode. Callers that want + accuracy-mode bytes must inject `response_format="video_bytes"` into the + dataset rows — typically via an `AddStaticColumns` transform. """ @classmethod def dataset_transforms(cls, model_params: "ModelParams") -> "list[Transform]": - return [] + # ColumnFilter rejects unknown columns at dataset-load time so typos + # (e.g. "negitive_prompt") fail loud instead of silently falling back + # to server-side defaults. + request_fields = list(VideoPathRequest.model_fields.keys()) + return [ + ColumnFilter( + required_columns=["prompt"], + optional_columns=[f for f in request_fields if f != "prompt"], + ), + ] @classmethod def encode_query(cls, query: Query) -> bytes: """Serialise query.data to VideoPathRequest JSON bytes. - Only `prompt` is required. All other fields fall back to MLPerf defaults - declared on VideoPathRequest but can be overridden via query.data. - Pass response_format="video_bytes" in query.data to request inline video - bytes (accuracy mode) instead of the default Lustre path (perf mode). - Extra keys in query.data (e.g. sample_id, sample_index) are ignored. + Only `prompt` is required. All other fields fall back to defaults on + VideoPathRequest but can be overridden via query.data. Streaming is + not supported — `stream=True` raises. """ data = query.data if "prompt" not in data: raise KeyError( f"'prompt' not found in query.data keys: {list(data.keys())}" ) + if data.get("stream"): + raise ValueError( + "VideoGenAdapter is non-streaming; remove `stream` from query.data." + ) known = VideoPathRequest.model_fields.keys() req = VideoPathRequest.model_validate({k: data[k] for k in known if k in data}) # exclude_none so optional fields with value None fall back to @@ -75,11 +85,13 @@ def decode_response(cls, response_bytes: bytes, query_id: str) -> QueryResult: """Deserialise trtllm-serve response JSON bytes to QueryResult. Dispatches on the response shape: - - "video_bytes" response: metadata["video_bytes"] holds the base64 payload. - - "video_path" response: metadata["video_path"] holds the Lustre file path. + - video_bytes response (str payload): metadata["video_bytes"]. + - video_path response: metadata["video_path"]. """ raw = json.loads(response_bytes) - if "video_bytes" in raw: + # Truthiness check, not key presence: a server that returns + # `"video_bytes": null` belongs in the video_path branch. + if isinstance(raw.get("video_bytes"), str): resp = VideoPayloadResponse.model_validate(raw) return QueryResult( id=query_id, @@ -99,10 +111,13 @@ def decode_sse_message(cls, json_bytes: bytes) -> str: class VideoGenAccumulator: - """No-op SSE accumulator satisfying SSEAccumulatorProtocol. + """SSE accumulator stub for HTTPClientConfig contract. - Video generation requests are non-streaming HTTP. This class exists - only to satisfy the HTTPClientConfig.accumulator type contract. + Video generation requests are non-streaming HTTP, so this class should + never be exercised. `get_final_output` raises rather than returning an + empty `QueryResult`, because the worker's SSE path swallows the + `NotImplementedError` from `decode_sse_message` and would otherwise + surface zero-output queries as successful. """ def __init__(self, query_id: str, stream_all_chunks: bool) -> None: @@ -113,4 +128,7 @@ def add_chunk(self, delta: Any) -> StreamChunk | None: return None def get_final_output(self) -> QueryResult: - return QueryResult(id=self.query_id) + raise RuntimeError( + "VideoGenAccumulator.get_final_output called: video generation is " + "non-streaming — check HTTPClientConfig.streaming and query.data['stream']." + ) diff --git a/src/inference_endpoint/videogen/types.py b/src/inference_endpoint/videogen/types.py index b0e1f333..26423b23 100644 --- a/src/inference_endpoint/videogen/types.py +++ b/src/inference_endpoint/videogen/types.py @@ -17,7 +17,7 @@ from typing import Literal -from pydantic import BaseModel, Field +from pydantic import BaseModel, ConfigDict, Field class VideoPathRequest(BaseModel): @@ -26,9 +26,9 @@ class VideoPathRequest(BaseModel): Matches trtllm-serve's VideoGenerationRequest. All fields have MLPerf defaults so that only `prompt` is required from the dataset. - `response_format` is set by VideoGenAdapter based on benchmark mode: - - "video_path" (perf mode): server saves video to shared storage, returns path only. - - "video_bytes" (accuracy mode): server returns base64-encoded video content. + `response_format` defaults to "video_path"; callers wanting accuracy-mode + behaviour must inject `response_format="video_bytes"` into `query.data` + via the dataset (the adapter does not derive it from `benchmark_mode`). """ prompt: str @@ -78,8 +78,13 @@ class VideoPathResponse(BaseModel): and returns the absolute path instead of video bytes. Used in perf mode: MLPerf defines query completion as server finishing generation, so bytes do not need to cross the wire. + + `extra="forbid"` so a server returning unexpected fields (or both + video_path and video_bytes) fails loudly at deserialisation. """ + model_config = ConfigDict(extra="forbid") + video_id: str video_path: str @@ -91,5 +96,7 @@ class VideoPayloadResponse(BaseModel): which the accuracy evaluator decodes to score quality (e.g. FVD). """ + model_config = ConfigDict(extra="forbid") + video_id: str video_bytes: str # base64-encoded video content diff --git a/tests/unit/videogen/test_adapter.py b/tests/unit/videogen/test_adapter.py index 28ba3ff4..a4231a12 100644 --- a/tests/unit/videogen/test_adapter.py +++ b/tests/unit/videogen/test_adapter.py @@ -97,6 +97,11 @@ def test_encode_query_missing_prompt_raises(self): with pytest.raises(KeyError): VideoGenAdapter.encode_query(query) + def test_encode_query_rejects_stream_true(self): + query = Query(id="q1", data={"prompt": "test", "stream": True}) + with pytest.raises(ValueError, match="non-streaming"): + VideoGenAdapter.encode_query(query) + def test_decode_response_returns_video_bytes_in_metadata(self): resp = VideoPayloadResponse( video_id="video_abc123", @@ -117,9 +122,19 @@ def test_decode_sse_message_raises_not_implemented(self): with pytest.raises(NotImplementedError): VideoGenAdapter.decode_sse_message(b"{}") - def test_dataset_transforms_returns_empty_list(self): + def test_dataset_transforms_returns_column_filter(self): + from inference_endpoint.dataset_manager.transforms import ColumnFilter + from inference_endpoint.videogen.types import VideoPathRequest + params = ModelParams() - assert VideoGenAdapter.dataset_transforms(params) == [] + transforms = VideoGenAdapter.dataset_transforms(params) + assert len(transforms) == 1 + cf = transforms[0] + assert isinstance(cf, ColumnFilter) + assert cf.required_columns == ["prompt"] + # Optional columns mirror VideoPathRequest fields except prompt itself. + expected_optional = {f for f in VideoPathRequest.model_fields if f != "prompt"} + assert set(cf.optional_columns or []) == expected_optional def test_default_route_is_trtllm_native(self): assert APIType.VIDEOGEN.default_route() == "/v1/videos/generations" @@ -132,11 +147,10 @@ def test_add_chunk_always_returns_none(self): assert acc.add_chunk("anything") is None assert acc.add_chunk(None) is None - def test_get_final_output_returns_query_result_with_id(self): + def test_get_final_output_raises_because_videogen_is_non_streaming(self): acc = VideoGenAccumulator(query_id="q1", stream_all_chunks=False) - result = acc.get_final_output() - assert isinstance(result, QueryResult) - assert result.id == "q1" + with pytest.raises(RuntimeError, match="non-streaming"): + acc.get_final_output() def test_satisfies_sse_accumulator_protocol(self): assert isinstance(VideoGenAccumulator("q1", False), SSEAccumulatorProtocol) From 8ce9006d8a703a12577f15192f3b1bbe83e340da Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Wed, 6 May 2026 11:39:44 -0700 Subject: [PATCH 21/22] refactor(videogen): video_id belongs in metadata, not response_output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - decode_response no longer wraps video_id in TextModelOutput. video_id is a server-side handle, not generated text — packing it into response_output meant downstream consumers (e.g. probe.py:195 printing get_response_output_string()) surfaced it as the response body. Both decode branches now set response_output=None and place video_id alongside video_path/video_bytes in metadata. - Update unit + integration test assertions for the new shape. - Add the missing unit-level coverage for the perf-mode (video_path) decode branch — previously only exercised by the integration suite. - Mock trtllm-serve now derives its mock video_id from sha1(prompt) instead of Python's salted hash(), so ids are reproducible across test runs and CI workers. Co-Authored-By: Claude Opus 4.7 --- src/inference_endpoint/videogen/adapter.py | 17 ++++++++------ tests/integration/videogen/conftest.py | 7 +++++- tests/integration/videogen/test_adapter.py | 7 ++++-- tests/unit/videogen/test_adapter.py | 27 +++++++++++++++++----- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/inference_endpoint/videogen/adapter.py b/src/inference_endpoint/videogen/adapter.py index 7ae84cca..08dddb1c 100644 --- a/src/inference_endpoint/videogen/adapter.py +++ b/src/inference_endpoint/videogen/adapter.py @@ -22,7 +22,6 @@ Query, QueryResult, StreamChunk, - TextModelOutput, ) from inference_endpoint.dataset_manager.transforms import ColumnFilter from inference_endpoint.endpoint_client.adapter_protocol import HttpRequestAdapter @@ -92,17 +91,21 @@ def decode_response(cls, response_bytes: bytes, query_id: str) -> QueryResult: # Truthiness check, not key presence: a server that returns # `"video_bytes": null` belongs in the video_path branch. if isinstance(raw.get("video_bytes"), str): - resp = VideoPayloadResponse.model_validate(raw) + resp_bytes = VideoPayloadResponse.model_validate(raw) return QueryResult( id=query_id, - response_output=TextModelOutput(output=resp.video_id), - metadata={"video_bytes": resp.video_bytes}, + metadata={ + "video_id": resp_bytes.video_id, + "video_bytes": resp_bytes.video_bytes, + }, ) - resp = VideoPathResponse.model_validate(raw) + resp_path = VideoPathResponse.model_validate(raw) return QueryResult( id=query_id, - response_output=TextModelOutput(output=resp.video_id), - metadata={"video_path": resp.video_path}, + metadata={ + "video_id": resp_path.video_id, + "video_path": resp_path.video_path, + }, ) @classmethod diff --git a/tests/integration/videogen/conftest.py b/tests/integration/videogen/conftest.py index 8f8ab0f5..aff23910 100644 --- a/tests/integration/videogen/conftest.py +++ b/tests/integration/videogen/conftest.py @@ -22,6 +22,7 @@ """ import base64 +import hashlib from collections.abc import Generator import pytest @@ -62,7 +63,11 @@ def _register_routes(self, app: web.Application) -> None: async def _handle_videogen(self, request: web.Request) -> web.Response: body = await request.json() - video_id = f"mock_video_{hash(body.get('prompt', '')) & 0xFFFF:04x}" + # sha1 not hash() — Python's hash() is salted per-interpreter via + # PYTHONHASHSEED, which makes the mock id non-deterministic across runs. + prompt = body.get("prompt", "") + digest = hashlib.sha1(prompt.encode()).hexdigest()[:4] + video_id = f"mock_video_{digest}" if body.get("response_format") == "video_bytes": return web.json_response( { diff --git a/tests/integration/videogen/test_adapter.py b/tests/integration/videogen/test_adapter.py index f028946b..1ee9ad27 100644 --- a/tests/integration/videogen/test_adapter.py +++ b/tests/integration/videogen/test_adapter.py @@ -66,7 +66,9 @@ def test_perf_mode_round_trip_returns_video_path( result = VideoGenAdapter.decode_response(content, query.id) assert result.id == "q1" assert result.error is None - assert result.metadata == {"video_path": mock_trtllm_serve.video_path} + assert result.response_output is None + assert result.metadata["video_path"] == mock_trtllm_serve.video_path + assert isinstance(result.metadata["video_id"], str) def test_accuracy_mode_round_trip_returns_video_bytes( self, mock_trtllm_serve: MockTrtllmServe @@ -89,7 +91,8 @@ def test_accuracy_mode_round_trip_returns_video_bytes( result = VideoGenAdapter.decode_response(content, query.id) assert result.id == "q1b" assert result.error is None - assert "video_bytes" in result.metadata + assert result.response_output is None + assert isinstance(result.metadata["video_id"], str) decoded = base64.b64decode(result.metadata["video_bytes"]) assert decoded == DUMMY_VIDEO_BYTES diff --git a/tests/unit/videogen/test_adapter.py b/tests/unit/videogen/test_adapter.py index a4231a12..dc1b470a 100644 --- a/tests/unit/videogen/test_adapter.py +++ b/tests/unit/videogen/test_adapter.py @@ -24,7 +24,7 @@ SSEAccumulatorProtocol, ) from inference_endpoint.videogen.adapter import VideoGenAccumulator, VideoGenAdapter -from inference_endpoint.videogen.types import VideoPayloadResponse +from inference_endpoint.videogen.types import VideoPathResponse, VideoPayloadResponse @pytest.mark.unit @@ -111,12 +111,27 @@ def test_decode_response_returns_video_bytes_in_metadata(self): assert isinstance(result, QueryResult) assert result.id == "q1" assert result.error is None - assert result.metadata["video_bytes"] == "dGVzdCB2aWRlbyBjb250ZW50" - - def test_decode_response_video_id_in_output(self): - resp = VideoPayloadResponse(video_id="vid_xyz", video_bytes="AAEC") + assert result.response_output is None + assert result.metadata == { + "video_id": "video_abc123", + "video_bytes": "dGVzdCB2aWRlbyBjb250ZW50", + } + + def test_decode_response_returns_video_path_in_metadata(self): + """Perf-mode decode branch — covered separately from integration.""" + resp = VideoPathResponse( + video_id="vid_perf_001", + video_path="/lustre/videos/vid_perf_001.mp4", + ) result = VideoGenAdapter.decode_response(resp.model_dump_json().encode(), "q1") - assert result.response_output.output == "vid_xyz" + assert isinstance(result, QueryResult) + assert result.id == "q1" + assert result.error is None + assert result.response_output is None + assert result.metadata == { + "video_id": "vid_perf_001", + "video_path": "/lustre/videos/vid_perf_001.mp4", + } def test_decode_sse_message_raises_not_implemented(self): with pytest.raises(NotImplementedError): From 63e259a279da56f368abf1117e77236ecf56b8b6 Mon Sep 17 00:00:00 2001 From: Tin-Yin Lai Date: Wed, 6 May 2026 11:42:11 -0700 Subject: [PATCH 22/22] fix(probe): reject api_type=videogen with a clear error The probe path assumes second-scale latencies (probe_timeout=60s) and text-prompt/text-response semantics. Video generation requests on WAN2.2-T2V-A14B take minutes per request and emit no chat tokens, so the probe always fails with a misleading 'Probe failed: only 0/N requests successful' after the timeout. Reject `--api-type videogen` upfront in _probe_async with a clear InputValidationError pointing users at `benchmark from-config` (or a dedicated health check, if one is later added). Addresses arekay-nv [Claude] medium-severity comment on probe.py:54. Co-Authored-By: Claude Opus 4.7 --- src/inference_endpoint/commands/probe.py | 12 ++++++++++++ tests/integration/commands/test_probe_command.py | 16 +++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/inference_endpoint/commands/probe.py b/src/inference_endpoint/commands/probe.py index 07ae9f18..de840b5d 100644 --- a/src/inference_endpoint/commands/probe.py +++ b/src/inference_endpoint/commands/probe.py @@ -79,6 +79,18 @@ async def _probe_async(config: ProbeConfig) -> None: test_prompt = config.prompt api_type = config.api_type + # Probe assumes second-scale latencies (probe_timeout=60s below) and + # text prompt/response semantics — neither holds for video generation, + # where each request takes minutes and there are no chat tokens to + # display. Reject upfront rather than emitting a misleading + # "0/N requests successful" failure after the timeout. + if api_type == APIType.VIDEOGEN: + raise InputValidationError( + "Probe does not support api_type=videogen " + "(per-request latencies exceed the probe timeout). " + "Use a dedicated health check or a benchmark from-config run instead." + ) + # Model: use provided or default to valid OpenAI model name model_name = config.model if not model_name: diff --git a/tests/integration/commands/test_probe_command.py b/tests/integration/commands/test_probe_command.py index bc3c046e..a1088584 100644 --- a/tests/integration/commands/test_probe_command.py +++ b/tests/integration/commands/test_probe_command.py @@ -25,7 +25,8 @@ import pytest from inference_endpoint.commands.probe import ProbeConfig, execute_probe -from inference_endpoint.exceptions import ExecutionError +from inference_endpoint.config.schema import APIType +from inference_endpoint.exceptions import ExecutionError, InputValidationError class TestProbeCommandIntegration: @@ -84,6 +85,19 @@ def test_probe_shows_multiple_responses(self, mock_http_echo_server, caplog): assert "[probe-0]" in caplog.text assert "Sample response text" in caplog.text + @pytest.mark.integration + def test_probe_rejects_videogen_api_type(self): + """Probe assumes second-scale latencies; videogen requests run for minutes.""" + config = ProbeConfig( + endpoints="http://localhost:8000", + model="wan22", + api_type=APIType.VIDEOGEN, + requests=1, + prompt="a cat", + ) + with pytest.raises(InputValidationError, match="videogen"): + execute_probe(config) + @pytest.mark.integration def test_probe_with_invalid_endpoint(self): """Test probe fails gracefully with invalid endpoint."""