简而言之:尝试将图像传递到StableCascadeCombinedPipeline会出现运行时错误,抱怨张量并非全部在cuda中。如果我注释掉图像参数,以便它仅依赖于文本提示,即作为文本到图像生成器,则该应用程序可以完美运行。
可以看到应用程序代码的要点(60 行 Python 代码),其中注释掉了图像输入 here
管道的文档将可选图像参数定义为:
images (torch.Tensor, PIL.Image.Image, List[torch.Tensor], List[PIL.Image.Image], optional) — The images to guide the image generation for the prior.
我正在通过渐变图像组件传递 PIL.Image.Image。
由于应用程序运行时不传递图像,似乎我需要以某种方式确保图像最终出现在
cuda
中,但到目前为止我还没有找到任何有关如何执行此操作的说明。
这是设置管道并定义生成函数的代码部分:
# Constants
repo = "stabilityai/stable-cascade"
# Ensure model and scheduler are initialized in GPU-enabled function
if torch.cuda.is_available():
pipe = StableCascadeCombinedPipeline.from_pretrained(repo, variant="bf16", torch_dtype=torch.bfloat16)
pipe.to("cuda")
# The generate function
@spaces.GPU(enable_queue=True)
def generate_image(prompt):
#def generate_image(prompt, images):
seed = random.randint(-100000,100000)
results = pipe(
prompt=prompt,
#images=[images],
height=1024,
width=1024,
num_inference_steps=20,
generator=torch.Generator(device="cuda").manual_seed(seed)
)
return results.images[0]
问题原来是
pipe.to('cuda')
没有将所需的组件(之前的图像编码器)移动到cuda。问题解决了
添加:
pipe.prior_image_encoder.to('cuda')
完整、有效的
app.py
和 requirements.txt
发布于 https://github.com/huggingface/diffusers/issues/7598#issuecomment-2042897916