cpuai commited on
Commit
d50ca82
·
verified ·
1 Parent(s): f9628a9

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +195 -0
app.py ADDED
@@ -0,0 +1,195 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import random
3
+ import torch
4
+ import diffusers
5
+ import gradio as gr
6
+
7
+ # 关键:导入 sdnq,用于注册 SDNQ 量化算子,否则会报
8
+ # “QuantizationMethod.SDNQ is not available yet” 之类的错误
9
+ from sdnq import SDNQConfig # noqa: F401 # 仅用于 side-effect 注册
10
+
11
+
12
+ # -------------------------
13
+ # 1. 全局加载 Z-Image-Turbo SDNQ 4bit 管线
14
+ # -------------------------
15
+
16
+ MODEL_ID = "Disty0/Z-Image-Turbo-SDNQ-uint4-svd-r32"
17
+
18
+ def load_pipeline():
19
+ """
20
+ 加载 Z-Image-Turbo 4bit SDNQ 模型。
21
+
22
+ 优先使用 bfloat16(与模型卡保持一致),
23
+ 若在某些 CPU 环境下不支持,则回退到 float32。
24
+ """
25
+ dtype = torch.bfloat16
26
+ try:
27
+ print(f"Try loading pipeline with dtype={dtype} ...")
28
+ pipe = diffusers.ZImagePipeline.from_pretrained(
29
+ MODEL_ID,
30
+ torch_dtype=dtype,
31
+ )
32
+ except Exception as e:
33
+ print(f"bfloat16 加载失败,回退到 float32: {e}")
34
+ pipe = diffusers.ZImagePipeline.from_pretrained(
35
+ MODEL_ID,
36
+ torch_dtype=torch.float32,
37
+ )
38
+
39
+ # 在低显存 / CPU 环境下,官方推荐开启 CPU offload
40
+ # 对纯 CPU Space 也兼容,只是会多一层模块管理
41
+ try:
42
+ pipe.enable_model_cpu_offload()
43
+ except Exception as e:
44
+ # 某些环境(老版 accelerate)可能没有该方法,忽略即可
45
+ print(f"enable_model_cpu_offload 失败,直接使用 CPU: {e}")
46
+
47
+ return pipe
48
+
49
+
50
+ pipe = load_pipeline()
51
+
52
+
53
+ # -------------------------
54
+ # 2. 推理函数(Gradio 回调)
55
+ # -------------------------
56
+
57
+ def generate_image(
58
+ prompt: str,
59
+ height: int = 768,
60
+ width: int = 768,
61
+ num_inference_steps: int = 9,
62
+ guidance_scale: float = 0.0,
63
+ seed: int | None = 0,
64
+ randomize_seed: bool = True,
65
+ ):
66
+ """
67
+ 使用 Z-Image-Turbo-SDNQ 生成单张图片。
68
+
69
+ 参数说明:
70
+ - prompt: 文本提示词
71
+ - height / width: 图像分辨率,建议 CPU 空间下 512 或 768 起步
72
+ - num_inference_steps: 采样步数,Z-Image-Turbo 一般 6~10 步即可
73
+ - guidance_scale: CFG scale,官方推荐 0.0(关闭 CFG)
74
+ - seed: 随机种子,便于复现
75
+ - randomize_seed: 是否自动随机 seed(方便连点出图)
76
+ """
77
+ if not prompt or prompt.strip() == "":
78
+ raise gr.Error("提示词不能为空,请输入 prompt。")
79
+
80
+ # 处理 seed
81
+ if randomize_seed or seed is None or seed < 0:
82
+ seed = random.randint(0, 2**31 - 1)
83
+
84
+ # Z-Image-Turbo 对 1024×1024 表现最好
85
+ # 但在 CPU Space 中性能会较慢,建议从 768×768 起
86
+ generator = torch.Generator(device="cpu").manual_seed(seed)
87
+
88
+ image = pipe(
89
+ prompt=prompt,
90
+ height=height,
91
+ width=width,
92
+ num_inference_steps=num_inference_steps,
93
+ guidance_scale=guidance_scale,
94
+ generator=generator,
95
+ ).images[0]
96
+
97
+ return image, seed
98
+
99
+
100
+ # -------------------------
101
+ # 3. Gradio UI 定义
102
+ # -------------------------
103
+
104
+ with gr.Blocks(title="Z-Image-Turbo SDNQ 4bit (CPU Friendly)") as demo:
105
+ gr.Markdown(
106
+ """
107
+ # Z-Image-Turbo SDNQ 4bit (CPU / 低显存友好)
108
+
109
+ 基于 **Disty0/Z-Image-Turbo-SDNQ-uint4-svd-r32** 的 Gradio Demo。
110
+ 可部署在 Hugging Face **CPU Space** 中运行(仅 CPU,也能出图,但会较慢)。
111
+
112
+ - 模型:Z-Image-Turbo 6B(4bit SDNQ 量化)
113
+ - 推荐:先从 512 或 768 分辨率开始,步数 6~10 步
114
+ - 提示:完全在 CPU 上运行时,生成一张 768×768 可能需要数十秒甚至更久
115
+ """
116
+ )
117
+
118
+ with gr.Row():
119
+ with gr.Column(scale=3):
120
+ prompt = gr.Textbox(
121
+ label="提示词 Prompt",
122
+ placeholder="例如:a photo of a beautiful Chinese city at night, neon lights, high detail, 4k",
123
+ lines=4,
124
+ )
125
+
126
+ with gr.Row():
127
+ height = gr.Slider(
128
+ label="高度 Height",
129
+ minimum=256,
130
+ maximum=1024,
131
+ step=64,
132
+ value=768,
133
+ )
134
+ width = gr.Slider(
135
+ label="宽度 Width",
136
+ minimum=256,
137
+ maximum=1024,
138
+ step=64,
139
+ value=768,
140
+ )
141
+
142
+ with gr.Row():
143
+ steps = gr.Slider(
144
+ label="采样步数 num_inference_steps",
145
+ minimum=4,
146
+ maximum=20,
147
+ step=1,
148
+ value=9,
149
+ )
150
+ guidance = gr.Slider(
151
+ label="CFG Scale (guidance_scale)",
152
+ minimum=0.0,
153
+ maximum=3.0,
154
+ step=0.1,
155
+ value=0.0,
156
+ )
157
+
158
+ with gr.Row():
159
+ seed = gr.Number(
160
+ label="随机种子 Seed(<0 或留空=自动随机)",
161
+ value=0,
162
+ precision=0,
163
+ )
164
+ randomize_seed = gr.Checkbox(
165
+ label="每次自动随机 Seed",
166
+ value=True,
167
+ )
168
+
169
+ generate_btn = gr.Button("生成图片 Generate", variant="primary")
170
+
171
+ with gr.Column(scale=2):
172
+ output_image = gr.Image(
173
+ label="生成结果",
174
+ type="pil",
175
+ format="png",
176
+ )
177
+ used_seed = gr.Number(
178
+ label="实际使用的 Seed(方便复现)",
179
+ value=0,
180
+ precision=0,
181
+ interactive=False,
182
+ )
183
+
184
+ # 绑定事件
185
+ generate_btn.click(
186
+ fn=generate_image,
187
+ inputs=[prompt, height, width, steps, guidance, seed, randomize_seed],
188
+ outputs=[output_image, used_seed],
189
+ )
190
+
191
+
192
+ # Hugging Face Space & 本地运行入口
193
+ if __name__ == "__main__":
194
+ # 本地调试时可直接运行:python app.py
195
+ demo.launch(server_name="0.0.0.0", server_port=int(os.getenv("PORT", 7860)))