换成 SDXL 模型后,出图整体偏灰、对比度低,用同一个提示词在 1.5 模型上却色彩正常。

一开始怀疑是「VAE 用半精度加载,数值溢出导致偏色」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。模型内置 VAE 缺失,回退到了通用解码器。少数情况下是外挂了 1.5 版本的 VAE,与 SDXL 不兼容。

不容易想到的是,解码后没有做像素值裁剪。

动手时先确认当前加载的 VAE 来源

python -c "print(pipe.vae.config._name_or_path)"

然后改用 SDXL 配套的 VAE 并指定半精度修复

pipe.vae = AutoencoderKL.from_pretrained('madebyollin/sdxl-vae-fp16-fix', torch_dtype=torch.float16)

随后用纯色提示词做对照验证

python -c "print(pipe('a red apple', num_inference_steps=20).images[0].getpixel((10,10)))"

末了确认输出范围在零到二五五之间

python -c "import numpy as np;print(np.array(img).min(), np.array(img).max())"

当时还开着另一个排查窗口,两边日志对照着看才定位到。

恢复的判定其实很直接。出图色彩恢复正常,暗部细节保留,同一提示词的画面与官方示例接近。

容易忽略的是,VAE 不匹配时几乎不会报错,只会安静地让颜色失真,换底模时一定要核对 VAE 版本。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189