# CacheDiT

يسرّع [CacheDiT](https://github.com/vipshop/cache-dit) خطوط أنابيب DiT من خلال إعادة استخدام مخرجات كتل التحوّل عبر خطوات إزالة الضوضاء. ولا يتطلب تدريبًا، ويدعم معظم خطوط أنابيب DiT في Diffusers، بما في ذلك Flux وQwen-Image وWan وHunyuanVideo. كما أن Diffusers يحتوي على [تخزين مؤقت مدمج](./cache) لا يتطلب اعتمادًا إضافيًا.

قم بتثبيت CacheDiT من PyPI.

```bash
pip install -U cache-dit
```

استدعِ `cache_dit.supported_pipelines()` لعرض عائلات خطوط الأنابيب التي يدعمها CacheDiT.

```py
import cache_dit

cache_dit.supported_pipelines()
```

## تفعيل التخزين المؤقت

استدعِ `cache_dit.enable_cache` على خط أنابيب لتخزينه مؤقتًا بالإعدادات الافتراضية، ثم شغّلي خط الأنابيب كما هو معتاد.

```py
import torch
import cache_dit
from diffusers import FluxPipeline

pipeline = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev", dtype=torch.bfloat16
).to("cuda")
cache_dit.enable_cache(pipeline)

image = pipeline(
    "A cat holding a sign that says hello world", num_inference_steps=28
).images[0]
```

يعمل CacheDiT أيضًا مع `torch.compile`. قم بتجميع المحوّل (transformer) بعد استدعاء `enable_cache`. راجع وثائق [compile](https://github.com/vipshop/cache-dit/blob/main/docs/user_guide/COMPILE.md) للإعدادات التي تتجنب إعادة التجميع مع أشكال المدخلات الديناميكية.

```py
pipeline.transformer = torch.compile(pipeline.transformer)
```

استدعِ `cache_dit.summary` بعد الاستدلال لتسجيل عدد الخطوات المخزّنة مؤقتًا والفرق المتبقي بين الخطوات.

```py
stats = cache_dit.summary(pipeline)
```

استدعِ `cache_dit.disable_cache` لاستعادة خط الأنابيب الأصلي.

```py
cache_dit.disable_cache(pipeline)
```

## تهيئة ذاكرة التخزين المؤقت

DBCache تقوم (Dual Block Cache) بحساب أول n كتل (Fn) في كل خطوة. عندما لا يتغير ناتجها بشكل كبير عن الخطوة السابقة، تعيد استخدام الناتج المخزّن مؤقتًا للكتل المتبقية، ويمكنها إعادة حساب آخر n كتل (Bn) لتصحيحه. يتنبأ مُعايِر TaylorSeer بالناتج المخزّن مؤقتًا من الخطوات السابقة بدلاً من إعادة استخدامه كما هو.

`enable_cache` افتراضيًا هو DBCache مع حساب أول 8 كتل دائمًا (F8B0) وخطوات إحماء غير مخزنة عدد 8. لمقايضة السرعة بالجودة، ارفع `Fn_compute_blocks` أو اخفض `residual_diff_threshold` (الافتراضي `0.08`). للحصول على أفضل جودة عند معدلات التخزين المؤقت العالية، أضف مُعاير TaylorSeer.

```py
from cache_dit import DBCacheConfig, TaylorSeerCalibratorConfig

cache_dit.enable_cache(
    pipeline,
    cache_config=DBCacheConfig(
        max_warmup_steps=8,
        Fn_compute_blocks=8,
        Bn_compute_blocks=0,
        residual_diff_threshold=0.12,
    ),
    calibrator_config=TaylorSeerCalibratorConfig(taylorseer_order=1),
)
```

بالنسبة إلى خطوط الأنابيب المدعومة، يعرف CacheDiit مسبقًا ما إذا كان CFG يعمل كتمريرة أمامية منفصلة. أما بالنسبة للنماذج الأخرى، فعيّن `enable_separate_cfg=True` في `DBCacheConfig` إذا كان النموذج ينفذ التمرير المشروط وغير المشروط بشكل منفصل، أو عيّن `False` إذا كان يدمجهما أو لا يستخدم CFG.

راجع وثائق [تصميم DBCache](https://github.com/vipshop/cache-dit/blob/main/docs/user_guide/DBCACHE_DESIGN.md) لمعرفة كيفية عمل كتل Fn وBn، ووثائق [اختبارات أداء ذاكرة التخزين المؤقت](https://github.com/vipshop/cache-dit/blob/main/bench/cache/README.md) للحصول على أرقام تتعلق بالسرعة والجودة.

## الخطوات التالية

- بالنسبة إلى خطوط الأنابيب التي لا يدعمها CacheDiT بعد، راجع وثائق [BlockAdapter](https://github.com/vipshop/cache-dit/blob/main/docs/user_guide/CACHE_API.md#automatic-block-adapter).
- يدعم CacheDiT أيضًا [التوازي السياقي](https://github.com/vipshop/cache-dit/blob/main/docs/user_guide/CONTEXT_PARALLEL.md) و[التكميم](https://github.com/vipshop/cache-dit/blob/main/docs/user_guide/QUANTIZATION.md).

