GPT bir yanıt üretirken görünen şey kelimelerdir; GPU'nun yaptığı iş ise çoğunlukla büyük matris çarpımları, bellekten veri taşıma ve sayısal olarak kararlı olasılık hesaplarıdır. Kernel programlama, bu hesabın GPU üzerinde hangi iş parçacığının hangi veriyi okuyacağını, ara sonucu nerede tutacağını ve belleğe ne zaman yazacağını tanımlar.
Bu yazı GPT attention katmanındaki QKᵀ ve PV matmul işlemlerini, aradaki scaled softmax adımını ve bunların neden tek bir hesap akışı içinde optimize edildiğini açıklar. Model eğitimi kararlarını ise LLM fine-tuning rehberimizde ele alıyoruz.
GPT attention'ında tokenların birbirine ilgisi QKᵀ ile bulunur, skorlar softmax ile ağırlıklara dönüşür, ardından PV ile içerik vektörleri birleştirilir. İyi bir GPU kernel'i, bu aşamalardaki gereksiz global bellek okumalarını ve ara tensör yazımlarını azaltır.
1 Kernel programlama nedir?
GPU programlamada kernel, çok sayıda GPU iş parçacığının paralel çalıştırdığı küçük programdır. Bir kernel tek bir sayı, vektör parçası veya matris bloğu işleyebilir. Performans yalnızca kaç çarpma yapıldığıyla belirlenmez: Verinin HBM/global bellek, L2, shared memory ve registerlar arasında nasıl hareket ettiği çoğu zaman belirleyicidir.
Matematikte C = AB yeterlidir. Naif bir kernel ise her C[i,j] elemanı için A'nın satırını ve B'nin sütununu global bellekten tekrar tekrar okuyabilir. Tiling, A ve B'nin küçük bloklarını hızlı belleğe alır ve aynı veriyi birçok çarpımda yeniden kullanır. CUDA'nın thread, block ve bellek hiyerarşisi bu kullanım için tasarlanmıştır (NVIDIA CUDA C Programming Guide).
// Kavramsal tiling; gerçek CUDA kodu değildir.
load A[tile_m, tile_k] -> shared memory
load B[tile_k, tile_n] -> shared memory
for k in tile_k:
accumulator += A_tile[row, k] * B_tile[k, col]
write accumulator -> C[row, col]2 GPT forward pass'te matmul nerede?
Transformer katmanında önceki katmandan gelen aktivasyonlar doğrusal projeksiyonlardan geçer. Bu projeksiyonlar da matmul'dur. Hidden state matrisi X için query, key ve value üretimi şöyle özetlenir:
Q = X W_Q
K = X W_K
V = X W_VUygulamalarda üç projeksiyon sıkça tek bir birleşik QKV projection olarak çalıştırılır. Böylece X daha az kez okunur, daha az kernel başlatılır ve bellek trafiği düşer. Decoder-only GPT'de attention'ın temel denklemi şöyledir:
S = Q Kᵀ / √d
P = softmax(S + causal_mask)
O = P Vd head dimension'dır. S ham attention skoru, P normalize edilmiş ağırlıklar,O ise bağlama duyarlı çıktıdır. Bu tanım Transformer'ın özgün çalışmasında verilmiştir (Vaswani ve ark., 2017).
3 QKᵀ: Tokenlar birbirine ne kadar bakacak?
Bir head için Q ve K, yaklaşık [T, d] şekline sahiptir. QKᵀ sonucu [T, T] boyutunda skor matrisi verir. Satır i, i. tokenın; sütun j ise j. tokena verdiği ilgiyi temsil eder:
S[i, j] = Σ_r Q[i, r] * K[j, r] / √dDizi uzunluğu T büyüdükçe skor matrisinin eleman sayısı T² olur. Uzun context'te attention'ın hem hesaplama hem bellek açısından pahalı olmasının nedeni budur. Otoregresif üretimde KV cache geçmiş key/value vektörlerinin tekrar hesaplanmasını önler; ancak yeni tokenın geçmişe bakışı yine maliyet taşır.
4 Causal mask: GPT neden geleceği göremez?
GPT bir sonraki tokenı tahmin eder. Eğitimde i. tokenın i+1 ve sonrasını görmesi veri sızıntısı olurdu. Bu nedenle maskeli skorlar softmax öncesinde etkisiz bırakılır:
if j > i:
S[i, j] = -∞
P[i, :] = softmax(S[i, :])Üretim kernelinde gerçek bir -∞ matrisi oluşturup belleğe yazmak gerekmez. İndeksler kullanılarak maskeli konumlar hesap sırasında atlanabilir. Bu ayrım, büyük batch ve uzun sequence'lerde gereksiz bellek trafiğini önler.
5 Softmax: Skordan ağırlığa, taşmadan
Ham dot product skorları olasılık değildir. Softmax, her attention satırında skorları normalize eder:
softmax(s_j) = exp(s_j) / Σ_k exp(s_k)Fakat exp(1000) kayan nokta taşmasına yol açabilir. Standart kararlı hesapta satır maksimumu çıkarılır; sonuç değişmez:
m = max_j(s_j)
p_j = exp(s_j - m) / Σ_k exp(s_k - m)Kernel açısından softmax bir reduction problemidir: önce maksimum, sonra üstel değerlerin toplamı, son olarak normalize edilmiş değer hesaplanır. Skor matrisini global belleğe yazıp tekrar okumak doğru ama pahalı bir akıştır.
6 PV: Hangi bilgi taşınacak?
Softmax sonrası P, her tokenın hangi value vektörlerinden ne kadar alacağını belirtir. Son işlem:
O[i, r] = Σ_j P[i, j] * V[j, r]Q ve K, hangi konuma bakılacağını; V ise o konumdan hangi içeriğin alınacağını belirler. Bu sezgisel ayrım faydalıdır, ancak pratikte üçü de aynı aktivasyondan öğrenilmiş farklı doğrusal projeksiyonlarla üretilir.
7 Neden fused attention kernel kullanılır?
S ve P teoride açık matrislerdir; çoğu kullanımda kalıcı olarak saklanmaları gerekmez. FlashAttention, Q/K/V bloklarını hızlı belleğe alıp skor, online softmax ve değer birleştirmeyi bloklar halinde yapar. Böylece büyük T×T attention matrisi HBM'e yazılıp geri okunmadan çıktı hesaplanabilir.
Bu yaklaşık bir matematik değildir; uygun sayısal algoritmayla aynı attention sonucunu üretmeyi hedefleyen IO-awarebir uygulama yaklaşımıdır. FlashAttention bellek erişimini, FlashAttention-2 ise iş bölümü ve paralelliği iyileştirir (Dao ve ark., 2022) ve (Dao, 2023).
// Blok bazlı online softmax fikri
for each K/V block:
scores = Q_block @ K_block.T / sqrt(d)
scores = apply_causal_mask(scores)
update running row max and running row sum
accumulate normalized contribution from V_block
write final O_block8 Tensor core, hassasiyet ve doğruluk
Modern GPU'lar belirli boyut ve veri tiplerinde tensor core kullanır. FP16 veya BF16 girişler çarpımı hızlandırabilir; ancak accumulation çoğu zaman daha yüksek hassasiyetle yürütülür. Eğitimde gradyanlar, softmax üstel hesapları ve loss ölçeği de hesaba katılmalıdır. Bu nedenle düşük hassasiyet, tile boyutu ve fused kernel kararı her GPU, model ve sequence length için profiler ile ölçülmeli; sonuçlar referans PyTorch hesabıyla tolerans içinde karşılaştırılmalıdır.
9 Sonuç
GPT'nin metin üretimi üst seviyede token tahmini gibi görünür; alt seviyede doğrusal projeksiyonlar, iki attention matmul'u ve dikkatli uygulanmış softmax zinciridir. Kernel programlama daha az matematik yapmaz; veriyi GPU belleğinde daha az taşıyıp daha çok yeniden kullanır. Model mimarisi ne hesaplanacağını, kernel uygulaması ise bunun donanımda ne kadar verimli hesaplanacağını belirler.
Kernel hızı tek başına kullanıcı deneyimini açıklamaz; tokenizer, Türkçe veri kalitesi, model seçimi ve değerlendirme de gerçek dil performansını belirler. Bu çerçevenin tokenizer, veri, uyarlama ve değerlendirme boyutları için Türkçe yapay zeka altyapısı yazısına bakabilirsiniz.
Kaynakça
- Vaswani, A. ve ark. (2017). Attention Is All You Need. NeurIPS.
- Dao, T. ve ark. (2022). FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness. NeurIPS.
- Dao, T. (2023). FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning. arXiv.
- NVIDIA. CUDA C++ Programming Guide.
Bu yazı 30 Temmuz 2026 tarihinde hazırlanmıştır. Denklemler eğitim amaçlı sadeleştirilmiştir; üretim kernel seçimi ve sayısal toleranslar her model, GPU ve framework sürümünde ayrıca doğrulanmalıdır.