Google Cloud TPU Kullanımı

Ömer SAVAŞ
mikrogovernment
Published in
6 min readOct 18, 2022

Son güncelleme: 10/11/2022

Edit: Uzatma talep ettim ücretsiz kullanımı 2 ay daha uzattılar sağolsunlar :)

Özet: Bu yazı; toplamda yaklaşık 400 bin dolarlık ücretsiz Google Cloud TPU ‘ya nasıl başvurulacağı ve nasıl kullanılacağı hakkındadır.

Merhaba sevgi pıtırcıkları. Geçenlerde twitter da, ücretsiz Google Cloud TPU kullanımı hakkında bir bağlantı gördüm. Özellikle ücretsiz olması dikkatimi çektiği için başvurmuştum. Google cloud ‘dan gelen mail ile bu programa kabul edildiğimi öğrendim. Biraz araştırınca bunun aslında benim sandığımdan çok daha iyi bir kaynak desteği olduğunu farkettim. Toplamda 410 bin doların üstünde bir kaynaktan bahsediyorum.

105 adet v2.8 için 105 x $3613 = $379,365.00 + 5 adet v3.8 için 5 x $6424 = $32,120.00
Toplamda: $411,485.00 (1 aylık kullanım bedeli hesaplanmıştır.)

Evet heyecan verici. Sonra bu konuda türkçe kaynak sıkıntısını görünce dedim ki: “Hemen bir yazı yazayım. Hem TPU nedir? Google Cloud TPU nasıl kullanılır? Onu anlatıyım. Hem de bu desteğe nasıl başvurabiliriz onu gösteriyim.” Bu vesile buradayız.

Önce hemen bu konuyu bir aradan çıkaralım. Burada Google ‘ın bir sitesi var. Araştırmacılar için paylaşılan bu kaynak hakkında bilgi veriyor. Sonra isterseniz buradaki formu doldurarak başvuruda bulunuyorsunuz. Eğer kabul edilirseniz sizden google cloud üzerinde bir proje oluşturmanız ve numarasını paylaşmanızı istiyorlar. Tebrikler toplamda $411,485.00 ‘lık bir kaynağınız var. Tek sorunu 1 aylık bir süre kısıtınız var.

Aslında TPU ‘ların amacı yapay zeka eğitimi olsa da benim hiç alakam yok diyen arkadaşlar ücretsiz tpu-vm ‘ler yaratarak kaynağı alternatif işler için de kullanabilir diye düşünüyorum. Sonuçta linux bir sunucu var ortada :)

Yavaş yavaş gidelim. Yapay zeka algoritmaları (özellikle deep learning) doğaları gereği CPU ‘lar üzerinde, GPU ‘lara göre daha yavaş çalışırlar. Çünkü paralel olarak koşturulmaya müsaitlerdir. GPU ‘lar da CPU ‘lara göre çok daha fazla çekirdek içerdiği için yeküne baktığımızda çok daha fazla işlem yapmış oluruz. Buna rağmen aslında GPU lar bile yoğun matris işlemi barındıran derin öğrenme eğitimini gerçekleştirirken tam verimli değillerdir. Çünkü mimarileri gereği ram ve işlem merkezi (alu) farklı yerlerdedir. Eğitim esnasında yoğun bir ram-işlemci trafiği yaratırlar. Bu da aslında bir darboğaz oluşturur. Temelde bu gibi durumları ortadan kaldırmak ve daha performanslı bir eğitim gerçekleştirmek için TPU geliştirildi / kullanılmaya başlandı. CPU, GPU ve TPU hakkında daha fazla kıyaslama için buraya bakabilirsiniz.

Google Cloud TPU ise bizim bu TPU ‘ları kullanarak bulut üzerinde eğitimleri gerçekleştirebilmemizi sağlıyor. Farklı yöntemleri var. İlki colab üzerinde hızlandırıcı olarak TPU seçmek. Bu yöntem için Ayyüce hocanın burada bir yazısı var. Bizim yazımızın amacı GCP üzerinden aldığımız ücretsiz kaynağı kullanmak olduğu için colab konusuna girmiyorum.

Diğer yöntem ise GCP üzerinde TPU sanal makineleri kullanarak bu kaynağı kullanmak. Önce bir TPU-VM oluşturarak eğitimi başlatacağımız ortamı hazırlıyoruz. Burada bize ücretsiz kaynak sağlanmış olan zone ve hızlandırıcısı seçmeye dikkat ediyoruz. Yoksa fatura zamanı biraz üzülebiliriz.

gcloud compute tpus tpu-vm create tpuTestVm — zone=europe-west4-a — accelerator-type=v3–8 — version=tpu-vm-tf-2.10.0

Kısa bir süre içerisinde oluşturuluyor. Ardından oluşturduğumuz sanal makineye ssh ile bağlanıyoruz.

gcloud compute tpus tpu-vm ssh tpuTestVm — zone europe-west4-a

Artık makinemizin içerisindeyiz. “htop” komutu ile kaynaklarımıza bakalım.

Evet yanlış görmediniz toplamda 96 adet çekirdek var. Hemen gerekli ön kurulumları yapalım ve eğitimi başlatalım. Ayrıca makine üzerinde yaklaşık 100 GB disk var.

Eğer verisetiniz bu boyuttan büyük ise ücretli bir disk oluşturup makinenize bağlayabilirsiniz. Ben mevcut disk ile yetineceğim.

Disk oluşturma: “gcloud compute disks create new-disk — size 10 — zone europe-west4-a — type pd-standard”

