Keras PlatoBlockchain Veri Zekası ile çoklu GPU eğitimi için 5 ipucu. Dikey Arama. Ai.

Keras ile çoklu GPU eğitimi için 5 ipucu

Derin Öğrenme (blok zinciri/bitcoin ve Veri Bilimi/Makine Öğrenimi ile birlikte 2010'ların sonlarının favori moda kelimesi), son birkaç yılda gerçekten harika şeyler yapmamızı sağladı. Algoritmalardaki ilerlemeler dışında (ki bunlar 1990'lardan beri bilinen fikirlere, yani “Veri Madenciliği çağı”na dayanmaktadır), başarısının ana nedenleri, büyük ücretsiz veri kümelerinin mevcudiyetine, açık kaynak kitaplıkların tanıtımına ve GPU'ların kullanımı. Bu blog yazısında son ikisine odaklanacağım ve zor yoldan öğrendiğim bazı ipuçlarını sizlerle paylaşacağım.

Neden TensorFlow ve Keras?

TensorFlow Google tarafından geliştirilen ve hızlı bir şekilde karmaşık ağların prototipini oluşturmanıza olanak tanıyan çok popüler bir Derin Öğrenme kitaplığıdır. Otomatik farklılaşma (sizi maliyet fonksiyonlarının gradyanlarını tahmin etmekten/kodlamaktan kurtarır) ve GPU desteği (iyi bir donanım kullanarak kolayca 200x hız iyileştirmesi elde etmenizi sağlar) gibi birçok ilginç özellikle birlikte gelir. Ayrıca, C veya CUDA kodu yazmanıza gerek kalmadan hızlı bir şekilde prototip oluşturabileceğiniz bir Python arayüzü sunar. Kuşkusuz, Torch, MXNet, Theano, Caffe, Deeplearning4j, CNTK, vb. gibi TensorFlow yerine kullanılabilecek birçok başka çerçeve vardır, ancak bunların hepsi kullanım durumunuza ve kişisel tercihinize bağlıdır.

Ama neden keras? Benim için doğrudan TF kullanmak, Numpy ile Makine Öğrenimi yapmak gibidir. Evet bu mümkün ve zaman zaman bunu yapmanız gerekiyor (özellikle özel katmanlar/kayıp fonksiyonları yazıyorsanız), ancak gerçekten karmaşık ağları bir dizi vektör işlemi olarak tanımlayan kod yazmak istiyor musunuz (evet, biliyorum) TF'de daha üst düzey yöntemler var ama Keras kadar havalı değiller)? Ayrıca farklı bir kütüphaneye geçmek isterseniz ne olur? O zaman muhtemelen berbat olan kodu yeniden yazman gerekecek. Ta ta taaa, Keras kurtarmaya! Keras, ağlarınızı üst düzey kavramlar kullanarak tanımlamanıza ve arka uçtan bağımsız kod yazmanıza olanak tanır; bu, ağları farklı derin öğrenme kitaplıklarında çalıştırabileceğiniz anlamına gelir. Keras hakkında sevdiğim birkaç şey, iyi yazılmış olması, nesne yönelimli bir mimariye sahip olması, katkıda bulunmasının kolay olması ve arkadaş canlısı bir topluluğa sahip olmasıdır. Beğendiyseniz teşekkür edin François Cholet geliştirmek ve açık kaynak sağlamak için.

Çoklu GPU eğitimi için İpuçları ve Elde Edilenler

Lafı fazla uzatmadan, Keras'ta GPU eğitiminden en iyi şekilde nasıl yararlanabileceğinize dair birkaç ipucuna ve aklınızda bulundurmanız gereken birkaç ipucuna geçelim:

1. Çoklu GPU eğitimi otomatik değildir

Keras & Tensorflow kullanarak GPU üzerinde eğitim modelleri sorunsuzdur. Bir NVIDIA kartınız varsa ve CUDA'yı yüklediyseniz, kitaplıklar bunu otomatik olarak algılar ve eğitim için kullanır. Çok havalı! Peki ya şımarık bir veletseniz ve birden fazla GPU'nuz varsa? Ne yazık ki çoklu GPU eğitimi almak için biraz çalışmanız gerekecek.
Keras PlatoBlockchain Veri Zekası ile çoklu GPU eğitimi için 5 ipucu. Dikey Arama. Ai.
Neyi başarmak istediğinize bağlı olarak bir ağı paralelleştirmenin birden çok yolu vardır, ancak ana iki yaklaşım model ve veri paralelleştirmedir. İlki, modeliniz tek bir GPU'ya sığmayacak kadar karmaşıksa size yardımcı olurken, ikincisi yürütmeyi hızlandırmak istediğinizde size yardımcı olabilir. Tipik olarak, insanlar çoklu GPU eğitiminden bahsettiğinde ikincisini kastederler. Eskiden bunu başarmak daha zordu ama neyse ki Keras yakın zamanda adı verilen bir yardımcı yöntem ekledi. mutli_gpu_model bu da paralel eğitimi/tahminleri kolaylaştırır (şu anda yalnızca TF arka ucuyla kullanılabilir). Ana fikir, modelinizi yöntemden geçirmeniz ve farklı GPU'lar arasında kopyalanmasıdır. Orijinal girdi, çeşitli GPU'lara beslenen parçalara bölünür ve daha sonra bunlar tek bir çıktı olarak toplanır. Bu yöntem paralel eğitim ve tahminler elde etmek için kullanılabilir, ancak eğitim için gerekli senkronizasyon nedeniyle GPU miktarıyla doğrusal olarak ölçeklenmediğini unutmayın.

