2 puan yazan darjeeling 1 시간 전 | Henüz yorum yok. | WhatsApp'ta paylaş

GLM-5 tabanlı bir Coding Agent’ı yüz milyonlarca istek ölçeğinde hizmete sunarken karşılaşılan iki KV Cache race condition hatasının yeniden üretilmesi, düzeltilmesi ve işlem hacmini artıran optimizasyonlar paylaşılıyor.

Arka plan

Ölçekleme yasaları (Scaling Laws), yalnızca model parametreleri ve veri ölçeğinde yeniliği değil, altyapı mühendisliğini de sınırlarına kadar zorluyor. Z.ai bu süreçte ortaya çıkan yan etkilere Scaling Pain adını veriyor.

GLM-5 serisiyle karmaşık Coding Agent iş yüklerini günde yüz milyonlarca kez işlerken, bazı kullanıcılardan bozuk çıktı (garbled output), tekrarlayan üretim, nadir karakter üretimi gibi anormal durumlar bildirildi. Bu sorunlar standart çıkarım ortamında hiç yeniden üretilemedi ve yalnızca yüksek eşzamanlılık ve uzun bağlam ortamlarında ortaya çıktı.


Temel sonuçların özeti

Öğe Değer
Bug Fix #1 uygulandıktan sonra anormal çıktı oranı %0,1 → %0,03’ün altı
LayerSplit işlem hacmi iyileşmesi (40K~120K token) +%10 ~ +%132
HiCache düzeltmesi SGLang PR #22811 olarak katkılandı

Anormal durum tespiti: Speculative Decoding metriklerinden yararlanma

Anormal durumları otomatik olarak tespit etmek başlı başına zorlu bir problemdi. Regex benzeri sezgisel yöntemlerde yanlış pozitif ve yanlış negatif çok fazlaydı; model tabanlı sınıflandırıcılar ise büyük ölçekli deneyler için fazla maliyetliydi.

Kırılma noktası Speculative Decoding metrikleri oldu.

  • Bozuk çıktı / nadir karakterler: spec_accept_length aşırı düşük → draft model ile target modelin KV Cache durumları arasında uyumsuzluk sinyali
  • Tekrarlayan üretim: spec_accept_rate aşırı yüksek → bozulmuş KV Cache nedeniyle attention örüntüsünün tekrar döngüsüne yakınsadığını gösteren sinyal

Buna dayanarak çevrimiçi bir izleme stratejisi uygulandı. Üretilen token sayısı 128’i geçtiğinde spec_accept_length < 1.4 veya spec_accept_rate > 0.96 ise üretim anında durduruluyor ve yük dengeleyici üzerinden yeniden deneme başlatılıyor. Böylece Speculative Decoding, performans optimizasyon aracından çıktı kalitesini gerçek zamanlı izleme aracına dönüşmüş oldu.


Bug Fix #1: PD ayrık mimarisinde KV Cache race condition

Neden

PD (Prefill-Decode) ayrık mimarisinde kuyruk gecikmesini (tail latency) kontrol etmek için zaman aşımı tabanlı istek iptal mekanizması kullanılıyor. Prefill belirlenen süre içinde tamamlanmazsa, Decode tarafı ilgili isteği abort ediyor ve KV Cache’i geri alıyor.

Sorun, abort sinyalinin Prefill tarafına düzgün şekilde iletilmemesi idi. Decode, KV Cache’i geri alıp yeni bir isteğe (Req2) yeniden tahsis ettikten sonra bile, önceki isteğin (Req1) RDMA write işlemleri ve Prefill hesaplaması sürmeye devam ediyor, bu da Req2’nin KV Cache’inin üzerine yazılmasına yol açıyordu.

Düzeltme

Decode, abort verdikten sonra Prefill tarafına bildirim gönderiyor ve Prefill yalnızca aşağıdaki iki koşuldan biri sağlandığında "geri alma güvenli" sinyalini döndürecek şekilde değiştirildi.

  1. RDMA write henüz başlamamışsa
  2. Daha önce başlatılmış write işlemlerinin tümü tamamlanmışsa

Decode, yalnızca bu onayı aldıktan sonra KV Cache’i yeniden kullanıyor. Uygulama sonucunda anormal çıktı oranı %0,1’den %0,03’ün altına düştü.


Bug Fix #2: HiCache’te Load-Use sıralama garantisinin eksik olması

Neden

Coding Agent iş yüklerinde ortalama giriş uzunluğu 70K token’ı aşıyor ve prefix yeniden kullanım oranı yüksek. Bunun için HiCache (hiyerarşik KV Cache) kullanılıyor; yapıda CPU belleğinden KV Cache asenkron olarak swap-in yapılırken Load Stream ile Forward Stream çakıştırılarak çalıştırılıyor.

Sorun, Indexer kernel’ının Indexer cache yüklemesinin tamamlanmasıyla ilgili senkronizasyon kısıtını açıkça belirtmemesi idi. Forward Stream, Load Streamden önce çalışmaya başlarsa, henüz yüklenmemiş KV Cache’in okunmasına neden olan bir read-before-ready örüntüsü oluşuyor ve bu da anormal çıktılara yol açıyordu.

Düzeltme

Indexer kernel’ı çalıştırılmadan önce Load Stream ile açık bir senkronizasyon noktası eklendi; böylece Forward Stream yalnızca veri hazır olduktan sonra hesaplamaya devam ediyor. Bu düzeltme SGLang topluluğuna PR #22811 olarak katkılandı.


Optimizasyon: LayerSplit (katman bazlı dağıtık KV Cache depolama)

İki hatanın ortak darboğazı Prefill aşamasının yüküydü. Bunu kökten iyileştirmek için LayerSplit tasarlanıp uygulandı.

Önceden Context Parallelism (CP) ortamında her GPU, tüm katmanların KV Cache’ini yinelenmiş biçimde depoluyordu. LayerSplit’te ise her GPU yalnızca katmanların bir bölümünden sorumlu olacak şekilde dağıtık depolama yapıyor; böylece GPU başına bellek kullanımı ciddi ölçüde azalıyor.

Çalışma sırasında ilgili katmanın KV Cache’ine sahip CP rank, attention hesaplamasından önce cache’i broadcast ediyor. Broadcast ile indexer hesaplaması çakıştırılarak iletişim ek yükü gizlendi; ayrıca ek iletişim verisi yalnızca indexer cache ile sınırlı olduğundan (KV Cache’in yaklaşık 1/8’i), toplam ek yük ihmal edilebilir düzeyde kaldı.

%90 cache hit oranı koşulunda 40K~120K token istekleri için işlem hacmi %10~%132 arttı ve bağlam uzunluğu büyüdükçe iyileşme oranı da arttı.


Sonuç

"Yalnızca işlem hacmi, gecikme ve kullanılabilirlik yetmez. Sistem, her üretim isteğinin arkasında model durumunun doğruluğunu da garanti etmelidir. Ölçekleme yasaları yetenekleri sonuna kadar zorluyor olabilir, ancak bu yetenekleri büyük ölçekte güvenilir kılan şey ancak titiz sistem mühendisliğidir."


Kaynak: Z.ai Research Blog (2026-04-30)

Henüz yorum yok.

Henüz yorum yok.