Enable VAE tiling for Qwen-Image-2.1 (#5)
* init Signed-off-by: Isotr0py <mozf@inferact.ai> * fix Signed-off-by: Isotr0py <mozf@inferact.ai> * test(diffusion): add Qwen-Image-2.1 unit tests Signed-off-by: Isotr0py <mozf@inferact.ai> * fix(diffusion): Qwen-Image-2.1 VAE spatial ratio, tiling e2e verification - AutoencoderKLQwenImage21: derive spatial_compression_ratio from the architecture (2 ** len(temperal_downsample) = 16x) instead of trusting the checkpoint's scale_factor_spatial=8, which corrupted tiled decode/encode geometry (output cropped to half size) and tiling gating. - pipeline: _read_vae_scale_factor prefers the architecture-derived value for the same reason. - models/qwen_image_21/__init__: lazy exports to break the circular import distributed VAE -> package __init__ -> pipeline -> distributed VAE. - Add VAE unit tests: ratio derivation, tiled vs untiled decode/encode consistency, distributed tile_split/exec/merge == tiled_decode. - e2e matrix (GB200, seed 42, 20 steps) all green; see e2e_out/qwen21_vae/. - examples: qwen_image_21_edit.py gains --vae-use-tiling. - docs: mark VAE patch-parallel verified for Qwen-Image-2.1; recipe notes the default-tile banding limitation at 2048px+. * clean tests Signed-off-by: Isotr0py <mozf@inferact.ai> * fix cudnn determination Signed-off-by: Isotr0py <mozf@inferact.ai> --------- Signed-off-by: Isotr0py <mozf@inferact.ai>
This commit is contained in:
1 parent
4fc3cf8c60
commit
3affc7766d
7 files changed
+163
-29
No files matched your search
@@ -15,6 +15,7 @@ from vllm_omni.diffusion.distributed.autoencoders.distributed_vae_executor impor
|
||||
)
|
||||
from vllm_omni.diffusion.models.qwen_image_21.autoencoder_kl_qwenimage21 import (
|
||||
AutoencoderKLQwenImage21,
|
||||
_cudnn_deterministic,
|
||||
_unpatchify,
|
||||
)
|
||||
|
||||
@@ -89,11 +90,12 @@ class DistributedAutoencoderKLQwenImage21(AutoencoderKLQwenImage21, DistributedV
|
||||
"""Decode a single latent tile into RGB space."""
|
||||
self.clear_cache()
|
||||
time = []
|
||||
for k in range(len(task.tensor)):
|
||||
self._conv_idx = [0]
|
||||
tile = self.post_quant_conv(task.tensor[k])
|
||||
decoded = self.decoder(tile, feat_cache=self._feat_map, feat_idx=self._conv_idx, first_chunk=(k == 0))
|
||||
time.append(decoded)
|
||||
with _cudnn_deterministic():
|
||||
for k in range(len(task.tensor)):
|
||||
self._conv_idx = [0]
|
||||
tile = self.post_quant_conv(task.tensor[k])
|
||||
decoded = self.decoder(tile, feat_cache=self._feat_map, feat_idx=self._conv_idx, first_chunk=(k == 0))
|
||||
time.append(decoded)
|
||||
result = torch.cat(time, dim=2)
|
||||
return result
|
||||
|
||||
|
||||
Reference in new issue
Block a user