Skip to content

4.3. [BİLGİ] Tensör İşleme Üniteleri (TPU'lar) nedir?

ayyüce kızrak edited this page May 19, 2019 · 3 revisions

Özetle

TPU

TPU'lar, derin öğrenme görevlerinde uzmanlaşmış donanım hızlandırıcılarıdır. Bu kod laboratuvarında Keras'taki keras_to_tpu_model'i nasıl kullanacağınızı göreceksiniz. Cloud TPU'lar, 8 çekirdekli temel bir yapılandırmada ve ayrıca 512 çekirdeğe kadar olan "TPU pods" adı verilen daha büyük yapılandırmalarda mevcuttur. Ekstra donanım, eğitimi yalnızca eğitim küme boyutunu artırarak hızlandırmak için kullanılabilir (ve Keras'ta bu sizin için otomatik olarak yapılır).

TPU'da Keras kullanarak bir modelin eğitimi için kod:

tpu = tf.contrib.cluster_resolver.TPUClusterResolver(TPU_ADDRESS)
strategy = tf.contrib.tpu.TPUDistributionStrategy(tpu)
tpu_model = tf.contrib.tpu.keras_to_tpu_model(model, strategy=strategy)

tpu_model.fit(get_training_dataset,
              steps_per_epoch=TRAIN_STEPS, epochs=EPOCHS,
              validation_data=get_validation_dataset, validation_steps=VALID_STEPS)

Etkileşimli hızlarda optimize bir çiçek sınıflandırıcıyı TPU kullanarak oluşturacağız. (dakika başına eğitim çalışması)

NEDEN TPU?

Modern GPU'lar, 3 boyut oluşturma, derin öğrenme, fiziksel simülasyonlar, vb. gibi çeşitli görevleri yapmalarına izin veren çok esnek bir mimari olan, programlanabilir "çekirdekler" etrafında düzenlenir. Klasik vektör işlemleri ve sinir ağları gibi büyük matris çarpımlarının baskın olduğu her işte mükemmeldir. NedenTPU Görsel: Bir kerede sinir ağı üzerinden işlenen sekiz görüntüden oluşan bir toplu matris çarpımı olarak yoğun bir sinir ağı katmanı görülmektedir. Lütfen gerçekten bir görüntünün tüm piksel değerlerinin ağırlıklı toplamını yaptığını doğrulamak için bir satır x sütun çarpımı ile çalıştırın. Evrişimli katmanlar, biraz daha karmaşık olmasına rağmen, matris çarpımları olarak da gösterilebilir.(bölüm1'deki tanım)

Donanım

MXU ve VPU

Bir TPU v2 çekirdeği, matris çarpımlarını çalıştıran bir Matris Çarpma Ünitesinden (MXU) ve aktivasyonlar, softmax vb. gibi diğer tüm işler için bir Vektör İşleme Ünitesinden (VPU) yapılmıştır. MXU ise karışık hassasiyette 16-32 bit floaitng point biçiminde çalışır.

Karışık hassas (mixed precision) floating point ve bfloat16

MXU, bfloat16 girişlerini ve float32 çıkışlarını kullanarak matris çarpımlarını hesaplar. Ara birikimler float32 hassasiyetinde gerçekleştirilir.

Yapay sinir ağı eğitimi tipik olarak azaltılmış bir floating point hassasiyetinin sağladığı gürültüye karşı dirençlidir. Gürültünün optimize etme işlemine yakınsamasına bile yardımcı olduğu durumlar vardır. Hesaplamaları hızlandırmak için geleneksel olarak 16 bitlik floating point hassasiyeti kullanılmıştır, ancak float16 ve float32 formatları çok farklı aralıklara sahiptir. Hassaslık float32'den float16'ya düşürüldüğünde genellikle aşırı ve az akışlara neden olur. Çözümler var, ancak float16'nın çalışması için tipik olarak ek çalışmalar gerekiyor.

Bu nedenle Google, bfloat16 biçimini TPU’larda sunulmaktadır. bfloat16 kesik float32 ile tam olarak aynı üs bitlerine ve aralığa sahiptir. Bu, TPU'ların matris çarpımlarını bfloat16 girişleri ile fakat float32 çıkışları ile karışık hassasiyetle hesapladığı gerçeğine ek olarak, tipik olarak, azaltılmış hassasiyetin performans kazanımlarından yararlanmak için kod değişikliği gerekmediği anlamına gelir.

Bfloat16 / float32 karma hassasiyetinin kullanılması TPU'larda varsayılandır. Etkinleştirmek için Tensorflow kodunuzda kod değişikliği gerekmez. Hala kodun boyunca float32 ile çalışıyorsunuz. Bir matris çarpımı yürütürken, TPU girişlerini otomatik olarak bfloat16'ya keser. Elde edilen matris float32'dir.

Sistolik Dizi

MXU, veri öğelerinin bir donanım hesaplama birimi dizisinden geçtiği "sistolik dizi" mimarisi kullanılarak donanımda matris çarpımlarını uygular. (Tıpta "sistolik", kalp kasılmalarına ve kan akışına, burada veri akışına karşılık gelir.) Bir matris çarpımının temel elemanı, bir matristen bir satır ile diğer matristen bir sütun arasındaki bir nokta çarpımıdır. (bu bölümün üstündeki resme bakınız). Bir matris çarpımı için Y = X * W, sonucun bir elemanı şöyle olacaktır:

Y[2,0] = X[2,0]*W[0,0] + X[2,1]*W[1,0] + X[2,2]*W[2,0] + ... + X[2,n]*W[n,0]

Bir GPU'da, bu nokta çarpını bir GPU "çekirdeğine" programlanır ve sonra elde edilen matrisin her değerini bir kerede denemek ve hesaplamak için paralel olarak mümkün olduğu kadar çok sayıda "çekirdek" üzerinde yürütülür. Elde edilen matris 128x128 büyükse, bu 128x128 = 16K "çekirdek" olmasını gerektirir ki bu genellikle mümkün değildir. En büyük GPU'lar yaklaşık 4000 çekirdeğe sahiptir. Öte yandan bir TPU, MXU’daki hesaplama birimleri için minimum donanım kullanır: sadece bfloat16 x bfloat16 => float32 çarpmadır, başka bir şey değil. Bunlar, bir TPU'nun 16K'sını 128x128 MXU'da uygulayabileceği ve bu matris çarpımını tek seferde işleyebileceği kadar küçük.

Görsel: MXU sistolik dizisi. Hesaplama elemanları çarpım biriktiricileridir. Bir matrisin değerleri diziye yüklenir (kırmızı noktalar). Diğer matrisin değerleri diziden geçer (gri noktalar). Sütun değerleri yükseltir. Satırlar kısmi toplamları yayar. Veri diziden akarken, sağ taraftan çıkan matris çarpımının sonucunu aldığınızı doğrulamak için kullanıcıya bir alıştırma olarak bırakılmıştır.

Buna ek olarak, nokta çarpımlar bir MXU'da hesaplanırken, ara toplamlar sadece bitişik hesaplama birimleri arasında akar. Depolanmaları ve hafızadan/hafızaya ya da bir kayıt dosyasına alınmaları gerekmez. Sonuç, TPU sistolik dizi mimarisinin, matris çarpımlarını hesaplarken GPU'ya göre ihmal edilemez bir hız avantajının yanı sıra önemli bir yoğunluk ve güç avantajına sahip olmasıdır.

Bulut TPU

Google Cloud Platform'da bir "Cloud TPU v2" isteğinde bulunduğunuzda, PCI bağlı bir TPU panosuna sahip bir sanal makine (VM-Virtual Machine) elde edersiniz. TPU kartında dört adet çift çekirdekli TPU yongası/çipi var. Her TPU çekirdeği bir VPU (Vektör İşleme Ünitesi) ve 128x128 MXU (MatriX çarpma Ünitesi) özelliğine sahiptir. Bu "Cloud TPU" daha sonra genellikle ağ üzerinden istenen VM'ye bağlanır. Yani tam resim şöyle görünüyor:

Görsel: ağa bağlı "Cloud TPU" hızlandırıcılı sanal makineniz. "Bulut TPU", üzerinde dört adet çift çekirdekli TPU çipi bulunan PCI bağlı bir TPU panosuna sahip bir sanal makineden yapılmıştır.

TPU bölmeleri

Google’ın veri merkezlerinde, TPU'lar, çok büyük bir hızlandırıcı olarak görünmelerini sağlayan yüksek performanslı bir bilgi işlem (HPC;High Performence Computing) ara bağlantıya bağlanır. Google onlara pods ismini vermektedir ve 512 TPU v2 çekirdeği kapsayabilir. TPU v3 bölmeleri daha da güçlü. TPUpods Görsel: bir TPU v3 pıd (kapsülü). HPC arabağından bağlı TPU panoları ve rafları.

Eğitim sırasında, gradyanlar all-reduce algoritması kullanılarak TPU çekirdekleri arasında değiştirilir (burada all-reduce iyi bir açıklaması). Eğitilen model, büyük küme boyutları üzerinde eğitim alarak donanımdan yararlanabilir.

Görsel: Google TPU'nun 2 Boyutlu toroidal ağ HPC ağındaki all-reduce algoritmasını kullanarak eğitim sırasında gradyanların senkronizasyonu.

Yazılım

Büyük küme boyutlu eğitim

TPU'lar için ideal küme büyüklüğü, TPU çekirdeği başına 128 veri öğesidir, ancak donanım, TPU çekirdeği başına 8 veri öğesinden zaten iyi bir şekilde faydalanabildiğini göstermektedir. Bir Cloud TPU’nun 8 çekirdeği olduğunu unutmayın.

Bu kod laboratuvarında Keras API'ını kullanacağız. Keras'ta küme boyutu, TPU'da çalışırken otomatik olarak çekirdek başına küme boyutu şeklinde olur. Bu, kodunuzda ayarlamanız gereken bir şey değildir, ancak geriplanda, 8 kat daha büyük bir küme büyüklüğü ile eğitim yapacaksınız.

Ek performans ipuçları için TPU Performans Kılavuzuna bakın. Çok büyük küme boyutları için, bazı modellerde özel dikkat gerekebilir, daha fazla ayrıntı için LARSOptimizer bölümüne bakın.

Kaputun altında: XLA

Tensorflow programları hesaplama grafiklerini tanımlar. TPU, Python kodunu doğrudan çalıştırmaz, Tensorflow programınız tarafından tanımlanan hesaplama grafiğini çalıştırır. Kaputun altında, XLA (hızlandırılmış Doğrusal Cebir derleyici-accelerated Linear Algebra compiler) adlı bir derleyici, hesaplama düğümlerinin Tensorflow grafiğini TPU makine koduna dönüştürür. Bu derleyici aynı zamanda kodunuz ve bellek düzeniniz üzerinde birçok gelişmiş optimizasyon gerçekleştirir. Çalışma TPU'ya gönderilirken derleme otomatik olarak gerçekleşir. Açıkça yapım zincirinize XLA dahil etmek zorunda değilsiniz. Görsel: TPU'da çalışmak için, Tensorflow programınız tarafından tanımlanan hesaplama grafiği önce bir XLA (hızlandırılmış Linear Cebir derleyici) göstergesine çevrilir, ardından XLA tarafından TPU makine koduna derlenir.

Keras'ta TPU'ları kullanma

TPU'lar, Tensorflow 1.12'den itibaren Keras API'si ile desteklenir. Keras desteği şu an için 8 çekirdek veya bir Cloud TPU ile sınırlıdır.

İşte bir örnek:

tpu = tf.contrib.cluster_resolver.TPUClusterResolver(TPU_ADDRESS)
strategy = tf.contrib.tpu.TPUDistributionStrategy(tpu)
tpu_model = tf.contrib.tpu.keras_to_tpu_model(model, strategy=strategy)

tpu_model.fit(get_training_dataset,
              steps_per_epoch=TRAIN_STEPS, epochs=EPOCHS,
              validation_data=get_validation_dataset, validation_steps=VALID_STEPS)

Bu kod parçasında:

  • TPUClusterResolver networkte TPU’yu bulur. TPU_ADDRESS argümanı tüm Google Cloud sistemlerinde (ML Engine, Kubernetes Engine, Deep Learning VM'ler) boş (None) olabilir. Bu sistemler TPU'larının nerede olduğunu biliyor. Colaboratory'de, TPU adresini bir ortam değişkeninden almanız ve buraya kendiniz iletmeniz gerekir - Kod örneği burada.

  • TPUDistributionStrategy dağılımı ve "tamamen azaltan/all-reduce" gradyan senkronizasyon algoritmasını uygulayan kısımdır.

  • keras_to_tpu_model modelinizin TPU'da çalışmaya ve tahminlerini hesaplamaya hazır bir kopyasını oluşturur. Lütfen tpu_model.fitfonksiyonunun, veri girişlerini hem eğitim hem de doğrulama veri setleri için tf.data.Dataset değerini döndüren bir fonksiyon olarak beklediğini unutmayın.

Ortak TPU taşıma görevleri

Bir Tensorflow modelinde veri yüklemek için birçok yol varken, TPU'lar için tf.data.Dataset API'sinin kullanılması gerekir. TPU'lar sabit küme boyutları ile en iyi şekilde çalışır. Lütfen tf.data.Dataset.batch (drop_remainder = True) kullanın. Bazı Tensorflow işlemleri desteklenmiyor. Hangileri olduğunu incelemek isterseniz liste burada. İyi haber şu ki bu sınırlama sadece eğitim koduna, yani modelinizde ileri ve geri geçişe uygulanır. Veri giriş hattınızdaki tüm Tensorflow işlemlerini CPU'da yürütüleceği haliyle kullanabilirsiniz. int8 veya int16 sayıları int32 olarak kabul edilir. TPU'da 32 bitten az çalışan tam sayı donanımı yoktur. tf.py_func, TPU'da desteklenmiyor. TPU'lar çok hızlıdır ve veri alımı genellikle üzerinde çalışırken darboğaza dönüşür. TPU Performans Kılavuzu'ndaki veri tıkanıklıklarını ve diğer performans ipuçlarını tespit etmek için kullanabileceğiniz araçlar vardır.

Estimator API ile TPU'ları kullanma

Bir Tahmin edici modelini TPUEstimator API'sine taşıma, daha fazla dahil olmakla birlikte, aynı zamanda ek esneklik sağlar ve TPU bölmeleri için destek sağlar. Süreci tanımlayan belgeler burada ve burada TPUEstimator taşıma örneğinden önce / sonra bir yorum bulabilirsiniz:

TPUEstimator model (MNIST) [TPUEstimator model (MNIST)]

Original Estimator model for reference [Original Estimator model for reference]


→ Gelecek Bölüm: 4.4. [BİLGİ] Yapay Sinir Ağı ile Sınıflandırma 101

Clone this wiki locally