TRL documentation

Bellek Kullanımını Azaltma

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.17.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Bellek Kullanımını Azaltma

Eğitim iş akışları genellikle bellek tüketimini azaltmak için optimize edilebilir ve TRL bunu başarmaya yardımcı olmak için çeşitli yerleşik özellikler sunar.

Aşağıda bu teknikleri özetliyor ve belirli kurulumunuz için en iyi sonucu veren yapılandırmayı bulmak amacıyla farklı kombinasyonlarla deney yapmanızı öneriyoruz.

Her yöntem, desteklenen eğitimciler için örnekler içerir. Bir tekniğin eğitimcinizle uyumlu olup olmadığından emin değilseniz, ilgili eğitimci belgelerine göz atmanızı öneririz.

Tüm eğitimcilerde desteklenen gradient checkpointing gibi ek stratejiler için transformers performans kılavuzuna bakın.

Kesme

Veri setindeki dizi uzunlukları büyük ölçüde değişkenlik gösterebilir. Veriler toplu (batch) olarak işlendiğinde, diziler, toplamdaki en uzun diziyle eşleşecek şekilde dolgu (padding) ile doldurulur; bu da çoğu dizi nispeten kısa olsa bile yüksek bellek kullanımına neden olabilir.

Truncation prompt-completion

Bellek kullanımını azaltmak için dizilerin makul bir uzunluğa kısaltılması önemlidir. TRL eğitimcileri varsayılan olarak dizileri kısaltır, ancak belirli kullanım durumunuza daha iyi uyum sağlamak için varsayılan kısaltma uzunluğunu ayarlamak isteyebilirsiniz.

DPO
SFT

DPO kırpma işlemi, birleştirilmiş prompt+completion dizisini kıran max_length parametresi üzerinden kontrol edilir.

DPO truncation

truncation parametresini ayarlamak için aşağıdaki kod parçasını kullanın:

from trl import DPOConfig

training_args = DPOConfig(..., max_length=...)

Eski max_prompt_length ve max_completion_length parametreleri artık kaldırıldı; bunun yerine, eğitimden önce veri setinizdeki aşırı uzun istemleri/tamamlamaları filtreleyin veya önceden kırpın.

max_length değerini nasıl seçilir?

max_length çok küçükse, token’larınızın önemli bir kısmı atılır ve eğitime katkı sağlamaz. Çok büyükse, bellek kullanımı ani bir şekilde artabilir ve bu durum bellek yetersizliği (OOM) hatalarına yol açabilir. Packing veya padding-free kullanılmadığında, büyük bir max_length değeri de birçok token’ın padding olması nedeniyle verimsiz bir eğitime neden olabilir.

Uygun bir değer seçmenize yardımcı olmak için, veri setinizdeki dizi uzunluğu dağılımını görselleştirmek için bir yardımcı araç sunuyoruz.

Paketleme

Bu teknik yalnızca SFT eğitimi ve FlashAttention (veya türevleri) kullanan kurulumlar için kullanılabilir.

Kırpma işlemi çeşitli dezavantajlara sahiptir:

  1. Bilgi kaybı: Dizilerin sonundaki önemli jetonlar atılabilir.
  2. Kırpma uzunluğunu seçme: Çok kısa veri kaybına, çok uzun ise verimsizliğe yol açar.

Packing, birden fazla diziyi aynı eğitim satırında bir araya getirerek ve her satırı max_length değerine kadar doldurarak bu sorunları azaltır.

Packing

TRL, dizileri verimli bir şekilde gruplayıp dolgu (padding) miktarını en aza indirerek Best-Fit Decreasing (BFD) kutu paketleme (bin packing) yöntemiyle paketleme (packing) uygular. Bir dizi max_length değerini aştığında, taşan token'ların nasıl işleneceğini farklı stratejiler belirler.

TRL üç stratejiyi destekler:

  • "bfd" (varsayılan): Best-Fit Decreasing paketleme kullanır. Bir dizi max_length değerini aşarsa, taşan jetonlar atılır.

  • "bfd_split": Best-Fit Decreasing packing kullanır, ancak uzun diziler paketleme öncesinde ≤ max_length uzunluğunda parçalara bölünür. Bu, tüm tokenleri korur ve Fewer Truncations Improve Language Modeling makalesinde önerilen yaklaşımı izler.

  • "wrapped": Tüm jetonlar bir akışa birleştirilir ve sabit uzunlukta bloklara bölünür. Bu, dolgu (padding) miktarını en aza indirir ancak ilgili olmayan örnekleri karıştırabilir. Bu strateji, literatürde (ör. Fewer Truncations Improve Language Modeling) concatenate-then-split olarak tanımlanan ön işleme adımına karşılık gelir. Qwen3-Coder-Next Technical Report'ta tartışıldığı üzere, veri setinin büyük bir bölümünde dizin sürekliliğini bozması nedeniyle performansı olumsuz etkileyen bir dezavantaja sahiptir.

