Uygulama geliştirici veya küme yöneticisiyseniz, asimetrik bellek erişimi (NUMA)’nın sistem performansını nasıl etkilediğini görmüşsünüzdür. Uygulama tamamen NUMA farkındalığına sahip olmadığında, performans dalgalanmaları ve öngörülemezlik ortaya çıkabilir.
Bu zorlukları aşmak adına, NVIDIA, Koherent Sürücü Tabanlı Bellek Yönetimi (CDMM) modunu, GH200, GB200 ve GB300 gibi donanım koheran platformlar için NVIDIA sürücüsü‘ne eklemiştir. CDMM, NVIDIA sürücüsünün, işletim sisteminin yerine GPU belleğini kontrol etmesini ve yönetmesini sağlar. Bu da uygulamaların verileri uygun bellek alanına yerleştirmesine olanak tanır ve böylece maksimum performans elde edilir.
Bu blogda, NUMA ve CDMM arasındaki farkları ve bunların uygulama performansını nasıl etkileyebileceğini açıklayacağız. Ayrıca, bu konuda daha fazla bilgi edinmek isterseniz bir beyaz kağıt yayımladık.
NUMA Nedir?
NUMA modu, donanım koheran platformlarda NVIDIA sürücüsü için varsayılan moddur. NUMA, tüm CPU (ev sahibi) belleği ve GPU (aygıt) belleğini işletim sistemine sunar. Bu, standart Linux API’leri (örneğin, malloc ve mmap) ile CUDA API’lerinin hem CPU hem de GPU üzerinde bellek ayırmasına olanak tanır. Ayrıca, kullanıcı alanı API’leri veya kernel tarafından otomatik olarak CPU ve GPU arasında dinamik bellek göçü sağlanır.
Ancak, NUMA modunun dikkate alınması gereken önemli bir yan etkisi vardır; GPU belleği genel bir bellek havuzu olarak kullanılmaktadır. Bu durum, GPU belleğinin genel işletim sistemi işlevlerinden kesin bir şekilde ayrılmasını sınırlamaktadır. Tipik NUMA davranışlarında bellek GPU’ya taşınabilir; bu da uygulama performansı için istenmeyen bir durum olabilir.
Bu sebepten ötürü, NVIDIA alternatif bir çözüm sunmaktadır: Koherent Sürücü Tabanlı Bellek Yönetimi (CDMM) Modu.
Donanım Koheran Platformlar Nedir?
Pek çok NVIDIA sistemi—GH200, GB200 ve GB300—CPU ve GPU arasında doğrudan NVLink çipler arası (C2C) bağlantılar içerir. Bu, PCIe bağlamlı sistemlerde bulunmayan güçlü bir yetenek sunar: donanım koheran bellek. Bu özellik, CPU ve GPU belleğinin her iki işlemci tarafından da doğrudan adreslenebilmesine imkan tanır.
Bu durum, belirli NUMA davranışlarına güvenen uygulamalar için bazı beklenmedik sonuçlar doğurabilir. Özellikle, işletim sistemi, GPU belleğini beklenmedik veya sürpriz kullanım durumları için seçebilir. Örneğin, dosyaları önbelleğe almak veya bir tahsisat talebi nedeniyle bellek yetersizliği (OOM) koşullarından kaçınmak için GPU belleğini kullanabilir. Bu farklılıklar, özellikle belirli bir CPU ve GPU bellek düzenine optimize edilmiş uygulama ve iş akışları (örneğin Kubernetes) için istenmeyen sonuçlar doğurabilir.
Yeni CDMM modu, bu zorlukları aşmaya yönelik çözümler sunmakta ve özellikle Kubernetes gibi uygulamalar için faydalı olacaktır.
NUMA’nın Kubernetes Üzerindeki Etkisi
Kubernetes, geniş GPU kümelerinin yönetimi için yaygın şekilde kullanıldığından, NUMA modunda çalıştırıldığında karşılaşılabilecek bazı belirli ve beklenmeyen davranışlar vardır. Bu durumlar, performansı olumsuz etkileyebilir ve uygulama işlevselliğini zedeleyebilir.
- Bellek yanlış raporlama: Kubernetes, GPU belleğini sistem bellek sayımına yanlış bir şekilde dahil eder ve bu da podların mevcut olmayan belleği istemesine neden olur, bu da OOM hatalarına yol açar.
- Pod bellek limitleri, sadece sistem belleği için değil GPU belleği için de geçerlidir: Kubernetes pod bellek limitleri, sistem belleği için tasarlanmış olduğundan, sistemden tahsis edilen bellek kullanıldığında hem sistem hem de GPU belleğine yanlış bir şekilde uygulanır. Bu, pod spesifikasyon API sözleşmesini bozar.
- GPU belleği podlar arasında izole edilmez: Kubernetes podları varsayılan olarak NUMA düğümleri arasındaki tüm belleğe erişebilir; bu da konteynerlerin erişmeleri olmayan GPU’lar üzerinde bellek tahsis etmelerine olanak tanır ve bu, izolasyonu bozabilir.
Bu nedenlerle, Kubernetes kullanırken CDMM modunu kullanmanızı öneriyoruz.
CDMM Nedir?
CDMM, NVIDIA sürücülerinin alternatif bir çalışma modudur ve GPU belleğinin işletim sistemine yazılım NUMA düğürü olarak sunulmasını önler. Bunun yerine, NVIDIA cihaz sürücüsü GPU belleğini doğrudan yönetir ve CPU’nun sistem belleğinden ayırır. Bu yaklaşım, PCIe’e bağlı GPU modeliyle ilham almıştır; burada GPU belleği sistem belleğinden ayrıdır.
CDMM modunda, CPU belleği Linux kernel tarafından, GPU belleği ise NVIDIA sürücüsü tarafından yönetilir. Bu, NVIDIA sürücüsünün GPU belleğini yönetmekten sorumlu olduğu ve GPU belleğinin nasıl kullanılacağı üzerinde tam kontrol sağladığı anlamına gelir. Böylece, daha fazla kontrol ve genellikle daha iyi uygulama performansı elde edilir.
CDMM’nin CUDA Geliştiricileri Üzerindeki Etkisi
CDMM’nin ana etkisi, sistemden tahsis edilen belleğin göçüdür. CDMM’nin mevcut uygulama durumunda, sistemden tahsis edilen bellek GPU’ya göç etmeyecek, ancak GPU hala C2C bağlantısı üzerinden sistemden tahsis edilen belleğe erişebilir.
Örneğin, bir uygulama cudaMemPrefetchAsync(), cudaMemPrefetchBatchAsync(), cudaMemDiscardAndPrefetchBatchAsync() ve cudaMemAdvise(SetPreferredLocation) gibi fonksiyonları kullanarak göçü teşvik etmeye çalıştığında, sayfalar göçmeyecektir.
CDMM’nin Sistem Yönetimi Üzerindeki Etkisi
CDMM modundayken, GPU’ları karşılayan NUMA düğümleri hâlâ mevcut olacaktır, ancak bunlar işletim sistemine bellek sunmayacaktır. numactl veya mbind gibi araçlar, GPU belleğine uygulandığında etkili olmayacaktır. Bu nedenle, bu araçların CDMM modunda GPU bellek yönetimi için kullanılmaması önerilir. Ancak yine de sistem belleğini yönetmek için kullanılabilirler.
CDMM, Linux sürücüsü 580.65.06 ve daha üstü sürümden itibaren Kubernetes tabanlı GPU operatörü dağıtımları için varsayılan moddur. CDMM’yi etkinleştirmek için, sürücü yüklendiğinde bir çekirdek modülü parametresi ve değeri geçirmeniz gerekir. CDMM modunu etkinleştirmek için gerekli komut ve sözdizimi hakkında kesin bilgi için CDMM beyaz kağıdına bakabilirsiniz.
CDMM ve NUMA Kullanımına Dair Rehberlik
Aşağıda CDMM ve NUMA modları arasındaki temel farklar ve hangi modun ne zaman tercih edileceği vurgulanmaktadır.
Uygulama bazlı bellek yönetimi
- NUMA mod: OS NUMA API’lerini kullanan ve toplam sistem belleğini (CPU + GPU belleği) yönetmeye güvenen uygulamalar için en iyisidir.
- CDMM mod: OS’yi atlayarak doğrudan GPU bellek kontrolü gerektiren uygulamalar için idealdir.
Bellek havuzlama
- NUMA mod: GPU ve CPU belleğinin daha büyük tek bir havuz oluşturmasına izin verir. İş yükleri, birleştirilmiş bellek ve bant genişliği yönetiminden faydalanır.
- CDMM mod: Sürücü yönetir ve OS’nin GPU bellek kullanmasını engeller. GPU belleği, GPU’ya özel veriler için ayrılmıştır.
GPU belleği kullanımı: görünürlük ve ölçüm
- NUMA mod: Standart araçlar, entegre havuz içinde GPU bellek kullanımını rapor eder, bu da NUMA’ya göre filtrelenebilir ve genel sistem belleği görünümü sağlar.
- CDMM mod: GPU belleği üzerine ince ayar yapılmış kontrol ve görünürlük sunar. Sürücü tarafından yönetilen GPU belleği, yöneticilere ve geliştiricilere performans tanısı ve optimizasyonu için tüketim konusunda net bir anlayış sunar.
Özet
Aşağıdaki tablo, NUMA ve CDMM modları arasındaki bellek yönetimi farklarını özetlemektedir.
NUMA | CDMM | |
Bellek yönetimi | OS hem CPU hem de GPU’yu yönetir | OS CPU’yu, NVIDIA sürücüsü GPU’yu yönetir |
GPU bellek ifadesi | OS’ye genel havuz olarak sunulur | OS için kullanılmaz |
Bellek göçü | CPU ve GPU arasında dinamik göç sağlar | Sistemden tahsis edilen bellek GPU’ya göç etmez |
CDMM’yi anlayarak ve stratejik bir şekilde uygulayarak, geliştiriciler ve yöneticiler NVIDIA donanım koheran bellek mimarilerinin tam potansiyelini açığa çıkarabilir; böylece GPU destekli iş yükleri için optimal performans ve kontrol elde edebilirler.
Donanım koheran platformlardan biri olan GH200, GB200 veya GB300 kullanıyorsanız, beyaz kağıda göz atmayı ve Kubernetes kullanıyorsanız CDMM moduna geçmeyi değerlendirin.