Bir sinir ağı eğitmek için CPU ve GPU arasında seçim yapma


29

Bir GPU’nun “ek yükü” hakkında tartışmalar gördüm ve “küçük” ağlar için bir CPU’da (veya CPU ağında) çalışmak GPU’dan daha hızlı olabilir.

'Küçük' ile kastedilen nedir?

Örneğin, 100 gizli üniteye sahip tek katmanlı bir MLP 'küçük' olur mu?

'Küçük' tanımımız tekrarlayan mimarilerde değişiyor mu?

CPU veya GPU'da eğitim alıp almayacağınıza karar verirken göz önünde bulundurulması gereken başka kriterler var mı?

EDIT 1:

Daha yeni bir blog yazısı buldum (muhtemelen modası geçmiş? 2014'ten itibaren):

"... Çoğu ağ kartı []] yalnızca CPU’ya kayıtlı bellekle çalışır ve bu nedenle iki düğüm arasında GPU’dan GPU’ya aktarma şu şekilde olur: GPU 1’den CPU 1’e, Ağ Kartı 1’den Ağ Kartı 2’den CPU’ya 2 2'den GPU'ya 2. Bu ne anlama gelir, eğer biri yavaş bir ağ kartı seçerse o zaman tek bir bilgisayar için hız olmayabilir. GPU'lar, CPU'ların sadece ağ kartlarının bunlara ayak uydurabilmesi için çok hızlı çalıştığını gösterir.

Bu nedenle, Google ve Microsoft gibi birçok büyük şirketin, büyük sinir ağlarını eğitmek için GPU kümeleri yerine CPU kullanması nedeni budur. "

Yani bir noktada, bu yayına göre, CPU'ları kullanmak daha hızlı olabilirdi. Bu hala böyle mi?

2 EDIT: Evet, bu blog yazısı çok eski olabilir, çünkü:

Şimdi bir düğüm içindeki GPU'ların PCIe veri yolu üzerinden bağlandığı görülüyor, bu yüzden iletişim yaklaşık 6GiB / s'de gerçekleşebilir. (Örneğin: https://www.youtube.com/watch?v=el1iSlP1uOs , yaklaşık 35 dakika içinde). Hoparlör, bunun GPU1'den CPU'ya GPU2'ye geçmekten daha hızlı olduğunu belirtir. Bu, ağ kartının artık tıkanıklık olmadığı anlamına gelir.


Blog yazısı olan adam iyi puan getiriyor. Bütün gerekçelerini anlamadım. Ancak, Google, Facebook, Twitter ve akademik dünyadaki tüm önde gelen derin öğrenme gruplarının kodlarını öncelikle GPU’larda çalıştırmaları, bunun iyi bir fikir olduğunu göstermektedir.
Taraflı

Yanıtlar:


28

Diğer cevapların bazılarının aksine, GPU'lar hakkında ikinci bir düşünce olmadan sürekli eğitim almamaya şiddetle tavsiye ediyorum. Bu, verilerin çok zengin olduğu (örneğin, çok sayıda piksel = bir çok değişken) ve modelin benzer şekilde milyonlarca parametreye sahip olduğu görüntüler ve metinler üzerinde derin öğrenme yöntemlerinin kullanılması ile gerçekleştirilir. Diğer alanlar için bu böyle olmayabilir.

'Küçük' ile kastedilen nedir? Örneğin, 100 gizli üniteye sahip tek katmanlı bir MLP 'küçük' olur mu?

Evet, modern standartlara göre kesinlikle çok küçük. Eğitim için mükemmel bir GPU'nuz olmadığı sürece (örneğin NVIDIA 1080 veya NVIDIA Titan), CPU'nuzun daha hızlı olduğunu görünce şaşırmam.

Sinir ağınızın karmaşıklığının, yalnızca gizli katmanınızdaki birimlerin sayısına değil, giriş özelliklerinin sayısına da bağlı olduğunu unutmayın. Gizli katmanınızda 100 birim varsa ve veri kümenizdeki her gözlemde 4 giriş özelliği varsa, ağınız küçüktür (~ 400 parametre). Bunun yerine, her gözlem bazı tıbbi / biyoteknoloji bağlamlarında olduğu gibi 1M giriş özelliklerine sahipse, ağınız parametre sayısı açısından oldukça büyüktür. Cevabımın kalanı için, oldukça az sayıda giriş özelliğine sahip olduğunuzu farz ediyorum pr. gözlem.

CPU ve GPU performansını karşılaştırırken bulduğum iyi bir örnek, takviye öğrenmeyi kullanarak bir poker botu yetiştirdiğim zamandı. Takviye öğrenmesi için genellikle sinir ağınızdaki birçok katmanı istemiyorsunuz ve sadece birkaç parametreye sahip birkaç katmana ihtiyacımız olduğunu gördük. Ayrıca, giriş özelliklerinin sayısı oldukça düşüktü. Başlangıçta bir GPU (NVIDIA Titan) eğitimi aldım, ancak takviye öğrenmenin çok fazla yineleme gerektirdiği için uzun zaman alıyordu. Neyse ki, CPU'mdaki eğitimin eğitimimin 10 kat daha hızlı geçmesini sağladığımı gördüm! Bu sadece CPU'nun bazen eğitim için daha iyi olabileceğini söylemek içindir.

CPU veya GPU'da eğitim alıp almayacağınıza karar verirken göz önünde bulundurulması gereken başka kriterler var mı?

GPU’da her zaman parti büyüklüğünüzü artırarak tüm GPU belleğini doldurmak isteyeceğinizi, CPU’da böyle olmadığını not etmek önemlidir. CPU üzerinde parti büyüklüğündeki bir artış pr süresini artıracaktır. Toplu. Bu nedenle, çok büyük bir parti boyutuna sahip olmanız (örneğin, çok gürültülü bir sinyal nedeniyle) sizin için önemliyse, bir GPU kullanmak faydalı olabilir. Ancak bunu pratikte tecrübe etmedim ve normalde küçük parti boyutları tercih edilir.


Teşekkür ederim @pir! Daha fazla okuyabileceğim özel referanslarınız var mı?
StatsSorceress

Ağınızın karşılaştırmanın çok küçük olduğunu görmek ve karşılaştırmak için örneğin VGG'nin parametre sayısını kolayca bulabilirsiniz.
pir

3
Küçük ağlarda çok fazla CPU / GPU karşılaştırması görmedim, çünkü büyük şirketler ve araştırma laboratuvarlarının ilgilendiği şey bu değil.
pir

@StatsSorceress Kendi başınıza test etmek istiyorsanız, neden sadece basit bir Keras MLP kurulumu ve GPU ile CPU üzerindeki performansı test etmiyorsunuz? Ayrıca güncellenmiş cevabım wrt. ağınızın boyutu.
pir

5

İşlemci şubenin yöneticisidir, her şeyden biraz yapabilir, ancak görevlendirme işlemleri dışında pek iyi değildir. Ancak, GPU makinenizde saklanan özel bir matematikçidir. Herhangi bir matematik ağır işlem yapıyorsanız, GPU'nuzu kullanmalısınız. Her zaman.

Python veya MATLAB gibi makine öğrenimi için herhangi bir popüler programlama dili kullanıyorsanız, işlemlerin GPU'nuzda çalışmasını istediğinizi size söyleyen tek bir kod satırıdır.

Makinenizin tüm çekirdeklerini de kullandığınızdan emin olmalısınız. Bu paralel hesaplamanın kullanılması demektir. Özellikle işlemlerin bağımsız olarak yapılabildiği sinir ağları için bu, hızınızı son derece artıracaktır.


4
Bazen GPU'ya veri aktarmanın genel yükünün paralellikten kaynaklanan hız artışını tamamen ortadan kaldırdığını buldum. GPU'ya gitmek her zaman iyi bir fikir değildir.
Adrian Keister

1
Bu, modelinizin karmaşıklığına bağlıdır. Basit bir K-NN eğitimi alıyorsanız, o zaman belki de buna değmez. Bununla birlikte, ters matris gerektiren herhangi bir modeli ya da birçok matris işlemine ihtiyaç duyan bir sinir ağını eğitiyorsanız, GPU'yu tercih etmek her zaman iyi bir fikirdir.
Jah,

1
@AdrianKeister Katılıyorum. Cevabımı almaya çalıştığım şey bu. OP tarafından belirtilen ağ için bu darboğaz olacaktır.
pir

1
100 gizli birim GPU'da makinemi kullanarak daha hızlı. İşlemcinin daha hızlı olması için çok az sayıda gizli üniteye ihtiyacım olacaktı. Dahası, eğitimimi her zaman gruplar halinde yapma eğilimindeyim. Bu durumda bir CPU'nun yeterince yoğun olan veriler göz önüne alındığında tıkanıklık olacağından şüpheliyim.
Jah,

3

İlk önce benzer sorulardan bazı alıntılara başvuracağım:

Matris işlemleri söz konusu olduğunda, iki kere düşünmezsiniz, her zaman GPU'ları tercih edersiniz. kaynak

Bir GPU'daki paralel mimari, vektör ve matris işlemleri için iyi uyarlanmıştır. kaynak

Dolayısıyla, bu soruları okursanız, duruma bakılmaksızın GPU kullanmanızı önerdiklerini göreceksiniz; her zaman biraz iyileşme sağlayacaktır.

'Küçük' ağların CPU ile eğitilmesi gerektiğini okumuş olmanızın nedeni, sadece küçük bir ağ için GPU eğitimi uygulamasının sadece CPU ile çalışmaktan daha fazla zaman alabilmesidir - bu GPU'nun daha yavaş olacağı anlamına gelmez.

100-gizli bir birim ağı biraz küçüktür , oradaki büyük derin ağlara göre küçük bir ağ olarak adlandırırım . Tekrarlayan mimariler (çoğunlukla) ileri beslemeli ağlardan daha fazla sinapslara sahiptir, bu nedenle 100 gizli birimler RNN 100 gizli bir birimlerden FFN'den daha büyüktür.


100 birimden oluşan tek bir gizli katmanı olan bir MLP'niz varsa, ağırlık paylaşımı nedeniyle 100 gizli birim içeren standart bir RNN ile aynı sayıda parametreye sahip olduğu doğru değil mi? Daha fazla “sinaps” var - daha fazla “aktivasyon” - ancak aynı sayıda parametre var, değil mi?
StatsSorceress

“Ağırlık” paylaşımı terimine aşina değilim. Aynı miktarda aktivasyona sahiptir, ancak daha fazla bağlantı yani daha fazla parametre ...
Thomas W

Ağırlık paylaşımı, RNN'deki bir gizli katmandan bir sonraki gizli katmana kadar olan ağırlık matrisinin aynı olduğu anlamına gelir; zaman içinde çoğaltılan aynı 'U' matrisidir. Ayrıca, girişten gizli katmana kadar olan ağırlıklar zaman içinde aynıdır.
StatsSorceress

@StatsSorceress matrislerle çalışmayı bilmiyorum. Evet, gizli bir katmandan diğerine ağırlık matrisi aynıdır. Bununla birlikte, toplamda daha fazla bağlantı vardır (çünkü bir katman PREVIOUS katmanına da bağlanabilir). Nasıl açıklayabileceğimden emin değilim, ancak bir RNN her zaman daha fazla bağlı katman olduğu için daha fazla parametreye sahip olacak ..
Thomas W

Evet, fiziksel olarak daha fazla parametre olduğunu anlıyorum, ancak bu parametrelerin çoğu aynı değeri alıyor; bu , bir MLP'de ve aynı sayıda giriş boyutuna sahip bir RNN'de ve aynı sayıda gizli boyutta olan bir RNN'deki etkin sayıda parametre anlamına gelir . aynı.
StatsSorceress
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.