Buckets:

mishig's picture
|
download
raw
8.24 kB

Pruna

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 belgelerinde optimizasyon yöntemlerinin tam kapsamını keşfedin.

Kurulum

Pruna'yı aşağıdaki komutla yükleyin.

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 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.

Bu örnekte kullanılan optimizasyon teknikleri hakkında daha fazla bilgi edinmek için Pruna optimizasyonu 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.

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.

# 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 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.

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.

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.

Flux için benchmarking hakkında daha fazla ayrıntı için Announcing FLUX-Juiced: The Fastest Image Generation Endpoint (2.6 times faster)! blog yazısına ve InferBench Space'ine göz atın.

Referans

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.