文章摘要
加载中...|
此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结

本项目提供了一套专为**昆山超算中心(海光 DCU / PyTorch 1.10 环境)**定制的 Stable Diffusion 离线渲染工具链。通过智能调度硬绑定追踪、模型常驻内存循环推理以及对国产海光硬件的低层深度优化,帮助用户极速且低成本地完成“画图抽奖”。


📂 文件结构

该工具链由三个紧密配合的核心脚本构成:

  1. generate.py(Python 推理核心后端)
    • 功能:负责调用 diffuserstransformers 库,从本地路径载入 Stable Diffusion 模型权重进行潜空间扩散计算,最后由 VAE 模块解码渲染并保存为 PNG 格式图片。
    • 优化:针对 DCU 显存搬运与跨节点传输进行了三次硬件同步(torch.cuda.synchronize()),支持指定多种采样器、自定义宽高、防动漫图崩坏的 VAE FP32 自动升级对齐,以及多图连续循环推理。
  2. submit_sd.sh(SLURM 作业提交模板)
    • 功能:定义 SLURM 调度参数(锁定 1 张海光 DCU,申请 6 核 CPU 防止 OOM),加载超算 PyTorch 模块,设定 PYTHONPATH 并配置各种 MIOpen 离线环境变量,最终调用 generate.py
    • 优化:全路径动态解析(免去写死物理路径),支持通过外部环境变量直接覆盖内部参数。
  3. go.sh(一键状态硬追踪器)
    • 功能:作为控制端,提交作业到集群中,同时锁定 Job ID 开启实时日志雷达,将计算节点的渲染过程通过 tail -f 投递至用户的控制台。
    • 优化:任务结束后自动切断本地日志流(防止截断最后一波日志),自动识别并抓取当前任务真正生成的图像,通过 img2txt 进行终端微缩预览。

🛠️ 环境依赖准备

本工具链需运行于超算计算节点上。前置环境条件如下:

  1. 超算模块
    • apps/PyTorch/1.10/dtk-22.04-py37(内含适配海光 DCU 显卡的 PyTorch 版本)。
  2. Python 虚拟环境 (venv)
    • 需在项目目录下准备好虚拟环境(Python 3.7 规格),且里面安装有适配当前 PyTorch 版本的 diffuserstransformerssafetensors 以及相应的加速依赖包。
    • 虚拟环境的依赖包物理路径应当位于 venv/lib/python3.7/site-packages
  3. 模型与配置文件
    • models/ 目录下放置 Stable Diffusion 本地模型(如 Anything V5 等)。
    • prompt.txt:存放默认的正向提示词(一行)。
    • negative.txt:存放默认的反向提示词(一行)。

🚀 快速开始

1. 一键提交并实时追踪

在登录节点终端中,直接执行:

bash
chmod +x go.sh submit_sd.sh
./go.sh

执行后,脚本会:

  • 自动清理可能存在的 Windows DOS 换行符毒瘤 (\r);
  • 向超算调度系统 sbatch 投递任务,并捕获 Job ID
  • 自动等待超算排队调度,并在分配到显卡启动的第一瞬间,开始把渲染输出动态打印在你的黑窗口里;
  • 结束后展示生成的字符画微缩预览,并提示你刷新可道云网盘获取高清大图。

2. 秒开帮助菜单

你可以在本地随时使用以下命令直接调用 Python 参数帮助菜单,无需等待几十秒加载 PyTorch 库:

bash
python generate.py --help

🎨 进阶技巧:批量画图减少“抽奖”排队时间

超算任务每次重新排队加载模型需要耗费 1~2 分钟,如果一次只画一张图,效率极其低下。建议利用我们新加入的批量机制进行连续推理:

环境变量参数覆盖控制

在使用 ./go.sh 提交任务时,你可以在命令前加上各种控制参数的环境变量。SLURM 会自动将它们注入计算节点:

示例 1:一次性连续生成 4 张图(共享单次排队和加载时间)

bash
SD_NUM_IMAGES=4 ./go.sh
  • 效果:系统只排一次队、加载一次模型。Python 会随机生成一个基础种子(如 1234),并连续输出 4 张图片(种子分别为 1234123512361237),依次保存为 sd_seed_1234.pngsd_seed_1003.png。每画完一张图,系统会自动回收一次显存防止溢出崩溃。

示例 2:调整出图尺寸与采样器,并锁定特定种子

bash
SD_NUM_IMAGES=2 SD_WIDTH=512 SD_HEIGHT=768 SD_SCHEDULER="dpm++_2m" SD_SEED=42 ./go.sh
  • 效果:生成 2 张垂直比例的大图(512x768),采样器改为更精细的 dpm++_2m,种子锁定为 4243

⚙️ 核心参数对照表

当你需要自定义或重构脚本时,可以参考以下完整的配置选项:

环境变量名称对应 python 参数默认值作用说明
SD_PROMPT--prompt读取 prompt.txt正向提示词
SD_NEGATIVE--negative_prompt读取 negative.txt反向提示词
SD_MODEL--model_pathanything-v5 路径本地模型权重的绝对路径
SD_WIDTH--width512渲染图像宽度
SD_HEIGHT--height512渲染图像高度
SD_STEPS--steps28潜空间扩散迭代步数
SD_CFG--cfg7.5无分类器引导系数(CFG Scale)
SD_NUM_IMAGES--num_images1单词作业内连续循环渲染出图的数量
SD_SCHEDULER--schedulereuler_a采样器。可选:euler_a, euler, dpm++_2m, dpm++_2m_sde, ddim, pndm
SD_SEED--seed-1随机种子。-1 表示自动随机,其余整数表示固定种子
SD_VAE_FP32--vae_fp32false强制将 VAE 模块提升至 FP32 精度(自动识别动漫模型,或手动填 true 开启)
SD_LOW_VRAM--low_vramfalse启用低显存 Attention 动作切片(开启会损失约 30% 速度,显存够用时请保持 false

🔍 排错与常见问题

1. 作业刚提交就“消失”了,没有日志产生

  • 排查方法:请立刻查看错误输出:cat logs/sd_*.err
  • 常见原因
    • submit_sd.sh 或模型路径不正确,导致 python 启动时找不到文件。
    • 虚拟环境缺失,找不到核心库。
    • 显卡分区名称 (kshdtest) 错误或账号无该分区权限。

2. 图像大面积呈现灰色、泛白或全黑

  • 解决方案:这是由于半精度 VAE 在动漫模型(如 Anything-v5/Counterfeit 等)下容易数值溢出导致的。
    • 请确保模型文件夹命名中包含 anythingcounterfeit(脚本会自动识别并启用 FP32防爆机制)。
    • 或者,在提交时显式声明环境变量强行拉起精度:
bash
SD_VAE_FP32=true ./go.sh

3. 排队时提示“DOS line breaks”报错

  • 排错原理:通常是因为脚本在 Windows 环境下编辑保存,导致每行末尾携带了 \r 符号,超算集群的 Linux Bash 无法识别。
  • 解决方案:在运行 ./go.sh 时,脚本已会自动对关联文件执行 sed -i 's/\r$//'。如果是其他文件发生类似报错,可手动在超算上敲命令清洗该文件:
bash
sed -i 's/\r$//' <报错文件>
评论 隐私政策