Tüm diziler max_length'den kısa ise, kırpma veya bölme gerektirmediği için bfd ve bfd_split aynı şekilde davranır.

from trl import SFTConfig

training_args = SFTConfig(
    ...,
    packing=True,
    packing_strategy="bfd",
    max_length=512,
)

Parametre-verimli ince ayar için PEFT

LoRA gibi Parameter-Efficient Fine-Tuning (PEFT) yöntemleri, eğitim sırasında bellek kullanımını azaltmak için kullanılan en etkili teknikler arasında yer alır. PEFT yöntemleri, modelin tüm parametrelerini eğitmek yerine yalnızca küçük bir sayıda adaptör parametresini eğitir; bu da bellek gereksinimlerini önemli ölçüde azaltır ve sınırlı donanımlarda daha büyük modellerin ince ayarını mümkün kılar.

PEFT'nin TRL ile kullanımına ilişkin kapsamlı ayrıntılar için, çeşitli adaptör yöntemleri, kuantizasyon seçenekleri ve gelişmiş yapılandırmalar dahil olmak üzere, PEFT Entegrasyonu sayfasına bakın.

Bellek kullanımını azaltmak için PEFT'yi kullanmak için:

from datasets import load_dataset
from peft import LoraConfig
from trl import SFTTrainer

dataset = load_dataset("trl-lib/Capybara", split="train")

peft_config = LoraConfig()

trainer = SFTTrainer(
    model="Qwen/Qwen2.5-0.5B",
    train_dataset=dataset,
    peft_config=peft_config,
)

PEFT, bellek tasarrufunu daha da artırmak için kuantizasyon (4-bit veya 8-bit) gibi diğer bellek azaltma teknikleriyle birleştirilebilir. Kuantizasyon örnekleri için PEFT Entegrasyonu bölümüne bakın.

Dolgu olmadan

Padding-free batching, bellek kullanımını azaltmak için alternatif bir yaklaşımdır. Bu yöntemde bir batch (toplu işlem) önce örneklenir ve ardından padding (doldurma) uygulanmadan tek bir diziye dönüştürülür. Farklı örneklerin parçalarını birleştirerek eksik dizilere yol açabilen packing (paketleme) yönteminden farklı olarak, padding-free batching tüm dizilerin eksiksiz ve bütünlüğü korunmuş şekilde kalmasını sağlar.

Padding-free

DPO
SFT

Padding-free, DPOTrainer içinde geçici olarak kullanılamıyor: DPO yeniden yapılandırmasından bu yana padding_free=True ayarlandığında uyarı verilir ve standart padding'e geri dönülür. Gelecekteki bir güncellemede yeniden sunulması planlanmaktadır.

from trl import DPOConfig

training_args = DPOConfig(..., padding_free=True, model_init_kwargs={"attn_implementation": "kernels-community/flash-attn2"})

Aktivasyon aktarımı

Activation offloading, GPU VRAM kullanımını, ileri geçiş sırasında aktivasyon tensörlerini geçici olarak CPU RAM'ine taşıyıp geriye doğru geçişte ihtiyaç duyulduğunda geri getirmek suretiyle azaltan bir bellek verimliliği tekniğidir. Bu, eğitim süresinde hafif bir artışa karşılık olarak tepe bellek kullanımını önemli ölçüde azaltır.

SFT eğitim yapılandırmanızda aktivasyon boşaltmayı etkinleştirmek için:

from trl import SFTConfig

training_args = SFTConfig(..., activation_offloading=True)

Arka planda, aktivasyon aktarımı, ileri geçiş sırasında aktivasyonları yakalamak için PyTorch'un saved_tensors_hooks mekanizmasını uygular. Boyut ve bağlama göre hangi tensörlerin aktarılacağını akıllıca yönetir ve verimsiz olacak çıktı tensörlerinin aktarılmasını önler. Performans optimizasyonu için, bir bayrak aracılığıyla (varsayılan olarak true) hesaplama ile CPU-GPU aktarımlarını üst üste bindirmek üzere CUDA akışlarını kullanabilir.

Dizileri Bir Katına Dolgu Yapma

Bu teknik şu anda SFT ve Reward eğitimcileri için desteklenmektedir.

