diffsynth 2.1.4__tar.gz → 2.1.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. {diffsynth-2.1.4 → diffsynth-2.1.6}/PKG-INFO +16 -1
  2. {diffsynth-2.1.4 → diffsynth-2.1.6}/README.md +15 -0
  3. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/configs/model_configs.py +36 -2
  4. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/configs/vram_management_module_maps.py +16 -0
  5. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/loader/config.py +2 -2
  6. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/loader/model.py +3 -0
  7. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/quant/backends/bitsandbytes.py +24 -24
  8. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/vram/layers.py +5 -2
  9. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/diffusion/base_pipeline.py +9 -1
  10. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/diffusion/flow_match.py +11 -1
  11. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/diffusion/loss.py +25 -2
  12. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/diffusion/training_module.py +1 -1
  13. diffsynth-2.1.6/diffsynth/models/minimax_h3_controlnet.py +105 -0
  14. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/minimax_h3_dit.py +4 -1
  15. diffsynth-2.1.6/diffsynth/models/qwen_video_edit_dit.py +89 -0
  16. diffsynth-2.1.6/diffsynth/models/sensenova_u1_common.py +229 -0
  17. diffsynth-2.1.6/diffsynth/models/sensenova_u1_dit.py +897 -0
  18. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/ace_step.py +2 -1
  19. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/minimax_h3_audio_video.py +158 -1
  20. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/minimax_music3.py +15 -1
  21. diffsynth-2.1.6/diffsynth/pipelines/qwen_video_edit.py +356 -0
  22. diffsynth-2.1.6/diffsynth/pipelines/sensenova_u1_image.py +318 -0
  23. diffsynth-2.1.6/diffsynth/utils/state_dict_converters/minimax_h3_controlnet.py +75 -0
  24. diffsynth-2.1.6/diffsynth/utils/state_dict_converters/qwen_video_edit.py +6 -0
  25. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/version.py +1 -1
  26. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth.egg-info/PKG-INFO +16 -1
  27. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth.egg-info/SOURCES.txt +8 -0
  28. {diffsynth-2.1.4 → diffsynth-2.1.6}/LICENSE +0 -0
  29. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/__init__.py +0 -0
  30. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/configs/__init__.py +0 -0
  31. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/__init__.py +0 -0
  32. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/attention/__init__.py +0 -0
  33. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/attention/attention.py +0 -0
  34. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/data/__init__.py +0 -0
  35. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/data/operators.py +0 -0
  36. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/data/unified_dataset.py +0 -0
  37. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/device/__init__.py +0 -0
  38. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/device/npu_compatible_device.py +0 -0
  39. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/gradient/__init__.py +0 -0
  40. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/gradient/gradient_checkpoint.py +0 -0
  41. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/loader/__init__.py +0 -0
  42. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/loader/file.py +0 -0
  43. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/npu_patch/npu_fused_operator.py +0 -0
  44. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/offload_training/__init__.py +0 -0
  45. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/offload_training/manager.py +0 -0
  46. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/offload_training/memory_buffer.py +0 -0
  47. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/offload_training/offloader.py +0 -0
  48. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/quant/__init__.py +0 -0
  49. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/quant/backends/__init__.py +0 -0
  50. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/quant/backends/comfy_kitchen.py +0 -0
  51. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/quant/backends/torchao.py +0 -0
  52. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/quant/base.py +0 -0
  53. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/quant/config.py +0 -0
  54. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/vram/__init__.py +0 -0
  55. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/vram/disk_map.py +0 -0
  56. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/core/vram/initialization.py +0 -0
  57. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/diffusion/__init__.py +0 -0
  58. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/diffusion/ddim_scheduler.py +0 -0
  59. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/diffusion/dmd2.py +0 -0
  60. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/diffusion/logger.py +0 -0
  61. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/diffusion/parsers.py +0 -0
  62. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/diffusion/runner.py +0 -0
  63. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/diffusion/template.py +0 -0
  64. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/__init__.py +0 -0
  65. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/aesthetic.py +0 -0
  66. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/base.py +0 -0
  67. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/bioclip.py +0 -0
  68. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/clip.py +0 -0
  69. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/fid.py +0 -0
  70. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/hpsv2.py +0 -0
  71. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/hpsv3.py +0 -0
  72. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/image_reward.py +0 -0
  73. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/lpips.py +0 -0
  74. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/pickscore.py +0 -0
  75. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/qwen_image_bench.py +0 -0
  76. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/unified_reward_2.py +0 -0
  77. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/metrics/unified_reward_edit.py +0 -0
  78. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ace_step_conditioner.py +0 -0
  79. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ace_step_dit.py +0 -0
  80. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ace_step_residual_fsq.py +0 -0
  81. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ace_step_text_encoder.py +0 -0
  82. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ace_step_tokenizer.py +0 -0
  83. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ace_step_vae.py +0 -0
  84. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/aesthetic.py +0 -0
  85. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/anima_dit.py +0 -0
  86. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/bioclip.py +0 -0
  87. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/boogu_image_dit.py +0 -0
  88. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/clip.py +0 -0
  89. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/demucs.py +0 -0
  90. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/dinov3_image_encoder.py +0 -0
  91. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ernie_image_dit.py +0 -0
  92. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ernie_image_text_encoder.py +0 -0
  93. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/fid.py +0 -0
  94. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux2_dit.py +0 -0
  95. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux2_text_encoder.py +0 -0
  96. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux2_vae.py +0 -0
  97. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux_controlnet.py +0 -0
  98. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux_dit.py +0 -0
  99. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux_infiniteyou.py +0 -0
  100. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux_ipadapter.py +0 -0
  101. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux_lora_encoder.py +0 -0
  102. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux_lora_patcher.py +0 -0
  103. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux_redux.py +0 -0
  104. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux_text_encoder_clip.py +0 -0
  105. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux_text_encoder_t5.py +0 -0
  106. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux_vae.py +0 -0
  107. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/flux_value_control.py +0 -0
  108. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/general_modules.py +0 -0
  109. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/hidream_common.py +0 -0
  110. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/hidream_o1_image_dit.py +0 -0
  111. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/hpsv2.py +0 -0
  112. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/hpsv3.py +0 -0
  113. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ideogram4_dit.py +0 -0
  114. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ideogram4_text_encoder.py +0 -0
  115. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ideogram4_vae.py +0 -0
  116. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/image_reward.py +0 -0
  117. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/joyai_image_dit.py +0 -0
  118. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/joyai_image_text_encoder.py +0 -0
  119. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/krea2_dit.py +0 -0
  120. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/krea2_text_encoder.py +0 -0
  121. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/lingbot_video_dit.py +0 -0
  122. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/longcat_video_dit.py +0 -0
  123. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/lpips.py +0 -0
  124. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ltx2_audio_vae.py +0 -0
  125. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ltx2_common.py +0 -0
  126. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ltx2_dit.py +0 -0
  127. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ltx2_text_encoder.py +0 -0
  128. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ltx2_upsampler.py +0 -0
  129. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/ltx2_video_vae.py +0 -0
  130. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/minimax_h3_audio_vae.py +0 -0
  131. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/minimax_h3_dit_comfy.py +0 -0
  132. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/minimax_h3_text_encoder.py +0 -0
  133. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/minimax_h3_video_vae.py +0 -0
  134. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/minimax_music3_condition_encoder.py +0 -0
  135. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/minimax_music3_dit.py +0 -0
  136. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/minimax_music3_rvq_depth_decoder.py +0 -0
  137. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/minimax_music3_text_encoder.py +0 -0
  138. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/minimax_music3_vocoder.py +0 -0
  139. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/model_loader.py +0 -0
  140. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/mova_audio_dit.py +0 -0
  141. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/mova_audio_vae.py +0 -0
  142. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/mova_dual_tower_bridge.py +0 -0
  143. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/nexus_gen.py +0 -0
  144. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/nexus_gen_ar_model.py +0 -0
  145. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/nexus_gen_projector.py +0 -0
  146. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/pickscore.py +0 -0
  147. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/qwen_image_bench.py +0 -0
  148. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/qwen_image_controlnet.py +0 -0
  149. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/qwen_image_dit.py +0 -0
  150. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/qwen_image_image2lora.py +0 -0
  151. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/qwen_image_text_encoder.py +0 -0
  152. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/qwen_image_vae.py +0 -0
  153. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/sd_text_encoder.py +0 -0
  154. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/siglip2_image_encoder.py +0 -0
  155. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/stable_diffusion_text_encoder.py +0 -0
  156. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/stable_diffusion_unet.py +0 -0
  157. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/stable_diffusion_vae.py +0 -0
  158. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/stable_diffusion_xl_text_encoder.py +0 -0
  159. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/stable_diffusion_xl_unet.py +0 -0
  160. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/step1x_connector.py +0 -0
  161. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/step1x_text_encoder.py +0 -0
  162. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/unified_reward_2.py +0 -0
  163. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/unified_reward_edit.py +0 -0
  164. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/wan_animate_2_dit.py +0 -0
  165. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/wan_video_animate_adapter.py +0 -0
  166. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/wan_video_camera_controller.py +0 -0
  167. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/wan_video_dit.py +0 -0
  168. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/wan_video_dit_s2v.py +0 -0
  169. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/wan_video_image_encoder.py +0 -0
  170. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/wan_video_mot.py +0 -0
  171. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/wan_video_motion_controller.py +0 -0
  172. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/wan_video_text_encoder.py +0 -0
  173. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/wan_video_vace.py +0 -0
  174. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/wan_video_vae.py +0 -0
  175. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/wantodance.py +0 -0
  176. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/wav2vec.py +0 -0
  177. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/z_image_controlnet.py +0 -0
  178. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/z_image_dit.py +0 -0
  179. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/z_image_image2lora.py +0 -0
  180. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/models/z_image_text_encoder.py +0 -0
  181. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/anima_image.py +0 -0
  182. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/boogu_image.py +0 -0
  183. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/ernie_image.py +0 -0
  184. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/flux2_image.py +0 -0
  185. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/flux_image.py +0 -0
  186. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/hidream_o1_image.py +0 -0
  187. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/ideogram4.py +0 -0
  188. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/joyai_image.py +0 -0
  189. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/krea2.py +0 -0
  190. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/lingbot_video.py +0 -0
  191. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/ltx2_audio_video.py +0 -0
  192. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/mova_audio_video.py +0 -0
  193. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/qwen_image.py +0 -0
  194. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/stable_diffusion.py +0 -0
  195. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/stable_diffusion_xl.py +0 -0
  196. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/wan_video.py +0 -0
  197. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/pipelines/z_image.py +0 -0
  198. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/controlnet/__init__.py +0 -0
  199. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/controlnet/annotator.py +0 -0
  200. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/controlnet/controlnet_input.py +0 -0
  201. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/data/__init__.py +0 -0
  202. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/data/audio.py +0 -0
  203. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/data/audio_video.py +0 -0
  204. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/data/media_io_ltx2.py +0 -0
  205. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/data/minimax_h3.py +0 -0
  206. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/demucs/__init__.py +0 -0
  207. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/dequantizer/__init__.py +0 -0
  208. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/lora/__init__.py +0 -0
  209. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/lora/flux.py +0 -0
  210. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/lora/flux_timestep.py +0 -0
  211. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/lora/general.py +0 -0
  212. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/lora/krea2.py +0 -0
  213. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/lora/merge.py +0 -0
  214. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/lora/minimax_h3.py +0 -0
  215. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/lora/reset_rank.py +0 -0
  216. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/lora/sdxl.py +0 -0
  217. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/quant/serialization.py +0 -0
  218. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/ses/__init__.py +0 -0
  219. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/ses/ses.py +0 -0
  220. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/__init__.py +0 -0
  221. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ace_step_conditioner.py +0 -0
  222. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ace_step_dit.py +0 -0
  223. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ace_step_text_encoder.py +0 -0
  224. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ace_step_tokenizer.py +0 -0
  225. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/anima_dit.py +0 -0
  226. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/dino_v3.py +0 -0
  227. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ernie_image_text_encoder.py +0 -0
  228. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux2_text_encoder.py +0 -0
  229. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_controlnet.py +0 -0
  230. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_dit.py +0 -0
  231. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_infiniteyou.py +0 -0
  232. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_ipadapter.py +0 -0
  233. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_text_encoder_clip.py +0 -0
  234. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_text_encoder_t5.py +0 -0
  235. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/flux_vae.py +0 -0
  236. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ideogram4_text_encoder.py +0 -0
  237. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/image_metrics.py +0 -0
  238. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/joyai_image_text_encoder.py +0 -0
  239. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/krea2_dit.py +0 -0
  240. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/krea2_text_encoder.py +0 -0
  241. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/lingbot_video_dit.py +0 -0
  242. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ltx2_audio_vae.py +0 -0
  243. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ltx2_dit.py +0 -0
  244. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ltx2_text_encoder.py +0 -0
  245. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/ltx2_video_vae.py +0 -0
  246. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/minimax_h3_audio_vae.py +0 -0
  247. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/minimax_h3_text_encoder.py +0 -0
  248. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/minimax_h3_video_vae.py +0 -0
  249. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/minimax_music3_text_encoder.py +0 -0
  250. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/nexus_gen.py +0 -0
  251. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/nexus_gen_projector.py +0 -0
  252. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/qwen_image_text_encoder.py +0 -0
  253. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/sdxl.py +0 -0
  254. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/sdxl_text_encoder.py +0 -0
  255. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/sdxl_text_encoder_2.py +0 -0
  256. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/sdxl_vae.py +0 -0
  257. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/stable_diffusion_text_encoder.py +0 -0
  258. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/stable_diffusion_vae.py +0 -0
  259. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/stable_diffusion_xl_text_encoder.py +0 -0
  260. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/step1x_connector.py +0 -0
  261. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wan_video_animate_adapter.py +0 -0
  262. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wan_video_dit.py +0 -0
  263. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wan_video_image_encoder.py +0 -0
  264. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wan_video_mot.py +0 -0
  265. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wan_video_vace.py +0 -0
  266. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wan_video_vae.py +0 -0
  267. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/wans2v_audio_encoder.py +0 -0
  268. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/z_image_dit.py +0 -0
  269. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/state_dict_converters/z_image_text_encoder.py +0 -0
  270. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/tile/__init__.py +0 -0
  271. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/tile/tile_worker.py +0 -0
  272. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/xfuser/__init__.py +0 -0
  273. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth/utils/xfuser/xdit_context_parallel.py +0 -0
  274. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth.egg-info/dependency_links.txt +0 -0
  275. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth.egg-info/requires.txt +0 -0
  276. {diffsynth-2.1.4 → diffsynth-2.1.6}/diffsynth.egg-info/top_level.txt +0 -0
  277. {diffsynth-2.1.4 → diffsynth-2.1.6}/pyproject.toml +0 -0
  278. {diffsynth-2.1.4 → diffsynth-2.1.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diffsynth
3
- Version: 2.1.4
3
+ Version: 2.1.6
4
4
  Summary: Enjoy the magic of Diffusion models!
5
5
  Author: ModelScope Team
6
6
  License-Expression: Apache-2.0
@@ -107,6 +107,10 @@ See also:
107
107
 
108
108
  > Currently, the development personnel of this project are limited, with most of the work handled by [Artiprocher](https://github.com/Artiprocher) and [mi804](https://github.com/mi804). Therefore, the progress of new feature development will be relatively slow, and the speed of responding to and resolving issues is limited. We apologize for this and ask developers to understand.
109
109
 
110
+ - **September 1, 2026** We have integrated [SenseNova-U1.5](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT), SenseTime's unified multimodal model, for which we provide text-to-image generation, image editing, low VRAM inference, and training support. For details, please refer to the [documentation](/docs/en/Model_Details/SenseNova-U1.md) and [example code](/examples/sensenova_u1/).
111
+
112
+ - **August 31, 2026** We have integrated [Qwen-Video-Edit](https://modelscope.cn/models/yunpeng1998/Qwen-Video-Edit), a video editing model developed by open-source community contributor [yunpeng1998](https://github.com/yunpeng1998) based on the image editing model Qwen-Image-Edit. This serves as an excellent example of exploring and expanding model capabilities.
113
+
110
114
  - **August 25, 2026** We have open-sourced [DiffSynth-WebUI](https://github.com/modelscope/DiffSynth-WebUI), enabling one-click private deployment of LoRA training services. Combined with the model quantization feature, you can train large models even with consumer-grade GPUs.
111
115
 
112
116
  - **August 19, 2026** We have released the model quantization feature. It provides a unified `QuantizeConfig` entry point supporting multiple quantization backends including bitsandbytes, torchao, and comfy-kitchen, with capabilities such as online quantization, loading pre-quantized weights, mixed quantization, saving quantized models, and quantization + LoRA training. For details, please refer to the [documentation](/docs/en/Pipeline_Usage/Quantization.md).
@@ -373,6 +377,7 @@ Quick start: experience popular and the latest models:
373
377
  Model overview:
374
378
 
375
379
  - Image generation
380
+ - SenseNova-U1: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/SenseNova-U1.html), [Example code](/examples/sensenova_u1/)
376
381
  - Boogu-Image: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/Boogu-Image.html), [Example code](/examples/boogu_image/)
377
382
  - Krea-2: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/Krea-2.html), [Example code](/examples/krea2/)
378
383
  - Ideogram 4: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/Ideogram-4.html), [Example code](/examples/ideogram4/)
