paint-brush
CPU ve GPU Yeteneklerine Sindirilebilir Üst Düzey Genel Bakışile@venkat2811
779 okumalar
779 okumalar

CPU ve GPU Yeteneklerine Sindirilebilir Üst Düzey Genel Bakış

ile Venkat Raman15m2024/04/23
Read on Terminal Reader

Çok uzun; Okumak

Makale, Von Neumann Mimarisi, Hyper-Threading ve Talimat Ardışık Düzeni gibi kavramları kapsayan, paralel hesaplama görevlerini yönetmede CPU'lar ve GPU'lar arasındaki temel farklılıkları ele alıyor. GPU'ların grafik işlemcilerden derin öğrenme algoritmalarını hızlandırmaya yönelik güçlü araçlara kadar evrimini açıklıyor.
featured image - CPU ve GPU Yeteneklerine Sindirilebilir Üst Düzey Genel Bakış
Venkat Raman HackerNoon profile picture

The Die'da olup bitenlere dair sindirilebilir üst düzey bir genel bakış

Bu makalede, GPU'ların Grafik, Sinir Ağları ve Derin Öğrenme görevlerinde neden iyi olduğunu ve CPU'ların çok sayıda sıralı, karmaşık genel amaçlı bilgi işlem görevlerinde neden iyi olduğunu anlamak için bazı temel düşük seviyeli ayrıntıları inceleyeceğiz. Bu yazı için araştırmam ve biraz daha ayrıntılı bilgi edinmem gereken birkaç konu vardı, bunlardan bazılarına sadece geçerken değineceğim. Yalnızca CPU ve GPU işlemenin mutlak temellerine odaklanmak için kasıtlı olarak yapılır.


Von Neumann Mimarlık

Daha önceki bilgisayarlar özel cihazlardı. Donanım devreleri ve mantık kapıları belirli bir dizi şeyi yapacak şekilde programlandı. Yeni bir şey yapılması gerekiyorsa devrelerin yeniden kablolanması gerekiyordu. "Yeni bir şey" iki farklı denklem için matematiksel hesaplamalar yapmak kadar basit olabilir. İkinci Dünya Savaşı sırasında Alan Turing, Enigma makinesini yenecek programlanabilir bir makine üzerinde çalışıyordu ve daha sonra "Turing Makinesi" makalesini yayınladı. Aynı sıralarda John von Neumann ve diğer araştırmacılar da temelde şunu öneren bir fikir üzerinde çalışıyorlardı:


  • Talimat ve veriler paylaşılan hafızada (Saklanan program) saklanmalıdır.
  • İşleme ve bellek birimleri ayrı olmalıdır.
  • Kontrol ünitesi, işlem ünitesini kullanarak hesaplamalar yapmak için bellekten veri ve talimatların okunmasıyla ilgilenir.


Darboğaz

  • İşleme darboğazı - Bir işlem biriminde (fiziksel mantık kapısı) aynı anda yalnızca bir talimat ve onun işleneni olabilir. Talimatlar birbiri ardına sırayla yürütülür. Yıllar geçtikçe işlemcileri daha küçük, daha hızlı saat döngüleri haline getirme ve çekirdek sayısını artırma konularına odaklanıldı ve iyileştirmeler yapıldı.
  • Bellek darboğazı - İşlemciler giderek daha hızlı büyüdükçe, bellek ile işlem birimi arasında aktarılabilecek hız ve veri miktarı bir darboğaz haline geldi. Bellek CPU'dan birkaç sıra daha yavaştır. Yıllar geçtikçe, odak noktası ve iyileştirmeler hafızayı daha yoğun ve daha küçük hale getirmek oldu.


CPU'lar

Bilgisayarımızdaki her şeyin ikili olduğunu biliyoruz. Dize, görüntü, video, ses, işletim sistemi, uygulama programı vb. hepsi 1'ler ve 0'lar olarak temsil edilir. CPU mimarisi (RISC, CISC, vb.) spesifikasyonları, CPU üreticilerinin uyması gereken ve işletim sisteminin donanımla arayüz oluşturması için mevcut olan talimat setlerine (x86, x86-64, ARM, vb.) sahiptir.


