diffsynth 2.1.5__tar.gz → 2.1.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {diffsynth-2.1.5 → diffsynth-2.1.6}/PKG-INFO +13 -1
- {diffsynth-2.1.5 → diffsynth-2.1.6}/README.md +12 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/configs/model_configs.py +36 -2
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/configs/vram_management_module_maps.py +16 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/diffusion/flow_match.py +11 -1
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/diffusion/loss.py +2 -2
- diffsynth-2.1.6/diffsynth/models/minimax_h3_controlnet.py +105 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/minimax_h3_dit.py +4 -1
- diffsynth-2.1.6/diffsynth/models/qwen_video_edit_dit.py +89 -0
- diffsynth-2.1.6/diffsynth/models/sensenova_u1_common.py +229 -0
- diffsynth-2.1.6/diffsynth/models/sensenova_u1_dit.py +897 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/minimax_h3_audio_video.py +144 -1
- diffsynth-2.1.6/diffsynth/pipelines/qwen_video_edit.py +356 -0
- diffsynth-2.1.6/diffsynth/pipelines/sensenova_u1_image.py +318 -0
- diffsynth-2.1.6/diffsynth/utils/state_dict_converters/minimax_h3_controlnet.py +75 -0
- diffsynth-2.1.6/diffsynth/utils/state_dict_converters/qwen_video_edit.py +6 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/version.py +1 -1
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth.egg-info/PKG-INFO +13 -1
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth.egg-info/SOURCES.txt +8 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/LICENSE +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/configs/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/attention/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/attention/attention.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/data/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/data/operators.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/data/unified_dataset.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/device/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/device/npu_compatible_device.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/gradient/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/gradient/gradient_checkpoint.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/loader/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/loader/config.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/loader/file.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/loader/model.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/npu_patch/npu_fused_operator.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/offload_training/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/offload_training/manager.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/offload_training/memory_buffer.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/offload_training/offloader.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/quant/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/quant/backends/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/quant/backends/bitsandbytes.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/quant/backends/comfy_kitchen.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/quant/backends/torchao.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/quant/base.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/quant/config.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/vram/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/vram/disk_map.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/vram/initialization.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/core/vram/layers.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/diffusion/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/diffusion/base_pipeline.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/diffusion/ddim_scheduler.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/diffusion/dmd2.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/diffusion/logger.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/diffusion/parsers.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/diffusion/runner.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/diffusion/template.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/diffusion/training_module.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/aesthetic.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/base.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/bioclip.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/clip.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/fid.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/hpsv2.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/hpsv3.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/image_reward.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/lpips.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/pickscore.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/qwen_image_bench.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/unified_reward_2.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/metrics/unified_reward_edit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ace_step_conditioner.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ace_step_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ace_step_residual_fsq.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ace_step_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ace_step_tokenizer.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ace_step_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/aesthetic.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/anima_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/bioclip.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/boogu_image_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/clip.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/demucs.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/dinov3_image_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ernie_image_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ernie_image_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/fid.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux2_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux2_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux2_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux_controlnet.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux_infiniteyou.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux_ipadapter.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux_lora_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux_lora_patcher.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux_redux.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux_text_encoder_clip.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux_text_encoder_t5.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/flux_value_control.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/general_modules.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/hidream_common.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/hidream_o1_image_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/hpsv2.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/hpsv3.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ideogram4_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ideogram4_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ideogram4_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/image_reward.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/joyai_image_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/joyai_image_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/krea2_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/krea2_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/lingbot_video_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/longcat_video_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/lpips.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ltx2_audio_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ltx2_common.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ltx2_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ltx2_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ltx2_upsampler.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/ltx2_video_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/minimax_h3_audio_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/minimax_h3_dit_comfy.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/minimax_h3_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/minimax_h3_video_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/minimax_music3_condition_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/minimax_music3_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/minimax_music3_rvq_depth_decoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/minimax_music3_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/minimax_music3_vocoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/model_loader.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/mova_audio_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/mova_audio_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/mova_dual_tower_bridge.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/nexus_gen.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/nexus_gen_ar_model.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/nexus_gen_projector.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/pickscore.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/qwen_image_bench.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/qwen_image_controlnet.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/qwen_image_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/qwen_image_image2lora.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/qwen_image_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/qwen_image_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/sd_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/siglip2_image_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/stable_diffusion_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/stable_diffusion_unet.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/stable_diffusion_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/stable_diffusion_xl_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/stable_diffusion_xl_unet.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/step1x_connector.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/step1x_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/unified_reward_2.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/unified_reward_edit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/wan_animate_2_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/wan_video_animate_adapter.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/wan_video_camera_controller.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/wan_video_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/wan_video_dit_s2v.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/wan_video_image_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/wan_video_mot.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/wan_video_motion_controller.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/wan_video_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/wan_video_vace.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/wan_video_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/wantodance.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/wav2vec.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/z_image_controlnet.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/z_image_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/z_image_image2lora.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/models/z_image_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/ace_step.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/anima_image.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/boogu_image.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/ernie_image.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/flux2_image.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/flux_image.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/hidream_o1_image.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/ideogram4.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/joyai_image.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/krea2.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/lingbot_video.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/ltx2_audio_video.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/minimax_music3.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/mova_audio_video.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/qwen_image.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/stable_diffusion.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/stable_diffusion_xl.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/wan_video.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/pipelines/z_image.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/controlnet/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/controlnet/annotator.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/controlnet/controlnet_input.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/data/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/data/audio.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/data/audio_video.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/data/media_io_ltx2.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/data/minimax_h3.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/demucs/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/dequantizer/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/lora/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/lora/flux.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/lora/flux_timestep.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/lora/general.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/lora/krea2.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/lora/merge.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/lora/minimax_h3.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/lora/reset_rank.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/lora/sdxl.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/quant/serialization.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/ses/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/ses/ses.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ace_step_conditioner.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ace_step_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ace_step_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ace_step_tokenizer.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/anima_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/dino_v3.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ernie_image_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux2_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_controlnet.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_infiniteyou.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_ipadapter.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_text_encoder_clip.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_text_encoder_t5.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ideogram4_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/image_metrics.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/joyai_image_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/krea2_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/krea2_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/lingbot_video_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ltx2_audio_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ltx2_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ltx2_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ltx2_video_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/minimax_h3_audio_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/minimax_h3_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/minimax_h3_video_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/minimax_music3_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/nexus_gen.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/nexus_gen_projector.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/qwen_image_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/sdxl.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/sdxl_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/sdxl_text_encoder_2.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/sdxl_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/stable_diffusion_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/stable_diffusion_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/stable_diffusion_xl_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/step1x_connector.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wan_video_animate_adapter.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wan_video_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wan_video_image_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wan_video_mot.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wan_video_vace.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wan_video_vae.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wans2v_audio_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/z_image_dit.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/z_image_text_encoder.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/tile/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/tile/tile_worker.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/xfuser/__init__.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth/utils/xfuser/xdit_context_parallel.py +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth.egg-info/dependency_links.txt +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth.egg-info/requires.txt +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/diffsynth.egg-info/top_level.txt +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/pyproject.toml +0 -0
- {diffsynth-2.1.5 → diffsynth-2.1.6}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: diffsynth
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.6
|
|
4
4
|
Summary: Enjoy the magic of Diffusion models!
|
|
5
5
|
Author: ModelScope Team
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -107,6 +107,10 @@ See also:
|
|
|
107
107
|
|
|
108
108
|
> Currently, the development personnel of this project are limited, with most of the work handled by [Artiprocher](https://github.com/Artiprocher) and [mi804](https://github.com/mi804). Therefore, the progress of new feature development will be relatively slow, and the speed of responding to and resolving issues is limited. We apologize for this and ask developers to understand.
|
|
109
109
|
|
|
110
|
+
- **September 1, 2026** We have integrated [SenseNova-U1.5](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT), SenseTime's unified multimodal model, for which we provide text-to-image generation, image editing, low VRAM inference, and training support. For details, please refer to the [documentation](/docs/en/Model_Details/SenseNova-U1.md) and [example code](/examples/sensenova_u1/).
|
|
111
|
+
|
|
112
|
+
- **August 31, 2026** We have integrated [Qwen-Video-Edit](https://modelscope.cn/models/yunpeng1998/Qwen-Video-Edit), a video editing model developed by open-source community contributor [yunpeng1998](https://github.com/yunpeng1998) based on the image editing model Qwen-Image-Edit. This serves as an excellent example of exploring and expanding model capabilities.
|
|
113
|
+
|
|
110
114
|
- **August 25, 2026** We have open-sourced [DiffSynth-WebUI](https://github.com/modelscope/DiffSynth-WebUI), enabling one-click private deployment of LoRA training services. Combined with the model quantization feature, you can train large models even with consumer-grade GPUs.
|
|
111
115
|
|
|
112
116
|
- **August 19, 2026** We have released the model quantization feature. It provides a unified `QuantizeConfig` entry point supporting multiple quantization backends including bitsandbytes, torchao, and comfy-kitchen, with capabilities such as online quantization, loading pre-quantized weights, mixed quantization, saving quantized models, and quantization + LoRA training. For details, please refer to the [documentation](/docs/en/Pipeline_Usage/Quantization.md).
|
|
@@ -373,6 +377,7 @@ Quick start: experience popular and the latest models:
|
|
|
373
377
|
Model overview:
|
|
374
378
|
|
|
375
379
|
- Image generation
|
|
380
|
+
- SenseNova-U1: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/SenseNova-U1.html), [Example code](/examples/sensenova_u1/)
|
|
376
381
|
- Boogu-Image: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/Boogu-Image.html), [Example code](/examples/boogu_image/)
|
|
377
382
|
- Krea-2: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/Krea-2.html), [Example code](/examples/krea2/)
|
|
378
383
|
- Ideogram 4: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/Ideogram-4.html), [Example code](/examples/ideogram4/)
|
|
@@ -640,6 +645,11 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
|
|
|
640
645
|
|
|
641
646
|
| Architecture | Model ID | Inference | Low VRAM Inference | Full Training | Validation After Full Training | LoRA Training | Validation After LoRA Training |
|
|
642
647
|
|-|-|-|-|-|-|-|-|
|
|
648
|
+
| SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT: T2I](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT.py) |
|
|
649
|
+
| SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT: Edit](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-Edit.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-Edit.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT-Edit.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT-Edit.py) |
|
|
650
|
+
| SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT-LoRAs: 8-step](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT-LoRAs) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-LoRA-8step.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-LoRA-8step.py) | - | - | - | - |
|
|
651
|
+
| SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT-SFT: T2I](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT-SFT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-SFT.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-SFT.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT-SFT.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT-SFT.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT-SFT.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT-SFT.py) |
|
|
652
|
+
| SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT-SFT: Edit](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT-SFT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-SFT-Edit.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-SFT-Edit.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT-SFT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT-SFT-Edit.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT-SFT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT-SFT-Edit.py) |
|
|
643
653
|
| MiniMax-Music3 | [MiniMax/MiniMax-Music3](https://www.modelscope.cn/models/MiniMax/MiniMax-Music3) | [code](/examples/minimax_music3/model_inference/MiniMax-Music3.py) | [code](/examples/minimax_music3/model_inference_low_vram/MiniMax-Music3.py) | — | — | — | — |
|
|
644
654
|
| MiniMax-H3 | [MiniMax/MiniMax-H3: FL2VA](https://www.modelscope.cn/models/MiniMax/MiniMax-H3) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-FL2VA.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-FL2VA.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-FL2VA.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-FL2VA.py) | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-FL2VA.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-FL2VA.py) |
|
|
645
655
|
| MiniMax-H3 | [MiniMax/MiniMax-H3: Ref2VA](https://www.modelscope.cn/models/MiniMax/MiniMax-H3) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-Ref2VA.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-Ref2VA.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-Ref2VA.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-Ref2VA.py) | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-Ref2VA.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-Ref2VA.py) |
|
|
@@ -658,6 +668,7 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
|
|
|
658
668
|
| MiniMax-H3 | [Comfy-Org/MiniMax-H3: Ref2VA pruned fp8](https://www.modelscope.cn/models/Comfy-Org/MiniMax-H3) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-FP8-Pruned-Ref2VA.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-FP8-Pruned-Ref2VA.py) | - | - | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-FP8-Pruned-Ref2VA.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-FP8-Pruned-Ref2VA.py) |
|
|
659
669
|
| MiniMax-H3 | [lightx2v/Minimax-h3-Turbo: FL2VA 4steps](https://www.modelscope.cn/models/lightx2v/Minimax-h3-Turbo) | [code](https://github.com/modelscope/DiffSynth-Studio/blob/main/examples/minimax_h3/model_inference/MiniMax-H3-FL2VA-Turbo.py) | [code](https://github.com/modelscope/DiffSynth-Studio/blob/main/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-FL2VA-Turbo.py) | - | - | - | - |
|
|
660
670
|
| MiniMax-H3 | [DiffSynth-Studio/MiniMax-H3-Text-Embeddings](https://www.modelscope.cn/models/DiffSynth-Studio/MiniMax-H3-Text-Embeddings) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-Text-Embeddings.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-Text-Embeddings.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-Text-Embeddings.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-Text-Embeddings.py) | - | - |
|
|
671
|
+
| MiniMax-H3 | [PAI/MiniMax-H3-Fun-Controlnet-Union](https://www.modelscope.cn/models/PAI/MiniMax-H3-Fun-Controlnet-Union) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-Fun-Controlnet-Union.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-Fun-Controlnet-Union.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-Fun-Controlnet-Union.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-Fun-Controlnet-Union.py) | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-Fun-Controlnet-Union.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-Fun-Controlnet-Union.py) |
|
|
661
672
|
| LingBot-Video | [Robbyant/lingbot-video-dense-1.3b: T2V](https://modelscope.cn/models/Robbyant/lingbot-video-dense-1.3b) | [code](/examples/lingbot_video/model_inference/lingbot-video-dense-1.3b_t2v.py) | [code](/examples/lingbot_video/model_inference_low_vram/lingbot-video-dense-1.3b_t2v.py) | [code](/examples/lingbot_video/model_training/full/lingbot-video-dense-1.3b_t2v.sh) | [code](/examples/lingbot_video/model_training/validate_full/lingbot-video-dense-1.3b_t2v.py) | [code](/examples/lingbot_video/model_training/lora/lingbot-video-dense-1.3b_t2v.sh) | [code](/examples/lingbot_video/model_training/validate_lora/lingbot-video-dense-1.3b_t2v.py) |
|
|
662
673
|
| LingBot-Video | [Robbyant/lingbot-video-dense-1.3b: TI2V](https://modelscope.cn/models/Robbyant/lingbot-video-dense-1.3b) | [code](/examples/lingbot_video/model_inference/lingbot-video-dense-1.3b_ti2v.py) | [code](/examples/lingbot_video/model_inference_low_vram/lingbot-video-dense-1.3b_ti2v.py) | [code](/examples/lingbot_video/model_training/full/lingbot-video-dense-1.3b_ti2v.sh) | [code](/examples/lingbot_video/model_training/validate_full/lingbot-video-dense-1.3b_ti2v.py) | [code](/examples/lingbot_video/model_training/lora/lingbot-video-dense-1.3b_ti2v.sh) | [code](/examples/lingbot_video/model_training/validate_lora/lingbot-video-dense-1.3b_ti2v.py) |
|
|
663
674
|
| LingBot-Video | [Robbyant/lingbot-video-dense-1.3b: T2I](https://modelscope.cn/models/Robbyant/lingbot-video-dense-1.3b) | [code](/examples/lingbot_video/model_inference/lingbot-video-dense-1.3b_t2i.py) | [code](/examples/lingbot_video/model_inference_low_vram/lingbot-video-dense-1.3b_t2i.py) | - | - | - | - |
|
|
@@ -764,6 +775,7 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
|
|
|
764
775
|
| Qwen-Image | [DiffSynth-Studio/Qwen-Image-In-Context-Control-Union](https://www.modelscope.cn/models/DiffSynth-Studio/Qwen-Image-In-Context-Control-Union) | [code](/examples/qwen_image/model_inference/Qwen-Image-In-Context-Control-Union.py) | [code](/examples/qwen_image/model_inference_low_vram/Qwen-Image-In-Context-Control-Union.py) | - | - | [code](/examples/qwen_image/model_training/lora/Qwen-Image-In-Context-Control-Union.sh) | [code](/examples/qwen_image/model_training/validate_lora/Qwen-Image-In-Context-Control-Union.py) |
|
|
765
776
|
| Qwen-Image | [DiffSynth-Studio/Qwen-Image-Edit-Lowres-Fix](https://www.modelscope.cn/models/DiffSynth-Studio/Qwen-Image-Edit-Lowres-Fix) | [code](/examples/qwen_image/model_inference/Qwen-Image-Edit-Lowres-Fix.py) | [code](/examples/qwen_image/model_inference_low_vram/Qwen-Image-Edit-Lowres-Fix.py) | - | - | - | - |
|
|
766
777
|
| Qwen-Image | [DiffSynth-Studio/Qwen-Image-i2L](https://www.modelscope.cn/models/DiffSynth-Studio/Qwen-Image-i2L) | [code](/examples/qwen_image/model_inference/Qwen-Image-i2L.py) | [code](/examples/qwen_image/model_inference_low_vram/Qwen-Image-i2L.py) | - | - | - | - |
|
|
778
|
+
| Qwen-Video-Edit | [yunpeng1998/Qwen-Video-Edit](https://www.modelscope.cn/models/yunpeng1998/Qwen-Video-Edit) | [code](/examples/qwen_video_edit/model_inference/Qwen-Video-Edit.py) | [code](/examples/qwen_video_edit/model_inference_low_vram/Qwen-Video-Edit.py) | [code](/examples/qwen_video_edit/model_training/full/Qwen-Video-Edit.sh) | [code](/examples/qwen_video_edit/model_training/validate_full/Qwen-Video-Edit.py) | [code](/examples/qwen_video_edit/model_training/lora/Qwen-Video-Edit.sh) | [code](/examples/qwen_video_edit/model_training/validate_lora/Qwen-Video-Edit.py) |
|
|
767
779
|
| Wan | [Wan-AI/Wan2.1-T2V-1.3B](https://modelscope.cn/models/Wan-AI/Wan2.1-T2V-1.3B) | [code](/examples/wanvideo/model_inference/Wan2.1-T2V-1.3B.py) | [code](/examples/wanvideo/model_inference_low_vram/Wan2.1-T2V-1.3B.py) | [code](/examples/wanvideo/model_training/full/Wan2.1-T2V-1.3B.sh) | [code](/examples/wanvideo/model_training/validate_full/Wan2.1-T2V-1.3B.py) | [code](/examples/wanvideo/model_training/lora/Wan2.1-T2V-1.3B.sh) | [code](/examples/wanvideo/model_training/validate_lora/Wan2.1-T2V-1.3B.py) |
|
|
768
780
|
| Wan | [Wan-AI/Wan2.1-T2V-14B](https://modelscope.cn/models/Wan-AI/Wan2.1-T2V-14B) | [code](/examples/wanvideo/model_inference/Wan2.1-T2V-14B.py) | [code](/examples/wanvideo/model_inference_low_vram/Wan2.1-T2V-14B.py) | [code](/examples/wanvideo/model_training/full/Wan2.1-T2V-14B.sh) | [code](/examples/wanvideo/model_training/validate_full/Wan2.1-T2V-14B.py) | [code](/examples/wanvideo/model_training/lora/Wan2.1-T2V-14B.sh) | [code](/examples/wanvideo/model_training/validate_lora/Wan2.1-T2V-14B.py) |
|
|
769
781
|
| Wan | [Wan-AI/Wan2.1-I2V-14B-480P](https://modelscope.cn/models/Wan-AI/Wan2.1-I2V-14B-480P) | [code](/examples/wanvideo/model_inference/Wan2.1-I2V-14B-480P.py) | [code](/examples/wanvideo/model_inference_low_vram/Wan2.1-I2V-14B-480P.py) | [code](/examples/wanvideo/model_training/full/Wan2.1-I2V-14B-480P.sh) | [code](/examples/wanvideo/model_training/validate_full/Wan2.1-I2V-14B-480P.py) | [code](/examples/wanvideo/model_training/lora/Wan2.1-I2V-14B-480P.sh) | [code](/examples/wanvideo/model_training/validate_lora/Wan2.1-I2V-14B-480P.py) |
|
|
@@ -40,6 +40,10 @@ See also:
|
|
|
40
40
|
|
|
41
41
|
> Currently, the development personnel of this project are limited, with most of the work handled by [Artiprocher](https://github.com/Artiprocher) and [mi804](https://github.com/mi804). Therefore, the progress of new feature development will be relatively slow, and the speed of responding to and resolving issues is limited. We apologize for this and ask developers to understand.
|
|
42
42
|
|
|
43
|
+
- **September 1, 2026** We have integrated [SenseNova-U1.5](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT), SenseTime's unified multimodal model, for which we provide text-to-image generation, image editing, low VRAM inference, and training support. For details, please refer to the [documentation](/docs/en/Model_Details/SenseNova-U1.md) and [example code](/examples/sensenova_u1/).
|
|
44
|
+
|
|
45
|
+
- **August 31, 2026** We have integrated [Qwen-Video-Edit](https://modelscope.cn/models/yunpeng1998/Qwen-Video-Edit), a video editing model developed by open-source community contributor [yunpeng1998](https://github.com/yunpeng1998) based on the image editing model Qwen-Image-Edit. This serves as an excellent example of exploring and expanding model capabilities.
|
|
46
|
+
|
|
43
47
|
- **August 25, 2026** We have open-sourced [DiffSynth-WebUI](https://github.com/modelscope/DiffSynth-WebUI), enabling one-click private deployment of LoRA training services. Combined with the model quantization feature, you can train large models even with consumer-grade GPUs.
|
|
44
48
|
|
|
45
49
|
- **August 19, 2026** We have released the model quantization feature. It provides a unified `QuantizeConfig` entry point supporting multiple quantization backends including bitsandbytes, torchao, and comfy-kitchen, with capabilities such as online quantization, loading pre-quantized weights, mixed quantization, saving quantized models, and quantization + LoRA training. For details, please refer to the [documentation](/docs/en/Pipeline_Usage/Quantization.md).
|
|
@@ -306,6 +310,7 @@ Quick start: experience popular and the latest models:
|
|
|
306
310
|
Model overview:
|
|
307
311
|
|
|
308
312
|
- Image generation
|
|
313
|
+
- SenseNova-U1: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/SenseNova-U1.html), [Example code](/examples/sensenova_u1/)
|
|
309
314
|
- Boogu-Image: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/Boogu-Image.html), [Example code](/examples/boogu_image/)
|
|
310
315
|
- Krea-2: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/Krea-2.html), [Example code](/examples/krea2/)
|
|
311
316
|
- Ideogram 4: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/Ideogram-4.html), [Example code](/examples/ideogram4/)
|
|
@@ -573,6 +578,11 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
|
|
|
573
578
|
|
|
574
579
|
| Architecture | Model ID | Inference | Low VRAM Inference | Full Training | Validation After Full Training | LoRA Training | Validation After LoRA Training |
|
|
575
580
|
|-|-|-|-|-|-|-|-|
|
|
581
|
+
| SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT: T2I](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT.py) |
|
|
582
|
+
| SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT: Edit](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-Edit.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-Edit.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT-Edit.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT-Edit.py) |
|
|
583
|
+
| SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT-LoRAs: 8-step](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT-LoRAs) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-LoRA-8step.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-LoRA-8step.py) | - | - | - | - |
|
|
584
|
+
| SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT-SFT: T2I](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT-SFT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-SFT.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-SFT.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT-SFT.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT-SFT.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT-SFT.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT-SFT.py) |
|
|
585
|
+
| SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT-SFT: Edit](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT-SFT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-SFT-Edit.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-SFT-Edit.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT-SFT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT-SFT-Edit.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT-SFT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT-SFT-Edit.py) |
|
|
576
586
|
| MiniMax-Music3 | [MiniMax/MiniMax-Music3](https://www.modelscope.cn/models/MiniMax/MiniMax-Music3) | [code](/examples/minimax_music3/model_inference/MiniMax-Music3.py) | [code](/examples/minimax_music3/model_inference_low_vram/MiniMax-Music3.py) | — | — | — | — |
|
|
577
587
|
| MiniMax-H3 | [MiniMax/MiniMax-H3: FL2VA](https://www.modelscope.cn/models/MiniMax/MiniMax-H3) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-FL2VA.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-FL2VA.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-FL2VA.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-FL2VA.py) | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-FL2VA.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-FL2VA.py) |
|
|
578
588
|
| MiniMax-H3 | [MiniMax/MiniMax-H3: Ref2VA](https://www.modelscope.cn/models/MiniMax/MiniMax-H3) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-Ref2VA.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-Ref2VA.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-Ref2VA.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-Ref2VA.py) | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-Ref2VA.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-Ref2VA.py) |
|
|
@@ -591,6 +601,7 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
|
|
|
591
601
|
| MiniMax-H3 | [Comfy-Org/MiniMax-H3: Ref2VA pruned fp8](https://www.modelscope.cn/models/Comfy-Org/MiniMax-H3) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-FP8-Pruned-Ref2VA.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-FP8-Pruned-Ref2VA.py) | - | - | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-FP8-Pruned-Ref2VA.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-FP8-Pruned-Ref2VA.py) |
|
|
592
602
|
| MiniMax-H3 | [lightx2v/Minimax-h3-Turbo: FL2VA 4steps](https://www.modelscope.cn/models/lightx2v/Minimax-h3-Turbo) | [code](https://github.com/modelscope/DiffSynth-Studio/blob/main/examples/minimax_h3/model_inference/MiniMax-H3-FL2VA-Turbo.py) | [code](https://github.com/modelscope/DiffSynth-Studio/blob/main/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-FL2VA-Turbo.py) | - | - | - | - |
|
|
593
603
|
| MiniMax-H3 | [DiffSynth-Studio/MiniMax-H3-Text-Embeddings](https://www.modelscope.cn/models/DiffSynth-Studio/MiniMax-H3-Text-Embeddings) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-Text-Embeddings.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-Text-Embeddings.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-Text-Embeddings.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-Text-Embeddings.py) | - | - |
|
|
604
|
+
| MiniMax-H3 | [PAI/MiniMax-H3-Fun-Controlnet-Union](https://www.modelscope.cn/models/PAI/MiniMax-H3-Fun-Controlnet-Union) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-Fun-Controlnet-Union.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-Fun-Controlnet-Union.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-Fun-Controlnet-Union.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-Fun-Controlnet-Union.py) | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-Fun-Controlnet-Union.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-Fun-Controlnet-Union.py) |
|
|
594
605
|
| LingBot-Video | [Robbyant/lingbot-video-dense-1.3b: T2V](https://modelscope.cn/models/Robbyant/lingbot-video-dense-1.3b) | [code](/examples/lingbot_video/model_inference/lingbot-video-dense-1.3b_t2v.py) | [code](/examples/lingbot_video/model_inference_low_vram/lingbot-video-dense-1.3b_t2v.py) | [code](/examples/lingbot_video/model_training/full/lingbot-video-dense-1.3b_t2v.sh) | [code](/examples/lingbot_video/model_training/validate_full/lingbot-video-dense-1.3b_t2v.py) | [code](/examples/lingbot_video/model_training/lora/lingbot-video-dense-1.3b_t2v.sh) | [code](/examples/lingbot_video/model_training/validate_lora/lingbot-video-dense-1.3b_t2v.py) |
|
|
595
606
|
| LingBot-Video | [Robbyant/lingbot-video-dense-1.3b: TI2V](https://modelscope.cn/models/Robbyant/lingbot-video-dense-1.3b) | [code](/examples/lingbot_video/model_inference/lingbot-video-dense-1.3b_ti2v.py) | [code](/examples/lingbot_video/model_inference_low_vram/lingbot-video-dense-1.3b_ti2v.py) | [code](/examples/lingbot_video/model_training/full/lingbot-video-dense-1.3b_ti2v.sh) | [code](/examples/lingbot_video/model_training/validate_full/lingbot-video-dense-1.3b_ti2v.py) | [code](/examples/lingbot_video/model_training/lora/lingbot-video-dense-1.3b_ti2v.sh) | [code](/examples/lingbot_video/model_training/validate_lora/lingbot-video-dense-1.3b_ti2v.py) |
|
|
596
607
|
| LingBot-Video | [Robbyant/lingbot-video-dense-1.3b: T2I](https://modelscope.cn/models/Robbyant/lingbot-video-dense-1.3b) | [code](/examples/lingbot_video/model_inference/lingbot-video-dense-1.3b_t2i.py) | [code](/examples/lingbot_video/model_inference_low_vram/lingbot-video-dense-1.3b_t2i.py) | - | - | - | - |
|
|
@@ -697,6 +708,7 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
|
|
|
697
708
|
| Qwen-Image | [DiffSynth-Studio/Qwen-Image-In-Context-Control-Union](https://www.modelscope.cn/models/DiffSynth-Studio/Qwen-Image-In-Context-Control-Union) | [code](/examples/qwen_image/model_inference/Qwen-Image-In-Context-Control-Union.py) | [code](/examples/qwen_image/model_inference_low_vram/Qwen-Image-In-Context-Control-Union.py) | - | - | [code](/examples/qwen_image/model_training/lora/Qwen-Image-In-Context-Control-Union.sh) | [code](/examples/qwen_image/model_training/validate_lora/Qwen-Image-In-Context-Control-Union.py) |
|
|
698
709
|
| Qwen-Image | [DiffSynth-Studio/Qwen-Image-Edit-Lowres-Fix](https://www.modelscope.cn/models/DiffSynth-Studio/Qwen-Image-Edit-Lowres-Fix) | [code](/examples/qwen_image/model_inference/Qwen-Image-Edit-Lowres-Fix.py) | [code](/examples/qwen_image/model_inference_low_vram/Qwen-Image-Edit-Lowres-Fix.py) | - | - | - | - |
|
|
699
710
|
| Qwen-Image | [DiffSynth-Studio/Qwen-Image-i2L](https://www.modelscope.cn/models/DiffSynth-Studio/Qwen-Image-i2L) | [code](/examples/qwen_image/model_inference/Qwen-Image-i2L.py) | [code](/examples/qwen_image/model_inference_low_vram/Qwen-Image-i2L.py) | - | - | - | - |
|
|
711
|
+
| Qwen-Video-Edit | [yunpeng1998/Qwen-Video-Edit](https://www.modelscope.cn/models/yunpeng1998/Qwen-Video-Edit) | [code](/examples/qwen_video_edit/model_inference/Qwen-Video-Edit.py) | [code](/examples/qwen_video_edit/model_inference_low_vram/Qwen-Video-Edit.py) | [code](/examples/qwen_video_edit/model_training/full/Qwen-Video-Edit.sh) | [code](/examples/qwen_video_edit/model_training/validate_full/Qwen-Video-Edit.py) | [code](/examples/qwen_video_edit/model_training/lora/Qwen-Video-Edit.sh) | [code](/examples/qwen_video_edit/model_training/validate_lora/Qwen-Video-Edit.py) |
|
|
700
712
|
| Wan | [Wan-AI/Wan2.1-T2V-1.3B](https://modelscope.cn/models/Wan-AI/Wan2.1-T2V-1.3B) | [code](/examples/wanvideo/model_inference/Wan2.1-T2V-1.3B.py) | [code](/examples/wanvideo/model_inference_low_vram/Wan2.1-T2V-1.3B.py) | [code](/examples/wanvideo/model_training/full/Wan2.1-T2V-1.3B.sh) | [code](/examples/wanvideo/model_training/validate_full/Wan2.1-T2V-1.3B.py) | [code](/examples/wanvideo/model_training/lora/Wan2.1-T2V-1.3B.sh) | [code](/examples/wanvideo/model_training/validate_lora/Wan2.1-T2V-1.3B.py) |
|
|
701
713
|
| Wan | [Wan-AI/Wan2.1-T2V-14B](https://modelscope.cn/models/Wan-AI/Wan2.1-T2V-14B) | [code](/examples/wanvideo/model_inference/Wan2.1-T2V-14B.py) | [code](/examples/wanvideo/model_inference_low_vram/Wan2.1-T2V-14B.py) | [code](/examples/wanvideo/model_training/full/Wan2.1-T2V-14B.sh) | [code](/examples/wanvideo/model_training/validate_full/Wan2.1-T2V-14B.py) | [code](/examples/wanvideo/model_training/lora/Wan2.1-T2V-14B.sh) | [code](/examples/wanvideo/model_training/validate_lora/Wan2.1-T2V-14B.py) |
|
|
702
714
|
| Wan | [Wan-AI/Wan2.1-I2V-14B-480P](https://modelscope.cn/models/Wan-AI/Wan2.1-I2V-14B-480P) | [code](/examples/wanvideo/model_inference/Wan2.1-I2V-14B-480P.py) | [code](/examples/wanvideo/model_inference_low_vram/Wan2.1-I2V-14B-480P.py) | [code](/examples/wanvideo/model_training/full/Wan2.1-I2V-14B-480P.sh) | [code](/examples/wanvideo/model_training/validate_full/Wan2.1-I2V-14B-480P.py) | [code](/examples/wanvideo/model_training/lora/Wan2.1-I2V-14B-480P.sh) | [code](/examples/wanvideo/model_training/validate_lora/Wan2.1-I2V-14B-480P.py) |
|
|
@@ -80,6 +80,23 @@ qwen_image_series = [
|
|
|
80
80
|
},
|
|
81
81
|
]
|
|
82
82
|
|
|
83
|
+
qwen_video_edit_series = [
|
|
84
|
+
{
|
|
85
|
+
# Example: ModelConfig(model_id="yunpeng1998/Qwen-Video-Edit", origin_file_pattern="360P/step-30000.safetensors")
|
|
86
|
+
"model_hash": "8ae0ca4ab286d00197f08986c7fbbade",
|
|
87
|
+
"model_name": "qwen_video_edit_dit",
|
|
88
|
+
"model_class": "diffsynth.models.qwen_image_dit.QwenImageDiT",
|
|
89
|
+
"state_dict_converter": "diffsynth.utils.state_dict_converters.qwen_video_edit.QwenVideoEditDiTStateDictConverter",
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
# Example: ModelConfig(model_id="yunpeng1998/Qwen-Video-Edit", origin_file_pattern="360P/step-30000.safetensors")
|
|
93
|
+
"model_hash": "8ae0ca4ab286d00197f08986c7fbbade",
|
|
94
|
+
"model_name": "qwen_video_edit_adapter",
|
|
95
|
+
"model_class": "diffsynth.models.qwen_video_edit_dit.QwenVideoEditAdapter",
|
|
96
|
+
"state_dict_converter": "diffsynth.utils.state_dict_converters.qwen_video_edit.QwenVideoEditAdapterStateDictConverter",
|
|
97
|
+
},
|
|
98
|
+
]
|
|
99
|
+
|
|
83
100
|
wan_series = [
|
|
84
101
|
{
|
|
85
102
|
# Example: ModelConfig(model_id="Wan-AI/Wan2.2-Animate-2-14B", origin_file_pattern="wan_animate_2/wan_animate_2_bf16.safetensors")
|
|
@@ -1509,6 +1526,14 @@ minimax_h3_series = [
|
|
|
1509
1526
|
"quant_config": {"method": "bitsandbytes_nf4", "load_prequantized": True},
|
|
1510
1527
|
"state_dict_converter": "diffsynth.utils.state_dict_converters.minimax_h3_audio_vae.MiniMaxH3AudioVAEStateDictConverter"
|
|
1511
1528
|
},
|
|
1529
|
+
{
|
|
1530
|
+
# Example: ModelConfig(model_id="PAI/MiniMax-H3-Fun-Controlnet-Union", origin_file_pattern="MiniMax-H3-Fun-Controlnet-Union.safetensors")
|
|
1531
|
+
"model_hash": "91179e6f6150c072cd8e5fa29f58576e",
|
|
1532
|
+
"model_name": "minimax_h3_controlnet",
|
|
1533
|
+
"model_class": "diffsynth.models.minimax_h3_controlnet.MiniMaxH3ControlNet",
|
|
1534
|
+
"extra_kwargs": {'control_layers': (0, 10, 20, 30, 40), 'control_in_dim': 49, 'control_apply_audio': False, 'hidden_size': 5376, 'num_attention_heads': 56, 'attention_head_dim': 128, 'ffn_hidden_size': 14336, 'time_embed_dim': 2688, 'adaln_out_features': 96768, 'patch_size': (1, 2, 2), 'norm_eps': 1e-05, 'qk_norm_eps': 1e-05},
|
|
1535
|
+
"state_dict_converter": "diffsynth.utils.state_dict_converters.minimax_h3_controlnet.MiniMaxH3ControlNetStateDictConverter"
|
|
1536
|
+
},
|
|
1512
1537
|
]
|
|
1513
1538
|
|
|
1514
1539
|
minimax_music3_series = [
|
|
@@ -1545,8 +1570,17 @@ minimax_music3_series = [
|
|
|
1545
1570
|
},
|
|
1546
1571
|
]
|
|
1547
1572
|
|
|
1573
|
+
sensenova_u1_series = [
|
|
1574
|
+
{
|
|
1575
|
+
# Example: ModelConfig(model_id="SenseNova/SenseNova-U1.5-8B-MoT", origin_file_pattern="model*.safetensors")
|
|
1576
|
+
"model_hash": "90bb0c235120a99ea78f9912471de82a",
|
|
1577
|
+
"model_name": "sensenova_u1_dit",
|
|
1578
|
+
"model_class": "diffsynth.models.sensenova_u1_dit.SenseNovaU1DiT",
|
|
1579
|
+
},
|
|
1580
|
+
]
|
|
1581
|
+
|
|
1548
1582
|
MODEL_CONFIGS = (
|
|
1549
|
-
stable_diffusion_xl_series + stable_diffusion_series + qwen_image_series + wan_series + flux_series + flux2_series + ernie_image_series
|
|
1583
|
+
stable_diffusion_xl_series + stable_diffusion_series + qwen_image_series + qwen_video_edit_series + wan_series + flux_series + flux2_series + ernie_image_series
|
|
1550
1584
|
+ z_image_series + ltx2_series + anima_series + mova_series + joyai_image_series + boogu_image_series + ace_step_series + hidream_o1_image_series
|
|
1551
|
-
+ image_metrics_series + ideogram4_series + krea2_series + lingbot_video_series + minimax_h3_series + minimax_music3_series
|
|
1585
|
+
+ image_metrics_series + ideogram4_series + krea2_series + lingbot_video_series + minimax_h3_series + minimax_music3_series + sensenova_u1_series
|
|
1552
1586
|
)
|
|
@@ -62,6 +62,10 @@ VRAM_MANAGEMENT_MODULE_MAPS = {
|
|
|
62
62
|
"torch.nn.Linear": "diffsynth.core.vram.layers.AutoWrappedLinear",
|
|
63
63
|
"torch.nn.Embedding": "diffsynth.core.vram.layers.AutoWrappedModule",
|
|
64
64
|
},
|
|
65
|
+
"diffsynth.models.qwen_video_edit_dit.QwenVideoEditAdapter": {
|
|
66
|
+
"torch.nn.Linear": "diffsynth.core.vram.layers.AutoWrappedLinear",
|
|
67
|
+
"torch.nn.Conv3d": "diffsynth.core.vram.layers.AutoWrappedModule",
|
|
68
|
+
},
|
|
65
69
|
"diffsynth.models.qwen_image_text_encoder.QwenImageTextEncoder": {
|
|
66
70
|
"torch.nn.Linear": "diffsynth.core.vram.layers.AutoWrappedLinear",
|
|
67
71
|
"torch.nn.Embedding": "diffsynth.core.vram.layers.AutoWrappedModule",
|
|
@@ -496,6 +500,18 @@ VRAM_MANAGEMENT_MODULE_MAPS = {
|
|
|
496
500
|
"torch.nn.Embedding": "diffsynth.core.vram.layers.AutoWrappedModule",
|
|
497
501
|
"transformers.models.qwen3.modeling_qwen3.Qwen3RMSNorm": "diffsynth.core.vram.layers.AutoWrappedModule",
|
|
498
502
|
},
|
|
503
|
+
"diffsynth.models.minimax_h3_controlnet.MiniMaxH3ControlNet": {
|
|
504
|
+
"torch.nn.Linear": "diffsynth.core.vram.layers.AutoWrappedLinear",
|
|
505
|
+
"torch.nn.RMSNorm": "diffsynth.core.vram.layers.AutoWrappedModule",
|
|
506
|
+
},
|
|
507
|
+
"diffsynth.models.sensenova_u1_dit.SenseNovaU1DiT": {
|
|
508
|
+
"diffsynth.models.sensenova_u1_dit.SenseNovaU1TimestepEmbedder": "diffsynth.core.vram.layers.AutoWrappedModule",
|
|
509
|
+
"diffsynth.models.sensenova_u1_dit.SenseNovaU1VisionEmbeddings": "diffsynth.core.vram.layers.AutoWrappedModule",
|
|
510
|
+
"torch.nn.Linear": "diffsynth.core.vram.layers.AutoWrappedLinear",
|
|
511
|
+
"torch.nn.Embedding": "diffsynth.core.vram.layers.AutoWrappedModule",
|
|
512
|
+
"torch.nn.Conv2d": "diffsynth.core.vram.layers.AutoWrappedModule",
|
|
513
|
+
"diffsynth.models.sensenova_u1_dit.SenseNovaU1RMSNorm": "diffsynth.core.vram.layers.AutoWrappedModule",
|
|
514
|
+
},
|
|
499
515
|
}
|
|
500
516
|
|
|
501
517
|
def QwenImageTextEncoder_Module_Map_Updater():
|
|
@@ -5,7 +5,7 @@ from typing_extensions import Literal
|
|
|
5
5
|
|
|
6
6
|
class FlowMatchScheduler():
|
|
7
7
|
|
|
8
|
-
def __init__(self, template: Literal["FLUX.1", "Wan", "Qwen-Image", "FLUX.2", "Z-Image", "LTX-2", "Qwen-Image-Lightning", "ERNIE-Image", "ACE-Step", "Ideogram4", "Krea-2", "Boogu", "MiniMax-H3", "MiniMax-Music3", "LingBot-Video"] = "FLUX.1"):
|
|
8
|
+
def __init__(self, template: Literal["FLUX.1", "Wan", "Qwen-Image", "FLUX.2", "Z-Image", "LTX-2", "Qwen-Image-Lightning", "ERNIE-Image", "ACE-Step", "Ideogram4", "Krea-2", "Boogu", "MiniMax-H3", "MiniMax-Music3", "LingBot-Video", "SenseNova-U1"] = "FLUX.1"):
|
|
9
9
|
self.set_timesteps_fn = {
|
|
10
10
|
"FLUX.1": FlowMatchScheduler.set_timesteps_flux,
|
|
11
11
|
"Wan": FlowMatchScheduler.set_timesteps_wan,
|
|
@@ -23,6 +23,7 @@ class FlowMatchScheduler():
|
|
|
23
23
|
"MiniMax-H3": FlowMatchScheduler.set_timesteps_minimax_h3,
|
|
24
24
|
"MiniMax-Music3": FlowMatchScheduler.set_timesteps_minimax_music3,
|
|
25
25
|
"LingBot-Video": FlowMatchScheduler.set_timesteps_lingbot_video,
|
|
26
|
+
"SenseNova-U1": FlowMatchScheduler.set_timesteps_sensenova_u1,
|
|
26
27
|
}.get(template, FlowMatchScheduler.set_timesteps_flux)
|
|
27
28
|
self.num_train_timesteps = 1000
|
|
28
29
|
|
|
@@ -173,6 +174,15 @@ class FlowMatchScheduler():
|
|
|
173
174
|
timesteps = sigmas * num_train_timesteps
|
|
174
175
|
return sigmas, timesteps
|
|
175
176
|
|
|
177
|
+
@staticmethod
|
|
178
|
+
def set_timesteps_sensenova_u1(num_inference_steps=50, denoising_strength=1.0, shift=3.0):
|
|
179
|
+
num_train_timesteps = 1000
|
|
180
|
+
sigmas = torch.linspace(denoising_strength, 0.0, num_inference_steps + 1)[:-1]
|
|
181
|
+
if shift is not None and shift != 1.0:
|
|
182
|
+
sigmas = shift * sigmas / (1 + (shift - 1) * sigmas)
|
|
183
|
+
timesteps = sigmas * num_train_timesteps
|
|
184
|
+
return sigmas, timesteps
|
|
185
|
+
|
|
176
186
|
@staticmethod
|
|
177
187
|
def set_timesteps_ace_step(num_inference_steps=8, denoising_strength=1.0, shift=3.0):
|
|
178
188
|
num_train_timesteps = 1000
|
|
@@ -63,7 +63,7 @@ def FlowMatchSFTAudioVideoLoss(pipe: BasePipeline, **inputs):
|
|
|
63
63
|
return loss
|
|
64
64
|
|
|
65
65
|
|
|
66
|
-
def FlowMatchSFTMiniMaxH3AudioVideoLoss(pipe: BasePipeline, training_cfg_scale: float = 1.0, inputs_nega: dict | None = None, **inputs):
|
|
66
|
+
def FlowMatchSFTMiniMaxH3AudioVideoLoss(pipe: BasePipeline, training_cfg_scale: float = 1.0, audio_loss_weight: float = 1.0, inputs_nega: dict | None = None, **inputs):
|
|
67
67
|
max_timestep_boundary = int(inputs.get("max_timestep_boundary", 1) * len(pipe.scheduler.timesteps))
|
|
68
68
|
min_timestep_boundary = int(inputs.get("min_timestep_boundary", 0) * len(pipe.scheduler.timesteps))
|
|
69
69
|
|
|
@@ -113,7 +113,7 @@ def FlowMatchSFTMiniMaxH3AudioVideoLoss(pipe: BasePipeline, training_cfg_scale:
|
|
|
113
113
|
loss = loss * pipe.scheduler.training_weight(timestep_video)
|
|
114
114
|
if "audio_input_latents" in inputs:
|
|
115
115
|
loss_audio = torch.nn.functional.mse_loss(noise_pred_audio.float(), training_target_audio.float())
|
|
116
|
-
loss_audio = loss_audio * pipe.scheduler_audio.training_weight(timestep_audio)
|
|
116
|
+
loss_audio = loss_audio * pipe.scheduler_audio.training_weight(timestep_audio) * audio_loss_weight
|
|
117
117
|
loss = loss + loss_audio
|
|
118
118
|
return loss
|
|
119
119
|
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import torch
|
|
2
|
+
import torch.nn as nn
|
|
3
|
+
|
|
4
|
+
from ..core.gradient import gradient_checkpoint_forward
|
|
5
|
+
from .minimax_h3_dit import MiniMaxH3DiTBlock, _PATCH_H, _PATCH_T, _PATCH_W
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class MiniMaxH3ControlNetBlock(MiniMaxH3DiTBlock):
|
|
9
|
+
def __init__(self, hidden_size, num_attention_heads, attention_head_dim, ffn_hidden_size, time_embed_dim, adaln_out_features, norm_eps, qk_norm_eps, block_id=0):
|
|
10
|
+
super().__init__(hidden_size, num_attention_heads, attention_head_dim, ffn_hidden_size, time_embed_dim, adaln_out_features, norm_eps, qk_norm_eps)
|
|
11
|
+
self.block_id = block_id
|
|
12
|
+
if block_id == 0:
|
|
13
|
+
self.before_proj = nn.Linear(hidden_size, hidden_size)
|
|
14
|
+
self.after_proj = nn.Linear(hidden_size, hidden_size)
|
|
15
|
+
|
|
16
|
+
def forward(self, c, x, *, t_emb, combined_indices, rope_freqs, cu_seqlens, max_seqlen):
|
|
17
|
+
if self.block_id == 0:
|
|
18
|
+
c = self.before_proj(c) + x
|
|
19
|
+
all_c = []
|
|
20
|
+
else:
|
|
21
|
+
all_c = list(torch.unbind(c))
|
|
22
|
+
c = all_c.pop(-1)
|
|
23
|
+
c = super().forward(c, t_emb=t_emb, combined_indices=combined_indices, rope_freqs=rope_freqs, cu_seqlens=cu_seqlens, max_seqlen=max_seqlen)
|
|
24
|
+
c_skip = self.after_proj(c)
|
|
25
|
+
all_c += [c_skip, c]
|
|
26
|
+
return torch.stack(all_c)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class MiniMaxH3ControlNet(nn.Module):
|
|
30
|
+
_repeated_blocks = ["MiniMaxH3ControlNetBlock"]
|
|
31
|
+
|
|
32
|
+
def __init__(
|
|
33
|
+
self,
|
|
34
|
+
control_layers: tuple = (0, 10, 20, 30, 40),
|
|
35
|
+
control_in_dim: int = 49,
|
|
36
|
+
control_apply_audio: bool = False,
|
|
37
|
+
hidden_size: int = 5376,
|
|
38
|
+
num_attention_heads: int = 56,
|
|
39
|
+
attention_head_dim: int = 128,
|
|
40
|
+
ffn_hidden_size: int = 14336,
|
|
41
|
+
time_embed_dim: int = 2688,
|
|
42
|
+
adaln_out_features: int = 96768,
|
|
43
|
+
patch_size: tuple = (1, 2, 2),
|
|
44
|
+
norm_eps: float = 1e-5,
|
|
45
|
+
qk_norm_eps: float = 1e-5,
|
|
46
|
+
**kwargs,
|
|
47
|
+
):
|
|
48
|
+
super().__init__()
|
|
49
|
+
self.control_layers = tuple(sorted({int(i) for i in control_layers}))
|
|
50
|
+
if not self.control_layers or self.control_layers[0] != 0:
|
|
51
|
+
raise ValueError(f"control_layers must start at layer 0 so the control stream is re-based on the main branch's input embeddings, got {self.control_layers}")
|
|
52
|
+
self.control_in_dim = control_in_dim
|
|
53
|
+
self.control_apply_audio = control_apply_audio
|
|
54
|
+
self.control_layers_mapping = {i: n for n, i in enumerate(self.control_layers)}
|
|
55
|
+
self.blocks = nn.ModuleList([
|
|
56
|
+
MiniMaxH3ControlNetBlock(hidden_size, num_attention_heads, attention_head_dim, ffn_hidden_size, time_embed_dim, adaln_out_features, norm_eps, qk_norm_eps, block_id=n)
|
|
57
|
+
for n in range(len(self.control_layers))
|
|
58
|
+
])
|
|
59
|
+
control_patch_dim = control_in_dim * patch_size[0] * patch_size[1] * patch_size[2]
|
|
60
|
+
self.control_patch_proj = nn.Linear(control_patch_dim, hidden_size, bias=True)
|
|
61
|
+
|
|
62
|
+
def patch_columns(self):
|
|
63
|
+
return self.control_in_dim * _PATCH_T * _PATCH_H * _PATCH_W
|
|
64
|
+
|
|
65
|
+
def forward(
|
|
66
|
+
self,
|
|
67
|
+
embeddings,
|
|
68
|
+
control_rows,
|
|
69
|
+
img_pos,
|
|
70
|
+
audio_pos,
|
|
71
|
+
*,
|
|
72
|
+
t_emb,
|
|
73
|
+
combined_indices,
|
|
74
|
+
rope_freqs,
|
|
75
|
+
cu_seqlens,
|
|
76
|
+
max_seqlen,
|
|
77
|
+
use_gradient_checkpointing=False,
|
|
78
|
+
use_gradient_checkpointing_offload=False,
|
|
79
|
+
):
|
|
80
|
+
expected = self.patch_columns()
|
|
81
|
+
if control_rows.shape[-1] != expected:
|
|
82
|
+
raise ValueError(f"control_rows carry {control_rows.shape[-1]} columns but control_in_dim={self.control_in_dim} expects {expected}")
|
|
83
|
+
if control_rows.shape[0] != img_pos.shape[0]:
|
|
84
|
+
raise ValueError(f"control_rows hold {control_rows.shape[0]} rows but the packed sequence has {img_pos.shape[0]} video rows; one control row per video row is required, in the same order")
|
|
85
|
+
control_embeds = self.control_patch_proj(control_rows.to(self.control_patch_proj.weight.dtype))
|
|
86
|
+
c = embeddings.index_copy(0, img_pos, control_embeds.to(embeddings.dtype))
|
|
87
|
+
for block in self.blocks:
|
|
88
|
+
c = gradient_checkpoint_forward(
|
|
89
|
+
block,
|
|
90
|
+
use_gradient_checkpointing,
|
|
91
|
+
use_gradient_checkpointing_offload,
|
|
92
|
+
c,
|
|
93
|
+
embeddings,
|
|
94
|
+
t_emb=t_emb,
|
|
95
|
+
combined_indices=combined_indices,
|
|
96
|
+
rope_freqs=rope_freqs,
|
|
97
|
+
cu_seqlens=cu_seqlens,
|
|
98
|
+
max_seqlen=max_seqlen,
|
|
99
|
+
)
|
|
100
|
+
hints = torch.unbind(c)[:-1]
|
|
101
|
+
if not self.control_apply_audio and audio_pos.numel():
|
|
102
|
+
keep = torch.ones(embeddings.shape[0], dtype=hints[0].dtype, device=hints[0].device)
|
|
103
|
+
keep[audio_pos] = 0
|
|
104
|
+
hints = tuple(hint * keep.unsqueeze(-1) for hint in hints)
|
|
105
|
+
return hints
|
|
@@ -336,6 +336,7 @@ class MiniMaxH3DiT(nn.Module):
|
|
|
336
336
|
use_gradient_checkpointing_offload=False,
|
|
337
337
|
update_audio_mask=None,
|
|
338
338
|
skip_mask_out_condition=False,
|
|
339
|
+
control_hints=None,
|
|
339
340
|
) -> tuple[torch.Tensor, torch.Tensor]:
|
|
340
341
|
inverse_indices = inverse_indices.view(-1).to(torch.long)
|
|
341
342
|
token_tags = token_tags.view(-1).to(torch.long)
|
|
@@ -371,7 +372,7 @@ class MiniMaxH3DiT(nn.Module):
|
|
|
371
372
|
|
|
372
373
|
hidden = decoder_input
|
|
373
374
|
cu_seqlens = cu_seqlens.to(device)
|
|
374
|
-
for block in self.blocks:
|
|
375
|
+
for block_id, block in enumerate(self.blocks):
|
|
375
376
|
hidden = gradient_checkpoint_forward(
|
|
376
377
|
block,
|
|
377
378
|
use_gradient_checkpointing,
|
|
@@ -383,6 +384,8 @@ class MiniMaxH3DiT(nn.Module):
|
|
|
383
384
|
cu_seqlens=cu_seqlens,
|
|
384
385
|
max_seqlen=max_seqlen,
|
|
385
386
|
)
|
|
387
|
+
if control_hints is not None and block_id in control_hints:
|
|
388
|
+
hidden = hidden + control_hints[block_id].to(hidden.device, hidden.dtype)
|
|
386
389
|
|
|
387
390
|
video_logits, audio_logits = self.final_layer(hidden, t_emb=t_emb, inverse_indices=inverse_indices)
|
|
388
391
|
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import torch, torch.nn as nn
|
|
2
|
+
from einops import rearrange
|
|
3
|
+
|
|
4
|
+
from .qwen_image_dit import QwenEmbedRope
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class QwenVideoEditRope(QwenEmbedRope):
|
|
8
|
+
"""Grid-aware RoPE for Qwen-Video-Edit"""
|
|
9
|
+
|
|
10
|
+
def _expand_pos_freqs_if_needed(self, video_fhw, txt_seq_lens):
|
|
11
|
+
if isinstance(video_fhw, list) and video_fhw and isinstance(video_fhw[0], dict):
|
|
12
|
+
video_fhw = (max(x["frame"] + 1 for x in video_fhw),
|
|
13
|
+
max(x["full_height"] for x in video_fhw),
|
|
14
|
+
max(x["full_width"] for x in video_fhw))
|
|
15
|
+
super()._expand_pos_freqs_if_needed(video_fhw, txt_seq_lens)
|
|
16
|
+
|
|
17
|
+
def forward(self, video_fhw, txt_seq_lens, device):
|
|
18
|
+
if not video_fhw or not isinstance(video_fhw[0], dict):
|
|
19
|
+
return super().forward(video_fhw, txt_seq_lens, device)
|
|
20
|
+
self._expand_pos_freqs_if_needed(video_fhw, txt_seq_lens)
|
|
21
|
+
if self.pos_freqs.device != device:
|
|
22
|
+
self.pos_freqs = self.pos_freqs.to(device)
|
|
23
|
+
self.neg_freqs = self.neg_freqs.to(device)
|
|
24
|
+
freqs_pos = self.pos_freqs.split([x // 2 for x in self.axes_dim], dim=1)
|
|
25
|
+
freqs_neg = self.neg_freqs.split([x // 2 for x in self.axes_dim], dim=1)
|
|
26
|
+
values = []
|
|
27
|
+
max_index = 0
|
|
28
|
+
for item in video_fhw:
|
|
29
|
+
frame, h, w = item["frame"], item["height"], item["width"]
|
|
30
|
+
full_h, full_w = item["full_height"], item["full_width"]
|
|
31
|
+
key = "grid_" + "_".join(str(item[x]) for x in
|
|
32
|
+
("frame", "height", "width", "h_off", "w_off", "full_height", "full_width"))
|
|
33
|
+
if key not in self.rope_cache:
|
|
34
|
+
axis_h = freqs_pos[1][:full_h]
|
|
35
|
+
axis_w = freqs_pos[2][:full_w]
|
|
36
|
+
if self.scale_rope:
|
|
37
|
+
axis_h = torch.cat([freqs_neg[1][-(full_h - full_h // 2):], freqs_pos[1][:full_h // 2]])
|
|
38
|
+
axis_w = torch.cat([freqs_neg[2][-(full_w - full_w // 2):], freqs_pos[2][:full_w // 2]])
|
|
39
|
+
frame_freq = freqs_pos[0][frame:frame + 1].view(1, 1, 1, -1).expand(1, h, w, -1)
|
|
40
|
+
height_freq = axis_h[item["h_off"]:item["h_off"] + h].view(1, h, 1, -1).expand(1, h, w, -1)
|
|
41
|
+
width_freq = axis_w[item["w_off"]:item["w_off"] + w].view(1, 1, w, -1).expand(1, h, w, -1)
|
|
42
|
+
self.rope_cache[key] = torch.cat([frame_freq, height_freq, width_freq], dim=-1).reshape(h * w, -1).contiguous()
|
|
43
|
+
values.append(self.rope_cache[key])
|
|
44
|
+
if self.scale_rope:
|
|
45
|
+
max_index = max(full_h // 2, full_w // 2, max_index)
|
|
46
|
+
else:
|
|
47
|
+
max_index = max(full_h, full_w, max_index)
|
|
48
|
+
return torch.cat(values, dim=0), self.pos_freqs[max_index:max_index + max(txt_seq_lens)]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class WanToQwenProjection(nn.Module):
|
|
52
|
+
def __init__(self, in_channels=16, inner_dim=3072):
|
|
53
|
+
super().__init__()
|
|
54
|
+
self.group = 1
|
|
55
|
+
self.proj = nn.Conv3d(in_channels, inner_dim, (1, 2, 2), stride=(1, 2, 2))
|
|
56
|
+
|
|
57
|
+
@torch.no_grad()
|
|
58
|
+
def init_from_qwen_dit(self, dit):
|
|
59
|
+
self.proj.weight.copy_(dit.img_in.weight.view(self.proj.out_channels, self.proj.in_channels, 2, 2).unsqueeze(2))
|
|
60
|
+
self.proj.bias.copy_(dit.img_in.bias)
|
|
61
|
+
|
|
62
|
+
def forward(self, x):
|
|
63
|
+
return rearrange(self.proj(x), "B D T H W -> B (T H W) D")
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class QwenToWanProjection(nn.Module):
|
|
67
|
+
def __init__(self, out_channels=16, inner_dim=3072):
|
|
68
|
+
super().__init__()
|
|
69
|
+
self.group = 1
|
|
70
|
+
self.proj = nn.Linear(inner_dim, out_channels * 4)
|
|
71
|
+
|
|
72
|
+
@torch.no_grad()
|
|
73
|
+
def init_from_qwen_dit(self, dit):
|
|
74
|
+
self.proj.load_state_dict(dit.proj_out.state_dict())
|
|
75
|
+
|
|
76
|
+
def forward(self, x, num_frames, tokens_h, tokens_w):
|
|
77
|
+
return rearrange(self.proj(x), "B (T H W) (C P Q) -> B C T (H P) (W Q)", T=num_frames, H=tokens_h, W=tokens_w, P=2, Q=2)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class QwenVideoEditAdapter(nn.Module):
|
|
81
|
+
def __init__(self, inner_dim=3072, in_channels=16, out_channels=16):
|
|
82
|
+
super().__init__()
|
|
83
|
+
self.in_proj = WanToQwenProjection(in_channels=in_channels, inner_dim=inner_dim)
|
|
84
|
+
self.out_proj = QwenToWanProjection(out_channels=out_channels, inner_dim=inner_dim)
|
|
85
|
+
|
|
86
|
+
@torch.no_grad()
|
|
87
|
+
def init_from_qwen_dit(self, dit):
|
|
88
|
+
self.in_proj.init_from_qwen_dit(dit)
|
|
89
|
+
self.out_proj.init_from_qwen_dit(dit)
|