[new-model] Add initial Qwen-Image-2.1 inference (#1918)
Co-authored-by: Aryan Kumar <156166681+aryan5v@users.noreply.github.com>
This commit is contained in:
co-authored by
Aryan Kumar
parent
a92c5c1578
commit
0d05b09c57
@@ -0,0 +1,73 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
"""Qwen-Image-2.1 generation, editing, references and transparent PNG output."""
|
||||
|
||||
import argparse
|
||||
|
||||
from fastvideo import VideoGenerator
|
||||
from fastvideo.api import (
|
||||
EngineConfig,
|
||||
GenerationRequest,
|
||||
GeneratorConfig,
|
||||
InputConfig,
|
||||
OffloadConfig,
|
||||
OutputConfig,
|
||||
ParallelismConfig,
|
||||
PipelineSelection,
|
||||
SamplingConfig,
|
||||
)
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--model-path", default="Qwen/Qwen-Image-2.1")
|
||||
parser.add_argument("--revision")
|
||||
parser.add_argument("--prompt", default="A red ceramic teapot, isolated on a transparent background.")
|
||||
parser.add_argument("--reference", action="append", default=[], help="Ordered reference image; repeat up to ten times")
|
||||
parser.add_argument("--negative-prompt", default=None)
|
||||
parser.add_argument("--true-cfg-scale", type=float, default=1.0)
|
||||
parser.add_argument("--height", type=int, default=1024)
|
||||
parser.add_argument("--width", type=int, default=1024)
|
||||
parser.add_argument("--reference-resolution", type=int, default=1024)
|
||||
parser.add_argument("--steps", type=int, default=40)
|
||||
parser.add_argument("--seed", type=int, default=42)
|
||||
parser.add_argument("--use-kv-cache", action=argparse.BooleanOptionalAction, default=True)
|
||||
parser.add_argument("--output", default="outputs/qwen_image21/image.png")
|
||||
args = parser.parse_args()
|
||||
if len(args.reference) > 10:
|
||||
parser.error("At most ten ordered reference images are supported")
|
||||
workload = "i2i" if args.reference else "t2i"
|
||||
generator = VideoGenerator.from_config(
|
||||
GeneratorConfig(
|
||||
model_path=args.model_path,
|
||||
revision=args.revision,
|
||||
engine=EngineConfig(
|
||||
num_gpus=1,
|
||||
parallelism=ParallelismConfig(tp_size=1, sp_size=1),
|
||||
offload=OffloadConfig(dit=True, dit_layerwise=True, text_encoder=True, vae=True,
|
||||
lazy_module_load=True),
|
||||
),
|
||||
pipeline=PipelineSelection(
|
||||
workload_type=workload,
|
||||
experimental={
|
||||
"reference_resolution": args.reference_resolution,
|
||||
"use_kv_cache": args.use_kv_cache,
|
||||
},
|
||||
),
|
||||
))
|
||||
try:
|
||||
generator.generate(
|
||||
GenerationRequest(
|
||||
prompt=args.prompt,
|
||||
negative_prompt=args.negative_prompt,
|
||||
inputs=InputConfig(references=args.reference or None),
|
||||
sampling=SamplingConfig(height=args.height, width=args.width, num_frames=1, fps=1,
|
||||
num_inference_steps=args.steps, guidance_scale=1.0,
|
||||
true_cfg_scale=args.true_cfg_scale, seed=args.seed),
|
||||
output=OutputConfig(output_path=args.output, save_video=True, return_frames=False),
|
||||
))
|
||||
finally:
|
||||
generator.shutdown()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,39 @@
|
||||
# Replace source.png and mask.png with your own images. The mask is an ordered
|
||||
# reference interpreted by the model, not a hard pixel-preservation constraint.
|
||||
generator:
|
||||
model_path: Qwen/Qwen-Image-2.1
|
||||
engine:
|
||||
num_gpus: 1
|
||||
parallelism:
|
||||
tp_size: 1
|
||||
sp_size: 1
|
||||
offload:
|
||||
dit: true
|
||||
dit_layerwise: true
|
||||
text_encoder: true
|
||||
vae: true
|
||||
lazy_module_load: true
|
||||
pipeline:
|
||||
workload_type: i2i
|
||||
experimental:
|
||||
reference_resolution: 1024
|
||||
use_kv_cache: true
|
||||
request:
|
||||
prompt: In image 1, turn the object highlighted by the mask in image 2 blue.
|
||||
inputs:
|
||||
references:
|
||||
- source.png
|
||||
- mask.png
|
||||
sampling:
|
||||
height: 1024
|
||||
width: 1024
|
||||
num_frames: 1
|
||||
fps: 1
|
||||
num_inference_steps: 40
|
||||
guidance_scale: 1.0
|
||||
true_cfg_scale: 1.0
|
||||
seed: 42
|
||||
output:
|
||||
output_path: outputs/qwen_image21/edit.png
|
||||
save_video: true
|
||||
return_frames: false
|
||||
@@ -0,0 +1,40 @@
|
||||
# Run on an allocated CUDA GPU after installing FastVideo and providing weights.
|
||||
# fastvideo generate --config examples/inference/basic/qwen_image21_t2i.yaml
|
||||
generator:
|
||||
model_path: Qwen/Qwen-Image-2.1
|
||||
engine:
|
||||
num_gpus: 1
|
||||
compile:
|
||||
enabled: false
|
||||
backend: inductor
|
||||
fullgraph: false
|
||||
parallelism:
|
||||
tp_size: 1
|
||||
sp_size: 1
|
||||
offload:
|
||||
dit: true
|
||||
dit_layerwise: true
|
||||
text_encoder: true
|
||||
vae: true
|
||||
lazy_module_load: true
|
||||
pipeline:
|
||||
workload_type: t2i
|
||||
experimental:
|
||||
kv_cache_device: cuda
|
||||
reference_resolution: 1024
|
||||
use_kv_cache: true
|
||||
request:
|
||||
prompt: A red ceramic teapot, isolated on a transparent background.
|
||||
sampling:
|
||||
height: 1024
|
||||
width: 1024
|
||||
num_frames: 1
|
||||
fps: 1
|
||||
num_inference_steps: 40
|
||||
guidance_scale: 1.0
|
||||
true_cfg_scale: 1.0
|
||||
seed: 42
|
||||
output:
|
||||
output_path: outputs/qwen_image21/teapot.png
|
||||
save_video: true
|
||||
return_frames: false
|
||||
Reference in New Issue
Block a user