@@ -640,6 +645,11 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
640
645
 
641
646
  | Architecture | Model ID | Inference | Low VRAM Inference | Full Training | Validation After Full Training | LoRA Training | Validation After LoRA Training |
642
647
  |-|-|-|-|-|-|-|-|
648
+ | SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT: T2I](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT.py) |
649
+ | SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT: Edit](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-Edit.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-Edit.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT-Edit.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT-Edit.py) |
650
+ | SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT-LoRAs: 8-step](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT-LoRAs) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-LoRA-8step.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-LoRA-8step.py) | - | - | - | - |
651
+ | SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT-SFT: T2I](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT-SFT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-SFT.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-SFT.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT-SFT.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT-SFT.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT-SFT.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT-SFT.py) |
652
+ | SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT-SFT: Edit](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT-SFT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-SFT-Edit.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-SFT-Edit.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT-SFT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT-SFT-Edit.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT-SFT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT-SFT-Edit.py) |
643
653
  | MiniMax-Music3 | [MiniMax/MiniMax-Music3](https://www.modelscope.cn/models/MiniMax/MiniMax-Music3) | [code](/examples/minimax_music3/model_inference/MiniMax-Music3.py) | [code](/examples/minimax_music3/model_inference_low_vram/MiniMax-Music3.py) | — | — | — | — |
644
654
  | MiniMax-H3 | [MiniMax/MiniMax-H3: FL2VA](https://www.modelscope.cn/models/MiniMax/MiniMax-H3) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-FL2VA.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-FL2VA.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-FL2VA.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-FL2VA.py) | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-FL2VA.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-FL2VA.py) |
645
655
  | MiniMax-H3 | [MiniMax/MiniMax-H3: Ref2VA](https://www.modelscope.cn/models/MiniMax/MiniMax-H3) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-Ref2VA.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-Ref2VA.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-Ref2VA.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-Ref2VA.py) | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-Ref2VA.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-Ref2VA.py) |
@@ -658,6 +668,7 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
658
668
  | MiniMax-H3 | [Comfy-Org/MiniMax-H3: Ref2VA pruned fp8](https://www.modelscope.cn/models/Comfy-Org/MiniMax-H3) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-FP8-Pruned-Ref2VA.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-FP8-Pruned-Ref2VA.py) | - | - | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-FP8-Pruned-Ref2VA.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-FP8-Pruned-Ref2VA.py) |
659
669
  | MiniMax-H3 | [lightx2v/Minimax-h3-Turbo: FL2VA 4steps](https://www.modelscope.cn/models/lightx2v/Minimax-h3-Turbo) | [code](https://github.com/modelscope/DiffSynth-Studio/blob/main/examples/minimax_h3/model_inference/MiniMax-H3-FL2VA-Turbo.py) | [code](https://github.com/modelscope/DiffSynth-Studio/blob/main/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-FL2VA-Turbo.py) | - | - | - | - |
660
670
  | MiniMax-H3 | [DiffSynth-Studio/MiniMax-H3-Text-Embeddings](https://www.modelscope.cn/models/DiffSynth-Studio/MiniMax-H3-Text-Embeddings) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-Text-Embeddings.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-Text-Embeddings.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-Text-Embeddings.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-Text-Embeddings.py) | - | - |
671
+ | MiniMax-H3 | [PAI/MiniMax-H3-Fun-Controlnet-Union](https://www.modelscope.cn/models/PAI/MiniMax-H3-Fun-Controlnet-Union) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-Fun-Controlnet-Union.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-Fun-Controlnet-Union.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-Fun-Controlnet-Union.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-Fun-Controlnet-Union.py) | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-Fun-Controlnet-Union.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-Fun-Controlnet-Union.py) |
661
672
  | LingBot-Video | [Robbyant/lingbot-video-dense-1.3b: T2V](https://modelscope.cn/models/Robbyant/lingbot-video-dense-1.3b) | [code](/examples/lingbot_video/model_inference/lingbot-video-dense-1.3b_t2v.py) | [code](/examples/lingbot_video/model_inference_low_vram/lingbot-video-dense-1.3b_t2v.py) | [code](/examples/lingbot_video/model_training/full/lingbot-video-dense-1.3b_t2v.sh) | [code](/examples/lingbot_video/model_training/validate_full/lingbot-video-dense-1.3b_t2v.py) | [code](/examples/lingbot_video/model_training/lora/lingbot-video-dense-1.3b_t2v.sh) | [code](/examples/lingbot_video/model_training/validate_lora/lingbot-video-dense-1.3b_t2v.py) |
662
673
  | LingBot-Video | [Robbyant/lingbot-video-dense-1.3b: TI2V](https://modelscope.cn/models/Robbyant/lingbot-video-dense-1.3b) | [code](/examples/lingbot_video/model_inference/lingbot-video-dense-1.3b_ti2v.py) | [code](/examples/lingbot_video/model_inference_low_vram/lingbot-video-dense-1.3b_ti2v.py) | [code](/examples/lingbot_video/model_training/full/lingbot-video-dense-1.3b_ti2v.sh) | [code](/examples/lingbot_video/model_training/validate_full/lingbot-video-dense-1.3b_ti2v.py) | [code](/examples/lingbot_video/model_training/lora/lingbot-video-dense-1.3b_ti2v.sh) | [code](/examples/lingbot_video/model_training/validate_lora/lingbot-video-dense-1.3b_ti2v.py) |
663
674
  | LingBot-Video | [Robbyant/lingbot-video-dense-1.3b: T2I](https://modelscope.cn/models/Robbyant/lingbot-video-dense-1.3b) | [code](/examples/lingbot_video/model_inference/lingbot-video-dense-1.3b_t2i.py) | [code](/examples/lingbot_video/model_inference_low_vram/lingbot-video-dense-1.3b_t2i.py) | - | - | - | - |
@@ -764,6 +775,7 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
764
775
  | Qwen-Image | [DiffSynth-Studio/Qwen-Image-In-Context-Control-Union](https://www.modelscope.cn/models/DiffSynth-Studio/Qwen-Image-In-Context-Control-Union) | [code](/examples/qwen_image/model_inference/Qwen-Image-In-Context-Control-Union.py) | [code](/examples/qwen_image/model_inference_low_vram/Qwen-Image-In-Context-Control-Union.py) | - | - | [code](/examples/qwen_image/model_training/lora/Qwen-Image-In-Context-Control-Union.sh) | [code](/examples/qwen_image/model_training/validate_lora/Qwen-Image-In-Context-Control-Union.py) |
765
776
  | Qwen-Image | [DiffSynth-Studio/Qwen-Image-Edit-Lowres-Fix](https://www.modelscope.cn/models/DiffSynth-Studio/Qwen-Image-Edit-Lowres-Fix) | [code](/examples/qwen_image/model_inference/Qwen-Image-Edit-Lowres-Fix.py) | [code](/examples/qwen_image/model_inference_low_vram/Qwen-Image-Edit-Lowres-Fix.py) | - | - | - | - |
766
777
  | Qwen-Image | [DiffSynth-Studio/Qwen-Image-i2L](https://www.modelscope.cn/models/DiffSynth-Studio/Qwen-Image-i2L) | [code](/examples/qwen_image/model_inference/Qwen-Image-i2L.py) | [code](/examples/qwen_image/model_inference_low_vram/Qwen-Image-i2L.py) | - | - | - | - |
778
+ | Qwen-Video-Edit | [yunpeng1998/Qwen-Video-Edit](https://www.modelscope.cn/models/yunpeng1998/Qwen-Video-Edit) | [code](/examples/qwen_video_edit/model_inference/Qwen-Video-Edit.py) | [code](/examples/qwen_video_edit/model_inference_low_vram/Qwen-Video-Edit.py) | [code](/examples/qwen_video_edit/model_training/full/Qwen-Video-Edit.sh) | [code](/examples/qwen_video_edit/model_training/validate_full/Qwen-Video-Edit.py) | [code](/examples/qwen_video_edit/model_training/lora/Qwen-Video-Edit.sh) | [code](/examples/qwen_video_edit/model_training/validate_lora/Qwen-Video-Edit.py) |
767
779
  | Wan | [Wan-AI/Wan2.1-T2V-1.3B](https://modelscope.cn/models/Wan-AI/Wan2.1-T2V-1.3B) | [code](/examples/wanvideo/model_inference/Wan2.1-T2V-1.3B.py) | [code](/examples/wanvideo/model_inference_low_vram/Wan2.1-T2V-1.3B.py) | [code](/examples/wanvideo/model_training/full/Wan2.1-T2V-1.3B.sh) | [code](/examples/wanvideo/model_training/validate_full/Wan2.1-T2V-1.3B.py) | [code](/examples/wanvideo/model_training/lora/Wan2.1-T2V-1.3B.sh) | [code](/examples/wanvideo/model_training/validate_lora/Wan2.1-T2V-1.3B.py) |
768
780
  | Wan | [Wan-AI/Wan2.1-T2V-14B](https://modelscope.cn/models/Wan-AI/Wan2.1-T2V-14B) | [code](/examples/wanvideo/model_inference/Wan2.1-T2V-14B.py) | [code](/examples/wanvideo/model_inference_low_vram/Wan2.1-T2V-14B.py) | [code](/examples/wanvideo/model_training/full/Wan2.1-T2V-14B.sh) | [code](/examples/wanvideo/model_training/validate_full/Wan2.1-T2V-14B.py) | [code](/examples/wanvideo/model_training/lora/Wan2.1-T2V-14B.sh) | [code](/examples/wanvideo/model_training/validate_lora/Wan2.1-T2V-14B.py) |
769
781
  | Wan | [Wan-AI/Wan2.1-I2V-14B-480P](https://modelscope.cn/models/Wan-AI/Wan2.1-I2V-14B-480P) | [code](/examples/wanvideo/model_inference/Wan2.1-I2V-14B-480P.py) | [code](/examples/wanvideo/model_inference_low_vram/Wan2.1-I2V-14B-480P.py) | [code](/examples/wanvideo/model_training/full/Wan2.1-I2V-14B-480P.sh) | [code](/examples/wanvideo/model_training/validate_full/Wan2.1-I2V-14B-480P.py) | [code](/examples/wanvideo/model_training/lora/Wan2.1-I2V-14B-480P.sh) | [code](/examples/wanvideo/model_training/validate_lora/Wan2.1-I2V-14B-480P.py) |
@@ -804,6 +816,9 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
804
816
  | 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) |
805
817
  | 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) |
806
818
  | 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) |
819
+ | 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) |
820
+ | 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) |
821
+ | 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) |
807
822
  | 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) |
808
823
  | 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) |
809
824
  | 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,10 @@ See also:
40
40
 
41
41
  > Currently, the development personnel of this project are limited, with most of the work handled by [Artiprocher](https://github.com/Artiprocher) and [mi804](https://github.com/mi804). Therefore, the progress of new feature development will be relatively slow, and the speed of responding to and resolving issues is limited. We apologize for this and ask developers to understand.
42
42
 
43
+ - **September 1, 2026** We have integrated [SenseNova-U1.5](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT), SenseTime's unified multimodal model, for which we provide text-to-image generation, image editing, low VRAM inference, and training support. For details, please refer to the [documentation](/docs/en/Model_Details/SenseNova-U1.md) and [example code](/examples/sensenova_u1/).
44
+
45
+ - **August 31, 2026** We have integrated [Qwen-Video-Edit](https://modelscope.cn/models/yunpeng1998/Qwen-Video-Edit), a video editing model developed by open-source community contributor [yunpeng1998](https://github.com/yunpeng1998) based on the image editing model Qwen-Image-Edit. This serves as an excellent example of exploring and expanding model capabilities.
46
+
43
47
  - **August 25, 2026** We have open-sourced [DiffSynth-WebUI](https://github.com/modelscope/DiffSynth-WebUI), enabling one-click private deployment of LoRA training services. Combined with the model quantization feature, you can train large models even with consumer-grade GPUs.
44
48
 
45
49
  - **August 19, 2026** We have released the model quantization feature. It provides a unified `QuantizeConfig` entry point supporting multiple quantization backends including bitsandbytes, torchao, and comfy-kitchen, with capabilities such as online quantization, loading pre-quantized weights, mixed quantization, saving quantized models, and quantization + LoRA training. For details, please refer to the [documentation](/docs/en/Pipeline_Usage/Quantization.md).
@@ -306,6 +310,7 @@ Quick start: experience popular and the latest models:
306
310
  Model overview:
307
311
 
308
312
  - Image generation
313
+ - SenseNova-U1: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/SenseNova-U1.html), [Example code](/examples/sensenova_u1/)
309
314
  - Boogu-Image: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/Boogu-Image.html), [Example code](/examples/boogu_image/)
310
315
  - Krea-2: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/Krea-2.html), [Example code](/examples/krea2/)
311
316
  - Ideogram 4: [Documentation](https://diffsynth-studio-doc.readthedocs.io/en/latest/Model_Details/Ideogram-4.html), [Example code](/examples/ideogram4/)
@@ -573,6 +578,11 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
573
578
 
574
579
  | Architecture | Model ID | Inference | Low VRAM Inference | Full Training | Validation After Full Training | LoRA Training | Validation After LoRA Training |
575
580
  |-|-|-|-|-|-|-|-|
581
+ | SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT: T2I](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT.py) |
582
+ | SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT: Edit](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-Edit.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-Edit.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT-Edit.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT-Edit.py) |
583
+ | SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT-LoRAs: 8-step](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT-LoRAs) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-LoRA-8step.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-LoRA-8step.py) | - | - | - | - |
584
+ | SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT-SFT: T2I](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT-SFT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-SFT.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-SFT.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT-SFT.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT-SFT.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT-SFT.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT-SFT.py) |
585
+ | SenseNova-U1 | [SenseNova/SenseNova-U1.5-8B-MoT-SFT: Edit](https://www.modelscope.cn/models/SenseNova/SenseNova-U1.5-8B-MoT-SFT) | [code](/examples/sensenova_u1/model_inference/SenseNova-U1.5-8B-MoT-SFT-Edit.py) | [code](/examples/sensenova_u1/model_inference_low_vram/SenseNova-U1.5-8B-MoT-SFT-Edit.py) | [code](/examples/sensenova_u1/model_training/full/SenseNova-U1.5-8B-MoT-SFT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_full/SenseNova-U1.5-8B-MoT-SFT-Edit.py) | [code](/examples/sensenova_u1/model_training/lora/SenseNova-U1.5-8B-MoT-SFT-Edit.sh) | [code](/examples/sensenova_u1/model_training/validate_lora/SenseNova-U1.5-8B-MoT-SFT-Edit.py) |
576
586
  | MiniMax-Music3 | [MiniMax/MiniMax-Music3](https://www.modelscope.cn/models/MiniMax/MiniMax-Music3) | [code](/examples/minimax_music3/model_inference/MiniMax-Music3.py) | [code](/examples/minimax_music3/model_inference_low_vram/MiniMax-Music3.py) | — | — | — | — |
577
587
  | MiniMax-H3 | [MiniMax/MiniMax-H3: FL2VA](https://www.modelscope.cn/models/MiniMax/MiniMax-H3) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-FL2VA.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-FL2VA.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-FL2VA.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-FL2VA.py) | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-FL2VA.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-FL2VA.py) |
578
588
  | MiniMax-H3 | [MiniMax/MiniMax-H3: Ref2VA](https://www.modelscope.cn/models/MiniMax/MiniMax-H3) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-Ref2VA.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-Ref2VA.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-Ref2VA.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-Ref2VA.py) | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-Ref2VA.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-Ref2VA.py) |
@@ -591,6 +601,7 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
591
601
  | MiniMax-H3 | [Comfy-Org/MiniMax-H3: Ref2VA pruned fp8](https://www.modelscope.cn/models/Comfy-Org/MiniMax-H3) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-FP8-Pruned-Ref2VA.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-FP8-Pruned-Ref2VA.py) | - | - | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-FP8-Pruned-Ref2VA.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-FP8-Pruned-Ref2VA.py) |
592
602
  | MiniMax-H3 | [lightx2v/Minimax-h3-Turbo: FL2VA 4steps](https://www.modelscope.cn/models/lightx2v/Minimax-h3-Turbo) | [code](https://github.com/modelscope/DiffSynth-Studio/blob/main/examples/minimax_h3/model_inference/MiniMax-H3-FL2VA-Turbo.py) | [code](https://github.com/modelscope/DiffSynth-Studio/blob/main/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-FL2VA-Turbo.py) | - | - | - | - |
593
603
  | MiniMax-H3 | [DiffSynth-Studio/MiniMax-H3-Text-Embeddings](https://www.modelscope.cn/models/DiffSynth-Studio/MiniMax-H3-Text-Embeddings) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-Text-Embeddings.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-Text-Embeddings.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-Text-Embeddings.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-Text-Embeddings.py) | - | - |
604
+ | MiniMax-H3 | [PAI/MiniMax-H3-Fun-Controlnet-Union](https://www.modelscope.cn/models/PAI/MiniMax-H3-Fun-Controlnet-Union) | [code](/examples/minimax_h3/model_inference/MiniMax-H3-Fun-Controlnet-Union.py) | [code](/examples/minimax_h3/model_inference_low_vram/MiniMax-H3-Fun-Controlnet-Union.py) | [code](/examples/minimax_h3/model_training/full/MiniMax-H3-Fun-Controlnet-Union.sh) | [code](/examples/minimax_h3/model_training/validate_full/MiniMax-H3-Fun-Controlnet-Union.py) | [code](/examples/minimax_h3/model_training/lora/MiniMax-H3-Fun-Controlnet-Union.sh) | [code](/examples/minimax_h3/model_training/validate_lora/MiniMax-H3-Fun-Controlnet-Union.py) |
594
605
  | LingBot-Video | [Robbyant/lingbot-video-dense-1.3b: T2V](https://modelscope.cn/models/Robbyant/lingbot-video-dense-1.3b) | [code](/examples/lingbot_video/model_inference/lingbot-video-dense-1.3b_t2v.py) | [code](/examples/lingbot_video/model_inference_low_vram/lingbot-video-dense-1.3b_t2v.py) | [code](/examples/lingbot_video/model_training/full/lingbot-video-dense-1.3b_t2v.sh) | [code](/examples/lingbot_video/model_training/validate_full/lingbot-video-dense-1.3b_t2v.py) | [code](/examples/lingbot_video/model_training/lora/lingbot-video-dense-1.3b_t2v.sh) | [code](/examples/lingbot_video/model_training/validate_lora/lingbot-video-dense-1.3b_t2v.py) |
595
606
  | LingBot-Video | [Robbyant/lingbot-video-dense-1.3b: TI2V](https://modelscope.cn/models/Robbyant/lingbot-video-dense-1.3b) | [code](/examples/lingbot_video/model_inference/lingbot-video-dense-1.3b_ti2v.py) | [code](/examples/lingbot_video/model_inference_low_vram/lingbot-video-dense-1.3b_ti2v.py) | [code](/examples/lingbot_video/model_training/full/lingbot-video-dense-1.3b_ti2v.sh) | [code](/examples/lingbot_video/model_training/validate_full/lingbot-video-dense-1.3b_ti2v.py) | [code](/examples/lingbot_video/model_training/lora/lingbot-video-dense-1.3b_ti2v.sh) | [code](/examples/lingbot_video/model_training/validate_lora/lingbot-video-dense-1.3b_ti2v.py) |
596
607
  | LingBot-Video | [Robbyant/lingbot-video-dense-1.3b: T2I](https://modelscope.cn/models/Robbyant/lingbot-video-dense-1.3b) | [code](/examples/lingbot_video/model_inference/lingbot-video-dense-1.3b_t2i.py) | [code](/examples/lingbot_video/model_inference_low_vram/lingbot-video-dense-1.3b_t2i.py) | - | - | - | - |
@@ -697,6 +708,7 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
697
708
  | Qwen-Image | [DiffSynth-Studio/Qwen-Image-In-Context-Control-Union](https://www.modelscope.cn/models/DiffSynth-Studio/Qwen-Image-In-Context-Control-Union) | [code](/examples/qwen_image/model_inference/Qwen-Image-In-Context-Control-Union.py) | [code](/examples/qwen_image/model_inference_low_vram/Qwen-Image-In-Context-Control-Union.py) | - | - | [code](/examples/qwen_image/model_training/lora/Qwen-Image-In-Context-Control-Union.sh) | [code](/examples/qwen_image/model_training/validate_lora/Qwen-Image-In-Context-Control-Union.py) |
698
709
  | Qwen-Image | [DiffSynth-Studio/Qwen-Image-Edit-Lowres-Fix](https://www.modelscope.cn/models/DiffSynth-Studio/Qwen-Image-Edit-Lowres-Fix) | [code](/examples/qwen_image/model_inference/Qwen-Image-Edit-Lowres-Fix.py) | [code](/examples/qwen_image/model_inference_low_vram/Qwen-Image-Edit-Lowres-Fix.py) | - | - | - | - |
699
710
  | Qwen-Image | [DiffSynth-Studio/Qwen-Image-i2L](https://www.modelscope.cn/models/DiffSynth-Studio/Qwen-Image-i2L) | [code](/examples/qwen_image/model_inference/Qwen-Image-i2L.py) | [code](/examples/qwen_image/model_inference_low_vram/Qwen-Image-i2L.py) | - | - | - | - |
711
+ | Qwen-Video-Edit | [yunpeng1998/Qwen-Video-Edit](https://www.modelscope.cn/models/yunpeng1998/Qwen-Video-Edit) | [code](/examples/qwen_video_edit/model_inference/Qwen-Video-Edit.py) | [code](/examples/qwen_video_edit/model_inference_low_vram/Qwen-Video-Edit.py) | [code](/examples/qwen_video_edit/model_training/full/Qwen-Video-Edit.sh) | [code](/examples/qwen_video_edit/model_training/validate_full/Qwen-Video-Edit.py) | [code](/examples/qwen_video_edit/model_training/lora/Qwen-Video-Edit.sh) | [code](/examples/qwen_video_edit/model_training/validate_lora/Qwen-Video-Edit.py) |
700
712
  | Wan | [Wan-AI/Wan2.1-T2V-1.3B](https://modelscope.cn/models/Wan-AI/Wan2.1-T2V-1.3B) | [code](/examples/wanvideo/model_inference/Wan2.1-T2V-1.3B.py) | [code](/examples/wanvideo/model_inference_low_vram/Wan2.1-T2V-1.3B.py) | [code](/examples/wanvideo/model_training/full/Wan2.1-T2V-1.3B.sh) | [code](/examples/wanvideo/model_training/validate_full/Wan2.1-T2V-1.3B.py) | [code](/examples/wanvideo/model_training/lora/Wan2.1-T2V-1.3B.sh) | [code](/examples/wanvideo/model_training/validate_lora/Wan2.1-T2V-1.3B.py) |
701
713
  | Wan | [Wan-AI/Wan2.1-T2V-14B](https://modelscope.cn/models/Wan-AI/Wan2.1-T2V-14B) | [code](/examples/wanvideo/model_inference/Wan2.1-T2V-14B.py) | [code](/examples/wanvideo/model_inference_low_vram/Wan2.1-T2V-14B.py) | [code](/examples/wanvideo/model_training/full/Wan2.1-T2V-14B.sh) | [code](/examples/wanvideo/model_training/validate_full/Wan2.1-T2V-14B.py) | [code](/examples/wanvideo/model_training/lora/Wan2.1-T2V-14B.sh) | [code](/examples/wanvideo/model_training/validate_lora/Wan2.1-T2V-14B.py) |
702
714
  | Wan | [Wan-AI/Wan2.1-I2V-14B-480P](https://modelscope.cn/models/Wan-AI/Wan2.1-I2V-14B-480P) | [code](/examples/wanvideo/model_inference/Wan2.1-I2V-14B-480P.py) | [code](/examples/wanvideo/model_inference_low_vram/Wan2.1-I2V-14B-480P.py) | [code](/examples/wanvideo/model_training/full/Wan2.1-I2V-14B-480P.sh) | [code](/examples/wanvideo/model_training/validate_full/Wan2.1-I2V-14B-480P.py) | [code](/examples/wanvideo/model_training/lora/Wan2.1-I2V-14B-480P.sh) | [code](/examples/wanvideo/model_training/validate_lora/Wan2.1-I2V-14B-480P.py) |
@@ -737,6 +749,9 @@ https://github.com/Artiprocher/DiffSynth-Studio/assets/35051019/59fb2f7b-8de0-44
737
749
  | 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) |
738
750
  | 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) |
739
751
  | 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) |
752
+ | 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) |
753
+ | 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) |
754
+ | 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) |
740
755
  | 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) |
741
756
  | 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) |
742
757
  | 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) |
@@ -80,6 +80,23 @@ qwen_image_series = [
80
80
  },
81
81
  ]
82
82
 
83
+ qwen_video_edit_series = [
84
+ {
85
+ # Example: ModelConfig(model_id="yunpeng1998/Qwen-Video-Edit", origin_file_pattern="360P/step-30000.safetensors")
86
+ "model_hash": "8ae0ca4ab286d00197f08986c7fbbade",
87
+ "model_name": "qwen_video_edit_dit",
88
+ "model_class": "diffsynth.models.qwen_image_dit.QwenImageDiT",
89
+ "state_dict_converter": "diffsynth.utils.state_dict_converters.qwen_video_edit.QwenVideoEditDiTStateDictConverter",
90
+ },
91
+ {
92
+ # Example: ModelConfig(model_id="yunpeng1998/Qwen-Video-Edit", origin_file_pattern="360P/step-30000.safetensors")
93
+ "model_hash": "8ae0ca4ab286d00197f08986c7fbbade",
94
+ "model_name": "qwen_video_edit_adapter",
95
+ "model_class": "diffsynth.models.qwen_video_edit_dit.QwenVideoEditAdapter",
96
+ "state_dict_converter": "diffsynth.utils.state_dict_converters.qwen_video_edit.QwenVideoEditAdapterStateDictConverter",
97
+ },
98
+ ]
99
+
83
100
  wan_series = [
84
101
  {
85
102
  # Example: ModelConfig(model_id="Wan-AI/Wan2.2-Animate-2-14B", origin_file_pattern="wan_animate_2/wan_animate_2_bf16.safetensors")
@@ -1509,6 +1526,14 @@ minimax_h3_series = [
1509
1526
  "quant_config": {"method": "bitsandbytes_nf4", "load_prequantized": True},
1510
1527
  "state_dict_converter": "diffsynth.utils.state_dict_converters.minimax_h3_audio_vae.MiniMaxH3AudioVAEStateDictConverter"
1511
1528
  },
1529
+ {
1530
+ # Example: ModelConfig(model_id="PAI/MiniMax-H3-Fun-Controlnet-Union", origin_file_pattern="MiniMax-H3-Fun-Controlnet-Union.safetensors")
1531
+ "model_hash": "91179e6f6150c072cd8e5fa29f58576e",
1532
+ "model_name": "minimax_h3_controlnet",
1533
+ "model_class": "diffsynth.models.minimax_h3_controlnet.MiniMaxH3ControlNet",
1534
+ "extra_kwargs": {'control_layers': (0, 10, 20, 30, 40), 'control_in_dim': 49, 'control_apply_audio': False, 'hidden_size': 5376, 'num_attention_heads': 56, 'attention_head_dim': 128, 'ffn_hidden_size': 14336, 'time_embed_dim': 2688, 'adaln_out_features': 96768, 'patch_size': (1, 2, 2), 'norm_eps': 1e-05, 'qk_norm_eps': 1e-05},
1535
+ "state_dict_converter": "diffsynth.utils.state_dict_converters.minimax_h3_controlnet.MiniMaxH3ControlNetStateDictConverter"
1536
+ },
1512
1537
  ]
1513
1538
 
1514
1539
  minimax_music3_series = [
@@ -1545,8 +1570,17 @@ minimax_music3_series = [
1545
1570
  },
1546
1571
  ]
1547
1572
 
1573
+ sensenova_u1_series = [
1574
+ {
1575
+ # Example: ModelConfig(model_id="SenseNova/SenseNova-U1.5-8B-MoT", origin_file_pattern="model*.safetensors")
1576
+ "model_hash": "90bb0c235120a99ea78f9912471de82a",
1577
+ "model_name": "sensenova_u1_dit",
1578
+ "model_class": "diffsynth.models.sensenova_u1_dit.SenseNovaU1DiT",
1579
+ },
1580
+ ]
1581
+
1548
1582
  MODEL_CONFIGS = (
1549
- stable_diffusion_xl_series + stable_diffusion_series + qwen_image_series + wan_series + flux_series + flux2_series + ernie_image_series
1583
+ stable_diffusion_xl_series + stable_diffusion_series + qwen_image_series + qwen_video_edit_series + wan_series + flux_series + flux2_series + ernie_image_series
1550
1584
  + z_image_series + ltx2_series + anima_series + mova_series + joyai_image_series + boogu_image_series + ace_step_series + hidream_o1_image_series
1551
- + image_metrics_series + ideogram4_series + krea2_series + lingbot_video_series + minimax_h3_series + minimax_music3_series
1585
+ + image_metrics_series + ideogram4_series + krea2_series + lingbot_video_series + minimax_h3_series + minimax_music3_series + sensenova_u1_series
1552
1586
  )
@@ -62,6 +62,10 @@ VRAM_MANAGEMENT_MODULE_MAPS = {
62
62
  "torch.nn.Linear": "diffsynth.core.vram.layers.AutoWrappedLinear",
63
63
  "torch.nn.Embedding": "diffsynth.core.vram.layers.AutoWrappedModule",
64
64
  },
65
+ "diffsynth.models.qwen_video_edit_dit.QwenVideoEditAdapter": {
66
+ "torch.nn.Linear": "diffsynth.core.vram.layers.AutoWrappedLinear",
67
+ "torch.nn.Conv3d": "diffsynth.core.vram.layers.AutoWrappedModule",
68
+ },
65
69
  "diffsynth.models.qwen_image_text_encoder.QwenImageTextEncoder": {
66
70
  "torch.nn.Linear": "diffsynth.core.vram.layers.AutoWrappedLinear",
67
71
  "torch.nn.Embedding": "diffsynth.core.vram.layers.AutoWrappedModule",
@@ -496,6 +500,18 @@ VRAM_MANAGEMENT_MODULE_MAPS = {
496
500
  "torch.nn.Embedding": "diffsynth.core.vram.layers.AutoWrappedModule",
497
501
  "transformers.models.qwen3.modeling_qwen3.Qwen3RMSNorm": "diffsynth.core.vram.layers.AutoWrappedModule",
498
502
  },
503
+ "diffsynth.models.minimax_h3_controlnet.MiniMaxH3ControlNet": {
504
+ "torch.nn.Linear": "diffsynth.core.vram.layers.AutoWrappedLinear",
505
+ "torch.nn.RMSNorm": "diffsynth.core.vram.layers.AutoWrappedModule",
506
+ },
507
+ "diffsynth.models.sensenova_u1_dit.SenseNovaU1DiT": {
508
+ "diffsynth.models.sensenova_u1_dit.SenseNovaU1TimestepEmbedder": "diffsynth.core.vram.layers.AutoWrappedModule",
509
+ "diffsynth.models.sensenova_u1_dit.SenseNovaU1VisionEmbeddings": "diffsynth.core.vram.layers.AutoWrappedModule",
510
+ "torch.nn.Linear": "diffsynth.core.vram.layers.AutoWrappedLinear",
511
+ "torch.nn.Embedding": "diffsynth.core.vram.layers.AutoWrappedModule",
512
+ "torch.nn.Conv2d": "diffsynth.core.vram.layers.AutoWrappedModule",
513
+ "diffsynth.models.sensenova_u1_dit.SenseNovaU1RMSNorm": "diffsynth.core.vram.layers.AutoWrappedModule",
514
+ },
499
515
  }
500
516
 
501
517
  def QwenImageTextEncoder_Module_Map_Updater():
@@ -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:
@@ -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):
@@ -5,7 +5,7 @@ from typing_extensions import Literal
5
5
 
6
6
  class FlowMatchScheduler():
7
7
 
8
- def __init__(self, template: Literal["FLUX.1", "Wan", "Qwen-Image", "FLUX.2", "Z-Image", "LTX-2", "Qwen-Image-Lightning", "ERNIE-Image", "ACE-Step", "Ideogram4", "Krea-2", "Boogu", "MiniMax-H3", "MiniMax-Music3", "LingBot-Video"] = "FLUX.1"):
8
+ def __init__(self, template: Literal["FLUX.1", "Wan", "Qwen-Image", "FLUX.2", "Z-Image", "LTX-2", "Qwen-Image-Lightning", "ERNIE-Image", "ACE-Step", "Ideogram4", "Krea-2", "Boogu", "MiniMax-H3", "MiniMax-Music3", "LingBot-Video", "SenseNova-U1"] = "FLUX.1"):
9
9
  self.set_timesteps_fn = {
10
10
  "FLUX.1": FlowMatchScheduler.set_timesteps_flux,
11
11
  "Wan": FlowMatchScheduler.set_timesteps_wan,
@@ -23,6 +23,7 @@ class FlowMatchScheduler():
23
23
  "MiniMax-H3": FlowMatchScheduler.set_timesteps_minimax_h3,
24
24
  "MiniMax-Music3": FlowMatchScheduler.set_timesteps_minimax_music3,
25
25
  "LingBot-Video": FlowMatchScheduler.set_timesteps_lingbot_video,
26
+ "SenseNova-U1": FlowMatchScheduler.set_timesteps_sensenova_u1,
26
27
  }.get(template, FlowMatchScheduler.set_timesteps_flux)
27
28
  self.num_train_timesteps = 1000
28
29
 
@@ -173,6 +174,15 @@ class FlowMatchScheduler():
173
174
  timesteps = sigmas * num_train_timesteps
174
175
  return sigmas, timesteps
175
176
 
177
+ @staticmethod
178
+ def set_timesteps_sensenova_u1(num_inference_steps=50, denoising_strength=1.0, shift=3.0):
179
+ num_train_timesteps = 1000
180
+ sigmas = torch.linspace(denoising_strength, 0.0, num_inference_steps + 1)[:-1]
181
+ if shift is not None and shift != 1.0:
182
+ sigmas = shift * sigmas / (1 + (shift - 1) * sigmas)
183
+ timesteps = sigmas * num_train_timesteps
184
+ return sigmas, timesteps
185
+
176
186
  @staticmethod
177
187
  def set_timesteps_ace_step(num_inference_steps=8, denoising_strength=1.0, shift=3.0):
178
188
  num_train_timesteps = 1000
@@ -63,7 +63,7 @@ def FlowMatchSFTAudioVideoLoss(pipe: BasePipeline, **inputs):
63
63
  return loss
64
64
 
65
65
 
66
- def FlowMatchSFTMiniMaxH3AudioVideoLoss(pipe: BasePipeline, **inputs):
66
+ def FlowMatchSFTMiniMaxH3AudioVideoLoss(pipe: BasePipeline, training_cfg_scale: float = 1.0, audio_loss_weight: float = 1.0, inputs_nega: dict | None = None, **inputs):
67
67
  max_timestep_boundary = int(inputs.get("max_timestep_boundary", 1) * len(pipe.scheduler.timesteps))
68
68
  min_timestep_boundary = int(inputs.get("min_timestep_boundary", 0) * len(pipe.scheduler.timesteps))
69
69
 
@@ -81,16 +81,39 @@ 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:
92
115
  loss_audio = torch.nn.functional.mse_loss(noise_pred_audio.float(), training_target_audio.float())
93
- loss_audio = loss_audio * pipe.scheduler_audio.training_weight(timestep_audio)
116
+ loss_audio = loss_audio * pipe.scheduler_audio.training_weight(timestep_audio) * audio_loss_weight
94
117
  loss = loss + loss_audio
95
118
  return loss
96
119
 
@@ -359,7 +359,7 @@ class DiffusionTrainingModule(torch.nn.Module):
359
359
  # TODO: set `remove_unnecessary_params` to `True` by default
360
360
  remove_unnecessary_params=False,
361
361
  # TODO: move `loss_required_params` to `loss.py`
362
- 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"),
363
363
  force_remove_params_shared=tuple(),
364
364
  force_remove_params_posi=tuple(),
365
365
  force_remove_params_nega=tuple(),