405 Milyar Parametreli Siber Güvenlik Odaklı LLM Model Projesi — Bölüm 2: VRAM Sınırlarının Eşiğinde Hayatta Kalma

Alican Kiraz
5 min readJan 7, 2025

Selamlar Dostlar, makale serimizin ikinci bölümünde sınırlı sayıda GPU ve VRAM limitleriyle nasıl modelimize eğitim verebileceğimizi düşünüp, akıl yoracağız.

İlk olarak VRAM’i eğitim sırasında data nasıl kullanıyor onu anlayalım. Ai eğitim sürecinde kullanılan model mimarisi, veri işleme parametreleri, optimizasyon teknikleri gibi bir çok parametre doğrudan VRAM kullanımını etkiliyor.

İlk akla gelen burda LLM’deki parametre sayısına bağlı olarak artan ağırlıkların saklanmasına odaklanalım. Ağırlıklar, modelin eğitim sürecinde öğrendiği parametrelerdir. Bu parametreler forward-backward geçişlerde sürekli kullanılır. Hatırlarsanız; Forward ve Backward’ı önceki makalemde anlatmıştım. Yinede kısaca bir değinecek olursak; Bir sinir ağı, katmanlarının her birinde matematiksel işlemler gerçekleştirebilmek için belirli ağırlıklar ve bias parametrelerine sahiptir. Eğitim sürecinde; İleri geçiş anında ağırlıklar, giriş verisiyle matematiksel işlemlere girerek tahmin (çıktı) üretir. Geri yayılım’da ise loss hesaplandıktan sonra, bu hata sinyali ağı geriye doğru dolaşarak her bir ağırlığın ne kadar düzeltileceğini belirler yani gradient’ı hesaplar.

Dolayısıyla, eğitim sırasında ve sonrasında bu ağırlıkların bellekte (GPU VRAM veya CPU RAM) saklanması gerekir. Eğitimde kullanılan GPU’lar, hesaplamaları hızlandırmak için ağırlıkları kendi VRAM belleklerinde tutarlar.

Bu ağırlıklarında farklı saklama formatları vardır. Bunlar; FP32, BF16, FP16 vb. farklı sayısal temsil (precision) formatları kullanılabilir. Bunlardan daha düşük hassasiyetli formatlardan olan FP16/BF16 daha az VRAM kullanır. Gelin onlarada bir bakalım.

Ağırlıkların saklanmasında kullanılan precision biçimi, hem modelin başarımını yani performans ve doğruluk gibi metrikleri, hem de VRAM kullanımını doğrudan etkiler.

https://www.researchgate.net/figure/mplement-the-calculation-on-the-32-bit-floating-point-precision-of-the-CFU-block-where_fig2_370874176

FP32 (32-bit Floating Point)

IEEE 754 standardına göre tek duyarlıklı kayan nokta formatıdır, kısaca float32 olarak gösterilir. Her bir sayı yani ağırlık için 32 bit(4 byte)’dır. Daha precise representasyon ve matematiksel işlemler de daha düşük overflow riski taşır. Ancak yararlarının yanında yüksek VRAM kullanımı ve 16'lı bf16 ve fp16'ya göre daha yavaş hesaplama sağlar.

FP16 (16-bit Floating Point)

IEEE 754 standardının half precision kayan nokta formatıdır, kısaca float16 olarak gösterilir. Bellek kullanım miktarı olarak her bir sayı için 16 bit (2 byte)’dır. FP32’ye göre yarı yarıya daha az bellek kullanımı yapar. Birçok modern GPU’da ve özellikle NVIDIA Tensor Core birimlerindeki işlemlerde çok hızlı matris çarpımı yapar. Ancak daha düşük temsil aralığı bulunur. Overflow veya underflow riskide daha fazladır. Eğitim sırasında gradient scaling vb. yöntemlerle bu riskler yönetilir.

BF16 (16-bit Brain Floating Point)

Mantık olarak FP32’nin exponent bit sayısını koruyup, fraction bit sayısını azaltan özel bir formattır. FP16 gibi 16 bit harcama yapar. FP16’ya kıyasla daha geniş bir temsil aralığı sunar. Bu sayede taşma problemleri daha az yaşanır. Ama FP16 gibi, 16 bitlik saklama alanı nedeniyle mantisa düşüktür. Ama buna rağmen pratikte FP16’dan daha stabil olduğu söylenebilir.

https://huggingface.co/docs/transformers/v4.15.0/performance

