Buckets:

mishig's picture
|
download
raw
13.3 kB
# 캐싱
Caching은 각 추론 단계마다 전체 계산을 수행하는 대신, attention 및 feedforward 레이어와 같은 다양한 레이어의 중간 출력을 저장하고 재사용함으로써 추론을 가속화합니다. 이는 추가적인 학습 없이 메모리 사용량이 증가하는 대가로 생성 속도를 크게 향상시킵니다.
이 가이드에서는 Diffusers에서 지원하는 캐싱 방법을 사용하는 방법을 보여줍니다.
## Pyramid Attention Broadcast
[Pyramid Attention Broadcast (PAB)](https://huggingface.co/papers/2408.12588)은 생성 과정의 연속된 timestep 간 attention 출력이 크게 다르지 않다는 관찰에 기반합니다. attention 차이는 cross attention 레이어에서 가장 작으며, 일반적으로 더 긴 timestep 범위에 걸쳐 캐시됩니다. 그 다음으로 temporal attention 레이어와 spatial attention 레이어가 따릅니다.
> [!TIP]
> 모든 비디오 모델에 세 가지 유형의 어텐션(cross, temporal, spatial)이 있는 것은 아닙니다!
PAB는 시퀀스 병렬성 및 classifier-free guidance 병렬성(데이터 병렬성)과 같은 다른 기법과 결합하여 거의 실시간의 비디오 생성을 가능하게 합니다.
활성화하려면 [PyramidAttentionBroadcastConfig](/docs/diffusers/main/ko/api/cache#diffusers.PyramidAttentionBroadcastConfig)를 설정하고 파이프라인의 transformer에 전달하세요. `spatial_attention_block_skip_range`는 공간 주의력 블록에서 주의력 계산을 건너뛰는 빈도를 제어하고, `spatial_attention_timestep_skip_range`는 건너뛸 타임스텝의 범위입니다. 간격이 작으면 추론 속도가 느려지고, 간격이 크면 생성 품질이 떨어질 수 있으므로 적절한 범위를 선택하는 데 주의하세요.
```python
import torch
from diffusers import CogVideoXPipeline, PyramidAttentionBroadcastConfig
pipeline = CogVideoXPipeline.from_pretrained("THUDM/CogVideoX-5b", dtype=torch.bfloat16)
pipeline.to("cuda") # or "mps", "xpu", "cpu"
config = PyramidAttentionBroadcastConfig(
spatial_attention_block_skip_range=2,
spatial_attention_timestep_skip_range=(100, 800),
current_timestep_callback=lambda: pipe.current_timestep,
)
pipeline.transformer.enable_cache(config)
```
## FasterCache
[FasterCache](https://huggingface.co/papers/2410.19355)는 각 연속적인 timestep마다 출력 차이가 작기 때문에 [PAB](#pyramid-attention-broadcast)와 유사하게 attention features를 캐싱하고 재사용합니다.
이 메서드는 샘플링에 classifier-free guidance를 사용하는 경우(대부분의 base model에서 일반적임) unconditional branch prediction을 건너뛰고, 연속된 timestep 간 예측된 latent output 사이에 상당한 중복성이 있을 경우 conditional branch prediction에서 이를 추정하도록 선택할 수 있습니다.
활성화하려면 [FasterCacheConfig](/docs/diffusers/main/ko/api/cache#diffusers.FasterCacheConfig)를 파이프라인의 transformer에 설정하고 전달하세요.
```python
import torch
from diffusers import CogVideoXPipeline, FasterCacheConfig
pipe line= CogVideoXPipeline.from_pretrained("THUDM/CogVideoX-5b", dtype=torch.bfloat16)
pipeline.to("cuda") # or "mps", "xpu", "cpu"
config = FasterCacheConfig(
spatial_attention_block_skip_range=2,
spatial_attention_timestep_skip_range=(-1, 681),
current_timestep_callback=lambda: pipe.current_timestep,
attention_weight_callback=lambda _: 0.3,
unconditional_batch_skip_range=5,
unconditional_batch_timestep_skip_range=(-1, 781),
tensor_format="BFCHW",
)
pipeline.transformer.enable_cache(config)
```
## SeaCache
[SeaCache](https://huggingface.co/papers/2602.18993)는 연속된 노이즈 제거 단계 간에 Spectral-Evolution-Aware(SEA) 지표를 비교합니다. 누적 지표 변화가 임계값 미만으로 유지되면, 비용이 높은 transformer block 스택을 건너뛰고 캐시된 잔차(residuals)로부터 그 출력을 예측합니다. 생성된 출력을 구성하는 시각적 잠재 변수(visual latents)로부터 지표를 구성합니다. 이미지-비디오 및 비디오-비디오 생성과 같이 해당 출력 궤적의 일부인 경우, 깨끗한 조건 프레임(clean conditioning frames)을 포함합니다. 생성을 조건화하지만 출력의 일부가 아닌 별도의 시각적 힌트(visual hints)는 제외합니다. 텍스트 조건화는 시각적 잠재 변수가 아니므로 제외됩니다.
Cosmos 3 Transfer는 컨트롤 힌트를 별도의 시각적 시퀀스로 처리하므로, 해당 어댑터는 이를 인디케이터에서 제외합니다. Control-CFG 분기는 동일한 출력 궤적을 비교하되, 각자의 캐시된 잔차를 유지합니다. 컨트롤 힌트는 여전히 트랜스포머의 조건으로 작용합니다.
구현은 다음 모델에 대한 내장 어댑터를 제공합니다:
- **Cosmos 3**는 주로 최적화되고 벤치마크된 통합입니다. 이는 post-normalization 경계를 통해 완전한 decoder 스택을 캐시합니다.
- **Wan T2V**는 eager 모드에서 범용 반복 블록 경로를 사용합니다. 이 통합은 다른 단일 스트림 비디오 transformer가 SeaCache에 원시 비전 latents를 제공할 수 있는 방법을 보여줄 뿐, 동일한 캐시 파라미터가 Wan에 최적이라는 주장이나 다른 Wan 변형이 지원된다는 것을 의미하지 않습니다.
`CacheMixin`을 사용하고, 인식되는 반복 블록 목록을 노출하며, `TransformerBlockRegistry`에 블록의 입력/출력 레이아웃을 등록하는 경우, 다른 비디오 transformer도 일반 경로와 통합할 수 있습니다. 파이프라인은 모든 transformer 호출에 대해 `cache_context`에 진입해야 하며, `step_index`, `sigma`, `num_inference_steps`를 연결하고, 조건부 및 무조건부 가이던스와 같은 독립적인 궤적에는 서로 다른 컨텍스트 이름을 사용해야 합니다. 내장 어댑터가 없는 경우, 생성된 출력을 구성하는 시각적 잠재 변수를 반환하는 `raw_vision_callback`을 전달하세요. 각 모델과 스케줄러에 대해 출력 품질을 검증하고 캐시 매개변수를 조정해야 합니다. Cosmos 3에서 지원 및 벤치마크 결과가 자동으로 이전되지 않으므로 주의가 필요합니다.
### Cosmos 3
SeaCache는 기본적으로 비활성화되어 있습니다. transformer에서 활성화하십시오. Cosmos 3의 denoising 루프는 각 `cache_context` 호출에 활성 scheduler step, sigma, step count를 연결하므로 추가적인 설정이 필요하지 않습니다:
```python
from diffusers import Cosmos3OmniPipeline, SeaCacheConfig
pipe = Cosmos3OmniPipeline.from_pretrained("nvidia/Cosmos3-Nano")
pipe.transformer.enable_cache(SeaCacheConfig(threshold=0.2, max_consecutive_cached=2))
```
이 모델 레벨 API는 [Cosmos3OmniPipeline](/docs/diffusers/main/ko/api/pipelines/cosmos3#diffusers.Cosmos3OmniPipeline), [Cosmos3OmniModularPipeline](/docs/diffusers/main/ko/api/pipelines/cosmos3#diffusers.Cosmos3OmniModularPipeline), [Cosmos3DistilledModularPipeline](/docs/diffusers/main/ko/api/pipelines/cosmos3#diffusers.Cosmos3DistilledModularPipeline)와 함께 작동합니다. SeaCache는 근사 최적화 기법으로, 생성된 출력이 변경될 수 있습니다. 모든 디노이징 단계에서 전체 transformer가 실행되어야 하는 경우 `pipe.transformer.disable_cache()`를 호출하세요.
## FirstBlockCache
[FirstBlock Cache](https://huggingface.co/docs/diffusers/main/en/api/cache#diffusers.FirstBlockCacheConfig)는 denoiser의 초기 레이어가 timestep이 넘어갈 때 얼마나 변하는지 확인합니다. 변화가 작으면 모델은 비용이 높은 후속 레이어를 건너뛰고 이전 출력을 재사용합니다.
```py
import torch
from diffusers import DiffusionPipeline
from diffusers.hooks import apply_first_block_cache, FirstBlockCacheConfig
pipeline = DiffusionPipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16
)
apply_first_block_cache(pipeline.transformer, FirstBlockCacheConfig(threshold=0.2))
```
## TaylorSeer 캐시
[TaylorSeer Cache](https://huggingface.co/papers/2403.06923)는 Taylor series expansions를 활용하여 denoising steps에 걸쳐 중간 activations를 근사하고 캐시함으로써 diffusion 추론을 가속화합니다. 이 방법은 과거의 계산에 기반하여 미래의 출력을 예측하고, 지정된 간격으로 이를 재사용하여 중복 계산을 줄입니다.
이 캐싱 메커니즘은 추가 메모리 오버헤드가 최소인 상태에서 뛰어난 결과를 제공합니다. 자세한 성능 분석은 [여기서 확인한 결과](https://github.com/huggingface/diffusers/pull/12648#issuecomment-3610615080)를 참고하세요.
TaylorSeer Cache를 활성화하려면 [TaylorSeerCacheConfig](/docs/diffusers/main/ko/api/cache#diffusers.TaylorSeerCacheConfig)를 생성하고 파이프라인의 transformer에 전달하세요:
- `cache_interval`: 전체 forward pass를 수행하기 전에 캐시된 출력을 재사용할 스텝 수
- `disable_cache_before_step`: 근사치를 위한 데이터를 수집하기 위해 전체 계산을 사용하는 초기 단계
- `max_order`: 근사 정확도 (이론적으로 값이 높을수록 품질이 향상되지만 메모리 사용량이 증가하므로 `1`로 설정하는 것을 권장합니다)
```python
import torch
from diffusers import FluxPipeline, TaylorSeerCacheConfig
pipe = FluxPipeline.from_pretrained(
"black-forest-labs/FLUX.1-dev",
dtype=torch.bfloat16,
).to("cuda") # or "mps", "xpu", "cpu"
config = TaylorSeerCacheConfig(
cache_interval=5,
max_order=1,
disable_cache_before_step=10,
taylor_factors_dtype=torch.bfloat16,
)
pipe.transformer.enable_cache(config)
```
## MagCache
[MagCache](https://github.com/Zehong-Ma/MagCache)는 잔차 업데이트의 크기를 기반으로 transformer 블록을 건너뛰어 추론을 가속화합니다. 업데이트(Output - Input)의 크기가 diffusion 과정에서 예측 가능하게 감소한다는 점을 관찰합니다. 사전 계산된 크기 비율을 기반으로 "오차 예산"을 누적하여, 언제 계산을 건너뛰고 이전 잔차를 재사용할지를 동적으로 결정합니다.
MagCache는 **Magnitude Ratios**(`mag_ratios`)에 의존하며, 이는 해당 감쇠 곡선을 설명합니다. 이러한 비율은 모델 체크포인트와 스케줄러에 따라 고유합니다. 번들된 `FLUX_MAG_RATIOS`는 FLUX.1에서 측정된 것이며, Flux2 및 Flux2 Klein을 포함한 다른 모델은 자체 캘리브레이션 실행이 필요합니다.
MagCache를 사용하려면 일반적으로 **Calibration**과 **Inference**의 두 단계 과정을 따릅니다.
1. **교정**: `calibrate=True`로 추론을 한 번 실행합니다. 훅이 잔차 크기를 측정하고 계산된 비율을 콘솔에 출력합니다.
2. **추론**: 이러한 비율을 `MagCacheConfig`에 전달하여 가속화를 활성화합니다.
```python
import torch
from diffusers import FluxPipeline, MagCacheConfig
pipe = FluxPipeline.from_pretrained(
"black-forest-labs/FLUX.1-schnell",
dtype=torch.bfloat16
).to("cuda") # or "mps", "xpu", "cpu"
# 1. Calibration Step
# Run full inference to measure model behavior.
calib_config = MagCacheConfig(calibrate=True, num_inference_steps=4)
pipe.transformer.enable_cache(calib_config)
# Run a prompt to trigger calibration
pipe("A cat playing chess", num_inference_steps=4)
# Logs will print something like: "MagCache Calibration Results: [1.0, 1.37, 0.97, 0.87]"
# 2. Inference Step
# Apply the specific ratios obtained from calibration for optimized speed.
# Note: For Flux models, you can also import defaults:
# from diffusers.hooks.mag_cache import FLUX_MAG_RATIOS
mag_config = MagCacheConfig(
mag_ratios=[1.0, 1.37, 0.97, 0.87],
num_inference_steps=4
)
pipe.transformer.enable_cache(mag_config)
image = pipe("A cat playing chess", num_inference_steps=4).images[0]
```
> [!NOTE]
> `mag_ratios`는 모델의 고유한 크기 감쇠 곡선을 나타냅니다. 높은 스텝 수(예: 50)에 대해 보정된 비율은 더 낮은 스텝 수(예: 20)에 재사용할 수 있습니다. 구현에서는 보간을 사용하여 해당 곡선을 현재 추론 스텝 수에 매핑합니다.
> [!TIP]
> Classifier-Free Guidance를 순차적으로 실행하는 파이프라인(예: Kandinsky 5.0)의 경우, 캘리브레이션 로그에 두 개의 배열이 출력될 수 있습니다: Conditional 패스용 배열과 Unconditional 패스용 배열입니다. 대부분의 경우, 첫 번째 배열(Conditional)을 사용해야 합니다.
> [!TIP]
> **batched** 방식으로 Classifier-Free Guidance를 실행하는 파이프라인(SDXL 또는 Flux 등)의 경우, 모델이 처리하는 `hidden_states`에는 조건부 및 무조건부 브랜치가 연결(concatenated)되어 함께 포함됩니다. 캘리브레이션 과정은 이를 자동으로 처리하여, 결합된 동작을 나타내는 단일 비율(ratio) 배열을 생성합니다. 생성된 이 배열은 수정 없이 그대로 사용할 수 있습니다.

Xet Storage Details

Size:
13.3 kB
·
Xet hash:
e80a4070fbf965aa8a19cab4f8ef7e190d19addca22d8174275ce4af97ced792

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