Diski vm ‘e bağlama: “gcloud alpha compute tpus tpu-vm attach-disk tpuTestVm— zone=europe-west4-a — disk=new-disk — mode=read-write”

Diski formatlama ve mount etme:
sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb
sudo mkdir -p /mnt/disks/persist
sudo mount -o discard,defaults /dev/sdb /mnt/disks/persist
sudo chmod a+w /mnt/disks/persist

Ardından gerekli ortam değişkenlerini ekliyor ve gerekli kütüphaneleri kuruyoruz. Bunların hepsini kurmak zorunda değiliz ama aşağıda değineceğim üzere ben dinamik bir kodlama yapmak ve sonuçları izlemek için ihtiyaç duyduğum tüm kütüphaneleri kuruyorum.

export TPU_NAME=local

export STORAGE_BUCKET=/home/omers
export MODEL_DIR=${STORAGE_BUCKET}/logs

export PYTHONPATH=”${PYTHONPATH}:/usr/share/tpu/models”

pip3 install -r /usr/share/tpu/models/official/requirements.txt

pip3 install — upgrade “cloud-tpu-profiler>=2.3.0”
pip3 install — user — upgrade -U “tensorboard>=2.3”
pip3 install — user — upgrade -U “tensorflow>=2.3”

pip3 install scikit-image ipython markupsafe==2.0.1 jupyter pandas scipy scikit-image matplotlib pydot

Artık şuradaki python dosyasını “wget https://omersavas.com/dosya/mnistTpu.py” komutu ile indirip “python3 mnistTpu.py” komutu ile çalıştırabiliriz. Ama ben bu makineyi interaktif olarak kullanmak istediğim için işlemleri jupyter notebook üzerinden yapmayı tercih ediyorum. Bunun için de bir porta ihtiyacım var. Çünkü jupyter notebook bir web servis üzerinden çalışıyor. Normal şartlarda makineye direk erişimimiz olmadığı için bir network oluşturup porta izin vermeliyiz ama makineye ssh yapabildiğimiz için biz kendi makinemizin 8888 numaralı portunu tpu-vm ‘in 8888 numaralı portuna yönlendirerek “http://localhost:8888” adresi üzerinden erişebiliriz. Gerekli kurulumları zaten demin yapmıştık. “gcloud compute tpus tpu-vm ssh tpuTestVm — zone europe-west4-a — ssh-flag=”-4 -L 8888:localhost:8888"” komutu ile yeniden bir ssh açarak “jupyter notebook” komutunu çalıştırıyoruz. Ardından bize token içeren bir adres veriyor onu tarayıcımıza yapıştırarak servise erişebiliriz. (http://127.0.0.1:8888/?token=XXXXXXXXXXXXXXXXXXXXXXXXXX)

Artık burada ister yeni dosya oluşturalım satır satır kod ekleyerek gidelim, ister komut satırından wget ile dosya indirip web arayüzünden düzenleyelim, ister makinemizdeki .ipynb dosyasını upload edelim artık makinenin kaynaklarını servis olarak kullanmakta özgürüz. Ben upload butonunu tıklayarak kendi makineme indirmiş olduğum mnist.ipynb dosyasını upload ediyorum. Ardından dosya ismine tıklayarak yeni sekmede açılmasını sağlıyorum. Sonra hücre hücre çalıştırarak eğitmi çok kısa sürede gerçekleştiriyoruz.

Eğer revize bir model tasarlayıp kendi modelinizi eğitmek istiyorsanız modeli bir scope içinde derlemeniz yeterli. Bu şekilde derlenmiş bir model eğitim başladığında TPU çekirdeklerini kullanacaktır:

resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu=’local’)
tf.config.experimental_connect_to_cluster(resolver)
tf.tpu.experimental.initialize_tpu_system(resolver)
print(“All devices: “, tf.config.list_logical_devices(‘TPU’))

strategy = tf.distribute.TPUStrategy(resolver)
with strategy.scope():
# Build your model here

Ayrıca bu kodu çalıştırdığınızda çıktı olarak makinenize bağlı tüm TPU çekirdeklerinin listesini görebilirsiniz.

Son olarak da eğitimin gidişatını izlemek için TensorBoard sevisini başlatmak istiyorum. Bunun için de jupyter servisi gibi kendi makinemin portunu map edeceğim. Bunun için yeni bir ssh başlatıyorum.

gcloud compute tpus tpu-vm ssh tpuTestVm — zone europe-west4-a — ssh-flag=”-4 -L 9012:localhost:9012"

Gerekli kurulumlar zaten yapılmıştı şimdi yine ortam değişkenlerini ekleyip servisi başlatıyoruz

export STORAGE_BUCKET=/home/omers
export MODEL_DIR=${STORAGE_BUCKET}/logs

TPU_LOAD_LIBRARY=0 tensorboard — logdir ${MODEL_DIR} — port 9012

Amacım aslında birden fazla TPU ‘yu aynı anda kullanabilmekti fakat yaptığım araştırmalarda ve google destek ekibinden aldığım mailde bunun doğru çalışan sorunsuz bir yönteminin olmadığını gördüm. Bunun yerine POD dediğimiz çok daha yüksek kaynaklı yönteme yönlendirmeler mevcut. Eğer siz aynı anda birden fazla TPU nun sorunsuz kullanılabildiği bir yöntem bulursanız beni de yeşillendirin :)

Tensorflow kütüphanesini ve mimarisini derinlemesine bilerek callbackler ve eventler ile bazı testler yapmayı planlıyorum ama malesef şuan bunun için çok vaktim yok. Sağlıcakla…

--

--