diffsynth 2.1.3__tar.gz → 2.1.5__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.3 → diffsynth-2.1.5}/PKG-INFO +6 -1
- {diffsynth-2.1.3 → diffsynth-2.1.5}/README.md +5 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/data/operators.py +2 -2
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/loader/config.py +2 -2
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/loader/file.py +17 -1
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/loader/model.py +4 -1
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/backends/bitsandbytes.py +24 -24
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/vram/layers.py +5 -2
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/base_pipeline.py +9 -1
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/flow_match.py +1 -1
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/loss.py +24 -1
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/training_module.py +20 -4
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/ace_step.py +2 -1
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/ltx2_audio_video.py +1 -1
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/minimax_h3_audio_video.py +14 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/minimax_music3.py +15 -1
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/version.py +1 -1
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth.egg-info/PKG-INFO +6 -1
- {diffsynth-2.1.3 → diffsynth-2.1.5}/LICENSE +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/configs/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/configs/model_configs.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/configs/vram_management_module_maps.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/attention/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/attention/attention.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/data/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/data/unified_dataset.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/device/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/device/npu_compatible_device.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/gradient/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/gradient/gradient_checkpoint.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/loader/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/npu_patch/npu_fused_operator.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/offload_training/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/offload_training/manager.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/offload_training/memory_buffer.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/offload_training/offloader.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/backends/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/backends/comfy_kitchen.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/backends/torchao.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/base.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/config.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/vram/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/vram/disk_map.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/vram/initialization.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/ddim_scheduler.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/dmd2.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/logger.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/parsers.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/runner.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/template.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/aesthetic.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/base.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/bioclip.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/clip.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/fid.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/hpsv2.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/hpsv3.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/image_reward.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/lpips.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/pickscore.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/qwen_image_bench.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/unified_reward_2.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/unified_reward_edit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ace_step_conditioner.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ace_step_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ace_step_residual_fsq.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ace_step_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ace_step_tokenizer.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ace_step_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/aesthetic.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/anima_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/bioclip.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/boogu_image_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/clip.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/demucs.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/dinov3_image_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ernie_image_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ernie_image_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/fid.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux2_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux2_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux2_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_controlnet.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_infiniteyou.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_ipadapter.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_lora_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_lora_patcher.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_redux.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_text_encoder_clip.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_text_encoder_t5.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_value_control.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/general_modules.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/hidream_common.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/hidream_o1_image_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/hpsv2.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/hpsv3.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ideogram4_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ideogram4_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ideogram4_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/image_reward.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/joyai_image_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/joyai_image_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/krea2_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/krea2_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/lingbot_video_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/longcat_video_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/lpips.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ltx2_audio_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ltx2_common.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ltx2_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ltx2_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ltx2_upsampler.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ltx2_video_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_h3_audio_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_h3_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_h3_dit_comfy.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_h3_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_h3_video_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_music3_condition_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_music3_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_music3_rvq_depth_decoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_music3_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_music3_vocoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/model_loader.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/mova_audio_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/mova_audio_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/mova_dual_tower_bridge.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/nexus_gen.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/nexus_gen_ar_model.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/nexus_gen_projector.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/pickscore.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/qwen_image_bench.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/qwen_image_controlnet.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/qwen_image_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/qwen_image_image2lora.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/qwen_image_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/qwen_image_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/sd_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/siglip2_image_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/stable_diffusion_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/stable_diffusion_unet.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/stable_diffusion_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/stable_diffusion_xl_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/stable_diffusion_xl_unet.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/step1x_connector.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/step1x_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/unified_reward_2.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/unified_reward_edit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_animate_2_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_animate_adapter.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_camera_controller.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_dit_s2v.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_image_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_mot.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_motion_controller.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_vace.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wantodance.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wav2vec.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/z_image_controlnet.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/z_image_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/z_image_image2lora.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/z_image_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/anima_image.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/boogu_image.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/ernie_image.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/flux2_image.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/flux_image.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/hidream_o1_image.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/ideogram4.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/joyai_image.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/krea2.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/lingbot_video.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/mova_audio_video.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/qwen_image.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/stable_diffusion.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/stable_diffusion_xl.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/wan_video.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/z_image.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/controlnet/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/controlnet/annotator.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/controlnet/controlnet_input.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/data/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/data/audio.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/data/audio_video.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/data/media_io_ltx2.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/data/minimax_h3.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/demucs/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/dequantizer/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/flux.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/flux_timestep.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/general.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/krea2.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/merge.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/minimax_h3.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/reset_rank.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/sdxl.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/quant/serialization.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/ses/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/ses/ses.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ace_step_conditioner.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ace_step_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ace_step_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ace_step_tokenizer.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/anima_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/dino_v3.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ernie_image_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux2_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_controlnet.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_infiniteyou.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_ipadapter.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_text_encoder_clip.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_text_encoder_t5.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ideogram4_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/image_metrics.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/joyai_image_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/krea2_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/krea2_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/lingbot_video_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ltx2_audio_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ltx2_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ltx2_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ltx2_video_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/minimax_h3_audio_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/minimax_h3_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/minimax_h3_video_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/minimax_music3_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/nexus_gen.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/nexus_gen_projector.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/qwen_image_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/sdxl.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/sdxl_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/sdxl_text_encoder_2.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/sdxl_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/stable_diffusion_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/stable_diffusion_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/stable_diffusion_xl_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/step1x_connector.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wan_video_animate_adapter.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wan_video_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wan_video_image_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wan_video_mot.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wan_video_vace.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wan_video_vae.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wans2v_audio_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/z_image_dit.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/z_image_text_encoder.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/tile/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/tile/tile_worker.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/xfuser/__init__.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/xfuser/xdit_context_parallel.py +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth.egg-info/SOURCES.txt +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth.egg-info/dependency_links.txt +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth.egg-info/requires.txt +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth.egg-info/top_level.txt +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/pyproject.toml +0 -0
- {diffsynth-2.1.3 → diffsynth-2.1.5}/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.5
|
|
4
4
|
Summary: Enjoy the magic of Diffusion models!
|
|
5
5
|
Author: ModelScope Team
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -107,6 +107,8 @@ 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
|
+
- **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
|
+
|
|
110
112
|
- **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).
|
|
111
113
|
|
|
112
114
|
- **August 17, 2026** MiniMax-Music3 open-sourced, welcome a new member to the audio model family! Support includes text-to-music generation and low VRAM inference. For details, please refer to the [documentation](/docs/en/Model_Details/MiniMax-Music3.md) and [example code](/examples/minimax_music3/).
|
|
@@ -802,6 +804,9 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
|
|
|
802
804
|
| FLUX.1 | [black-forest-labs/FLUX.1-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-dev) | [code](/examples/flux/model_inference/FLUX.1-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-dev.py) |
|
|
803
805
|
| FLUX.1 | [black-forest-labs/FLUX.1-Krea-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-Krea-dev) | [code](/examples/flux/model_inference/FLUX.1-Krea-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-Krea-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-Krea-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-Krea-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-Krea-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-Krea-dev.py) |
|
|
804
806
|
| FLUX.1 | [black-forest-labs/FLUX.1-Kontext-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-Kontext-dev) | [code](/examples/flux/model_inference/FLUX.1-Kontext-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-Kontext-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-Kontext-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-Kontext-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-Kontext-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-Kontext-dev.py) |
|
|
807
|
+
| FLUX.1 | [black-forest-labs/FLUX.1-Fill-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-Fill-dev) | [code](/examples/flux/model_inference/FLUX.1-Fill-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-Fill-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-Fill-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-Fill-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-Fill-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-Fill-dev.py) |
|
|
808
|
+
| FLUX.1 | [black-forest-labs/FLUX.1-Redux-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-Redux-dev) | [code](/examples/flux/model_inference/FLUX.1-Redux-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-Redux-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-Redux-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-Redux-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-Redux-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-Redux-dev.py) |
|
|
809
|
+
| FLUX.1 | [HuanJue/Insert-Anything](https://www.modelscope.cn/models/HuanJue/Insert-Anything) | [code](/examples/flux/model_inference/Insert-Anything.py) | [code](/examples/flux/model_inference_low_vram/Insert-Anything.py) | - | - | [code](/examples/flux/model_training/lora/Insert-Anything.sh) | [code](/examples/flux/model_training/validate_lora/Insert-Anything.py) |
|
|
805
810
|
| FLUX.1 | [alimama-creative/FLUX.1-dev-Controlnet-Inpainting-Beta](https://www.modelscope.cn/models/alimama-creative/FLUX.1-dev-Controlnet-Inpainting-Beta) | [code](/examples/flux/model_inference/FLUX.1-dev-Controlnet-Inpainting-Beta.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-dev-Controlnet-Inpainting-Beta.py) | [code](/examples/flux/model_training/full/FLUX.1-dev-Controlnet-Inpainting-Beta.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-dev-Controlnet-Inpainting-Beta.py) | [code](/examples/flux/model_training/lora/FLUX.1-dev-Controlnet-Inpainting-Beta.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-dev-Controlnet-Inpainting-Beta.py) |
|
|
806
811
|
| FLUX.1 | [InstantX/FLUX.1-dev-Controlnet-Union-alpha](https://www.modelscope.cn/models/InstantX/FLUX.1-dev-Controlnet-Union-alpha) | [code](/examples/flux/model_inference/FLUX.1-dev-Controlnet-Union-alpha.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-dev-Controlnet-Union-alpha.py) | [code](/examples/flux/model_training/full/FLUX.1-dev-Controlnet-Union-alpha.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-dev-Controlnet-Union-alpha.py) | [code](/examples/flux/model_training/lora/FLUX.1-dev-Controlnet-Union-alpha.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-dev-Controlnet-Union-alpha.py) |
|
|
807
812
|
| FLUX.1 | [jasperai/Flux.1-dev-Controlnet-Upscaler](https://www.modelscope.cn/models/jasperai/Flux.1-dev-Controlnet-Upscaler) | [code](/examples/flux/model_inference/FLUX.1-dev-Controlnet-Upscaler.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-dev-Controlnet-Upscaler.py) | [code](/examples/flux/model_training/full/FLUX.1-dev-Controlnet-Upscaler.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-dev-Controlnet-Upscaler.py) | [code](/examples/flux/model_training/lora/FLUX.1-dev-Controlnet-Upscaler.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-dev-Controlnet-Upscaler.py) |
|
|
@@ -40,6 +40,8 @@ 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
|
+
- **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
|
+
|
|
43
45
|
- **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).
|
|
44
46
|
|
|
45
47
|
- **August 17, 2026** MiniMax-Music3 open-sourced, welcome a new member to the audio model family! Support includes text-to-music generation and low VRAM inference. For details, please refer to the [documentation](/docs/en/Model_Details/MiniMax-Music3.md) and [example code](/examples/minimax_music3/).
|
|
@@ -735,6 +737,9 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
|
|
|
735
737
|
| FLUX.1 | [black-forest-labs/FLUX.1-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-dev) | [code](/examples/flux/model_inference/FLUX.1-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-dev.py) |
|
|
736
738
|
| FLUX.1 | [black-forest-labs/FLUX.1-Krea-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-Krea-dev) | [code](/examples/flux/model_inference/FLUX.1-Krea-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-Krea-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-Krea-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-Krea-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-Krea-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-Krea-dev.py) |
|
|
737
739
|
| FLUX.1 | [black-forest-labs/FLUX.1-Kontext-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-Kontext-dev) | [code](/examples/flux/model_inference/FLUX.1-Kontext-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-Kontext-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-Kontext-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-Kontext-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-Kontext-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-Kontext-dev.py) |
|
|
740
|
+
| FLUX.1 | [black-forest-labs/FLUX.1-Fill-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-Fill-dev) | [code](/examples/flux/model_inference/FLUX.1-Fill-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-Fill-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-Fill-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-Fill-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-Fill-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-Fill-dev.py) |
|
|
741
|
+
| FLUX.1 | [black-forest-labs/FLUX.1-Redux-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-Redux-dev) | [code](/examples/flux/model_inference/FLUX.1-Redux-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-Redux-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-Redux-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-Redux-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-Redux-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-Redux-dev.py) |
|
|
742
|
+
| FLUX.1 | [HuanJue/Insert-Anything](https://www.modelscope.cn/models/HuanJue/Insert-Anything) | [code](/examples/flux/model_inference/Insert-Anything.py) | [code](/examples/flux/model_inference_low_vram/Insert-Anything.py) | - | - | [code](/examples/flux/model_training/lora/Insert-Anything.sh) | [code](/examples/flux/model_training/validate_lora/Insert-Anything.py) |
|
|
738
743
|
| FLUX.1 | [alimama-creative/FLUX.1-dev-Controlnet-Inpainting-Beta](https://www.modelscope.cn/models/alimama-creative/FLUX.1-dev-Controlnet-Inpainting-Beta) | [code](/examples/flux/model_inference/FLUX.1-dev-Controlnet-Inpainting-Beta.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-dev-Controlnet-Inpainting-Beta.py) | [code](/examples/flux/model_training/full/FLUX.1-dev-Controlnet-Inpainting-Beta.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-dev-Controlnet-Inpainting-Beta.py) | [code](/examples/flux/model_training/lora/FLUX.1-dev-Controlnet-Inpainting-Beta.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-dev-Controlnet-Inpainting-Beta.py) |
|
|
739
744
|
| FLUX.1 | [InstantX/FLUX.1-dev-Controlnet-Union-alpha](https://www.modelscope.cn/models/InstantX/FLUX.1-dev-Controlnet-Union-alpha) | [code](/examples/flux/model_inference/FLUX.1-dev-Controlnet-Union-alpha.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-dev-Controlnet-Union-alpha.py) | [code](/examples/flux/model_training/full/FLUX.1-dev-Controlnet-Union-alpha.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-dev-Controlnet-Union-alpha.py) | [code](/examples/flux/model_training/lora/FLUX.1-dev-Controlnet-Union-alpha.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-dev-Controlnet-Union-alpha.py) |
|
|
740
745
|
| FLUX.1 | [jasperai/Flux.1-dev-Controlnet-Upscaler](https://www.modelscope.cn/models/jasperai/Flux.1-dev-Controlnet-Upscaler) | [code](/examples/flux/model_inference/FLUX.1-dev-Controlnet-Upscaler.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-dev-Controlnet-Upscaler.py) | [code](/examples/flux/model_training/full/FLUX.1-dev-Controlnet-Upscaler.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-dev-Controlnet-Upscaler.py) | [code](/examples/flux/model_training/lora/FLUX.1-dev-Controlnet-Upscaler.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-dev-Controlnet-Upscaler.py) |
|
|
@@ -307,8 +307,8 @@ class LoadAudioWithTorchaudio(DataProcessingOperator, FrameSamplerByRateMixin):
|
|
|
307
307
|
padding = target_samples - current_samples
|
|
308
308
|
waveform = torch.nn.functional.pad(waveform, (0, padding))
|
|
309
309
|
return waveform, sample_rate
|
|
310
|
-
except:
|
|
311
|
-
warnings.warn(f"Cannot load audio in {data}. The audio will be `None`.")
|
|
310
|
+
except Exception as e:
|
|
311
|
+
warnings.warn(f"Cannot load audio in {data} due to {e}. The audio will be `None`.")
|
|
312
312
|
return None
|
|
313
313
|
|
|
314
314
|
|
|
@@ -75,11 +75,11 @@ class ModelConfig:
|
|
|
75
75
|
def parse_download_source(self):
|
|
76
76
|
if self.download_source is None:
|
|
77
77
|
if os.environ.get('DIFFSYNTH_DOWNLOAD_SOURCE') is not None:
|
|
78
|
-
return os.environ.get('DIFFSYNTH_DOWNLOAD_SOURCE')
|
|
78
|
+
return os.environ.get('DIFFSYNTH_DOWNLOAD_SOURCE').lower()
|
|
79
79
|
else:
|
|
80
80
|
return "modelscope"
|
|
81
81
|
else:
|
|
82
|
-
return self.download_source
|
|
82
|
+
return self.download_source.lower()
|
|
83
83
|
|
|
84
84
|
def parse_skip_download(self):
|
|
85
85
|
if self.skip_download is None:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from safetensors import safe_open
|
|
2
|
-
import torch, hashlib
|
|
2
|
+
import torch, hashlib, json
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
def load_state_dict(file_path, torch_dtype=None, device="cpu", pin_memory=False, verbose=0):
|
|
@@ -34,10 +34,26 @@ def load_state_dict_from_safetensors(file_path, torch_dtype=None, device="cpu"):
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
def load_metadata_from_safetensors(file_path):
|
|
37
|
+
if isinstance(file_path, list):
|
|
38
|
+
metadata = {}
|
|
39
|
+
for file_path_ in file_path:
|
|
40
|
+
for key, value in load_metadata_from_safetensors(file_path_).items():
|
|
41
|
+
metadata[key] = merge_metadata_value(metadata[key], value) if key in metadata else value
|
|
42
|
+
return metadata
|
|
37
43
|
with safe_open(file_path, framework="pt", device="cpu") as f:
|
|
38
44
|
return f.metadata() or {}
|
|
39
45
|
|
|
40
46
|
|
|
47
|
+
def merge_metadata_value(old_value, new_value):
|
|
48
|
+
try:
|
|
49
|
+
old_items, new_items = json.loads(old_value), json.loads(new_value)
|
|
50
|
+
except (json.JSONDecodeError, TypeError):
|
|
51
|
+
return new_value
|
|
52
|
+
if isinstance(old_items, list) and isinstance(new_items, list):
|
|
53
|
+
return json.dumps(old_items + [i for i in new_items if i not in old_items])
|
|
54
|
+
return new_value
|
|
55
|
+
|
|
56
|
+
|
|
41
57
|
def load_state_dict_from_bin(file_path, torch_dtype=None, device="cpu"):
|
|
42
58
|
state_dict = torch.load(file_path, map_location=device, weights_only=True)
|
|
43
59
|
if len(state_dict) == 1:
|
|
@@ -37,7 +37,7 @@ def load_model(model_class, path, config=None, torch_dtype=torch.bfloat16, devic
|
|
|
37
37
|
devices = [vram_config[k] for k in ("offload_device", "onload_device", "preparing_device", "computation_device")]
|
|
38
38
|
load_device = [d for d in devices if d != "disk"][0]
|
|
39
39
|
disk_map = DiskMap(path, load_device, torch_dtype=None, state_dict_converter=state_dict_converter)
|
|
40
|
-
metadata = load_metadata_from_safetensors(path
|
|
40
|
+
metadata = load_metadata_from_safetensors(path)
|
|
41
41
|
model = quantize.prepare_for_prequantized_load(model, compute_dtype=vram_config["computation_dtype"])
|
|
42
42
|
model = enable_vram_management(model, module_map, vram_config=vram_config, disk_map=disk_map, vram_limit=vram_limit, quantize=quantize, metadata=metadata)
|
|
43
43
|
else:
|
|
@@ -119,6 +119,9 @@ def load_model(model_class, path, config=None, torch_dtype=torch.bfloat16, devic
|
|
|
119
119
|
# Because some models override the behavior of `to()`,
|
|
120
120
|
# especially those from libraries like Transformers.
|
|
121
121
|
model = model.to(dtype=torch_dtype, device=device)
|
|
122
|
+
if quantize is not None:
|
|
123
|
+
# Downstream steps (e.g. LoRA hot-loading) need the config to handle the quantized layers.
|
|
124
|
+
model.quantize_config = quantize
|
|
122
125
|
if hasattr(model, "eval"):
|
|
123
126
|
model = model.eval()
|
|
124
127
|
return model
|
|
@@ -11,26 +11,27 @@ except ImportError:
|
|
|
11
11
|
BITSANDBYTES_AVAILABLE = False
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
14
|
+
if BITSANDBYTES_AVAILABLE:
|
|
15
|
+
class BitsAndBytesLinear4bit(bnb.nn.Linear4bit):
|
|
16
|
+
def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs):
|
|
17
|
+
local_names = set()
|
|
18
|
+
for name, current in list(self._parameters.items()) + list(self._buffers.items()):
|
|
19
|
+
if current is None:
|
|
20
|
+
continue
|
|
21
|
+
local_names.add(name)
|
|
22
|
+
key = prefix + name
|
|
23
|
+
if key in state_dict:
|
|
24
|
+
value = state_dict[key]
|
|
25
|
+
if name in self._parameters:
|
|
26
|
+
self._parameters[name] = value if isinstance(value, torch.nn.Parameter) else torch.nn.Parameter(value, requires_grad=False)
|
|
27
|
+
else:
|
|
28
|
+
self._buffers[name] = value
|
|
29
|
+
elif strict:
|
|
30
|
+
missing_keys.append(key)
|
|
31
|
+
if strict:
|
|
32
|
+
for key in state_dict:
|
|
33
|
+
if key.startswith(prefix) and key[len(prefix):].split(".", 1)[0] not in local_names:
|
|
34
|
+
unexpected_keys.append(key)
|
|
34
35
|
|
|
35
36
|
|
|
36
37
|
@register_quant_backend("bitsandbytes")
|
|
@@ -55,7 +56,7 @@ class BitsAndBytesQuantBackend(QuantBackend):
|
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
def quantized_linear_classes(self):
|
|
58
|
-
return (
|
|
59
|
+
return (BitsAndBytesLinear4bit,)
|
|
59
60
|
|
|
60
61
|
def create_quantized_linear(self, linear, compute_device=None, model_device=None):
|
|
61
62
|
"""The `meta` shell avoids allocating an fp weight; bnb quantizes while `Params4bit` moves to `compute_device`."""
|
|
@@ -65,7 +66,7 @@ class BitsAndBytesQuantBackend(QuantBackend):
|
|
|
65
66
|
compute_device = linear.weight.device
|
|
66
67
|
|
|
67
68
|
with torch.device("meta"):
|
|
68
|
-
quant_linear =
|
|
69
|
+
quant_linear = BitsAndBytesLinear4bit(
|
|
69
70
|
linear.in_features,
|
|
70
71
|
linear.out_features,
|
|
71
72
|
bias=linear.bias is not None,
|
|
@@ -89,7 +90,7 @@ class BitsAndBytesQuantBackend(QuantBackend):
|
|
|
89
90
|
|
|
90
91
|
def create_quantized_linear_shell(self, linear, compute_dtype):
|
|
91
92
|
with torch.device("meta"):
|
|
92
|
-
shell =
|
|
93
|
+
shell = BitsAndBytesLinear4bit(
|
|
93
94
|
linear.in_features,
|
|
94
95
|
linear.out_features,
|
|
95
96
|
bias=linear.bias is not None,
|
|
@@ -98,7 +99,6 @@ class BitsAndBytesQuantBackend(QuantBackend):
|
|
|
98
99
|
quant_type=self.config.quant_type,
|
|
99
100
|
quant_storage=self.config.quant_storage,
|
|
100
101
|
)
|
|
101
|
-
shell._load_from_state_dict = _assign_params_from_state_dict.__get__(shell)
|
|
102
102
|
return shell
|
|
103
103
|
|
|
104
104
|
def unflatten_state_dict(self, state_dict, metadata):
|
|
@@ -442,7 +442,7 @@ class AutoWrappedLinear(torch.nn.Linear, AutoTorchModule, LoRAHotLoadMixin):
|
|
|
442
442
|
return out
|
|
443
443
|
|
|
444
444
|
|
|
445
|
-
class AutoWrappedQuantizedModule(AutoTorchModule, LoRAHotLoadMixin):
|
|
445
|
+
class AutoWrappedQuantizedModule(torch.nn.Linear, AutoTorchModule, LoRAHotLoadMixin):
|
|
446
446
|
def __init__(
|
|
447
447
|
self,
|
|
448
448
|
module: torch.nn.Module,
|
|
@@ -467,7 +467,8 @@ class AutoWrappedQuantizedModule(AutoTorchModule, LoRAHotLoadMixin):
|
|
|
467
467
|
"Disk offload for quantized layers requires both `disk_map` and `quantize`, "
|
|
468
468
|
"so each layer can rebuild its packed weight and quant state lazily."
|
|
469
469
|
)
|
|
470
|
-
|
|
470
|
+
AutoTorchModule.__init__(
|
|
471
|
+
self,
|
|
471
472
|
offload_dtype,
|
|
472
473
|
offload_device,
|
|
473
474
|
onload_dtype,
|
|
@@ -478,6 +479,8 @@ class AutoWrappedQuantizedModule(AutoTorchModule, LoRAHotLoadMixin):
|
|
|
478
479
|
computation_device,
|
|
479
480
|
vram_limit,
|
|
480
481
|
)
|
|
482
|
+
self.in_features = module.in_features
|
|
483
|
+
self.out_features = module.out_features
|
|
481
484
|
self.module = module
|
|
482
485
|
self.name = name
|
|
483
486
|
self.disk_offload = disk_offload
|
|
@@ -240,6 +240,13 @@ class BasePipeline(torch.nn.Module):
|
|
|
240
240
|
module.computation_device = device
|
|
241
241
|
|
|
242
242
|
|
|
243
|
+
def check_quant_hot_load(self, module: torch.nn.Module):
|
|
244
|
+
# A quantized weight cannot absorb a fused LoRA, so hot-loading is the only option for it.
|
|
245
|
+
if getattr(module, "quantize_config", None) is None:
|
|
246
|
+
return module
|
|
247
|
+
return self.enable_lora_hot_loading(module)
|
|
248
|
+
|
|
249
|
+
|
|
243
250
|
def load_lora(
|
|
244
251
|
self,
|
|
245
252
|
module: torch.nn.Module,
|
|
@@ -249,6 +256,7 @@ class BasePipeline(torch.nn.Module):
|
|
|
249
256
|
state_dict=None,
|
|
250
257
|
verbose=1,
|
|
251
258
|
):
|
|
259
|
+
module = self.check_quant_hot_load(module)
|
|
252
260
|
if state_dict is None:
|
|
253
261
|
if isinstance(lora_config, str):
|
|
254
262
|
lora = load_state_dict(lora_config, torch_dtype=self.torch_dtype, device=self.device)
|
|
@@ -370,7 +378,7 @@ class BasePipeline(torch.nn.Module):
|
|
|
370
378
|
"computation_dtype": self.torch_dtype,
|
|
371
379
|
"computation_device": self.device,
|
|
372
380
|
}
|
|
373
|
-
model = enable_vram_management(model, module_map, vram_config=vram_config)
|
|
381
|
+
model = enable_vram_management(model, module_map, vram_config=vram_config, quantize=getattr(model, "quantize_config", None))
|
|
374
382
|
return model
|
|
375
383
|
|
|
376
384
|
def compile_pipeline(self, mode: str = "default", dynamic: bool = True, fullgraph: bool = False, compile_models: list = None, **kwargs):
|
|
@@ -302,7 +302,7 @@ class FlowMatchScheduler():
|
|
|
302
302
|
num_train_timesteps = 1000
|
|
303
303
|
if special_case == "stage2":
|
|
304
304
|
sigmas = torch.Tensor([0.909375, 0.725, 0.421875])
|
|
305
|
-
elif special_case == "
|
|
305
|
+
elif special_case == "distilled_stage1":
|
|
306
306
|
sigmas = torch.Tensor([1.0, 0.99375, 0.9875, 0.98125, 0.975, 0.909375, 0.725, 0.421875])
|
|
307
307
|
else:
|
|
308
308
|
dynamic_shift_len = dynamic_shift_len or 4096
|
|
@@ -63,7 +63,7 @@ def FlowMatchSFTAudioVideoLoss(pipe: BasePipeline, **inputs):
|
|
|
63
63
|
return loss
|
|
64
64
|
|
|
65
65
|
|
|
66
|
-
def FlowMatchSFTMiniMaxH3AudioVideoLoss(pipe: BasePipeline, **inputs):
|
|
66
|
+
def FlowMatchSFTMiniMaxH3AudioVideoLoss(pipe: BasePipeline, training_cfg_scale: 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
|
|
|
@@ -81,11 +81,34 @@ def FlowMatchSFTMiniMaxH3AudioVideoLoss(pipe: BasePipeline, **inputs):
|
|
|
81
81
|
training_target_audio = pipe.scheduler_audio.training_target(inputs["audio_input_latents"], audio_noise, timestep_audio)
|
|
82
82
|
|
|
83
83
|
models = {name: getattr(pipe, name) for name in pipe.in_iteration_models}
|
|
84
|
+
if training_cfg_scale > 1.0:
|
|
85
|
+
if not inputs_nega:
|
|
86
|
+
raise ValueError(
|
|
87
|
+
"MiniMax-H3 CFG-aware training requires unconditional inputs. "
|
|
88
|
+
"When using split training, rebuild the data cache with the same "
|
|
89
|
+
"--training_cfg_scale value."
|
|
90
|
+
)
|
|
91
|
+
inputs_uncond = {**inputs, **inputs_nega}
|
|
92
|
+
inputs_uncond["use_gradient_checkpointing"] = False
|
|
93
|
+
inputs_uncond["use_gradient_checkpointing_offload"] = False
|
|
94
|
+
with torch.no_grad():
|
|
95
|
+
noise_pred_uncond, noise_pred_audio_uncond = pipe.model_fn(
|
|
96
|
+
**models, **inputs_uncond,
|
|
97
|
+
timestep_video=timestep_video, timestep_audio=timestep_audio,
|
|
98
|
+
)
|
|
99
|
+
|
|
84
100
|
noise_pred, noise_pred_audio = pipe.model_fn(
|
|
85
101
|
**models, **inputs,
|
|
86
102
|
timestep_video=timestep_video, timestep_audio=timestep_audio,
|
|
87
103
|
)
|
|
88
104
|
|
|
105
|
+
if training_cfg_scale > 1.0:
|
|
106
|
+
# The checkpoint's conditional prediction has CFG distilled into it.
|
|
107
|
+
# Rearrange the CFG equation to recover the raw velocity fitted to the
|
|
108
|
+
# standard flow-matching target, using the current model as the teacher.
|
|
109
|
+
noise_pred = (noise_pred + (training_cfg_scale - 1.0) * noise_pred_uncond) / training_cfg_scale
|
|
110
|
+
noise_pred_audio = (noise_pred_audio + (training_cfg_scale - 1.0) * noise_pred_audio_uncond) / training_cfg_scale
|
|
111
|
+
|
|
89
112
|
loss = torch.nn.functional.mse_loss(noise_pred.float(), training_target.float())
|
|
90
113
|
loss = loss * pipe.scheduler.training_weight(timestep_video)
|
|
91
114
|
if "audio_input_latents" in inputs:
|
|
@@ -193,9 +193,25 @@ class DiffusionTrainingModule(torch.nn.Module):
|
|
|
193
193
|
quant_config = QuantizeConfig(method=method, exclude_modules=exclude_modules)
|
|
194
194
|
if not quant_config.backend.capabilities().get("is_differentiable", True):
|
|
195
195
|
raise ValueError(f"Quantization method `{method}` is not differentiable, so it cannot be used for training (frozen quantized layers must pass gradients through to LoRA branches). Choose a method whose backend declares `is_differentiable=True`.")
|
|
196
|
-
quant_map[model_string] = quant_config
|
|
196
|
+
quant_map[self.normalize_quant_key(model_string)] = quant_config
|
|
197
197
|
return quant_map
|
|
198
198
|
|
|
199
|
+
def normalize_quant_key(self, model_string):
|
|
200
|
+
if isinstance(model_string, str) and model_string.startswith("[") and model_string.endswith("]"):
|
|
201
|
+
try:
|
|
202
|
+
model_string = json.loads(model_string)
|
|
203
|
+
except json.JSONDecodeError:
|
|
204
|
+
raise ValueError(f"Failed to parse quant option model string: `{model_string}`. A multi-file model must be written as a JSON list of files, matching its `--model_paths` entry.")
|
|
205
|
+
if isinstance(model_string, list):
|
|
206
|
+
return tuple(model_string)
|
|
207
|
+
return model_string
|
|
208
|
+
|
|
209
|
+
def get_quant_config(self, quant_map, model_string):
|
|
210
|
+
quant_config = quant_map.get(self.normalize_quant_key(model_string))
|
|
211
|
+
if quant_config is None and len(quant_map) > 0:
|
|
212
|
+
print(f"No quant option matches `{model_string}`. This model is loaded without quantization. Parsed quant options: {({key: config.method for key, config in quant_map.items()})}.")
|
|
213
|
+
return quant_config
|
|
214
|
+
|
|
199
215
|
def parse_model_configs(self, model_paths, model_id_with_origin_paths, fp8_models=None, offload_models=None, quant_options=None, device="cpu"):
|
|
200
216
|
fp8_models = [] if fp8_models is None else fp8_models.split(",")
|
|
201
217
|
offload_models = [] if offload_models is None else offload_models.split(",")
|
|
@@ -209,7 +225,7 @@ class DiffusionTrainingModule(torch.nn.Module):
|
|
|
209
225
|
offload=path in offload_models,
|
|
210
226
|
device=device
|
|
211
227
|
)
|
|
212
|
-
model_configs.append(ModelConfig(path=path, quantize=
|
|
228
|
+
model_configs.append(ModelConfig(path=path, quantize=self.get_quant_config(quant_map, path), **vram_config))
|
|
213
229
|
if model_id_with_origin_paths is not None:
|
|
214
230
|
model_id_with_origin_paths = model_id_with_origin_paths.split(",")
|
|
215
231
|
for model_id_with_origin_path in model_id_with_origin_paths:
|
|
@@ -219,7 +235,7 @@ class DiffusionTrainingModule(torch.nn.Module):
|
|
|
219
235
|
device=device
|
|
220
236
|
)
|
|
221
237
|
config = self.parse_path_or_model_id(model_id_with_origin_path)
|
|
222
|
-
model_configs.append(ModelConfig(model_id=config.model_id, origin_file_pattern=config.origin_file_pattern, quantize=
|
|
238
|
+
model_configs.append(ModelConfig(model_id=config.model_id, origin_file_pattern=config.origin_file_pattern, quantize=self.get_quant_config(quant_map, model_id_with_origin_path), **vram_config))
|
|
223
239
|
return model_configs
|
|
224
240
|
|
|
225
241
|
|
|
@@ -343,7 +359,7 @@ class DiffusionTrainingModule(torch.nn.Module):
|
|
|
343
359
|
# TODO: set `remove_unnecessary_params` to `True` by default
|
|
344
360
|
remove_unnecessary_params=False,
|
|
345
361
|
# TODO: move `loss_required_params` to `loss.py`
|
|
346
|
-
loss_required_params=("input_latents", "max_timestep_boundary", "min_timestep_boundary", "first_frame_latents", "video_latents", "audio_input_latents", "num_inference_steps"),
|
|
362
|
+
loss_required_params=("input_latents", "max_timestep_boundary", "min_timestep_boundary", "first_frame_latents", "video_latents", "audio_input_latents", "num_inference_steps", "cfg_scale"),
|
|
347
363
|
force_remove_params_shared=tuple(),
|
|
348
364
|
force_remove_params_posi=tuple(),
|
|
349
365
|
force_remove_params_nega=tuple(),
|
|
@@ -70,7 +70,8 @@ class AceStepPipeline(BasePipeline):
|
|
|
70
70
|
pipe.conditioner = model_pool.fetch_model("ace_step_conditioner")
|
|
71
71
|
pipe.dit = model_pool.fetch_model("ace_step_dit")
|
|
72
72
|
pipe.vae = model_pool.fetch_model("ace_step_vae")
|
|
73
|
-
pipe.vae
|
|
73
|
+
if pipe.vae is not None:
|
|
74
|
+
pipe.vae.remove_weight_norm()
|
|
74
75
|
pipe.tokenizer_model = model_pool.fetch_model("ace_step_tokenizer")
|
|
75
76
|
|
|
76
77
|
if text_tokenizer_config is not None:
|
|
@@ -213,7 +213,7 @@ class LTX2AudioVideoPipeline(BasePipeline):
|
|
|
213
213
|
progress_bar_cmd=tqdm,
|
|
214
214
|
):
|
|
215
215
|
# Scheduler
|
|
216
|
-
self.scheduler.set_timesteps(num_inference_steps, denoising_strength=denoising_strength, special_case="
|
|
216
|
+
self.scheduler.set_timesteps(num_inference_steps, denoising_strength=denoising_strength, special_case="distilled_stage1" if use_distilled_pipeline else None)
|
|
217
217
|
# Inputs
|
|
218
218
|
inputs_posi = {
|
|
219
219
|
"prompt": prompt,
|
|
@@ -58,7 +58,21 @@ class MiniMaxH3Pipeline(BasePipeline):
|
|
|
58
58
|
model_configs: list[ModelConfig] = [],
|
|
59
59
|
processor_config: ModelConfig = ModelConfig(model_id="MiniMax/MiniMax-H3", origin_file_pattern="FL2VA/processor/"),
|
|
60
60
|
vram_limit: float = None,
|
|
61
|
+
redirect_common_files: bool = True,
|
|
61
62
|
):
|
|
63
|
+
if redirect_common_files:
|
|
64
|
+
redirect_dict = {
|
|
65
|
+
"MiniMax/MiniMax-H3": "MiniMaxAI/MiniMax-H3",
|
|
66
|
+
}
|
|
67
|
+
for model_config in model_configs:
|
|
68
|
+
if model_config.require_downloading() and model_config.parse_download_source() == "huggingface":
|
|
69
|
+
if model_config.model_id is not None and model_config.model_id in redirect_dict:
|
|
70
|
+
print(f"The model is detected to be downloading from HuggingFace. {model_config.model_id} is redirected to {redirect_dict[model_config.model_id]}. You can use `redirect_common_files=False` to disable file redirection.")
|
|
71
|
+
model_config.model_id = redirect_dict[model_config.model_id]
|
|
72
|
+
if processor_config is not None and processor_config.require_downloading() and processor_config.parse_download_source() == "huggingface":
|
|
73
|
+
if processor_config.model_id is not None and processor_config.model_id in redirect_dict:
|
|
74
|
+
print(f"The model is detected to be downloading from HuggingFace. {processor_config.model_id} is redirected to {redirect_dict[processor_config.model_id]}. You can use `redirect_common_files=False` to disable file redirection.")
|
|
75
|
+
processor_config.model_id = redirect_dict[processor_config.model_id]
|
|
62
76
|
pipe = MiniMaxH3Pipeline(device=device, torch_dtype=torch_dtype)
|
|
63
77
|
model_pool = pipe.download_and_load_models(model_configs, vram_limit)
|
|
64
78
|
pipe.text_encoder = model_pool.fetch_model("minimax_h3_text_encoder")
|
|
@@ -45,7 +45,21 @@ class MiniMaxMusic3Pipeline(BasePipeline):
|
|
|
45
45
|
model_configs: list[ModelConfig] = [],
|
|
46
46
|
tokenizer_config: ModelConfig = None,
|
|
47
47
|
vram_limit: float = None,
|
|
48
|
+
redirect_common_files: bool = True,
|
|
48
49
|
):
|
|
50
|
+
if redirect_common_files:
|
|
51
|
+
redirect_dict = {
|
|
52
|
+
"MiniMax/MiniMax-Music3": "MiniMaxAI/MiniMax-Music3",
|
|
53
|
+
}
|
|
54
|
+
for model_config in model_configs:
|
|
55
|
+
if model_config.require_downloading() and model_config.parse_download_source() == "huggingface":
|
|
56
|
+
if model_config.model_id is not None and model_config.model_id in redirect_dict:
|
|
57
|
+
print(f"The model is detected to be downloading from HuggingFace. {model_config.model_id} is redirected to {redirect_dict[model_config.model_id]}. You can use `redirect_common_files=False` to disable file redirection.")
|
|
58
|
+
model_config.model_id = redirect_dict[model_config.model_id]
|
|
59
|
+
if tokenizer_config is not None and tokenizer_config.require_downloading() and tokenizer_config.parse_download_source() == "huggingface":
|
|
60
|
+
if tokenizer_config.model_id is not None and tokenizer_config.model_id in redirect_dict:
|
|
61
|
+
print(f"The model is detected to be downloading from HuggingFace. {tokenizer_config.model_id} is redirected to {redirect_dict[tokenizer_config.model_id]}. You can use `redirect_common_files=False` to disable file redirection.")
|
|
62
|
+
tokenizer_config.model_id = redirect_dict[tokenizer_config.model_id]
|
|
49
63
|
pipe = MiniMaxMusic3Pipeline(device=device, torch_dtype=torch_dtype)
|
|
50
64
|
model_pool = pipe.download_and_load_models(model_configs, vram_limit)
|
|
51
65
|
pipe.text_encoder = model_pool.fetch_model("minimax_music3_text_encoder")
|
|
@@ -348,4 +362,4 @@ class MiniMaxMusic3Unit_Vocoder(PipelineUnit):
|
|
|
348
362
|
waveform_chunks.append(waveform[...,
|
|
349
363
|
left:waveform.shape[-1] - right])
|
|
350
364
|
song = torch.cat(waveform_chunks, dim=-1)[0]
|
|
351
|
-
return {"audio": song.float().clamp(-1.0, 1.0)}
|
|
365
|
+
return {"audio": song.float().clamp(-1.0, 1.0).cpu()}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Make sure to modify __release_datetime__ to release time when making official release.
|
|
2
|
-
__version__ = '2.1.
|
|
2
|
+
__version__ = '2.1.5'
|
|
3
3
|
# default release datetime for branches under active development is set
|
|
4
4
|
# to be a time far-far-away-into-the-future
|
|
5
5
|
__release_datetime__ = '2099-10-13 08:56:12'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: diffsynth
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.5
|
|
4
4
|
Summary: Enjoy the magic of Diffusion models!
|
|
5
5
|
Author: ModelScope Team
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -107,6 +107,8 @@ 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
|
+
- **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
|
+
|
|
110
112
|
- **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).
|
|
111
113
|
|
|
112
114
|
- **August 17, 2026** MiniMax-Music3 open-sourced, welcome a new member to the audio model family! Support includes text-to-music generation and low VRAM inference. For details, please refer to the [documentation](/docs/en/Model_Details/MiniMax-Music3.md) and [example code](/examples/minimax_music3/).
|
|
@@ -802,6 +804,9 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
|
|
|
802
804
|
| FLUX.1 | [black-forest-labs/FLUX.1-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-dev) | [code](/examples/flux/model_inference/FLUX.1-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-dev.py) |
|
|
803
805
|
| FLUX.1 | [black-forest-labs/FLUX.1-Krea-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-Krea-dev) | [code](/examples/flux/model_inference/FLUX.1-Krea-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-Krea-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-Krea-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-Krea-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-Krea-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-Krea-dev.py) |
|
|
804
806
|
| FLUX.1 | [black-forest-labs/FLUX.1-Kontext-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-Kontext-dev) | [code](/examples/flux/model_inference/FLUX.1-Kontext-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-Kontext-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-Kontext-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-Kontext-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-Kontext-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-Kontext-dev.py) |
|
|
807
|
+
| FLUX.1 | [black-forest-labs/FLUX.1-Fill-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-Fill-dev) | [code](/examples/flux/model_inference/FLUX.1-Fill-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-Fill-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-Fill-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-Fill-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-Fill-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-Fill-dev.py) |
|
|
808
|
+
| FLUX.1 | [black-forest-labs/FLUX.1-Redux-dev](https://www.modelscope.cn/models/black-forest-labs/FLUX.1-Redux-dev) | [code](/examples/flux/model_inference/FLUX.1-Redux-dev.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-Redux-dev.py) | [code](/examples/flux/model_training/full/FLUX.1-Redux-dev.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-Redux-dev.py) | [code](/examples/flux/model_training/lora/FLUX.1-Redux-dev.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-Redux-dev.py) |
|
|
809
|
+
| FLUX.1 | [HuanJue/Insert-Anything](https://www.modelscope.cn/models/HuanJue/Insert-Anything) | [code](/examples/flux/model_inference/Insert-Anything.py) | [code](/examples/flux/model_inference_low_vram/Insert-Anything.py) | - | - | [code](/examples/flux/model_training/lora/Insert-Anything.sh) | [code](/examples/flux/model_training/validate_lora/Insert-Anything.py) |
|
|
805
810
|
| FLUX.1 | [alimama-creative/FLUX.1-dev-Controlnet-Inpainting-Beta](https://www.modelscope.cn/models/alimama-creative/FLUX.1-dev-Controlnet-Inpainting-Beta) | [code](/examples/flux/model_inference/FLUX.1-dev-Controlnet-Inpainting-Beta.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-dev-Controlnet-Inpainting-Beta.py) | [code](/examples/flux/model_training/full/FLUX.1-dev-Controlnet-Inpainting-Beta.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-dev-Controlnet-Inpainting-Beta.py) | [code](/examples/flux/model_training/lora/FLUX.1-dev-Controlnet-Inpainting-Beta.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-dev-Controlnet-Inpainting-Beta.py) |
|
|
806
811
|
| FLUX.1 | [InstantX/FLUX.1-dev-Controlnet-Union-alpha](https://www.modelscope.cn/models/InstantX/FLUX.1-dev-Controlnet-Union-alpha) | [code](/examples/flux/model_inference/FLUX.1-dev-Controlnet-Union-alpha.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-dev-Controlnet-Union-alpha.py) | [code](/examples/flux/model_training/full/FLUX.1-dev-Controlnet-Union-alpha.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-dev-Controlnet-Union-alpha.py) | [code](/examples/flux/model_training/lora/FLUX.1-dev-Controlnet-Union-alpha.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-dev-Controlnet-Union-alpha.py) |
|
|
807
812
|
| FLUX.1 | [jasperai/Flux.1-dev-Controlnet-Upscaler](https://www.modelscope.cn/models/jasperai/Flux.1-dev-Controlnet-Upscaler) | [code](/examples/flux/model_inference/FLUX.1-dev-Controlnet-Upscaler.py) | [code](/examples/flux/model_inference_low_vram/FLUX.1-dev-Controlnet-Upscaler.py) | [code](/examples/flux/model_training/full/FLUX.1-dev-Controlnet-Upscaler.sh) | [code](/examples/flux/model_training/validate_full/FLUX.1-dev-Controlnet-Upscaler.py) | [code](/examples/flux/model_training/lora/FLUX.1-dev-Controlnet-Upscaler.sh) | [code](/examples/flux/model_training/validate_lora/FLUX.1-dev-Controlnet-Upscaler.py) |
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|