Buckets:

hf-doc-build/doc-dev / optimum-neuron /pr_1113 /en /inference_tutorials /stable-diffusion-xl-txt2img.md
|
download
raw
4.66 kB
# Stable Diffusion XL with Neuronx: Text to image
`🤗 Optimum` extends `🤗 Diffusers` to support inference on the second generation of Neuron devices(powering Trainium and Inferentia 2). It aims at inheriting the ease of Diffusers on Neuron.
To get started, make sure you have [configured your inf2 / trn1 instance](https://huggingface.co/docs/optimum-neuron/installation), and installed optimum:
```python
!pip install "optimum-neuron[neuronx]" diffusers matplotlib
```
## Compilation
To deploy SDXL models, we will also start by compiling the models. We support the export of following components in the pipeline to boost the speed:
* Text encoder
* Second text encoder
* U-Net (a three times larger UNet than the one in Stable Diffusion pipeline)
* VAE encoder
* VAE decoder
You can either compile and export a Stable Diffusion Checkpoint via CLI or `NeuronStableDiffusionXLPipeline` class.
In this tutorial, we will export [`stabilityai/stable-diffusion-xl-base-1.0`](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0) with the API.
```python
from optimum.neuron import NeuronStableDiffusionXLPipeline
model_id = "stabilityai/stable-diffusion-xl-base-1.0"
num_image_per_prompt = 1
input_shapes = {"batch_size": 1, "height": 1024, "width": 1024, "num_image_per_prompt": num_image_per_prompt}
compiler_args = {"auto_cast": "matmul", "auto_cast_type": "bf16"}
```
```python
# Compile and save
stable_diffusion_xl = NeuronStableDiffusionXLPipeline.from_pretrained(
model_id, export=True, device_ids=[0, 1], **compiler_args, **input_shapes
)
save_directory = "sd_neuron_xl/"
stable_diffusion_xl.save_pretrained(save_directory)
```
```python
# Push and share your model to the HuggingFace hub
repository_id = (
"your-username/your-awesome-model" # Replace with your repo id, eg. "Jingya/stable-diffusion-xl-base-1.0-neuronx".
)
stable_diffusion_xl.push_to_hub(save_directory, repository_id=repository_id, use_auth_token=True)
```
Feel free to use the following command as well for compiling and exporting the model:
```bash
optimum-cli export neuron --model stabilityai/stable-diffusion-xl-base-1.0 \
--task stable-diffusion-xl \
--batch_size 1 \
--height 1024 `# height in pixels of generated image, eg. 768, 1024` \
--width 1024 `# width in pixels of generated image, eg. 768, 1024` \
--num_images_per_prompt 1 `# number of images to generate per prompt, defaults to 1` \
--auto_cast matmul `# cast only matrix multiplication operations` \
--auto_cast_type bf16 `# cast operations from FP32 to BF16` \
sd_neuron_xl/
```
We Recommend `inf2.8xlarge` or larger for compilation. You will also be able to compile the models with a CPU-only instance *(needs ~92GB memory)* using the CLI with `--disable-validation`, which disables the validation of inference on neuron devices.
In the following section, we will run the pre-compiled model on Neuron devices, to reduce expenses, you can run inference with `inf2.xlarge` instance.
## Text-to-image Inference
If you have pre-compiled Stable Diffusion XL models, you can load them directly to skip the compilation:
```python
# stable_diffusion_xl = NeuronStableDiffusionXLPipeline.from_pretrained("your-username/your-awesome-model") # Pass a local path or your repo id on the HuggingFace hub.
```
```python
from diffusers import DPMSolverMultistepScheduler
stable_diffusion_xl.scheduler = DPMSolverMultistepScheduler.from_config(stable_diffusion_xl.scheduler.config)
```
```python
import time
import numpy as np
from matplotlib import image as mpimg
from matplotlib import pyplot as plt
```
```python
>>> # Run pipeline
>>> prompt = [
... "a photo of an astronaut riding a horse on mars",
... "sonic on the moon",
... "elvis playing guitar while eating a hotdog",
... "saved by the bell",
... "engineers eating lunch at the opera",
... "panda eating bamboo on a plane",
... "A digital illustration of a steampunk flying machine in the sky with cogs and mechanisms, 4k, detailed, trending in artstation, fantasy vivid colors",
... "kids playing soccer at the FIFA World Cup",
... ]
>>> plt.title("Image")
>>> plt.xlabel("X pixel scaling")
>>> plt.ylabel("Y pixels scaling")
>>> total_time = 0
>>> for x in prompt:
... start_time = time.time()
... image = stable_diffusion_xl(x).images[0]
... inf_time = time.time() - start_time
... print(f"[Inference Time] {np.round(inf_time, 2)} seconds.")
... image.save("image.png")
... image = mpimg.imread("image.png")
... # clear_output(wait=True)
... plt.imshow(image)
... plt.show()
```
[Inference Time] 13.74 seconds.
```python
```

Xet Storage Details

Size:
4.66 kB
·
Xet hash:
9c728dd5199b515e08a0a7a7b01486276f3260e6e32259092fa459fb70f85df3

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