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.
Files changed (270) hide show
  1. {diffsynth-2.1.3 → diffsynth-2.1.5}/PKG-INFO +6 -1
  2. {diffsynth-2.1.3 → diffsynth-2.1.5}/README.md +5 -0
  3. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/data/operators.py +2 -2
  4. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/loader/config.py +2 -2
  5. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/loader/file.py +17 -1
  6. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/loader/model.py +4 -1
  7. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/backends/bitsandbytes.py +24 -24
  8. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/vram/layers.py +5 -2
  9. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/base_pipeline.py +9 -1
  10. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/flow_match.py +1 -1
  11. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/loss.py +24 -1
  12. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/training_module.py +20 -4
  13. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/ace_step.py +2 -1
  14. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/ltx2_audio_video.py +1 -1
  15. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/minimax_h3_audio_video.py +14 -0
  16. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/minimax_music3.py +15 -1
  17. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/version.py +1 -1
  18. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth.egg-info/PKG-INFO +6 -1
  19. {diffsynth-2.1.3 → diffsynth-2.1.5}/LICENSE +0 -0
  20. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/__init__.py +0 -0
  21. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/configs/__init__.py +0 -0
  22. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/configs/model_configs.py +0 -0
  23. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/configs/vram_management_module_maps.py +0 -0
  24. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/__init__.py +0 -0
  25. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/attention/__init__.py +0 -0
  26. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/attention/attention.py +0 -0
  27. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/data/__init__.py +0 -0
  28. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/data/unified_dataset.py +0 -0
  29. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/device/__init__.py +0 -0
  30. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/device/npu_compatible_device.py +0 -0
  31. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/gradient/__init__.py +0 -0
  32. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/gradient/gradient_checkpoint.py +0 -0
  33. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/loader/__init__.py +0 -0
  34. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/npu_patch/npu_fused_operator.py +0 -0
  35. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/offload_training/__init__.py +0 -0
  36. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/offload_training/manager.py +0 -0
  37. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/offload_training/memory_buffer.py +0 -0
  38. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/offload_training/offloader.py +0 -0
  39. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/__init__.py +0 -0
  40. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/backends/__init__.py +0 -0
  41. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/backends/comfy_kitchen.py +0 -0
  42. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/backends/torchao.py +0 -0
  43. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/base.py +0 -0
  44. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/quant/config.py +0 -0
  45. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/vram/__init__.py +0 -0
  46. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/vram/disk_map.py +0 -0
  47. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/core/vram/initialization.py +0 -0
  48. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/__init__.py +0 -0
  49. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/ddim_scheduler.py +0 -0
  50. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/dmd2.py +0 -0
  51. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/logger.py +0 -0
  52. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/parsers.py +0 -0
  53. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/runner.py +0 -0
  54. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/diffusion/template.py +0 -0
  55. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/__init__.py +0 -0
  56. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/aesthetic.py +0 -0
  57. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/base.py +0 -0
  58. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/bioclip.py +0 -0
  59. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/clip.py +0 -0
  60. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/fid.py +0 -0
  61. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/hpsv2.py +0 -0
  62. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/hpsv3.py +0 -0
  63. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/image_reward.py +0 -0
  64. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/lpips.py +0 -0
  65. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/pickscore.py +0 -0
  66. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/qwen_image_bench.py +0 -0
  67. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/unified_reward_2.py +0 -0
  68. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/metrics/unified_reward_edit.py +0 -0
  69. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ace_step_conditioner.py +0 -0
  70. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ace_step_dit.py +0 -0
  71. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ace_step_residual_fsq.py +0 -0
  72. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ace_step_text_encoder.py +0 -0
  73. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ace_step_tokenizer.py +0 -0
  74. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ace_step_vae.py +0 -0
  75. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/aesthetic.py +0 -0
  76. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/anima_dit.py +0 -0
  77. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/bioclip.py +0 -0
  78. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/boogu_image_dit.py +0 -0
  79. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/clip.py +0 -0
  80. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/demucs.py +0 -0
  81. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/dinov3_image_encoder.py +0 -0
  82. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ernie_image_dit.py +0 -0
  83. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ernie_image_text_encoder.py +0 -0
  84. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/fid.py +0 -0
  85. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux2_dit.py +0 -0
  86. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux2_text_encoder.py +0 -0
  87. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux2_vae.py +0 -0
  88. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_controlnet.py +0 -0
  89. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_dit.py +0 -0
  90. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_infiniteyou.py +0 -0
  91. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_ipadapter.py +0 -0
  92. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_lora_encoder.py +0 -0
  93. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_lora_patcher.py +0 -0
  94. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_redux.py +0 -0
  95. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_text_encoder_clip.py +0 -0
  96. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_text_encoder_t5.py +0 -0
  97. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_vae.py +0 -0
  98. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/flux_value_control.py +0 -0
  99. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/general_modules.py +0 -0
  100. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/hidream_common.py +0 -0
  101. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/hidream_o1_image_dit.py +0 -0
  102. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/hpsv2.py +0 -0
  103. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/hpsv3.py +0 -0
  104. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ideogram4_dit.py +0 -0
  105. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ideogram4_text_encoder.py +0 -0
  106. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ideogram4_vae.py +0 -0
  107. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/image_reward.py +0 -0
  108. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/joyai_image_dit.py +0 -0
  109. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/joyai_image_text_encoder.py +0 -0
  110. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/krea2_dit.py +0 -0
  111. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/krea2_text_encoder.py +0 -0
  112. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/lingbot_video_dit.py +0 -0
  113. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/longcat_video_dit.py +0 -0
  114. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/lpips.py +0 -0
  115. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ltx2_audio_vae.py +0 -0
  116. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ltx2_common.py +0 -0
  117. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ltx2_dit.py +0 -0
  118. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ltx2_text_encoder.py +0 -0
  119. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ltx2_upsampler.py +0 -0
  120. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/ltx2_video_vae.py +0 -0
  121. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_h3_audio_vae.py +0 -0
  122. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_h3_dit.py +0 -0
  123. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_h3_dit_comfy.py +0 -0
  124. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_h3_text_encoder.py +0 -0
  125. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_h3_video_vae.py +0 -0
  126. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_music3_condition_encoder.py +0 -0
  127. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_music3_dit.py +0 -0
  128. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_music3_rvq_depth_decoder.py +0 -0
  129. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_music3_text_encoder.py +0 -0
  130. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/minimax_music3_vocoder.py +0 -0
  131. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/model_loader.py +0 -0
  132. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/mova_audio_dit.py +0 -0
  133. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/mova_audio_vae.py +0 -0
  134. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/mova_dual_tower_bridge.py +0 -0
  135. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/nexus_gen.py +0 -0
  136. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/nexus_gen_ar_model.py +0 -0
  137. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/nexus_gen_projector.py +0 -0
  138. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/pickscore.py +0 -0
  139. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/qwen_image_bench.py +0 -0
  140. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/qwen_image_controlnet.py +0 -0
  141. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/qwen_image_dit.py +0 -0
  142. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/qwen_image_image2lora.py +0 -0
  143. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/qwen_image_text_encoder.py +0 -0
  144. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/qwen_image_vae.py +0 -0
  145. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/sd_text_encoder.py +0 -0
  146. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/siglip2_image_encoder.py +0 -0
  147. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/stable_diffusion_text_encoder.py +0 -0
  148. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/stable_diffusion_unet.py +0 -0
  149. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/stable_diffusion_vae.py +0 -0
  150. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/stable_diffusion_xl_text_encoder.py +0 -0
  151. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/stable_diffusion_xl_unet.py +0 -0
  152. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/step1x_connector.py +0 -0
  153. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/step1x_text_encoder.py +0 -0
  154. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/unified_reward_2.py +0 -0
  155. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/unified_reward_edit.py +0 -0
  156. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_animate_2_dit.py +0 -0
  157. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_animate_adapter.py +0 -0
  158. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_camera_controller.py +0 -0
  159. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_dit.py +0 -0
  160. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_dit_s2v.py +0 -0
  161. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_image_encoder.py +0 -0
  162. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_mot.py +0 -0
  163. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_motion_controller.py +0 -0
  164. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_text_encoder.py +0 -0
  165. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_vace.py +0 -0
  166. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wan_video_vae.py +0 -0
  167. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wantodance.py +0 -0
  168. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/wav2vec.py +0 -0
  169. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/z_image_controlnet.py +0 -0
  170. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/z_image_dit.py +0 -0
  171. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/z_image_image2lora.py +0 -0
  172. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/models/z_image_text_encoder.py +0 -0
  173. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/anima_image.py +0 -0
  174. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/boogu_image.py +0 -0
  175. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/ernie_image.py +0 -0
  176. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/flux2_image.py +0 -0
  177. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/flux_image.py +0 -0
  178. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/hidream_o1_image.py +0 -0
  179. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/ideogram4.py +0 -0
  180. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/joyai_image.py +0 -0
  181. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/krea2.py +0 -0
  182. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/lingbot_video.py +0 -0
  183. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/mova_audio_video.py +0 -0
  184. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/qwen_image.py +0 -0
  185. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/stable_diffusion.py +0 -0
  186. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/stable_diffusion_xl.py +0 -0
  187. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/wan_video.py +0 -0
  188. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/pipelines/z_image.py +0 -0
  189. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/controlnet/__init__.py +0 -0
  190. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/controlnet/annotator.py +0 -0
  191. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/controlnet/controlnet_input.py +0 -0
  192. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/data/__init__.py +0 -0
  193. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/data/audio.py +0 -0
  194. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/data/audio_video.py +0 -0
  195. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/data/media_io_ltx2.py +0 -0
  196. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/data/minimax_h3.py +0 -0
  197. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/demucs/__init__.py +0 -0
  198. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/dequantizer/__init__.py +0 -0
  199. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/__init__.py +0 -0
  200. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/flux.py +0 -0
  201. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/flux_timestep.py +0 -0
  202. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/general.py +0 -0
  203. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/krea2.py +0 -0
  204. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/merge.py +0 -0
  205. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/minimax_h3.py +0 -0
  206. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/reset_rank.py +0 -0
  207. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/lora/sdxl.py +0 -0
  208. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/quant/serialization.py +0 -0
  209. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/ses/__init__.py +0 -0
  210. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/ses/ses.py +0 -0
  211. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/__init__.py +0 -0
  212. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ace_step_conditioner.py +0 -0
  213. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ace_step_dit.py +0 -0
  214. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ace_step_text_encoder.py +0 -0
  215. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ace_step_tokenizer.py +0 -0
  216. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/anima_dit.py +0 -0
  217. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/dino_v3.py +0 -0
  218. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ernie_image_text_encoder.py +0 -0
  219. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux2_text_encoder.py +0 -0
  220. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_controlnet.py +0 -0
  221. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_dit.py +0 -0
  222. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_infiniteyou.py +0 -0
  223. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_ipadapter.py +0 -0
  224. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_text_encoder_clip.py +0 -0
  225. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_text_encoder_t5.py +0 -0
  226. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/flux_vae.py +0 -0
  227. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ideogram4_text_encoder.py +0 -0
  228. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/image_metrics.py +0 -0
  229. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/joyai_image_text_encoder.py +0 -0
  230. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/krea2_dit.py +0 -0
  231. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/krea2_text_encoder.py +0 -0
  232. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/lingbot_video_dit.py +0 -0
  233. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ltx2_audio_vae.py +0 -0
  234. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ltx2_dit.py +0 -0
  235. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ltx2_text_encoder.py +0 -0
  236. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/ltx2_video_vae.py +0 -0
  237. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/minimax_h3_audio_vae.py +0 -0
  238. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/minimax_h3_text_encoder.py +0 -0
  239. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/minimax_h3_video_vae.py +0 -0
  240. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/minimax_music3_text_encoder.py +0 -0
  241. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/nexus_gen.py +0 -0
  242. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/nexus_gen_projector.py +0 -0
  243. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/qwen_image_text_encoder.py +0 -0
  244. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/sdxl.py +0 -0
  245. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/sdxl_text_encoder.py +0 -0
  246. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/sdxl_text_encoder_2.py +0 -0
  247. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/sdxl_vae.py +0 -0
  248. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/stable_diffusion_text_encoder.py +0 -0
  249. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/stable_diffusion_vae.py +0 -0
  250. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/stable_diffusion_xl_text_encoder.py +0 -0
  251. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/step1x_connector.py +0 -0
  252. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wan_video_animate_adapter.py +0 -0
  253. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wan_video_dit.py +0 -0
  254. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wan_video_image_encoder.py +0 -0
  255. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wan_video_mot.py +0 -0
  256. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wan_video_vace.py +0 -0
  257. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wan_video_vae.py +0 -0
  258. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/wans2v_audio_encoder.py +0 -0
  259. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/z_image_dit.py +0 -0
  260. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/state_dict_converters/z_image_text_encoder.py +0 -0
  261. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/tile/__init__.py +0 -0
  262. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/tile/tile_worker.py +0 -0
  263. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/xfuser/__init__.py +0 -0
  264. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth/utils/xfuser/xdit_context_parallel.py +0 -0
  265. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth.egg-info/SOURCES.txt +0 -0
  266. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth.egg-info/dependency_links.txt +0 -0
  267. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth.egg-info/requires.txt +0 -0
  268. {diffsynth-2.1.3 → diffsynth-2.1.5}/diffsynth.egg-info/top_level.txt +0 -0
  269. {diffsynth-2.1.3 → diffsynth-2.1.5}/pyproject.toml +0 -0
  270. {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
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[0] if isinstance(path, list) else 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
- def _assign_params_from_state_dict(self, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs):
15
- """`_load_from_state_dict` replacement for shells: assigns tensors as-is, since packed weights do not pass the standard shape check."""
16
- local_names = set()
17
- for name, current in list(self._parameters.items()) + list(self._buffers.items()):
18
- if current is None:
19
- continue
20
- local_names.add(name)
21
- key = prefix + name
22
- if key in state_dict:
23
- value = state_dict[key]
24
- if name in self._parameters:
25
- self._parameters[name] = value if isinstance(value, torch.nn.Parameter) else torch.nn.Parameter(value, requires_grad=False)
26
- else:
27
- self._buffers[name] = value
28
- elif strict:
29
- missing_keys.append(key)
30
- if strict:
31
- for key in state_dict:
32
- if key.startswith(prefix) and key[len(prefix):].split(".", 1)[0] not in local_names:
33
- unexpected_keys.append(key)
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 (bnb.nn.Linear4bit,)
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 = bnb.nn.Linear4bit(
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 = bnb.nn.Linear4bit(
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
- super().__init__(
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 == "ditilled_stage1":
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=quant_map.get(path), **vram_config))
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=quant_map.get(model_id_with_origin_path), **vram_config))
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.remove_weight_norm()
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="ditilled_stage1" if use_distilled_pipeline else None)
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.3'
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
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