Etkinleştirildiğinde bu seçenek, tüm dizilerin belirtilen değerin katına yastıklandığını garanti eder.
Bu, dizi uzunluklarını bellek dostu sınırlara hizalayarak bazı donanımlarda hesaplama verimliliğini artırabilir.

SFT
Ödül
from trl import SFTConfig

training_args = SFTConfig(..., pad_to_multiple_of=2048)

PyTorch önbellek ayıracı

Uzun çalıştırmalarda, özellikle çevrimiçi RL (GRPO, RLOO, Online DPO) sırasında GPU belleği parçalanabilir. expandable_segments:True ayarını yapmak, PyTorch’un önbellekleme atayıcısının mevcut segmentleri büyütmeye izin verir; bu da ayrılan ve ayrılmış bellek arasındaki farkı azaltır:

export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
export PYTORCH_ALLOC_CONF=expandable_segments:True  # canonical name since PyTorch 2.10

vLLM uyku moduyla (vllm_enable_sleep_mode=True), vLLM bu ayarı aşmak için yalnızca PYTORCH_CUDA_ALLOC_CONF değerini okur; bu nedenle yalnızca PYTORCH_ALLOC_CONF değerini ayarlamayın.

Çevrimiçi yöntemlerde üretim için model toplama işlemini devre dışı bırakma

DeepSpeed ZeRO-3 kullanıldığında, model ağırlıkları birden fazla GPU arasında parçalanır. Çevrimiçi yöntemler, eğitim sürecinin bir parçası olarak modelden tamamlamalar üretmeyi içerir. Bu adımda, üretim için model ağırlıkları geçici olarak tek bir GPU üzerinde toplanır. Çok büyük modellerde bu toplama işlemi, bu sorunda #2250 açıklandığı gibi OOM hatalarına yol açabilir.

Bu sorunla karşılaşırsanız, … parametresini ayarlayarak üretim için model ağırlıklarının toplanmasını devre dışı bırakabilirsiniz:

GRPO
Çevrimiçi DPO
RLOO
from trl import GRPOConfig

training_args = GRPOConfig(..., ds3_gather_for_generation=False)

Bu ayar, model ağırlıklarının toplanmasını engelleyerek OOM hatalarını önler, ancak daha yavaş üretim hızlarına yol açabilir.

vLLM uyku modu

Çevrimiçi eğitim yöntemleri için vLLM'yi üretim arka ucu olarak kullanırken, sleep mode'u etkinleştirerek vLLM parametrelerini ve önbelleğini optimizasyon adımı sırasında CPU RAM'ine aktarabilir ve ağırlık senkronizasyonu ile üretim için gerektiğinde GPU VRAM'ine geri yükleyebilirsiniz.

GRPO
RLOO
from trl import GRPOConfig

training_args = GRPOConfig(..., vllm_enable_sleep_mode=True)

vLLM ağırlıklarını ve önbelleğini dışa aktarmak, GPU bellek kullanımını düşük tutmaya yardımcı olur; bu, büyük modellerin eğitimi sırasında veya sınırlı GPU kaynakları kullanıldığında özellikle faydalı olabilir. Ancak, vLLM motorunu uyku modundan uyandırmak bazı host–cihaz aktarma gecikmeleri getirir ve bu da eğitim hızını hafifçe etkileyebilir.

Gradient checkpointing

Gradient checkpointing, ileri geçiş sırasında tüm ara aktivasyonları saklamayarak ve bunları geriye doğru geçiş sırasında yeniden hesaplayarak hesaplama gücünü bellek karşılığında takas eder.

from trl import SFTConfig

training_args = SFTConfig(..., gradient_checkpointing=True)

Gradient checkpointing, bellek kullanımını optimize etmek için tüm trainer'larda varsayılan olarak etkinleştirilmiştir. Gerekirse gradient_checkpointing=False ayarlayarak devre dışı bırakabilirsiniz.

Seçici aktivasyon denetleme noktası

SFTTrainer ile ileri geçiş sırasında dikkat çıktısını kaydedebilir, geriye doğru geçişte yeniden hesaplamak yerine bunu kullanabilirsiniz. Bu, uzun bağlamda checkpointing kaynaklı yavaşlamanın çoğunu geri kazanır; bunun bedeli, katman başına ek bir gizli durum boyutunda tensördür. Bu, yeniden girmeyen (non-reentrant) checkpointing'i zorunlu kılar.

from trl import SFTConfig

training_args = SFTConfig(
    ...,
    gradient_checkpointing=True,
    gradient_checkpointing_kwargs={"selective": True},
)

Daha fazla bellek optimizasyonu tekniği için Transformers Performans Kılavuzu'na bakın.

Update on GitHub