Verileri içeren işletim sistemi ve uygulama programları, CPU'da işlenmek üzere talimat setlerine ve ikili verilere çevrilir. Çip seviyesinde işlem transistörlerde ve mantık kapılarında yapılır. İki sayıyı toplamak için bir program çalıştırırsanız, toplama ("işleme") işlemcideki bir mantık kapısında yapılır.


CPU'da Von Neumann mimarisine göre iki sayıyı toplarken devredeki iki sayı üzerinde tek bir toplama komutu çalışır. Bu milisaniyenin çok küçük bir kısmı boyunca, işlem ünitesinin (yürütme) çekirdeğinde yalnızca ekleme talimatı yürütüldü! Bu detay beni her zaman etkilemiştir.


Modern bir CPU'daki çekirdek

CPU çekirdeğindeki bileşenlere genel bakış (Tek HW İş Parçacığı)


Yukarıdaki diyagramdaki bileşenler apaçık ortadadır. Daha fazla ayrıntı ve ayrıntılı açıklama için bu mükemmel makaleye bakın. Modern CPU'larda, tek bir fiziksel çekirdek birden fazla tamsayı ALU, kayan noktalı ALU vb. içerebilir. Yine bu birimler fiziksel mantık kapılarıdır.

GPU'yu daha iyi anlayabilmek için CPU çekirdeğindeki 'Donanım Konusunu' anlamamız gerekiyor. Donanım iş parçacığı, her bir CPU saat döngüsünde bir CPU çekirdeğinin yürütme birimlerinde yapılabilen bir bilgi işlem birimidir . Bir çekirdekte gerçekleştirilebilecek en küçük iş birimini temsil eder.


Talimat döngüsü

Bir CPU çekirdeği üzerinde, tek bir donanım iş parçacığında, ardışık düzen veya Superscaler olmadan çalışan bir işlem


Yukarıdaki diyagram CPU komut döngüsünü/makine döngüsünü göstermektedir. CPU'nun tek bir talimatı yürütmek için gerçekleştirdiği bir dizi adımdır (örneğin: c=a+b).


  • Getirme: Program sayacı (CPU çekirdeğindeki özel kayıt) hangi talimatın getirilmesi gerektiğini takip eder. Talimat alınır ve talimat kaydında saklanır. Basit işlemler için ilgili veriler de alınır.

  • Kod Çözme: Operatörleri ve işlenenleri görmek için talimatın kodu çözülür.

  • Yürütme: Belirtilen işleme göre uygun işlem birimi seçilir ve yürütülür.

  • Bellek Erişimi: Bir talimat karmaşıksa veya ek veri gerekiyorsa (birkaç faktör buna neden olabilir), belleğe erişim yürütmeden önce yapılır. (Basitlik açısından yukarıdaki şemada göz ardı edilmiştir). Karmaşık bir talimat için, ilk veriler hesaplama ünitesinin veri kaydında mevcut olacaktır, ancak talimatın tam olarak yürütülmesi için L1 ve L2 önbelleğinden veri erişimi gereklidir. Bu, hesaplama biriminin yürütülmesinden önce küçük bir bekleme süresi olabileceği ve bekleme süresi boyunca donanım iş parçacığının hala hesaplama birimini tuttuğu anlamına gelir.

  • Geri Yaz: Eğer yürütme çıktı üretirse (örneğin: c=a+b), çıktı kayıt/önbellek/belleğe geri yazılır. (Yukarıdaki diyagramda veya yazının sonraki herhangi bir yerinde basitlik açısından göz ardı edilmiştir)


Yukarıdaki diyagramda hesaplama yalnızca t2'de yapılıyor. Geri kalan zamanlarda çekirdek boşta kalıyor (hiçbir iş yapmıyoruz).

