TensorFlow, GPU ve Çoklu İşleme Konularında İpuçları ve Tüyolar

0 2,635

Bulut servislerini kullanmadığınız takdirde bugün bir GPU kartına 10 binlerce dolar ödemeniz gerekmekte. Örneğin bugünlerde Tesla P100 serisi bir işlemci 7 bin dolarken, V100 serisinde fiyat 10 bin dolara çıkmakta. Komik olmakla birlikte grafik işlemci kartları kullananların en çok şikayet ettikleri konular da bellek boyutlarının azlığı. Yüzlerce gigabyte’lık flash diskleri bir kaç dolara sipariş edebiliyorken, grafik kartlar çoğunlukla 16 GB, lüks olanları ise 32 GB’lık belleğe sahiptir. Bu yazıda Keras ve TensorFlow ile gerçekleştireceğiniz makine öğrenmesi projelerinizde GPU ve çoklu işleme (multiprocessing) konularında bazı tüyolar paylaşmaya çalışacağım.

Tesla V100’ün tanıtımı

Tek bir GPU’nun rezerve edilmesi

TensorFlow’un GPU için olan versiyonunu indirdiğinizi varsayalım.

TensorFlow aç gözlü bir yaklaşımla tüm GPU’ların tüm belleğini ihtiyacı olmasa bile kendisine tahsis etmektedir. Bu da aynı sunucu üzerinde birden fazla kişi ya da proje çalışıyorsa diğer paydaşlar bellek yetersizliği sebebiyle hata almasına neden olmaktadır.

Makinenizdeki GPU’ları listelemek için nvidia-smi komutunu kullanabilirsiniz. Komut GPU’ları listelediği gibi işlemci ve bellek kullanımlarının yüzdelerini de göstermektedir. Komutun başına watch ekleyerek 2 sn’de bir güncellenmesini sağlayarak sistemi izleyebilirsiniz.

Çoklu GPU’lardan sadece birinin tahsis edilmesi için GPU indeksini belirtmeniz yeterli olacaktır.

Birden fazlasını tahsis etmek isterseniz virgül ile indeksleri belirtebilirsiniz.

 

Alternatif olarak, modellerin dizaynı sırasında da kullanmasını istediğiniz GPU’yu belirtebilirsiniz. Bu kullanım size farklı modellerin farklı GPU’lar üzerinde birbirinden bağımsız olarak koşmasını sağlaycaktır.

Merkezi İşlemci Birimi (CPU)

Hiç GPU kullanmadan doğrudan CPU core’ları üzerinde çalışmak istiyorsanız da indeks değerini boş atamanız yeterli olacaktır.

Kullanılacak CPU core’larını limitlemek isterseniz device_count olarak atayabilirsiniz. Bu kullanımda GPU kullanılmak istenilmemiş, 5 cpu core kullanılmıştır. Aynı şekilde GPU adetlerini de belirtebilirsiniz.

GPU belleği çok değerlidir!

Tek bir GPU’yu kendinize tahsis etseniz bile TensorFlow o GPU’ya ait tüm belleği tahsis edecektir. nvidi-smi komutu ile 200 MB’lık bir veri seti ile çalışıyorsanız da 16 GB’ın kullanımda olduğunu görürsünüz. Oysa ki aynı GPU’yu başka bir görev ile birlikte ortak kullanabilirdik. TensorFlow oturumunda belleğin büyümesine izin verirseniz (allow_growth) GPU belleğinin sadece ihtiyacınız kadarı size tahsis edilecektir.

Çoklu işleme

Modeliniz özellikle eğitim safhası uzun sürmektedir. Eğitim ya da tahmin işlemlerini seri uygulamak yerine python’un çoklu işleme kütüphanesi ile paralel hale getirebiliriz. Bu şekilde zaman kaybını minimuma indirebiliriz.

TensorFlow’un belirtmediğiniz takdirde tüm belleği tahsis ettiğini biliyoruz. Dolayısıyla multiprocessing içerisinde TensorFlow’u doğrudan çağırırsak bellek yetersiz hatası alacağız.

allow_growth parametersine başta doğru değerini atarsak ise yine hata almaktayız.

Çözümü ise her bir çoklu işleme işi içerisinde allow_growth değerini tekrar tekrar doğru atamaktan geçiyor.

Örnek bir uygulama

Çoklu işleme havuzuna 10 eleman beslerken, çoklu işleme kütüphanesi aynı anda 10 elemanı işleyecektir. my_tuple değişkenler grubunun boyutu ile havuz boyutunun eşit olmasına özen gösterin. Aksi takdirde örneğin çoklu değişkenleriniz 100 elemandan oluşurken bunu havuz boyutunu 10 olarak atayarak 10’ar 10’ar işlemek isterseniz bir hata almazken oturumunuzun asılı kaldığını görebiliyorsunuz.

Dikkat etmeniz gereken çoklu işleme kütüphanesi 10 paralelde train fonksiyonunu çağırırken bu fonksiyon içerisinde allow_growth değerini doğru olarak atadık.

Böylelikle işleme hızımızı 10 kat hızlandırmış olduk.

GPU destekli çoklu işleme görevinin kodunu GitHub‘ta da bulabilirsiniz.

Tüm GPU’ları kullanabilmek

Çoklu GPU’ya sahip olmak sizi bir kaç kat daha hızlı yapmayacaktır. Bu GPU’ların birbirine ana kart üzerinde nvlink ile bağlanmış olması önemli husus öncelikle. Framework’un gradyanların aynı GPU’da olmasını zorunlu tutması da elleriniz kollarınızı bağlayan bir husus. Uber mühendislerinin geliştirdiği horovod, GPU’ları sanal olarak birleştirip tek bir GPU gibi hareket etmesini sağlamakta.

Bu yazıda GPU, çoklu işleme (multiprocessing), TensorFlow ve Keras ile kişisel denemelerden edindiğim bazı tüyo ve ipuçlarını paylaşmaya çalıştım.

Bu yazı Tips and Tricks for GPU and Multiprocessing in TensorFlow yazısından Türkçe’ye çevrilmiştir.

 

 

 

 

 

 

Email adresiniz yayınlanmayacaktır.