Buckets:

hf-doc-build/doc / diffusers /v0.43.0 /pt /stable_diffusion.md
mishig's picture
|
download
raw
6.1 kB

Desempenho básico

A difusão é um processo aleatório que exige alto custo computacional. Você pode precisar executar o DiffusionPipeline várias vezes antes de obter a saída desejada. Por isso, é importante equilibrar cuidadosamente a velocidade de geração e o uso de memória para iterar mais rápido,

Este guia recomenda algumas dicas básicas de desempenho para o uso do DiffusionPipeline. Consulte a documentação da seção de Otimização de Inferência, como Aceleração de inferência ou Redução do uso de memória, para guias de desempenho mais detalhados.

Uso de memória

Reduzir a quantidade de memória usada acelera indiretamente a geração e pode ajudar um modelo a caber no dispositivo.

O método enable_model_cpu_offload() move o modelo para a CPU quando ele não está em uso, para economizar memória de GPU.

import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
  "stabilityai/stable-diffusion-xl-base-1.0",
  dtype=torch.bfloat16,
  device_map="cuda"  # or "mps", "xpu", "cpu"
)
pipeline.enable_model_cpu_offload()

prompt = """
cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""
pipeline(prompt).images[0]
print(f"Max memory reserved: {torch.cuda.max_memory_allocated() / 1024**3:.2f} GB")

Velocidade de inferência

O desruidamento é o processo mais computacionalmente exigente durante a difusão. Métodos que otimizam esse processo aceleram a velocidade de inferência. Tente os seguintes métodos para ganhar velocidade.

  • Adicione device_map="cuda" para colocar o pipeline em uma GPU. Colocar um modelo em um acelerador, como uma GPU, aumenta a velocidade porque ele executa os cálculos em paralelo.
  • Defina dtype=torch.bfloat16 para executar o pipeline em meia precisão. Reduzir a precisão do tipo de dados aumenta a velocidade, pois leva menos tempo para realizar cálculos em uma precisão menor.
import torch
import time
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler

pipeline = DiffusionPipeline.from_pretrained(
  "stabilityai/stable-diffusion-xl-base-1.0",
  dtype=torch.bfloat16,
  device_map="cuda
)
  • Use um agendador mais rápido, como o DPMSolverMultistepScheduler, que requer apenas ~20-25 etapas.
  • Defina num_inference_steps para um valor menor. Reduzir o número de etapas de inferência diminui o número total de computações. No entanto, isso pode resultar em uma qualidade de geração inferior.
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config)

prompt = """
cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""

start_time = time.perf_counter()
image = pipeline(prompt).images[0]
end_time = time.perf_counter()

print(f"Image generation took {end_time - start_time:.3f} seconds")

Qualidade da geração

Muitos modelos de difusão modernos entregam imagens de alta qualidade imediatamente. No entanto, você ainda pode melhorar a qualidade da geração tentando o seguinte.

  • Tente um prompt mais detalhado e descritivo. Inclua detalhes como o meio da imagem, o sujeito, o estilo e a estética. Um prompt negativo também pode ajudar a orientar o modelo a se afastar de características indesejadas, usando palavras como baixa qualidade ou desfocado.

    import torch
    from diffusers import DiffusionPipeline
    
    pipeline = DiffusionPipeline.from_pretrained(
        "stabilityai/stable-diffusion-xl-base-1.0",
        dtype=torch.bfloat16,
        device_map="cuda"  # or "mps", "xpu", "cpu"
    )
    
    prompt = """
    cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
    highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
    """
    negative_prompt = "low quality, blurry, ugly, poor details"
    pipeline(prompt, negative_prompt=negative_prompt).images[0]
    

    Para mais detalhes sobre a criação de prompts melhores, consulte o documento Técnicas de prompt.

  • Experimente um agendador diferente, como HeunDiscreteScheduler ou LMSDiscreteScheduler, que sacrifica a velocidade de geração em favor da qualidade.

    import torch
    from diffusers import DiffusionPipeline, HeunDiscreteScheduler
    
    pipeline = DiffusionPipeline.from_pretrained(
        "stabilityai/stable-diffusion-xl-base-1.0",
        dtype=torch.bfloat16,
        device_map="cuda"  # or "mps", "xpu", "cpu"
    )
    pipeline.scheduler = HeunDiscreteScheduler.from_config(pipeline.scheduler.config)
    
    prompt = """
    cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
    highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
    """
    negative_prompt = "low quality, blurry, ugly, poor details"
    pipeline(prompt, negative_prompt=negative_prompt).images[0]
    

Próximas etapas

Diffusers oferece otimizações mais avançadas e poderosas, como group-offloading e compilação regional. Para saber mais sobre como maximizar o desempenho, consulte a seção de Otimização de Inferência.

Xet Storage Details

Size:
6.1 kB
·
Xet hash:
734b83e4f967135c6bee9dbf00aee3f8a231c5439b8a877297501548ad825cb9

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.