Modern CPU'lar, temel olarak (getirme-kod çözme-yürütme) adımların saat döngüsü başına eş zamanlı olarak gerçekleşmesini sağlayan HW bileşenlerine sahiptir.

Tek bir donanım iş parçacığı artık her saat döngüsünde hesaplama yapabilir. Buna talimat boru hattı denir.


Getirme, Kod Çözme, Bellek Erişimi ve Geri Yazma işlemleri CPU'daki diğer bileşenler tarafından gerçekleştirilir. Daha iyi bir kelime bulunamadığı için bunlara "boru hattı konuları" denir. Boru hattı iş parçacığı, bir talimat döngüsünün yürütme aşamasında olduğunda bir donanım iş parçacığı haline gelir.


Tek bir donanım iş parçacığında CPU çekirdeği üzerinde ardışık düzen ile çalışan bir işlem


Gördüğünüz gibi t2'den itibaren her döngüde hesaplama çıktısı alıyoruz. Daha önce her 3 döngüde bir hesaplama çıktısı alıyorduk. Ardışık düzen bilgi işlem verimini artırır. Bu, Von Neumann Mimarisindeki işleme darboğazlarını yönetme tekniklerinden biridir. Sıra dışı yürütme, dal tahmini, spekülatif yürütme vb. gibi başka optimizasyonlar da vardır.

Hyper-Threading

Bu, GPU'lara geçmeden önce CPU hakkında tartışmak istediğim son kavramdır. Saat hızları arttıkça işlemciler de daha hızlı ve verimli hale geldi. Uygulama (komut seti) karmaşıklığının artmasıyla birlikte CPU hesaplama çekirdekleri gereğinden az kullanıldı ve bellek erişimini beklerken daha fazla zaman harcanıyordu.


Yani bir hafıza darboğazı görüyoruz. Hesaplama birimi belleğe erişim için zaman harcıyor ve herhangi bir yararlı iş yapmıyor. Bellek, CPU'dan birkaç sıra daha yavaştır ve bu fark yakın zamanda kapanmayacak. Buradaki fikir, tek bir CPU çekirdeğinin bazı birimlerindeki bellek bant genişliğini artırmak ve verileri, bellek erişimini beklerken hesaplama birimlerini kullanmaya hazır tutmaktı.


Hyper-threading, 2002 yılında Intel tarafından Xeon ve Pentium 4 işlemcilerde kullanıma sunuldu. Hyper-threading'den önce çekirdek başına yalnızca bir donanım iş parçacığı vardı. Hyper-threading ile çekirdek başına 2 donanım iş parçacığı olacaktır. Bu ne anlama geliyor? Bazı yazmaçlar, program sayacı, getirme birimi, kod çözme birimi vb. için kopya işleme devresi.

2 HW İş parçacığına (Hyper-Threading) sahip bir CPU çekirdeği


Yukarıdaki şema sadece hiper iş parçacıklı bir CPU çekirdeğindeki yeni devre elemanlarını göstermektedir. Tek bir fiziksel çekirdek bu şekilde İşletim Sistemine 2 çekirdek olarak görünür. Hyper-threading'in etkin olduğu 4 çekirdekli bir işlemciniz varsa, işletim sistemi tarafından 8 çekirdek olarak görülür . L1 - L3 önbellek boyutu, ek kayıtları barındıracak şekilde artacaktır. Yürütme birimlerinin paylaşıldığını unutmayın.


İki donanım iş parçacığına sahip bir CPU çekirdeği üzerinde ardışık düzen ile çalışan iki işlem


a=b+c, d=e+f yapan P1 ve P2 süreçlerimiz olduğunu varsayalım, bunlar HW iş parçacığı 1 ve 2 nedeniyle tek bir saat döngüsünde eş zamanlı olarak yürütülebilir. Tek bir HW iş parçacığıyla, daha önce gördüğümüz gibi, bu mümkün olmazdı. Burada, donanım iş parçacığı ekleyerek bir çekirdek içindeki bellek bant genişliğini artırıyoruz, böylece işlem birimi verimli bir şekilde kullanılabilir. Bu işlem eşzamanlılığını artırır.