2. Parti Boyutuna Dikkat Edin

Çoklu GPU eğitimi yaparken parti boyutuna dikkat edin çünkü hız/bellek, modelinizin yakınsaması üzerinde birden fazla etkisi vardır ve dikkatli olmazsanız model ağırlıklarınızı bozabilirsiniz!

Hız/bellek: Açıkçası, parti ne kadar büyük olursa, eğitim/tahmin o kadar hızlı olur. Bunun nedeni, GPU'lara veri girme ve onlardan veri almanın bir ek yükü olması, bu nedenle küçük toplu işlerin daha fazla ek yükü olmasıdır. Diğer taraftan, parti ne kadar büyük olursa GPU'da o kadar fazla belleğe ihtiyacınız olur. Özellikle eğitim sırasında, her katmanın girdileri, geri yayılım adımında gerekli olduğu için bellekte tutulur, bu nedenle toplu iş boyutunuzu çok fazla artırmak, yetersiz bellek hatalarına neden olabilir.

Yakınsama: Modelinizi eğitmek için Stokastik Gradient Uygun (SGD) veya bazı türevlerini kullanıyorsanız, parti boyutunun ağınızın yakınsama ve genelleme yeteneğini etkileyebileceğini aklınızda bulundurmalısınız. Birçok bilgisayarla görme problemindeki tipik parti boyutları 32-512 örnek arasındadır. Olarak Keskar ve diğerleri “Pratikte, daha büyük bir parti (512'den fazla) kullanıldığında, modelin kalitesinde, genelleme kabiliyeti ile ölçüldüğü üzere bir bozulma olduğu gözlemlenmiştir.” Diğer farklı optimize edicilerin farklı özelliklere sahip olduğunu ve özel dağıtılmış optimizasyon tekniklerinin soruna yardımcı olabileceğini unutmayın. Matematiksel detaylarla ilgileniyorsanız, Joeri Hermans'ın Tezini okumanızı tavsiye ederim.Ölçeklenebilir Derin Öğrenme ve Paralelleştirme Gradyan İnişi Üzerine anlayışının sonucu olarak, buzdolabında iki üç günden fazla durmayan küçük şişeler elinizin altında bulunur.
Keras PlatoBlockchain Veri Zekası ile çoklu GPU eğitimi için 5 ipucu. Dikey Arama. Ai.
Ağırlıkların bozulması: Bu, yıkıcı sonuçlara yol açabilecek kötü bir teknik ayrıntıdır. Çoklu GPU eğitimi yaptığınızda tüm GPU'ları veri ile beslemek önemlidir. Çağınızın en son kümesinde tanımlanandan daha az veri olabilir (çünkü veri kümenizin boyutu, kümenizin boyutuna tam olarak bölünemez). Bu, bazı GPU'ların son adımda herhangi bir veri almamasına neden olabilir. Ne yazık ki bazı Keras Katmanları, özellikle de Toplu Normalleştirme Katmanı, ağırlıklarda görünen nan değerlerine yol açan bununla baş edemez (BN katmanındaki hareketli ortalama ve varyans). İşleri daha da kötü hale getirmek için, eğitim sırasında (öğrenme aşaması 1 iken) sorun gözlemlenmeyecektir çünkü belirli katman, tahminlerde partinin ortalamasını/varyansını kullanır. Bununla birlikte, tahminler sırasında (öğrenme aşaması 0'a ayarlanmıştır), bizim durumumuzda nan haline gelebilecek ve kötü sonuçlara yol açabilecek olan değişen ortalama/varyans kullanılır. Bu yüzden kendinize bir iyilik yapın ve çoklu GPU eğitimi yaparken her zaman parti boyutunuzun sabit olduğundan emin olun. Bunu başarmanın iki basit yolu, önceden tanımlanmış boyuta uymayan grupları reddetmek veya önceden tanımlanmış boyuta ulaşana kadar toplu iş içindeki kayıtları tekrarlamaktır. Son olarak, çoklu GPU kurulumunda toplu iş boyutunun sisteminizdeki mevcut GPU sayısının katı olması gerektiğini unutmayın.

3. GPU verileri Açlığı, yani CPU'lar GPU'lara ayak uyduramıyor

Derin ağları eğitirken/tahmin ederken tipik olarak en pahalı kısım, GPU'larda gerçekleşen tahmindir. Veriler arka planda CPU'larda önceden işlenir ve periyodik olarak GPU'lara beslenir. Yine de GPU'ların ne kadar hızlı olduğunu hafife almamak gerekir; ağınız çok sığsa veya ön işleme adımı çok karmaşıksa, CPU'larınız GPU'larınıza ayak uyduramaz veya başka bir deyişle, onları yeterince hızlı veri beslemezler. Bu, boşa harcanan para/kaynaklara dönüşen düşük GPU kullanımına yol açabilir.
Keras PlatoBlockchain Veri Zekası ile çoklu GPU eğitimi için 5 ipucu. Dikey Arama. Ai.
Keras tipik olarak toplu işlerin tahminlerini paralel olarak gerçekleştirir ancak Python'un GIL'i (Global Interpreter Lock) nedeniyle Python'da gerçek çoklu iş parçacığını gerçekten elde edemezsiniz. Bunun için iki çözüm var: ya birden fazla işlem kullanın (burada ele almayacağım çok sayıda sorun olduğunu unutmayın) veya ön işleme adımınızı basit tutun. Geçmişte, Görüntü ön işleme sırasında CPU'lara yüklediğimiz gereksiz yükün bir kısmını hafifletmek için Keras'a bir Çekme İsteği gönderdim, bu nedenle çoğu kullanıcı standart oluşturucuları kullanırlarsa etkilenmemelidir. Özel oluşturucularınız varsa, Numpy gibi C kitaplıklarına mümkün olduğunca fazla mantık göndermeye çalışın çünkü bu yöntemlerden bazıları aslında GIL'i serbest bırakın bu, paralelleştirme derecesini artırabileceğiniz anlamına gelir. GPU veri açlığı ile karşı karşıya olup olmadığınızı tespit etmenin iyi bir yolu, GPU kullanımını izlemektir, ancak bunu gözlemlemek için tek nedenin bu olmadığı konusunda uyarılmalıdır (birden fazla GPU'da eğitim sırasında gerçekleşen senkronizasyon aynı zamanda düşük kullanımın sorumlusudur). ). Tipik olarak GPU veri açlığı, GPU patlamaları ve ardından kullanım olmaksızın uzun duraklamalar gözlemlenerek tespit edilebilir. Geçmişte GPU kullanımınızı ölçmenize yardımcı olabilecek bir Dstat uzantısını açık kaynaklı hale getirmiştim, bu yüzden şuna bir göz atın: orijinal blog yazısı.

4. Paralel modellerinizi kaydetme

Modelinizi paralelleştirmek için mutli_gpu_model yöntemini kullandığınızı, eğitimin bittiğini ve şimdi ağırlıklarını sürdürmek istediğinizi varsayalım. Kötü haber şu ki, bunun üzerinde sadece save() arayamazsınız. Şu anda Keras'ın size izin vermeyen bir sınırlaması var. paralel bir modeli kaydet. Bunun 2 yolu vardır: ya orijinal modelin referansında save()'i çağırın (ağırlıklar otomatik olarak güncellenecektir) ya da paralelleştirilmiş versiyonu kesip tüm gereksiz bağlantıları temizleyerek modeli serileştirmeniz gerekir. İlk seçenek çok daha kolay ama gelecekte, ikincisini gerçekleştiren bir serialize() yöntemini açık kaynaklı hale getirmeyi planlıyorum.

5. Mevcut GPU'ları saymanın kötü bir yan etkisi vardır.

Ne yazık ki şu anda tensorflow.python.client.device_lib.list_local_devices() yönteminde yeni bir TensorFlow Oturumu oluşturulmasına ve sistemdeki tüm mevcut GPU'ların başlatılmasına neden olan kötü bir yan etki var. Bu, belirtilenden daha fazla GPU görüntülenmesi veya yeni oturumların zamanından önce başlatılması gibi beklenmeyen sonuçlara yol açabilir (bu konudaki tüm ayrıntıları okuyabilirsiniz. çekme isteği). Benzer sürprizlerden kaçınmak için bunun yerine Keras'ın K.get_session().list_devices() yöntemini kullanmanız önerilir; bu, oturumda kayıtlı tüm GPU'ları size geri getirecektir. Son olarak, list_devices() yöntemini çağırmanın bir şekilde pahalı olduğunu unutmayın, bu nedenle yalnızca mevcut GPU'ların sayısıyla ilgileniyorsanız, yöntemi bir kez arayın ve numaralarını yerel bir değişkende saklayın.

Bu kadar! Umarım bu listeyi faydalı bulmuşsunuzdur. Keras'ta GPU eğitimi için başka ipuçları/ipuçları bulduysanız, bunları aşağıda yorumlarda paylaşın. 🙂

Zaman Damgası:

Den fazla Veri kutusu