加载 ControlNet 后报 expected scalar type Half but found Float,把类型改回去又出现显存不足。

一开始怀疑是「预处理器输出尺寸与底模要求不同」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。控制模型与底模精度不一致。也可能是控制模型是另一个版本系列,通道数不匹配。

少数情况下是同时加载多个控制模型,显存被占满。

上来先把控制模型与底模统一为半精度

ctrl = ControlNetModel.from_pretrained('lllyasviel/control_v11p_sd15_canny', torch_dtype=torch.float16)

接着确认两者属于同一版本系列

python -c "print(base.config._name_or_path, ctrl.config._name_or_path)"

控制图缩放到与输出相同的尺寸

python -c "from PIL import Image;print(Image.open('c.png').resize((768,768)).size)"

多控制模型时改用顺序加载

pipe.enable_sequential_cpu_offload()

改之前我把相关日志按时间截了一段存着,事后对时间线用得上。

别只看报错消失,验证要多做一步。出图正常,构图与参考图一致,不再出现精度报错,显存也没有溢出。

补一句。SD1.5 的控制模型不能用在 SDXL 上,报错形式五花八门,先核对版本系列比逐条查 dtype 更快。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189