Bazı ilginç senaryolar:

  • CPU'nun yalnızca bir tamsayı ALU'su vardır. Bir HW İş Parçacığı 1 veya HW İş Parçacığı 2, bir saat döngüsü beklemeli ve bir sonraki döngüde hesaplamaya devam etmelidir.
  • CPU'da bir tamsayı ALU ve bir kayan noktalı ALU bulunur. HW Thread 1 ve HW Thread 2, sırasıyla ALU ve FPU kullanılarak eş zamanlı olarak toplama işlemi yapabilir.
  • Mevcut tüm ALU'lar HW İş parçacığı 1 tarafından kullanılıyor. HW İş parçacığı 2, ALU kullanılabilir hale gelene kadar beklemelidir. (Yukarıdaki ekleme örneği için geçerli değildir ancak diğer talimatlarda da olabilir).

CPU neden geleneksel masaüstü/sunucu bilgi işlemde bu kadar iyidir?

  • Yüksek saat hızları - GPU saat hızlarından daha yüksek. Bu yüksek hızı talimat ardışık düzeniyle birleştiren CPU'lar sıralı görevlerde son derece iyidir. Gecikme için optimize edildi.
  • Çeşitli uygulamalar ve bilgi işlem ihtiyaçları - Kişisel bilgisayarlar ve sunucular çok çeşitli uygulamalara ve bilgi işlem gereksinimlerine sahiptir. Bu, karmaşık bir talimat seti ile sonuçlanır. CPU'nun birkaç konuda iyi olması gerekir.
  • Çoklu Görev ve Çoklu İşleme - Bilgisayarlarımızdaki bu kadar çok uygulama nedeniyle CPU iş yükü bağlam değiştirmeyi gerektirir. Önbellekleme sistemleri ve bellek erişimi bunu destekleyecek şekilde ayarlanmıştır. CPU donanım iş parçacığında bir işlem planlandığında, gerekli tüm veriler hazır olur ve hesaplama talimatlarını hızlı bir şekilde tek tek yürütür.

CPU Dezavantajları

Bu makaleye göz atın ve ayrıca Colab not defterini deneyin. Matris çarpımının nasıl paralelleştirilebilir bir görev olduğunu ve paralel bilgi işlem çekirdeklerinin hesaplamayı nasıl hızlandırabileceğini gösteriyor.

  • Sıralı görevlerde son derece iyi ancak paralel görevlerde iyi değil.
  • Karmaşık talimat seti ve karmaşık hafıza erişim modeli.
  • CPU ayrıca hesaplamaya ek olarak bağlam değiştirme ve kontrol birimi etkinliklerine de çok fazla enerji harcıyor

Temel Çıkarımlar

  • Talimat ardışık düzeni bilgi işlem verimini artırır.
  • Bellek bant genişliğini artırmak, bilgi işlem eşzamanlılığını artırır.
  • CPU'lar sıralı görevlerde iyidir (gecikme için optimize edilmiştir). Çok sayıda hesaplama birimine ve mevcut olmayan (verim için optimize edilmemiş) donanım iş parçacıklarına ihtiyaç duyduğundan, büyük ölçüde paralel görevlerde iyi değildir. Bunlar mevcut değildir çünkü CPU'lar genel amaçlı bilgi işlem için üretilmiştir ve karmaşık talimat setlerine sahiptir.


GPU'lar

Bilgi işlem gücü arttıkça grafik işlemeye olan talep de arttı. Kullanıcı arayüzü oluşturma ve oyun oynama gibi görevler paralel işlemler gerektirir ve bu da devre düzeyinde çok sayıda ALU ve FPU ihtiyacını artırır. Sıralı görevler için tasarlanan CPU'lar bu paralel iş yüklerini etkili bir şekilde işleyemedi. Böylece GPU'lar, grafik görevlerinde paralel işleme talebini karşılamak için geliştirildi ve daha sonra hızlandırılmış derin öğrenme algoritmalarında benimsenmelerinin yolu açıldı.


