Skip to content

Commit 5794fff

Browse files
authored
[docs] Remote inference (#12372)
* init * fix
1 parent 4fb44bd commit 5794fff

5 files changed

Lines changed: 283 additions & 571 deletions

File tree

docs/source/en/_toctree.yml

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454
title: Batch inference
5555
- local: training/distributed_inference
5656
title: Distributed inference
57+
- local: hybrid_inference/overview
58+
title: Remote inference
5759
title: Inference
5860
- isExpanded: false
5961
sections:
@@ -88,17 +90,6 @@
8890
title: FreeU
8991
title: Community optimizations
9092
title: Inference optimization
91-
- isExpanded: false
92-
sections:
93-
- local: hybrid_inference/overview
94-
title: Overview
95-
- local: hybrid_inference/vae_decode
96-
title: VAE Decode
97-
- local: hybrid_inference/vae_encode
98-
title: VAE Encode
99-
- local: hybrid_inference/api_reference
100-
title: API Reference
101-
title: Hybrid Inference
10293
- isExpanded: false
10394
sections:
10495
- local: modular_diffusers/overview
@@ -270,6 +261,8 @@
270261
title: Outputs
271262
- local: api/quantization
272263
title: Quantization
264+
- local: hybrid_inference/api_reference
265+
title: Remote inference
273266
- local: api/parallel
274267
title: Parallel inference
275268
title: Main Classes
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
# Hybrid Inference API Reference
1+
# Remote inference
22

3-
## Remote Decode
3+
Remote inference provides access to an [Inference Endpoint](https://huggingface.co/docs/inference-endpoints/index) to offload local generation requirements for decoding and encoding.
4+
5+
## remote_decode
46

57
[[autodoc]] utils.remote_utils.remote_decode
68

7-
## Remote Encode
9+
## remote_encode
810

911
[[autodoc]] utils.remote_utils.remote_encode

docs/source/en/hybrid_inference/overview.md

Lines changed: 274 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,51 +10,296 @@ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express o
1010
specific language governing permissions and limitations under the License.
1111
-->
1212

13-
# Hybrid Inference
13+
# Remote inference
1414

15-
**Empowering local AI builders with Hybrid Inference**
15+
> [!TIP]
16+
> This is currently an experimental feature, and if you have any feedback, please feel free to leave it [here](https://github.com/huggingface/diffusers/issues/new?template=remote-vae-pilot-feedback.yml).
1617
18+
Remote inference offloads the decoding and encoding process to a remote endpoint to relax the memory requirements for local inference with large models. This feature is powered by [Inference Endpoints](https://huggingface.co/docs/inference-endpoints/index). Refer to the table below for the supported models and endpoint.
1719

18-
> [!TIP]
19-
> Hybrid Inference is an [experimental feature](https://huggingface.co/blog/remote_vae).
20-
> Feedback can be provided [here](https://github.com/huggingface/diffusers/issues/new?template=remote-vae-pilot-feedback.yml).
20+
| Model | Endpoint | Checkpoint | Support |
21+
|---|---|---|---|
22+
| Stable Diffusion v1 | https://q1bj3bpq6kzilnsu.us-east-1.aws.endpoints.huggingface.cloud | [stabilityai/sd-vae-ft-mse](https://huggingface.co/stabilityai/sd-vae-ft-mse) | encode/decode |
23+
| Stable Diffusion XL | https://x2dmsqunjd6k9prw.us-east-1.aws.endpoints.huggingface.cloud | [madebyollin/sdxl-vae-fp16-fix](https://huggingface.co/madebyollin/sdxl-vae-fp16-fix) | encode/decode |
24+
| Flux | https://whhx50ex1aryqvw6.us-east-1.aws.endpoints.huggingface.cloud | [black-forest-labs/FLUX.1-schnell](https://huggingface.co/black-forest-labs/FLUX.1-schnell) | encode/decode |
25+
| HunyuanVideo | https://o7ywnmrahorts457.us-east-1.aws.endpoints.huggingface.cloud | [hunyuanvideo-community/HunyuanVideo](https://huggingface.co/hunyuanvideo-community/HunyuanVideo) | decode |
26+
27+
This guide will show you how to encode and decode latents with remote inference.
28+
29+
## Encoding
30+
31+
Encoding converts images and videos into latent representations. Refer to the table below for the supported VAEs.
32+
33+
Pass an image to [`~utils.remote_encode`] to encode it. The specific `scaling_factor` and `shift_factor` values for each model can be found in the [Remote inference](../hybrid_inference/api_reference) API reference.
34+
35+
```py
36+
import torch
37+
from diffusers import FluxPipeline
38+
from diffusers.utils import load_image
39+
from diffusers.utils.remote_utils import remote_encode
40+
41+
pipeline = FluxPipeline.from_pretrained(
42+
"black-forest-labs/FLUX.1-schnell",
43+
torch_dtype=torch.float16,
44+
vae=None,
45+
device_map="cuda"
46+
)
47+
48+
init_image = load_image(
49+
"https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/astronaut.jpg"
50+
)
51+
init_image = init_image.resize((768, 512))
52+
53+
init_latent = remote_encode(
54+
endpoint="https://whhx50ex1aryqvw6.us-east-1.aws.endpoints.huggingface.cloud",
55+
image=init_image,
56+
scaling_factor=0.3611,
57+
shift_factor=0.1159
58+
)
59+
```
60+
61+
## Decoding
62+
63+
Decoding converts latent representations back into images or videos. Refer to the table below for the available and supported VAEs.
64+
65+
Set the output type to `"latent"` in the pipeline and set the `vae` to `None`. Pass the latents to the [`~utils.remote_decode`] function. For Flux, the latents are packed so the `height` and `width` also need to be passed. The specific `scaling_factor` and `shift_factor` values for each model can be found in the [Remote inference](../hybrid_inference/api_reference) API reference.
66+
67+
<hfoptions id="decode">
68+
<hfoption id="Flux">
69+
70+
```py
71+
from diffusers import FluxPipeline
72+
73+
pipeline = FluxPipeline.from_pretrained(
74+
"black-forest-labs/FLUX.1-schnell",
75+
torch_dtype=torch.bfloat16,
76+
vae=None,
77+
device_map="cuda"
78+
)
79+
80+
prompt = """
81+
A photorealistic Apollo-era photograph of a cat in a small astronaut suit with a bubble helmet, standing on the Moon and holding a flagpole planted in the dusty lunar soil. The flag shows a colorful paw-print emblem. Earth glows in the black sky above the stark gray surface, with sharp shadows and high-contrast lighting like vintage NASA photos.
82+
"""
83+
84+
latent = pipeline(
85+
prompt=prompt,
86+
guidance_scale=0.0,
87+
num_inference_steps=4,
88+
output_type="latent",
89+
).images
90+
image = remote_decode(
91+
endpoint="https://whhx50ex1aryqvw6.us-east-1.aws.endpoints.huggingface.cloud/",
92+
tensor=latent,
93+
height=1024,
94+
width=1024,
95+
scaling_factor=0.3611,
96+
shift_factor=0.1159,
97+
)
98+
image.save("image.jpg")
99+
```
100+
101+
</hfoption>
102+
<hfoption id="HunyuanVideo">
103+
104+
```py
105+
import torch
106+
from diffusers import HunyuanVideoPipeline, HunyuanVideoTransformer3DModel
107+
108+
transformer = HunyuanVideoTransformer3DModel.from_pretrained(
109+
"hunyuanvideo-community/HunyuanVideo", subfolder="transformer", torch_dtype=torch.bfloat16
110+
)
111+
pipeline = HunyuanVideoPipeline.from_pretrained(
112+
model_id, transformer=transformer, vae=None, torch_dtype=torch.float16, device_map="cuda"
113+
)
114+
115+
latent = pipeline(
116+
prompt="A cat walks on the grass, realistic",
117+
height=320,
118+
width=512,
119+
num_frames=61,
120+
num_inference_steps=30,
121+
output_type="latent",
122+
).frames
123+
124+
video = remote_decode(
125+
endpoint="https://o7ywnmrahorts457.us-east-1.aws.endpoints.huggingface.cloud/",
126+
tensor=latent,
127+
output_type="mp4",
128+
)
129+
130+
if isinstance(video, bytes):
131+
with open("video.mp4", "wb") as f:
132+
f.write(video)
133+
```
134+
135+
</hfoption>
136+
</hfoptions>
137+
138+
## Queuing
139+
140+
Remote inference supports queuing to process multiple generation requests. While the current latent is being decoded, you can queue the next prompt.
141+
142+
```py
143+
import queue
144+
import threading
145+
from IPython.display import display
146+
from diffusers import StableDiffusionXLPipeline
147+
148+
def decode_worker(q: queue.Queue):
149+
while True:
150+
item = q.get()
151+
if item is None:
152+
break
153+
image = remote_decode(
154+
endpoint="https://q1bj3bpq6kzilnsu.us-east-1.aws.endpoints.huggingface.cloud/",
155+
tensor=item,
156+
scaling_factor=0.13025,
157+
)
158+
display(image)
159+
q.task_done()
160+
161+
q = queue.Queue()
162+
thread = threading.Thread(target=decode_worker, args=(q,), daemon=True)
163+
thread.start()
164+
165+
def decode(latent: torch.Tensor):
166+
q.put(latent)
167+
168+
prompts = [
169+
"A grainy Apollo-era style photograph of a cat in a snug astronaut suit with a bubble helmet, standing on the lunar surface and gripping a flag with a paw-print emblem. The gray Moon landscape stretches behind it, Earth glowing vividly in the black sky, shadows crisp and high-contrast.",
170+
"A vintage 1960s sci-fi pulp magazine cover illustration of a heroic cat astronaut planting a flag on the Moon. Bold, saturated colors, exaggerated space gear, playful typography floating in the background, Earth painted in bright blues and greens.",
171+
"A hyper-detailed cinematic shot of a cat astronaut on the Moon holding a fluttering flag, fur visible through the helmet glass, lunar dust scattering under its feet. The vastness of space and Earth in the distance create an epic, awe-inspiring tone.",
172+
"A colorful cartoon drawing of a happy cat wearing a chunky, oversized spacesuit, proudly holding a flag with a big paw print on it. The Moon’s surface is simplified with craters drawn like doodles, and Earth in the sky has a smiling face.",
173+
"A monochrome 1969-style press photo of a “first cat on the Moon” moment. The cat, in a tiny astronaut suit, stands by a planted flag, with grainy textures, scratches, and a blurred Earth in the background, mimicking old archival space photos."
174+
]
175+
176+
177+
pipeline = StableDiffusionXLPipeline.from_pretrained(
178+
"https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0",
179+
torch_dtype=torch.float16,
180+
vae=None,
181+
device_map="cuda"
182+
)
183+
184+
pipeline.unet = pipeline.unet.to(memory_format=torch.channels_last)
185+
pipeline.unet = torch.compile(pipe.unet, mode="reduce-overhead", fullgraph=True)
186+
187+
_ = pipeline(
188+
prompt=prompts[0],
189+
output_type="latent",
190+
)
191+
192+
for prompt in prompts:
193+
latent = pipeline(
194+
prompt=prompt,
195+
output_type="latent",
196+
).images
197+
decode(latent)
198+
199+
q.put(None)
200+
thread.join()
201+
```
202+
203+
## Benchmarks
204+
205+
The tables demonstrate the memory requirements for encoding and decoding with Stable Diffusion v1.5 and SDXL on different GPUs.
21206

207+
For the majority of these GPUs, the memory usage dictates whether other models (text encoders, UNet/transformer) need to be offloaded or required tiled encoding. The latter two techniques increases inference time and impacts quality.
22208

209+
<details><summary>Encoding - Stable Diffusion v1.5</summary>
23210

24-
## Why use Hybrid Inference?
211+
| GPU | Resolution | Time (seconds) | Memory (%) | Tiled Time (secs) | Tiled Memory (%) |
212+
|:------------------------------|:-------------|-----------------:|-------------:|--------------------:|-------------------:|
213+
| NVIDIA GeForce RTX 4090 | 512x512 | 0.015 | 3.51901 | 0.015 | 3.51901 |
214+
| NVIDIA GeForce RTX 4090 | 256x256 | 0.004 | 1.3154 | 0.005 | 1.3154 |
215+
| NVIDIA GeForce RTX 4090 | 2048x2048 | 0.402 | 47.1852 | 0.496 | 3.51901 |
216+
| NVIDIA GeForce RTX 4090 | 1024x1024 | 0.078 | 12.2658 | 0.094 | 3.51901 |
217+
| NVIDIA GeForce RTX 4080 SUPER | 512x512 | 0.023 | 5.30105 | 0.023 | 5.30105 |
218+
| NVIDIA GeForce RTX 4080 SUPER | 256x256 | 0.006 | 1.98152 | 0.006 | 1.98152 |
219+
| NVIDIA GeForce RTX 4080 SUPER | 2048x2048 | 0.574 | 71.08 | 0.656 | 5.30105 |
220+
| NVIDIA GeForce RTX 4080 SUPER | 1024x1024 | 0.111 | 18.4772 | 0.14 | 5.30105 |
221+
| NVIDIA GeForce RTX 3090 | 512x512 | 0.032 | 3.52782 | 0.032 | 3.52782 |
222+
| NVIDIA GeForce RTX 3090 | 256x256 | 0.01 | 1.31869 | 0.009 | 1.31869 |
223+
| NVIDIA GeForce RTX 3090 | 2048x2048 | 0.742 | 47.3033 | 0.954 | 3.52782 |
224+
| NVIDIA GeForce RTX 3090 | 1024x1024 | 0.136 | 12.2965 | 0.207 | 3.52782 |
225+
| NVIDIA GeForce RTX 3080 | 512x512 | 0.036 | 8.51761 | 0.036 | 8.51761 |
226+
| NVIDIA GeForce RTX 3080 | 256x256 | 0.01 | 3.18387 | 0.01 | 3.18387 |
227+
| NVIDIA GeForce RTX 3080 | 2048x2048 | 0.863 | 86.7424 | 1.191 | 8.51761 |
228+
| NVIDIA GeForce RTX 3080 | 1024x1024 | 0.157 | 29.6888 | 0.227 | 8.51761 |
229+
| NVIDIA GeForce RTX 3070 | 512x512 | 0.051 | 10.6941 | 0.051 | 10.6941 |
230+
| NVIDIA GeForce RTX 3070 | 256x256 | 0.015 | 3.99743 | 0.015 | 3.99743 |
231+
| NVIDIA GeForce RTX 3070 | 2048x2048 | 1.217 | 96.054 | 1.482 | 10.6941 |
232+
| NVIDIA GeForce RTX 3070 | 1024x1024 | 0.223 | 37.2751 | 0.327 | 10.6941 |
25233

26-
Hybrid Inference offers a fast and simple way to offload local generation requirements.
234+
</details>
27235

28-
- 🚀 **Reduced Requirements:** Access powerful models without expensive hardware.
29-
- 💎 **Without Compromise:** Achieve the highest quality without sacrificing performance.
30-
- 💰 **Cost Effective:** It's free! 🤑
31-
- 🎯 **Diverse Use Cases:** Fully compatible with Diffusers 🧨 and the wider community.
32-
- 🔧 **Developer-Friendly:** Simple requests, fast responses.
236+
<details><summary>Encoding SDXL</summary>
33237

34-
---
238+
| GPU | Resolution | Time (seconds) | Memory Consumed (%) | Tiled Time (seconds) | Tiled Memory (%) |
239+
|:------------------------------|:-------------|-----------------:|----------------------:|-----------------------:|-------------------:|
240+
| NVIDIA GeForce RTX 4090 | 512x512 | 0.029 | 4.95707 | 0.029 | 4.95707 |
241+
| NVIDIA GeForce RTX 4090 | 256x256 | 0.007 | 2.29666 | 0.007 | 2.29666 |
242+
| NVIDIA GeForce RTX 4090 | 2048x2048 | 0.873 | 66.3452 | 0.863 | 15.5649 |
243+
| NVIDIA GeForce RTX 4090 | 1024x1024 | 0.142 | 15.5479 | 0.143 | 15.5479 |
244+
| NVIDIA GeForce RTX 4080 SUPER | 512x512 | 0.044 | 7.46735 | 0.044 | 7.46735 |
245+
| NVIDIA GeForce RTX 4080 SUPER | 256x256 | 0.01 | 3.4597 | 0.01 | 3.4597 |
246+
| NVIDIA GeForce RTX 4080 SUPER | 2048x2048 | 1.317 | 87.1615 | 1.291 | 23.447 |
247+
| NVIDIA GeForce RTX 4080 SUPER | 1024x1024 | 0.213 | 23.4215 | 0.214 | 23.4215 |
248+
| NVIDIA GeForce RTX 3090 | 512x512 | 0.058 | 5.65638 | 0.058 | 5.65638 |
249+
| NVIDIA GeForce RTX 3090 | 256x256 | 0.016 | 2.45081 | 0.016 | 2.45081 |
250+
| NVIDIA GeForce RTX 3090 | 2048x2048 | 1.755 | 77.8239 | 1.614 | 18.4193 |
251+
| NVIDIA GeForce RTX 3090 | 1024x1024 | 0.265 | 18.4023 | 0.265 | 18.4023 |
252+
| NVIDIA GeForce RTX 3080 | 512x512 | 0.064 | 13.6568 | 0.064 | 13.6568 |
253+
| NVIDIA GeForce RTX 3080 | 256x256 | 0.018 | 5.91728 | 0.018 | 5.91728 |
254+
| NVIDIA GeForce RTX 3080 | 2048x2048 | OOM | OOM | 1.866 | 44.4717 |
255+
| NVIDIA GeForce RTX 3080 | 1024x1024 | 0.302 | 44.4308 | 0.302 | 44.4308 |
256+
| NVIDIA GeForce RTX 3070 | 512x512 | 0.093 | 17.1465 | 0.093 | 17.1465 |
257+
| NVIDIA GeForce RTX 3070 | 256x256 | 0.025 | 7.42931 | 0.026 | 7.42931 |
258+
| NVIDIA GeForce RTX 3070 | 2048x2048 | OOM | OOM | 2.674 | 55.8355 |
259+
| NVIDIA GeForce RTX 3070 | 1024x1024 | 0.443 | 55.7841 | 0.443 | 55.7841 |
35260

36-
## Available Models
261+
</details>
37262

38-
* **VAE Decode 🖼️:** Quickly decode latent representations into high-quality images without compromising performance or workflow speed.
39-
* **VAE Encode 🔢:** Efficiently encode images into latent representations for generation and training.
40-
* **Text Encoders 📃 (coming soon):** Compute text embeddings for your prompts quickly and accurately, ensuring a smooth and high-quality workflow.
263+
<details><summary>Decoding - Stable Diffusion v1.5</summary>
41264

42-
---
265+
| GPU | Resolution | Time (seconds) | Memory (%) | Tiled Time (secs) | Tiled Memory (%) |
266+
| --- | --- | --- | --- | --- | --- |
267+
| NVIDIA GeForce RTX 4090 | 512x512 | 0.031 | 5.60% | 0.031 (0%) | 5.60% |
268+
| NVIDIA GeForce RTX 4090 | 1024x1024 | 0.148 | 20.00% | 0.301 (+103%) | 5.60% |
269+
| NVIDIA GeForce RTX 4080 | 512x512 | 0.05 | 8.40% | 0.050 (0%) | 8.40% |
270+
| NVIDIA GeForce RTX 4080 | 1024x1024 | 0.224 | 30.00% | 0.356 (+59%) | 8.40% |
271+
| NVIDIA GeForce RTX 4070 Ti | 512x512 | 0.066 | 11.30% | 0.066 (0%) | 11.30% |
272+
| NVIDIA GeForce RTX 4070 Ti | 1024x1024 | 0.284 | 40.50% | 0.454 (+60%) | 11.40% |
273+
| NVIDIA GeForce RTX 3090 | 512x512 | 0.062 | 5.20% | 0.062 (0%) | 5.20% |
274+
| NVIDIA GeForce RTX 3090 | 1024x1024 | 0.253 | 18.50% | 0.464 (+83%) | 5.20% |
275+
| NVIDIA GeForce RTX 3080 | 512x512 | 0.07 | 12.80% | 0.070 (0%) | 12.80% |
276+
| NVIDIA GeForce RTX 3080 | 1024x1024 | 0.286 | 45.30% | 0.466 (+63%) | 12.90% |
277+
| NVIDIA GeForce RTX 3070 | 512x512 | 0.102 | 15.90% | 0.102 (0%) | 15.90% |
278+
| NVIDIA GeForce RTX 3070 | 1024x1024 | 0.421 | 56.30% | 0.746 (+77%) | 16.00% |
43279

44-
## Integrations
280+
</details>
45281

46-
* **[SD.Next](https://github.com/vladmandic/sdnext):** All-in-one UI with direct supports Hybrid Inference.
47-
* **[ComfyUI-HFRemoteVae](https://github.com/kijai/ComfyUI-HFRemoteVae):** ComfyUI node for Hybrid Inference.
282+
<details><summary>Decoding SDXL</summary>
48283

49-
## Changelog
284+
| GPU | Resolution | Time (seconds) | Memory Consumed (%) | Tiled Time (seconds) | Tiled Memory (%) |
285+
| --- | --- | --- | --- | --- | --- |
286+
| NVIDIA GeForce RTX 4090 | 512x512 | 0.057 | 10.00% | 0.057 (0%) | 10.00% |
287+
| NVIDIA GeForce RTX 4090 | 1024x1024 | 0.256 | 35.50% | 0.257 (+0.4%) | 35.50% |
288+
| NVIDIA GeForce RTX 4080 | 512x512 | 0.092 | 15.00% | 0.092 (0%) | 15.00% |
289+
| NVIDIA GeForce RTX 4080 | 1024x1024 | 0.406 | 53.30% | 0.406 (0%) | 53.30% |
290+
| NVIDIA GeForce RTX 4070 Ti | 512x512 | 0.121 | 20.20% | 0.120 (-0.8%) | 20.20% |
291+
| NVIDIA GeForce RTX 4070 Ti | 1024x1024 | 0.519 | 72.00% | 0.519 (0%) | 72.00% |
292+
| NVIDIA GeForce RTX 3090 | 512x512 | 0.107 | 10.50% | 0.107 (0%) | 10.50% |
293+
| NVIDIA GeForce RTX 3090 | 1024x1024 | 0.459 | 38.00% | 0.460 (+0.2%) | 38.00% |
294+
| NVIDIA GeForce RTX 3080 | 512x512 | 0.121 | 25.60% | 0.121 (0%) | 25.60% |
295+
| NVIDIA GeForce RTX 3080 | 1024x1024 | 0.524 | 93.00% | 0.524 (0%) | 93.00% |
296+
| NVIDIA GeForce RTX 3070 | 512x512 | 0.183 | 31.80% | 0.183 (0%) | 31.80% |
297+
| NVIDIA GeForce RTX 3070 | 1024x1024 | 0.794 | 96.40% | 0.794 (0%) | 96.40% |
50298

51-
- March 10 2025: Added VAE encode
52-
- March 2 2025: Initial release with VAE decoding
299+
</details>
53300

54-
## Contents
55301

56-
The documentation is organized into three sections:
302+
## Resources
57303

58-
* **VAE Decode** Learn the basics of how to use VAE Decode with Hybrid Inference.
59-
* **VAE Encode** Learn the basics of how to use VAE Encode with Hybrid Inference.
60-
* **API Reference** Dive into task-specific settings and parameters.
304+
- Remote inference is also supported in [SD.Next](https://github.com/vladmandic/sdnext) and [ComfyUI-HFRemoteVae](https://github.com/kijai/ComfyUI-HFRemoteVae).
305+
- Refer to the [Remote VAEs for decoding with Inference Endpoints](https://huggingface.co/blog/remote_vae) blog post to learn more.

0 commit comments

Comments
 (0)