Diğer Formatlar ve Düşük Hassasiyet Yöntemleri

  • INT8, INT4: Özellikle inference aşamasında modelleri sıkıştırmak için kullanılan bir formattır. Eğitimde kayan noktalı hesaplamalara göre daha sınırlı temsil gücü olduğundan nadiren doğrudan kullanılır.
  • Quantization Aware Training (QAT): Eğitim sırasında modelin belirli katmanlarını INT8 veya benzeri düşük bit formatlarında eğitmek mümkün olsa da genellikle ek karmaşıklık gerektirir.
  • Mixed Precision: Modelin bazı kısımlarında FP16/BF16, bazıları ise FP32’de tutulabilir. Özellikle gradientlerin toplanması, ağırlıkların güncellenmesi için master weights gibi FP32 kopyalarda saklanabilir.

Peki Model nedir ve ağırlık saklama işlemi nasıl yapılır?

Bir Model, katmanları ve bu katmanların oluşturduğu veri yapısından yani PyTorch nn.Module veya TensorFlow tf.Module gibi yapılarıiçerir. Bu parametreler bu arada genelde başlangıçta random başlatılır.

İlk adımda belleğe yükleme yapılır; bu yükleme sırasında tanımlanan bu parametreler, GPU’daki VRAM’e veya ayarlamalara göre CPU’yada kopyalanır. Her katmandaki ağırlıklar, belirlenen precision formatıyla saklanır.

Peki ileri geri geçişte nasıl kullanılır?

Eğitim sırasında bu parametreler ileri geçişte matris çarpımları ve nonlineer aktivasyonlar için kullanılır. Geri geçişte, her parametrenin gradienti hesaplanır. Bu gradientler de genellikle aynı veya benzer precision formatında tutulur.

https://stackoverflow.com/questions/64621585/pytorch-optimizer-adamw-and-adam-with-weight-decay

Ancak mixed precision training söz konusu olursa, taşma / alt-seviye hatalarını azaltmak için bazı işlemler FP32 ana kopyayla yapılır. Eğitimde kullanılan optimizatöre mesela; SGD, Adam, AdamW’e göre, bu ağırlıkların güncellenmesi için ek bellek alanları da saklanır. Adam’ı düşünecek olursak her parametre için “moment” ve “variance” olmak üzere 2 ek vektör saklanır. Bu parametrelerde ağırlıklarla aynı precision’da olabilir veya bazen FP32 gibi daha yüksek precision’da tutulur.

Şimdi Eğitim Parametrelerinin Etkisine bir göz atalım.

Batch Size ve Sequence Length

  • En önemli faktörlerden biri aslında Batch size ve micro-batch size’dır. Aktivasyonların boyutunu ve veri işleme yükünü belirlerler. Büyük batch size, aynı anda daha fazla veri örneğinin modelden geçirilmesine olanak tanır ancak çok daha fazla VRAM kullanımına yol açar. Aslında küçük batch size ile VRAM tasarrufuda sağlanabilir fakat bu sefer eğitim süresi uzar veya model genelleme performansı değişebilir.
  • Transformer tabanlı LLM’lerde, giriş metinlerinin sekans uzunluğu arttıkça bu kez de self-attention katmanlarının maliyeti ve aktivasyon boyutu artar. Daha uzun bir sequence length ise ileri ve geri geçişte saklanması gereken matrislerin de büyük olması anlamına geleceğinden VRAM tüketimi hızla yükselir.

Precision (Sayısal Hassasiyet)

  • FP32’ye kıyasla FP16 veya BF16'da Parametreler ve aktivasyonlar yarı yarıya daha az VRAM kaplayabilir. Modern GPU’lar, özellikle Tensor Core’ları kullanırken FP16/BF16 kullanımında hem hız artışı hem de VRAM’de tasarruf sağlar.
https://github.com/rasbt/deeplearning-models/blob/master/pytorch_ipynb/mechanics/gradient-checkpointing-nin.ipynb

Gradient Checkpointing ve ZeRO

  • Gradient Checkpointing: Bazı ara aktivasyonların saklanması yerine, gerektiğinde yeniden hesaplanmasını sağlayan yaklaşımıdır. Böylece aktivasyon depolama maliyeti düşerken, yeniden hesaplama için ek işlem gücü gerekir.
  • ZeRO (Zero Redundancy Optimizer): Dağıtık eğitim ortamlarında parametrelerle optimizasyon değişkenlerini GPU’lar arasında bölüştürerek VRAM kullanımını azaltır.
  • Model/ Pipeline/ Tensor Parallelism: Modeli pipeline parallelism veya tensor parallelism ile birden fazla GPU’ya dağıtılması sağlayarak, her GPU’da tutulması gereken parametre miktarını ve aktivasyonları azaltabilir.

Umarım keyifli bir okuma olmuştur. Bir sonraki makalede bu parametrelere uygun kod yazacağız.

--

--

Alican Kiraz
Alican Kiraz

Written by Alican Kiraz

Head of Cyber Defense Center @Trendyol | CSIE | CSAE | CCISO | CASP+ | OSCP | eCIR | CPENT | eWPTXv2 | eCDFP | eCTHPv2 | OSWP | CEH Master | Pentest+ | CySA+

Responses (1)