自定义Pipeline调用SDXL遇TypeError:NoneType对象不可迭代求助
解决SDXL自定义Pipeline适配时的NoneType迭代报错
问题根源
你遇到的TypeError: argument of type 'NoneType' is not iterable,是因为SDXL的UNet要求必须传入包含text_embeds和time_ids的added_cond_kwargs字典,但你的自定义Pipeline里没有正确构造这个参数,导致它变成了None,代码判断"text_embeds" in added_cond_kwargs时自然报错。
具体修复步骤
- 构造完整的text embeddings:SDXL需要同时处理正负prompt的embedding,要把两者拼接起来。参考官方逻辑,用
text_encoder和text_encoder_2分别生成embedding,然后按维度拼接,最终得到text_embeds。 - 生成time_ids参数:这个参数包含图像的目标尺寸、裁剪尺寸、缩放系数等信息,需要根据你的生成参数构造,格式示例:
time_ids = torch.cat([ torch.tensor([height]), torch.tensor([width]), torch.tensor([crop_height]), torch.tensor([crop_width]), torch.tensor([target_height]), torch.tensor([target_width]), ]).unsqueeze(0).to(device) - 确保added_cond_kwargs不为空:在调用UNet的forward方法时,显式传入构造好的字典:
added_cond_kwargs = {"text_embeds": text_embeds, "time_ids": time_ids} unet_output = self.unet( sample, timestep, encoder_hidden_states=encoder_hidden_states, added_cond_kwargs=added_cond_kwargs, return_dict=return_dict, ) - 检查参数传递链:从输入处理到UNet调用的每一步,确保
added_cond_kwargs没有被意外置为None,所有依赖的参数(比如两个text encoder的输出、time_ids)都正确生成并传递。
额外注意
diffusers 0.18.2对SDXL的支持已经比较完善,但SDXL的UNet输入结构和SD 1.x/2.x差异很大,自定义Pipeline不能直接沿用旧逻辑,必须适配双text encoder、added_cond_kwargs这些新要求。
内容的提问来源于stack exchange,提问作者kamza
相关产品推荐
相关产品推荐