Şiddetle tavsiye ederim:

  • Video Oyunu oluşturmada yer alan paralel görevleri açıklayan bu izleyin.
  • Bir transformatörde yer alan paralel görevleri anlamak için bu blog yazısını okumak. CNN'ler ve RNN'ler gibi başka derin öğrenme mimarileri de var. Yüksek Lisans (LLM) dünyayı ele geçirdiğinden, transformatör görevleri için gerekli olan matris çarpımlarındaki paralelliğin yüksek düzeyde anlaşılması, bu yazının geri kalanı için iyi bir bağlam oluşturacaktır. (Daha sonraki bir zamanda, transformatörleri tam olarak anlamayı ve küçük bir GPT modelinin transformatör katmanlarında neler olduğuna dair sindirilebilir, üst düzey bir genel bakış paylaşmayı planlıyorum.)

Örnek CPU ve GPU özellikleri

CPU'ların ve GPU'ların çekirdekleri, donanım iş parçacıkları, saat hızı, bellek bant genişliği ve çip üzerindeki belleği önemli ölçüde farklılık gösterir. Örnek:

  • Intel Xeon 8280'de şunlar bulunur :
    • Turbo'da 2700 MHz taban ve 4000 MHz
    • 28 çekirdek ve 56 donanım iş parçacığı
    • Genel boru hattı iş parçacıkları: 896 - 56
    • L3 Önbellek: 38,5 MB (tüm çekirdekler tarafından paylaşılır) L2 Önbellek: 28,0 MB (çekirdekler arasında bölünür) L1 Önbellek: 1,375 MB (çekirdekler arasında bölünür)
    • Kayıt boyutu halka açık değil
    • Maksimum Bellek: 1 TB DDR4, 2933 MHz, 6 kanal
    • Maksimum Bellek Bant Genişliği: 131 GB/s
    • Tepe FP64 Performansı = 4,0 GHz 2 AVX-512 birimi Saat döngüsü başına AVX-512 birimi başına 8 işlem * 28 çekirdek = ~2,8 TFLOP [Kullanılarak türetilmiştir: Tepe FP64 Performansı = (Maks. Turbo Frekansı) (AVX-512 birimi sayısı) ( Saat döngüsü başına AVX-512 ünitesi başına işlemler) * (Çekirdek sayısı)]
      • Bu sayı GPU ile karşılaştırma yapmak için kullanılır, çünkü genel amaçlı bilgi işlemde en yüksek performansı elde etmek oldukça özneldir. Bu sayı teorik bir maksimum sınırdır, yani FP64 devreleri sonuna kadar kullanılmaktadır.


  • Nvidia A100 80GB SXM'de şunlar bulunur :
    • 1065 MHz taban ve Turbo'da 1410 MHz
    • 108 SM, SM başına 64 FP32 CUDA çekirdeği (SP olarak da bilinir), SM başına 4 FP64 Tensör çekirdeği, SM başına 68 donanım iş parçacığı (64 + 4)
      • GPU başına genel: 6912 64 FP32 CUDA çekirdeği, 432 FP 64 Tensör çekirdeği, 7344 (6912 + 432) donanım iş parçacığı
    • SM başına ardışık düzen iş parçacıkları: SM başına 2048 - 68 = 1980
    • L2 Önbellek: 40 MB (tüm SM'ler arasında paylaşılır) L1 Önbellek: toplam 20,3 MB (SM başına 192 KB)
    • Kayıt boyutu: 27,8 MB (SM başına 256 KB)
    • Maksimum GPU Ana Belleği: 80GB HBM2e, 1512 MHz
    • Maksimum GPU Ana Bellek Bant Genişliği: 2,39 TB/s
    • En Yüksek FP64 Performansı = 19,5 TFLOP [yalnızca tüm FP64 Tensör çekirdeklerini kullanarak]. CUDA çekirdeklerinde yalnızca FP64 kullanıldığında 9,7 TFLOP'luk düşük değer. Bu sayı teorik bir maksimum sınırdır, yani FP64 devreleri sonuna kadar kullanılmaktadır.


Modern bir GPU'daki çekirdek

CPU'da gördüğümüz terminolojiler her zaman doğrudan GPU'lara çevrilmez. Burada bileşenleri ve çekirdek NVIDIA A100 GPU'yu göreceğiz. Bu makale için araştırma yaparken beni şaşırtan şey, CPU satıcılarının bir çekirdeğin yürütme birimlerinde kaç adet ALU, FPU vb. bulunduğunu yayınlamamalarıydı. NVIDIA çekirdek sayısı konusunda oldukça şeffaftır ve CUDA çerçevesi devre düzeyinde tam esneklik ve erişim sağlar.


Modern bir CPU ve NVIDIA GPU (kaynak: NVIDIA)


Yukarıdaki diyagramda GPU'da L3 Önbelleğinin olmadığını, daha küçük L2 önbelleğini, daha küçük ama çok daha fazla kontrol ünitesi ve L1 önbelleğini ve çok sayıda işlem biriminin olduğunu görebiliriz.


NVIDIA A100 GPU (kaynak: NVIDIA)

NVIDIA A100 GPU akışlı çok işlemcili (bir CPU çekirdeğine eşitlenebilir) kaynak: NVIDIA


Yukarıdaki diyagramlardaki GPU bileşenleri ve ilk anlamamız için bunların CPU eşdeğerleri aşağıda verilmiştir. CUDA programlaması yapmadım, bu yüzden onu CPU eşdeğerleriyle karşılaştırmak ilk başta anlamanıza yardımcı olur. CUDA programcıları bunu çok iyi anlıyorlar.

  • Çoklu Akış Çoklu İşlemcileri <> Çok Çekirdekli CPU
  • Akış Çok İşlemcili (SM) <> CPU Çekirdeği
  • Akış işlemcisi (SP)/ CUDA Core <> CPU Çekirdeğinin yürütme birimlerinde ALU / FPU
  • Tensör Çekirdeği (tek talimatta 4x4 FP64 işlemlerini gerçekleştirebilen) <> Modern bir CPU çekirdeğindeki SIMD yürütme birimleri (örn: AVX-512)
  • Donanım İş Parçacığı (tek bir saat döngüsünde CUDA veya Tensör Çekirdeklerinde hesaplama yapmak) <> Donanım İş Parçacığı (tek bir saat döngüsünde yürütme birimlerinde [ALU'lar, FPU'lar vb.] hesaplama yapmak)
  • HBM / VRAM / DRAM / GPU Bellek <> RAM
  • Çip üzerinde bellek/SRAM (Kayıtlar, L1, L2 önbellek) <> Çip üzerinde bellek/SRAM (Kayıtlar, L1, L2, L3 önbellek)
    • Not: Bir SM'deki kayıtlar, bir çekirdekteki Kayıtlardan önemli ölçüde daha büyüktür. Çünkü iş parçacığı sayısı çok fazla. CPU'daki hiper iş parçacığında kayıt sayısında artış olduğunu ancak hesaplama birimlerinde artış görmediğimizi unutmayın. Burada da aynı prensip var.

Verileri ve bellek bant genişliğini taşıma

Grafikler ve derin öğrenme görevleri, SIM(D/T) [Tek talimat çoklu veri/iş parçacığı] tipi yürütmeyi gerektirir. yani tek bir talimat için büyük miktarlarda veriyi okumak ve bunlar üzerinde çalışmak.


CPU ve GPU'larda komut ardışık düzeni ve hiper iş parçacığının da yetenekleri olduğunu tartıştık. Uygulanma şekli ve çalışma şekli biraz farklıdır ancak prensipler aynıdır.

GPU planlaması (kaynak: NVIDIA)

CPU'lardan farklı olarak GPU'lar (CUDA aracılığıyla), Pipeline Threads'e doğrudan erişim sağlar (bellekten veri getirir ve bellek bant genişliğini kullanır). GPU zamanlayıcıları ilk önce hesaplama birimlerini (ilişkili paylaşılan L1 önbelleği ve hesaplama işlenenlerini depolamak için kayıtlar dahil) doldurmaya çalışarak, ardından verileri kayıtlara ve HBM'ye getiren "boru hattı iş parçacıklarını" doldurmaya çalışarak çalışır. Tekrar vurgulamak isterim ki, CPU uygulama programcıları bu konuyu düşünmemektedir ve "boru hattı iş parçacıkları" ve çekirdek başına hesaplama birimi sayısı hakkındaki spesifikasyonlar yayınlanmamaktadır. Nvidia yalnızca bunları yayınlamakla kalmıyor, aynı zamanda programcılara tam kontrol sağlıyor.


Bunun ne kadar faydalı olduğunu görebileceğimiz CUDA programlama modeli ve model hizmet optimizasyon tekniğinde "toplama" hakkındaki özel bir yazıda bu konuyu daha ayrıntılı olarak ele alacağım.


GPU - Yüksek Verimli İşlemci (kaynak: NVIDIA)


Yukarıdaki diyagram CPU ve GPU çekirdeğindeki donanım iş parçacığının yürütülmesini göstermektedir. Daha önce CPU boru hattında tartıştığımız "bellek erişimi" bölümüne bakın. Bu diyagram bunu gösteriyor. CPU'nun karmaşık bellek yönetimi, bu bekleme süresini L1 önbelleğinden kayıtlara veri getirmeye yetecek kadar kısa (birkaç saat döngüsü) hale getirir. Verilerin L3'ten veya ana bellekten getirilmesi gerektiğinde, verileri zaten kayıtlı olan diğer iş parçacığı (bunu hiper iş parçacığı bölümünde gördük) yürütme birimlerinin kontrolünü alır.


GPU'larda, aşırı abonelik (çok sayıda ardışık düzen iş parçacığı ve kayıt) ve basit talimat seti nedeniyle, yürütmeyi bekleyen kayıtlarda büyük miktarda veri zaten mevcuttur. Yürütülmeyi bekleyen bu ardışık düzen iş parçacıkları, donanım iş parçacıkları haline gelir ve GPU'lardaki ardışık düzen iş parçacıkları hafif olduğundan, yürütmeyi her saat döngüsünde olduğu sıklıkta gerçekleştirir.


Bant Genişliği, Bilgi İşlem Yoğunluğu ve Gecikme

Gol üstü ne?

  • GPU'dan en iyi şekilde yararlanmak için her saat döngüsünde donanım kaynaklarını (işlem birimleri) tam olarak kullanın.
  • Hesaplama birimlerini meşgul etmek için onlara yeterli miktarda veri beslememiz gerekiyor.

CPU ve GPU'da matris çarpımı


Daha küçük matrislerin matris çarpımındaki gecikmenin CPU ve GPU'da aşağı yukarı aynı olmasının ana nedeni budur. Denemek .

Görevlerin yeterince paralel olması ve verilerin, işlem FLOP'larını ve bellek bant genişliğini doyuracak kadar büyük olması gerekir. Tek bir görev yeterince büyük değilse, belleği doyurmak ve donanımdan tam olarak yararlanmak amacıyla hesaplama yapmak için bu tür birden fazla görevin paketlenmesi gerekir.


Hesaplama Yoğunluğu = FLOP / Bant Genişliği . yani, hesaplama birimlerinin saniyede yapabileceği iş miktarının, belleğin saniyede sağlayabildiği veri miktarına oranı.

Bilgi İşlem Yoğunluğu (kaynak: NVIDIA)

Yukarıdaki şemada, daha yüksek gecikme süresine ve daha düşük bant genişliğine sahip belleğe gidildikçe hesaplama yoğunluğunun arttığını görüyoruz. Bilgi işlemin tam olarak kullanılabilmesi için bu sayının mümkün olduğu kadar küçük olmasını istiyoruz. Bunun için, hesaplamanın hızlı bir şekilde gerçekleşebilmesi için L1/Register'larda olabildiğince fazla veri tutmamız gerekiyor. HBM'den tek veri alırsak, buna değecek kadar tek veri üzerinde 100 işlem yaptığımız yalnızca birkaç işlem vardır. Eğer 100 işlem yapmazsak hesaplama birimleri boşta kalırdı. GPU'lardaki yüksek sayıda iş parçacığı ve kayıtların devreye girdiği yer burasıdır. İşlem yoğunluğunu düşük tutmak ve paralel çekirdekleri meşgul etmek için mümkün olduğu kadar veriyi L1/Kayıtlarda tutmak.

CUDA ve Tensor çekirdekleri arasında hesaplama yoğunluğu açısından 4X fark vardır çünkü CUDA çekirdekleri yalnızca bir 1x1 FP64 MMA yapabilirken Tensor çekirdekleri saat döngüsü başına 4x4 FP64 MMA talimatı yapabilir.

Temel Çıkarımlar

Yüksek sayıda hesaplama birimi (CUDA ve Tensor çekirdekleri), yüksek sayıda iş parçacığı ve kayıt (abonelik üzerinden), azaltılmış talimat seti, L3 önbellek yok, HBM (SRAM), basit ve yüksek verimli bellek erişim modeli (CPU'nun içerik değiştirmesiyle karşılaştırıldığında) , çok katmanlı önbellekleme, bellek sayfalama, TLB vb.), paralel hesaplamada (grafik oluşturma, derin öğrenme vb.) GPU'ları CPU'lardan çok daha iyi yapan ilkelerdir.


GPU'ların ötesinde

GPU'lar ilk olarak grafik işleme görevlerini yerine getirmek için oluşturuldu. Yapay zeka araştırmacıları CUDA'nın avantajlarından ve onun CUDA çekirdekleri aracılığıyla güçlü paralel işlemeye doğrudan erişiminden yararlanmaya başladı. NVIDIA GPU'da Doku İşleme, Işın İzleme, Raster, Polimorf motorlar vb. bulunur (grafiğe özel talimat setleri diyelim). Yapay zekanın benimsenmesinin artmasıyla birlikte, derin öğrenmeye adanmış 4x4 matris hesaplamasında (MMA talimatı) iyi olan Tensor çekirdekleri ekleniyor.


NVIDIA, 2017'den bu yana her mimarideki Tensor çekirdeği sayısını artırıyor. Ancak bu GPU'lar grafik işlemede de iyidir. GPU'larda talimat seti ve karmaşıklık çok daha az olmasına rağmen, tamamen derin öğrenmeye (özellikle Transformer Mimarisine) adanmış değildir.


Transformatör mimarisi için bir yazılım katmanı optimizasyonu (dikkat katmanının bellek erişim düzenine mekanik sempati) olan FlashAttention 2 , görevlerde 2 kat hızlanma sağlar.


CPU ve GPU'ya ilişkin derinlemesine ilk ilkelere dayalı anlayışımızla, Transformatör Hızlandırıcılarına olan ihtiyacı anlayabiliriz: Paralellik için çok sayıda hesaplama birimine sahip, azaltılmış komut seti içeren, özel bir çip (yalnızca transformatör işlemleri için devre), L1/L2 önbellekler, HBM'nin yerini alan devasa DRAM (kayıtlar), transformatör mimarisinin bellek erişim modeli için optimize edilmiş bellek birimleri. Sonuçta Yüksek Lisanslar (web ve mobilden sonra) insanlar için yeni yol arkadaşlarıdır ve verimlilik ve performans için özel çiplere ihtiyaç duyarlar.

Bazı AI Hızlandırıcılar:

Trafo Hızlandırıcıları:

FPGA tabanlı Trafo Hızlandırıcıları:


Referanslar: