# Pruna

[Pruna](https://github.com/PrunaAI/pruna) هو إطار عمل لتحسين النماذج يقدم طرق تحسين متنوعة - مثل التكميم، والتقليم، والتخزين المؤقت، والتجميع - لتسريع الاستدلال وتقليل استهلاك الذاكرة. تُعرض نظرة عامة على طرق التحسين أدناه.

| تقنية    | الوصف                                                                                   | السرعة | الذاكرة | الجودة |
|--------------|-----------------------------------------------------------------------------------------------|:-----:|:------:|:-------:|
| `batcher`    | تجمع المدخلات المتعددة معًا لمعالجتها في وقت واحد، مما يحسّن الكفاءة الحسابية ويقلل من وقت المعالجة. | ✅    | ❌     | ➖      |
| `cacher`     | يخزّن النتائج الوسيطة للعمليات الحسابية لتسريع العمليات اللاحقة.               | ✅    | ➖     | ➖      |
| `compiler`   | يُحسّن النموذج باستخدام تعليمات مخصصة للأجهزة المحددة.                                 | ✅    | ➖     | ➖      |
| `distiller`  | يُدرّب نموذجًا أصغر وأبسط لمحاكاة نموذج أكبر وأكثر تعقيدًا.                       | ✅    | ✅     | ❌      |
| `quantizer`  | يقلل من دقة الأوزان والتفعيلات، مما يخفض متطلبات الذاكرة.              | ✅    | ✅     | ❌      |
| `pruner`     | يزيل الاتصالات والعصبونات الأقل أهمية أو المتكررة، مما يؤدي إلى شبكة أكثر ندرة وكفاءة. | ✅    | ✅     | ❌      |
| `recoverer`  | يعيد أداء النموذج بعد الضغط.                                       | ➖    | ➖     | ✅      |
| `factorizer` | يقوم Factorization بدمج عدة عمليات ضرب مصفوفات صغيرة في عملية واحدة كبيرة مدمجة. | ✅ | ➖ | ➖ |
| `enhancer`   | يعزز مخرجات النموذج من خلال تطبيق خوارزميات ما بعد المعالجة مثل إزالة الضوضاء أو رفع الدقة. | ❌ | - | ✅ |

✅ (يحسّن)، ➖ (نفس الشيء تقريبًا)، ❌ (يُضعف)

استكشف مجموعة طرق التحسين الكاملة في [توثيق Pruna](https://docs.pruna.ai/en/stable/docs_pruna/user_manual/configure.html#configure-algorithms).

## التثبيت

قم بتثبيت Pruna باستخدام الأمر التالي.

```bash
pip install pruna
```

## تحسين نماذج Diffusers

تدعم نماذج Diffusers مجموعة واسعة من خوارزميات التحسين كما هو موضح أدناه.

    

يُحسّن المثال أدناه [black-forest-labs/FLUX.1-dev](https://huggingface.co/black-forest-labs/FLUX.1-dev) باستخدام مزيج من خوارزميات factorizer وcompiler وcacher. يُسرّع هذا المزيج الاستدلال حتى 4.2 أضعاف ويقلل ذروة استخدام ذاكرة GPU من 34.7GB إلى 28.0GB، مع الحفاظ على جودة المخرجات شبه المتطابقة.

> [!TIP]
> راجع وثائق [تحسين Pruna](https://docs.pruna.ai/en/stable/docs_pruna/user_manual/configure.html) لمعرفة المزيد حول تقنيات التحسين المستخدمة في هذا المثال.

    

ابدأ بتعريف `SmashConfig` بخوارزميات التحسين المراد استخدامها. لتحسين النموذج، قم بتغليف خط الأنابيب و`SmashConfig` باستخدام `smash` ثم استخدم خط الأنابيب بشكل طبيعي للاستدلال.

```python
import torch
from diffusers import FluxPipeline

from pruna import PrunaModel, SmashConfig, smash

# load the model
# Try segmind/Segmind-Vega or black-forest-labs/FLUX.1-schnell with a small GPU memory
pipe = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    dtype=torch.bfloat16
).to("cuda")  # or "mps", "xpu", "cpu"

# define the configuration
smash_config = SmashConfig()
smash_config["factorizer"] = "qkv_diffusers"
smash_config["compiler"] = "torch_compile"
smash_config["torch_compile_target"] = "module_list"
smash_config["cacher"] = "fora"
smash_config["fora_interval"] = 2

# for the best results in terms of speed you can add these configs
# however they will increase your warmup time from 1.5 min to 10 min
# smash_config["torch_compile_mode"] = "max-autotune-no-cudagraphs"
# smash_config["quantizer"] = "torchao"
# smash_config["torchao_quant_type"] = "fp8dq"
# smash_config["torchao_excluded_modules"] = "norm+embedding"

# optimize the model
smashed_pipe = smash(pipe, smash_config)

# run the model
smashed_pipe("a knitted purple prune").images[0]
```

    

بعد التحسين، يمكننا مشاركة النموذج المحسّن وتحميله باستخدام Hugging Face Hub.

```python
# save the model
smashed_pipe.save_to_hub("<username>/FLUX.1-dev-smashed")

# load the model
smashed_pipe = PrunaModel.from_hub("<username>/FLUX.1-dev-smashed")
```

## تقييم نماذج Diffusers ومعايرتها

توفّر Pruna الوكيل [EvaluationAgent](https://docs.pruna.ai/en/stable/docs_pruna/user_manual/evaluate.html) لتقييم جودة نماذجك المُحسَّنة.

يمكننا تحديد المقاييس التي نهتم بها، مثل الوقت الكلي ومعدل الإنتاجية، بالإضافة إلى مجموعة البيانات التي سنقيّم عليها. كما يمكننا تعريف نموذج ومروره إلى `EvaluationAgent`.

يمكننا تحميل نموذج محسّن وتقييمه باستخدام `EvaluationAgent` ثم تمريره إلى `Task`.

```python
import torch
from diffusers import FluxPipeline

from pruna import PrunaModel
from pruna.data.pruna_datamodule import PrunaDataModule
from pruna.evaluation.evaluation_agent import EvaluationAgent
from pruna.evaluation.metrics import (
    ThroughputMetric,
    TorchMetricWrapper,
    TotalTimeMetric,
)
from pruna.evaluation.task import Task

# define the device
device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"

# load the model
# Try PrunaAI/Segmind-Vega-smashed or PrunaAI/FLUX.1-dev-smashed with a small GPU memory
smashed_pipe = PrunaModel.from_hub("PrunaAI/FLUX.1-dev-smashed")

# Define the metrics
metrics = [
    TotalTimeMetric(n_iterations=20, n_warmup_iterations=5),
    ThroughputMetric(n_iterations=20, n_warmup_iterations=5),
    TorchMetricWrapper("clip"),
]

# Define the datamodule
datamodule = PrunaDataModule.from_string("LAION256")
datamodule.limit_datasets(10)

# Define the task and evaluation agent
task = Task(metrics, datamodule=datamodule, device=device)
eval_agent = EvaluationAgent(task)

# Evaluate smashed model and offload it to CPU
smashed_pipe.move_to_device(device)
smashed_pipe_results = eval_agent.evaluate(smashed_pipe)
smashed_pipe.move_to_device("cpu")
```

بدلاً من مقارنة النموذج المُحسَّن بالنموذج الأساسي، يمكنك أيضًا تقييم نموذج `diffusers` المستقل. وهذا مفيد إذا كنت ترغب في تقييم أداء النموذج دون التحسين. يمكننا القيام بذلك باستخدام غلاف `PrunaModel` وتشغيل `EvaluationAgent` عليه.

```python
import torch
from diffusers import FluxPipeline

from pruna import PrunaModel

# load the model
# Try PrunaAI/Segmind-Vega-smashed or PrunaAI/FLUX.1-dev-smashed with a small GPU memory
pipe = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    dtype=torch.bfloat16
).to("cpu")
wrapped_pipe = PrunaModel(model=pipe)
```

الآن وقد اطلعت على كيفية تحسين نماذجك وتقييمها، يمكنك البدء في استخدام Pruna لتحسين نماذجك الخاصة. لحسن الحظ، لدينا العديد من الأمثلة لمساعدتك على البدء.

> [!TIP]
> لمزيد من التفاصيل حول إجراء اختبارات الأداء على Flux، اطّلع على منشور المدونة [إعلان FLUX-Juiced: أسرع نقطة نهاية لتوليد الصور (أسرع بـ 2.6 مرة)!](https://huggingface.co/blog/PrunaAI/flux-fastest-image-generation-endpoint) ومساحة [InferBench](https://huggingface.co/spaces/PrunaAI/InferBench).

## مرجع

- [Pruna](https://github.com/PrunaAI/pruna)
- تحسين [Pruna](https://docs.pruna.ai/en/stable/docs_pruna/user_manual/configure.html#configure-algorithms)
- [تقييم Pruna](https://docs.pruna.ai/en/stable/docs_pruna/user_manual/evaluate.html)
- [دروس Pruna](https://docs.pruna.ai/en/stable/docs_pruna/tutorials/index.html)

