批量生成怎么做?麦橘超然脚本化调用实例
你是不是也遇到过这样的情况:想用麦橘超然模型批量生成几十张图,但每次都要打开网页、填提示词、点生成、等结果、再保存……重复操作十几次后手酸眼花,效率低得让人抓狂?别急,这篇文章不讲界面怎么点,也不堆参数术语,就带你用几行代码把“手动点击”变成“一键批量出图”。全程基于已部署好的麦橘超然离线控制台服务,无需重装模型、不改环境、不碰CUDA配置——真正拿来即用的脚本化方案。
1. 先搞清楚:我们到底在调用什么?
1.1 麦橘超然不是黑盒,而是一个可编程的图像工厂
很多人以为“WebUI = 只能点点点”,其实不然。你看到的那个简洁的Gradio界面(就是那个带提示词框和生成按钮的网页),背后运行的是一个标准的Python服务进程。它暴露了一个清晰的推理函数接口:generate_fn(prompt, seed, steps)。这个函数不挑人、不认浏览器、不依赖鼠标——只要你能用Python调它,它就老老实实给你返回一张图。
换句话说:网页只是它的“前台营业员”,而函数才是真正的“产线工人”。我们要做的,就是绕过营业员,直接跟产线工人下单。
1.2 为什么不用API?因为根本不需要额外启动服务
注意看原部署脚本里的这行关键代码:
demo.launch(server_name="0.0.0.0", server_port=6006)它启动的是一个标准的Gradio服务器,而Gradio从v4.0起就原生支持客户端直连模式——不需要另起FastAPI或Flask,也不用写路由、配CORS、开代理。只要服务在跑,你就能用gradio_client库像调本地函数一样远程调用它。零配置、零侵入、零改动。
1.3 批量生成的核心,其实是“把人干的活,拆成三步让代码干”
- 第一步:准备一批提示词(比如10个不同风格的商品描述)
- 第二步:对每个提示词,设置好种子和步数,调一次
generate_fn - 第三步:把返回的图片自动保存为文件,按序号或关键词命名
没有魔法,只有清晰的逻辑链。下面我们就一步步把它写出来。
2. 准备工作:两行命令搞定依赖
你不需要重装整个环境,只需要在本地电脑(也就是你打开浏览器访问http://127.0.0.1:6006的那台机器)上安装一个轻量客户端库:
pip install gradio-client就这么简单。它不到2MB,不碰你的CUDA驱动,不下载任何模型,只负责“发请求+收图片”。
小提醒:如果你本地没装Python,或者想在服务器端直接批量跑(比如用GPU批量出图),那就在服务器上执行这行命令即可。两者完全兼容。
3. 核心脚本:15行代码实现全自动批量生成
3.1 创建batch_gen.py文件(复制即用)
在你的任意文件夹里新建一个文本文件,命名为batch_gen.py,把下面这段代码完整粘贴进去:
from gradio_client import Client import time import os # 连接到正在运行的麦橘超然服务(确保 http://127.0.0.1:6006 已打开) client = Client("http://127.0.0.1:6006") # 定义你要批量生成的提示词列表(支持中英文,可自由增删) prompts = [ "水墨风格的江南古镇,小桥流水,白墙黛瓦,春日柳枝轻拂水面,写意留白", "极简主义办公桌,纯白背景,一支金属钢笔、一本皮面笔记本、一杯热咖啡,柔光摄影", "赛博朋克风格的未来城市街道,雨夜,蓝色和粉色的霓虹灯光反射在湿漉漉的地面上,头顶有飞行汽车", "毛绒玩具风格的柴犬,坐在窗台边晒太阳,阳光透过纱帘,暖色调,柔和焦外", "科幻实验室内部,全息投影悬浮着DNA双螺旋结构,穿白大褂的研究员背影,冷蓝主色调" ] # 开始批量生成 os.makedirs("output_batch", exist_ok=True) print(f" 已创建输出文件夹:./output_batch") print(f" 开始批量生成 {len(prompts)} 张图像...\n") for i, prompt in enumerate(prompts, 1): print(f"🖼 正在生成第 {i}/{len(prompts)} 张:{prompt[:40]}...") # 调用WebUI背后的生成函数(参数顺序必须一致:prompt → seed → steps) result = client.predict( prompt, # 提示词 0, # 种子(固定为0保证可复现;设为-1则每次随机) 20, # 步数 api_name="/generate_fn" ) # 保存图片(自动加序号,避免覆盖) output_path = f"output_batch/gen_{i:02d}_{prompt[:20].replace(' ', '_').replace('/', '_')}.png" with open(output_path, "wb") as f: f.write(result) print(f" 已保存:{output_path}") # 可选:每张图之间停1秒,避免请求过密(对本地服务非必需,但更稳妥) time.sleep(1) print(f"\n 批量生成完成!共生成 {len(prompts)} 张图,全部存放在 ./output_batch 文件夹中。")3.2 运行脚本,亲眼看着图一张张落地
确保你的麦橘超然服务已经在运行(终端里能看到Running on public URL: http://127.0.0.1:6006这样的提示),然后在同一个终端里执行:
python batch_gen.py你会看到类似这样的实时输出:
已创建输出文件夹:./output_batch 开始批量生成 5 张图像... 🖼 正在生成第 1/5 张:水墨风格的江南古镇,小桥流水,白墙黛瓦... 已保存:output_batch/gen_01_水墨风格的江南古镇.png 🖼 正在生成第 2/5 张:极简主义办公桌,纯白背景,一支金属钢笔... 已保存:output_batch/gen_02_极简主义办公桌.png ... 批量生成完成!共生成 5 张图,全部存放在 ./output_batch 文件夹中。打开output_batch文件夹,5张高清图已经整整齐齐躺在那里——和你在网页上点出来的质量完全一致,只是快了10倍。
4. 进阶技巧:让批量生成更聪明、更可控
4.1 想换种子?一行代码全搞定
默认脚本用固定种子0,保证每次重跑结果一致。如果你想每张图都独一无二,只需把这一行:
0, # 种子(固定为0保证可复现;设为-1则每次随机)改成:
-1, # 每次生成随机种子或者更精细地控制:给每张图配专属种子,比如用序号做基础值:
seed = 1000 + i, # 第1张种子1001,第2张1002……4.2 提示词太多?用文件读取,告别硬编码
把所有提示词存进prompts.txt,每行一条:
水墨风格的江南古镇... 极简主义办公桌... 赛博朋克风格的未来城市街道...然后把脚本里prompts = [...]这段替换成:
with open("prompts.txt", "r", encoding="utf-8") as f: prompts = [line.strip() for line in f if line.strip()]从此新增提示词,只需改文本文件,不用动Python代码。
4.3 想批量调参?把步数也变成变量列表
不满足于统一20步?可以为每条提示词指定不同步数:
prompt_settings = [ ("水墨风格的江南古镇...", 15), ("赛博朋克风格的未来城市...", 25), ("毛绒玩具风格的柴犬...", 18), ] for i, (prompt, steps) in enumerate(prompt_settings, 1): result = client.predict(prompt, -1, steps, api_name="/generate_fn") # ...后续保存逻辑参数自由组合,完全由你定义。
5. 常见问题与稳如泰山的解决方案
5.1 “报错 ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=6006): Max retries exceeded”
这是最常遇到的问题,原因只有一个:麦橘超然服务没在运行,或没监听在6006端口。
解决方法:
- 回到你启动
web_app.py的终端,确认有没有报错,是否显示Running on http://127.0.0.1:6006 - 如果是远程服务器部署,且你通过SSH隧道访问,请确保隧道命令仍在运行中(那个ssh窗口不能关!)
- 检查端口是否被占用:
lsof -i :6006(Mac/Linux)或netstat -ano | findstr :6006(Windows)
5.2 “生成的图是黑的/空白/报错Tensor not on CUDA”
这是显存不足的典型表现,但别慌——这不是脚本的问题,而是WebUI服务本身在低显存设备上启用float8量化后,对输入长度敏感。
解决方法(三选一):
- 精简提示词:去掉冗余形容词,保留核心名词+风格词(例如把“雨夜中闪烁着蓝色和粉色霓虹灯光的潮湿街道”简化为“雨夜霓虹街道,赛博朋克”)
- 降低步数:从20步降到15步,对多数场景影响极小,但显存压力骤减
- 加一行保底:在调用前加
client.reset_session(),强制清空会话状态,避免缓存干扰
5.3 “想导出带参数信息的文件名,比如 gen_01_seed0_steps20.png”
完全支持。把保存路径这行:
output_path = f"output_batch/gen_{i:02d}_{prompt[:20].replace(' ', '_').replace('/', '_')}.png"升级为:
output_path = f"output_batch/gen_{i:02d}_seed0_steps20_{prompt[:15].replace(' ', '_')}.png"参数明明白白写进文件名,回溯复现毫无压力。
6. 总结:批量生成的本质,是把重复劳动交给代码
我们没做任何高深的事:没有魔改模型、没有重写推理引擎、没有折腾Docker镜像。只是看清了一个事实——那个你每天点来点去的网页,本来就是一个活生生的、可编程的API服务。
它用Gradio构建,所以天然支持客户端直连;它用DiffSynth加载,所以推理逻辑干净透明;它用float8量化,所以能在RTX 3060上稳稳跑满1080p出图。而我们要做的,不过是用15行Python,把“人手点单”变成“程序下单”。
从此,无论是测试100种提示词效果、为电商铺货生成50款商品图、还是给设计提案准备20版风格预览——你都不需要再守着网页刷新。写好列表,敲下回车,去泡杯茶回来,图就齐了。
这才是AI工具该有的样子:强大,但不傲慢;智能,但不难用;专业,但不设门槛。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。