Upload app.py with huggingface_hub
Browse files
app.py
CHANGED
|
@@ -22,10 +22,9 @@ from diffusers import (
|
|
| 22 |
QwenImageImg2ImgPipeline
|
| 23 |
)
|
| 24 |
from diffusers.schedulers import (
|
| 25 |
-
|
| 26 |
EulerDiscreteScheduler,
|
| 27 |
-
|
| 28 |
-
UniPCMultistepScheduler
|
| 29 |
)
|
| 30 |
from huggingface_hub import hf_hub_download
|
| 31 |
|
|
@@ -59,84 +58,55 @@ if torch.cuda.is_available():
|
|
| 59 |
# =================================================================
|
| 60 |
|
| 61 |
# Конфигурации для разных типов schedulers
|
| 62 |
-
#
|
|
|
|
| 63 |
SCHEDULER_CONFIGS = {
|
| 64 |
-
# ===
|
| 65 |
-
"
|
| 66 |
-
"class":
|
| 67 |
-
"config": {
|
| 68 |
-
"alias": "
|
| 69 |
-
},
|
| 70 |
-
"DPM++ SDE Karras": {
|
| 71 |
-
"class": DPMSolverMultistepScheduler,
|
| 72 |
-
"config": {"algorithm_type": "sde-dpmsolver++", "solver_order": 2, "use_karras_sigmas": True},
|
| 73 |
-
"alias": "dpmpp_sde_karras"
|
| 74 |
-
},
|
| 75 |
-
"DPM++ 3M SDE Karras": {
|
| 76 |
-
"class": DPMSolverMultistepScheduler,
|
| 77 |
-
"config": {"algorithm_type": "sde-dpmsolver++", "solver_order": 3, "use_karras_sigmas": True},
|
| 78 |
-
"alias": "dpmpp_3m_sde_karras"
|
| 79 |
},
|
| 80 |
-
"
|
| 81 |
-
"class":
|
| 82 |
"config": {},
|
| 83 |
-
"alias": "
|
| 84 |
},
|
| 85 |
"Euler": {
|
| 86 |
"class": EulerDiscreteScheduler,
|
| 87 |
"config": {},
|
| 88 |
"alias": "euler"
|
| 89 |
},
|
| 90 |
-
|
| 91 |
-
# === ЭКСПЕРИМЕНТАЛЬНЫЕ (Альтернативные варианты сигм) ===
|
| 92 |
-
"DPM++ 2M": {
|
| 93 |
-
"class": DPMSolverMultistepScheduler,
|
| 94 |
-
"config": {"algorithm_type": "dpmsolver++", "solver_order": 2},
|
| 95 |
-
"alias": "dpmpp_2m"
|
| 96 |
-
},
|
| 97 |
-
"DPM++ 2M Beta": {
|
| 98 |
-
"class": DPMSolverMultistepScheduler,
|
| 99 |
-
"config": {"algorithm_type": "dpmsolver++", "solver_order": 2, "use_beta_sigmas": True},
|
| 100 |
-
"alias": "dpmpp_2m_beta"
|
| 101 |
-
},
|
| 102 |
-
"DPM++ 2M Exponential": {
|
| 103 |
-
"class": DPMSolverMultistepScheduler,
|
| 104 |
-
"config": {"algorithm_type": "dpmsolver++", "solver_order": 2, "use_exponential_sigmas": True},
|
| 105 |
-
"alias": "dpmpp_2m_exp"
|
| 106 |
-
},
|
| 107 |
"Euler Karras": {
|
| 108 |
"class": EulerDiscreteScheduler,
|
| 109 |
"config": {"use_karras_sigmas": True},
|
| 110 |
"alias": "euler_karras"
|
| 111 |
},
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
"
|
| 116 |
-
|
| 117 |
-
|
|
|
|
|
|
|
|
|
|
| 118 |
}
|
| 119 |
}
|
| 120 |
|
| 121 |
-
DEFAULT_SCHEDULER = "
|
| 122 |
|
| 123 |
# Для UI - группируем по категориям для удобства
|
| 124 |
SCHEDULER_GROUPS = {
|
| 125 |
-
"⭐ Рекомендуемые": [
|
| 126 |
-
"
|
| 127 |
-
"
|
| 128 |
-
"DPM++ 3M SDE Karras",
|
| 129 |
-
"Euler Ancestral",
|
| 130 |
-
"Euler"
|
| 131 |
-
],
|
| 132 |
-
"🧪 Экспериментальные": [
|
| 133 |
-
"DPM++ 2M",
|
| 134 |
-
"DPM++ 2M Beta",
|
| 135 |
-
"DPM++ 2M Exponential",
|
| 136 |
-
"Euler Karras"
|
| 137 |
],
|
| 138 |
-
"
|
| 139 |
-
"
|
|
|
|
|
|
|
|
|
|
| 140 |
]
|
| 141 |
}
|
| 142 |
|
|
|
|
| 22 |
QwenImageImg2ImgPipeline
|
| 23 |
)
|
| 24 |
from diffusers.schedulers import (
|
| 25 |
+
FlowMatchEulerDiscreteScheduler,
|
| 26 |
EulerDiscreteScheduler,
|
| 27 |
+
FlowMatchHeunDiscreteScheduler
|
|
|
|
| 28 |
)
|
| 29 |
from huggingface_hub import hf_hub_download
|
| 30 |
|
|
|
|
| 58 |
# =================================================================
|
| 59 |
|
| 60 |
# Конфигурации для разных типов schedulers
|
| 61 |
+
# ⚠️ ВАЖНО: Qwen pipeline передает sigmas в set_timesteps()
|
| 62 |
+
# Поэтому работают ТОЛЬКО schedulers которые поддерживают sigmas параметр!
|
| 63 |
SCHEDULER_CONFIGS = {
|
| 64 |
+
# === РЕКОМЕНДУЕМЫЕ (Совместимые с Qwen Flow Matching) ===
|
| 65 |
+
"Flow Match Euler": {
|
| 66 |
+
"class": FlowMatchEulerDiscreteScheduler,
|
| 67 |
+
"config": {},
|
| 68 |
+
"alias": "flow_euler"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 69 |
},
|
| 70 |
+
"Flow Match Heun": {
|
| 71 |
+
"class": FlowMatchHeunDiscreteScheduler,
|
| 72 |
"config": {},
|
| 73 |
+
"alias": "flow_heun"
|
| 74 |
},
|
| 75 |
"Euler": {
|
| 76 |
"class": EulerDiscreteScheduler,
|
| 77 |
"config": {},
|
| 78 |
"alias": "euler"
|
| 79 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
"Euler Karras": {
|
| 81 |
"class": EulerDiscreteScheduler,
|
| 82 |
"config": {"use_karras_sigmas": True},
|
| 83 |
"alias": "euler_karras"
|
| 84 |
},
|
| 85 |
+
"Euler Beta": {
|
| 86 |
+
"class": EulerDiscreteScheduler,
|
| 87 |
+
"config": {"use_beta_sigmas": True},
|
| 88 |
+
"alias": "euler_beta"
|
| 89 |
+
},
|
| 90 |
+
"Euler Exponential": {
|
| 91 |
+
"class": EulerDiscreteScheduler,
|
| 92 |
+
"config": {"use_exponential_sigmas": True},
|
| 93 |
+
"alias": "euler_exp"
|
| 94 |
}
|
| 95 |
}
|
| 96 |
|
| 97 |
+
DEFAULT_SCHEDULER = "Flow Match Euler"
|
| 98 |
|
| 99 |
# Для UI - группируем по категориям для удобства
|
| 100 |
SCHEDULER_GROUPS = {
|
| 101 |
+
"⭐ Flow Matching (Рекомендуемые)": [
|
| 102 |
+
"Flow Match Euler",
|
| 103 |
+
"Flow Match Heun"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
],
|
| 105 |
+
"🔄 Euler Variants (Экспериментальные)": [
|
| 106 |
+
"Euler",
|
| 107 |
+
"Euler Karras",
|
| 108 |
+
"Euler Beta",
|
| 109 |
+
"Euler Exponential"
|
| 110 |
]
|
| 111 |
}
|
| 112 |
|