Buckets:

mishig's picture
|
download
raw
8.24 kB
# Pruna
[Pruna](https://github.com/PrunaAI/pruna), çıkarımı hızlandırmak ve bellek kullanımını azaltmak için kuantizasyon, budama, önbellekleme ve derleme gibi çeşitli optimizasyon yöntemleri sunan bir model optimizasyon çerçevesidir. Optimizasyon yöntemlerinin genel bir özeti aşağıda gösterilmektedir.
| Teknik | Açıklama | Hız | Bellek | Kalite |
|--------------|-----------------------------------------------------------------------------------------------|:-----:|:------:|:-------:|
| `batcher` | Birden fazla girdiyi aynı anda işlenmek üzere bir araya getirerek hesaplama verimliliğini artırır ve işleme süresini kısaltır. | ✅ | ❌ | ➖ |
| `cacher` | Hesaplamaların ara sonuçlarını depolar ve sonraki işlemleri hızlandırır. | ✅ | ➖ | ➖ |
| `compiler` | Modeli, belirli donanımlar için talimatlarla optimize eder. | ✅ | ➖ | ➖ |
| `distiller` | Daha büyük ve karmaşık bir modeli taklit etmek için daha küçük ve basit bir model eğitir. | ✅ | ✅ | ❌ |
| `quantizer` | Ağırlıkların ve aktivasyonların hassasiyetini azaltarak bellek gereksinimlerini düşürür. | ✅ | ✅ | ❌ |
| `pruner` | Daha az önemli veya gereksiz bağlantıları ve nöronları kaldırarak daha seyrek ve verimli bir ağ oluşturur. | ✅ | ✅ | ❌ |
| `recoverer` | Sıkıştırma sonrasında bir modelin performansını geri yükler. | ➖ | ➖ | ✅ |
| `factorizer` | Factorization, birkaç küçük matris çarpımını tek bir büyük füzyonlu işlemde birleştirir. | ✅ | ➖ | ➖ |
| `enhancer` | Gürültü azaltma veya ölçeklendirme gibi son işleme algoritmaları uygulayarak model çıktısını iyileştirir. | ❌ | - | ✅ |
✅ (iyileştirir), ➖ (yaklaşık aynı), ❌ (kötüleştirmir)
[Pruna belgeleri](https://docs.pruna.ai/en/stable/docs_pruna/user_manual/configure.html#configure-algorithms)nde optimizasyon yöntemlerinin tam kapsamını keşfedin.
## Kurulum
Pruna'yı aşağıdaki komutla yükleyin.
```bash
pip install pruna
```
## Diffusers modellerini optimize et
Aşağıda gösterildiği gibi, Diffusers modelleri için geniş bir yelpazede optimizasyon algoritmaları desteklenmektedir.
Aşağıdaki örnek, [black-forest-labs/FLUX.1-dev](https://huggingface.co/black-forest-labs/FLUX.1-dev) modelini factorizer, compiler ve cacher algoritmalarının bir kombinasyonuyla optimize eder. Bu kombinasyon, çıkarımı (inference) en fazla 4.2x hızlandırırken tepe GPU bellek kullanımını 34.7GB'den 28.0GB'a düşürür ve tüm bunları neredeyse aynı çıktı kalitesini koruyarak gerçekleştirir.
> [!TIP]
> Bu örnekte kullanılan optimizasyon teknikleri hakkında daha fazla bilgi edinmek için [Pruna optimizasyonu](https://docs.pruna.ai/en/stable/docs_pruna/user_manual/configure.html) belgelerine başvurun.
Optimizasyon algoritmalarını kullanmak için bir `SmashConfig` tanımlayarak başlayın. Modeli optimize etmek için pipeline'ı ve `SmashConfig`'i `smash` ile sarmalayın ve ardından pipeline'ı çıkarım için normal şekilde kullanın.
```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]
```
Optimizasyonun ardından, optimize edilmiş modeli Hugging Face Hub üzerinden paylaşabilir ve yükleyebiliriz.
```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 modellerini değerlendirin ve performanslarını ölçün
Pruna, optimize ettiğiniz modellerin kalitesini değerlendirmek için [EvaluationAgent](https://docs.pruna.ai/en/stable/docs_pruna/user_manual/evaluate.html) sağlar.
Toplam süre ve işleme hızı gibi önem verdiğimiz metrikleri ve değerlendirme yapılacak veri setini seçebiliriz. Bir model tanımlayıp `EvaluationAgent` nesnesine iletebiliriz.
Optimize edilmiş bir modeli yükleyip değerlendirmek için `EvaluationAgent` kullanabilir ve bunu `Task` nesnesine iletebiliriz.
```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")
```
Optimize edilmiş modeli temel modelle karşılaştırmak yerine, bağımsız `diffusers` modelini de değerlendirebilirsiniz. Bu, modelin performansını optimizasyon olmadan değerlendirmek istediğinizde faydalıdır. Bunu, `PrunaModel` sarmalayıcısını kullanarak ve üzerinde `EvaluationAgent` çalıştırarak yapabiliriz.
```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)
```
Modellerinizi nasıl optimize edeceğinizi ve değerlendireceğinizi gördüğünüze göre, artık Pruna'yı kendi modellerinizi optimize etmek için kullanmaya başlayabilirsiniz. Neyse ki, başlamanıza yardımcı olacak birçok örneğimiz var.
> [!TIP]
> Flux için benchmarking hakkında daha fazla ayrıntı için [Announcing FLUX-Juiced: The Fastest Image Generation Endpoint (2.6 times faster)!](https://huggingface.co/blog/PrunaAI/flux-fastest-image-generation-endpoint) blog yazısına ve [InferBench](https://huggingface.co/spaces/PrunaAI/InferBench) Space'ine göz atın.
## Referans
- [Pruna](https://github.com/PrunaAI/pruna)
- [Pruna optimizasyonu](https://docs.pruna.ai/en/stable/docs_pruna/user_manual/configure.html#configure-algorithms)
- [Pruna değerlendirme](https://docs.pruna.ai/en/stable/docs_pruna/user_manual/evaluate.html)
- [Pruna eğitimleri](https://docs.pruna.ai/en/stable/docs_pruna/tutorials/index.html)

Xet Storage Details

Size:
8.24 kB
·
Xet hash:
03ecda8ddf3b6694b279180f14fd5764a54763e8ad91e017ade77ed19206f477

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