Hesaplamaları matris çarpımı olarak ifade etmek neden daha hızlıdır?


18

Google'ın TensorFlow'u kullanan MNist eğitiminde , bir adımın bir matrisin bir vektörle çarpılmasına eşdeğer olduğu bir hesaplama gösterilir. Google önce, hesaplamayı gerçekleştirecek her sayısal çarpma ve eklemenin tam olarak yazıldığı bir resim gösterir. Daha sonra, hesaplamanın bu sürümünün daha hızlı olduğunu veya en azından daha hızlı olabileceğini iddia ederek bunun yerine matris çarpımı olarak ifade edildiği bir resim gösterirler:

Bunu denklemler olarak yazarsak:

skaler denklem

Bu işlemi bir matris çarpımına ve vektör eklemesine dönüştürerek "vektörleştirebiliriz". Bu, hesaplama verimliliği için yararlıdır. (Aynı zamanda düşünmenin de yararlı bir yoludur.)

vektör denklemi

Bunun gibi denklemlerin genellikle makine öğrenme uygulayıcıları tarafından matris çarpma formatında yazıldığını biliyorum ve elbette bunu kod tersliği veya matematiği anlamak açısından yapmanın avantajlarını görebiliyorum. Anlamadığım şey, Google'ın uzun el formundan matris formuna dönüştürmenin "hesaplama verimliliği için yararlı" iddiasıdır.

Hesaplamaları matris çarpımı olarak ifade ederek yazılımda performans iyileştirmelerini ne zaman, neden ve nasıl elde etmek mümkün olabilir? İkinci (matris tabanlı) görüntüdeki matris çarpımını kendim hesaplayacak olsaydım, bir insan olarak, bunu ilk (skaler) görüntüde gösterilen her bir farklı hesaplamayı sırayla yaparak yapardım. Bana göre, bunlar aynı hesaplama dizisi için iki gösterimden başka bir şey değildir. Bilgisayarım için neden farklı? Bir bilgisayar neden matris hesaplamasını skaler olandan daha hızlı yapabilir?

Yanıtlar:


19

Bu açık gibi görünebilir, ancak bilgisayarlar formüller yürütmez, kod yürütürler ve yürütmenin ne kadar sürdüğü doğrudan yürüttükleri koda ve yalnızca dolaylı olarak kodun uyguladığı kavramlara bağlıdır. İki mantıksal özdeş kod parçası çok farklı performans özelliklerine sahip olabilir. Matris çarpımında ortaya çıkması muhtemel bazı nedenler:

  • Birden çok iş parçacığı kullanma. Birden fazla çekirdeği olmayan, çoğu 8'e kadar olan modern bir CPU yoktur ve yüksek performanslı bilgi işlem için özel makineler çeşitli yuvalarda kolayca 64'e sahip olabilir. Kodu normal bir programlama dilinde açıkça yazmak , bunlardan sadece birini kullanır . Başka bir deyişle, üzerinde çalıştığı makinenin kullanılabilir bilgi işlem kaynaklarının % 2'sinden daha azını kullanabilir .
  • SIMD talimatlarını kullanarak (kafa karıştırıcı bir şekilde, buna "vektörleştirme" de denir, ancak söz konusu metindeki alıntılardan farklı bir anlamda). Özünde, 4 veya 8 veya benzeri skaler aritmetik talimatlar yerine, CPU'ya 4 veya 8 veya benzeri kayıtlarda paralel olarak aritmetik gerçekleştiren bir talimat verin . Bu kelimenin tam anlamıyla bazı hesaplamalar yapabilir (mükemmel bir şekilde bağımsız ve talimat seti için uygun olduklarında) 4 veya 8 kat daha hızlı.
  • Önbelleği daha akıllı kullanmak . Bellek erişimi geçici ve uzamsal olarak tutarlıysa , yani arka arkaya erişim yakın adreslere yapılır ve bir adrese iki kez eriştiğinizde, uzun bir duraklama yerine hızlı bir şekilde iki kez erişirsiniz.
  • GPU gibi hızlandırıcıları kullanma. Bu cihazlar CPU'lardan çok farklı hayvanlardır ve bunları verimli bir şekilde programlamak kendi başına bir sanat biçimidir. Örneğin, birkaç düzine çekirdekten oluşan gruplara ayrılan yüzlerce çekirdeğe sahipler ve bu gruplar kaynakları paylaşıyorlar - normal bellekten çok daha hızlı olan birkaç KiB belleği paylaşıyorlar ve grubun herhangi bir çekirdeği ifbu gruptaki diğer tüm kişilerin bunu beklemesi gerektiğini ifade eder.
  • Çalışmayı çok sayıda yeni baş ağrısına neden olan ancak elbette çok daha büyük bilgi işlem kaynaklarına erişebilen birkaç makineye dağıtın (süper bilgisayarlarda çok önemlidir!).
  • Daha akıllı algoritmalar. Matris çarpımı için, yukarıdaki hilelerle düzgün bir şekilde optimize edilmiş basit O (n ^ 3) algoritması, makul matris boyutları için genellikle alt-kübik olanlardan daha hızlıdır , ancak bazen kazanırlar. Seyrek matrisler gibi özel durumlar için özel algoritmalar yazabilirsiniz.

Birçok akıllı insan , yukarıdaki hileleri ve daha fazlasını kullanarak ve hatta aptal platforma özgü hilelerle bile, ortak lineer cebir işlemleri için çok verimli bir kod yazdı . Bu nedenle, formülünüzü bir matris çarpımına dönüştürmek ve daha sonra olgun bir lineer cebir kütüphanesine çağırarak bu hesaplamayı uygulamak bu optimizasyon çabasından yararlanır. Buna karşılık, formülü basit bir şekilde yüksek seviyeli bir dilde yazarsanız, sonunda üretilen makine kodu bu hilelerin tümünü kullanmaz ve o kadar hızlı olmaz. Bu, matris formülasyonunu alıp kendiniz yazdığınız saf bir matris çarpma rutini çağırarak (yine açık bir şekilde) uygularsanız da geçerlidir.

Kodu hızlı hale getirmek iş gerektirir ve performansın son onsunu istiyorsanız genellikle çok fazla iş gerektirir. Pek çok önemli hesaplama, birkaç lineer cebir işleminin kombinasyonu olarak ifade edilebildiğinden, bu işlemler için yüksek düzeyde optimize edilmiş kod oluşturmak ekonomiktir. Bir kerelik özel kullanım durumunuz? Sizden başka kimsenin umrunda değil, bu yüzden halkı optimize etmek ekonomik değil.


4

(seyrek) Matris-vektör çarpımı oldukça paralelleştirilebilir. Bu, verileriniz büyükse ve hizmetinizde bir sunucu çiftliğiniz varsa çok kullanışlıdır.

Bu, matrisi ve vektörü parçalara ayırabileceğiniz ve ayrı makinelerin bazı işleri yapmasına izin verebileceğiniz anlamına gelir. Sonra sonuçlarının bir kısmını birbirleriyle paylaşın ve ardından nihai sonucu alın.

Örneğinizde işlemler aşağıdaki gibi olacaktır

  1. ızgaradaki koordinatlarına göre her biri bir Wx, y tutan bir işlemci ızgarası oluşturun

  2. kaynak vektörü her sütun boyunca yayınla (maliyet O(log height))

  3. her işlemciyi yerel olarak çarpmaya (maliyet O(width of submatrix * heightof submatrix))

  4. bir toplam (maliyet O(log width)) kullanarak sonucu her satır boyunca daralt

Toplam sonlayıcı olduğu için bu son işlem geçerlidir.

Bu aynı zamanda yedekli yapıya olanak tanır ve tüm bilgileri tek bir makineye koymak zorunda kalmamanızı sağlar.

Grafiklerde gördüğünüz gibi küçük 4x4 matrisler için, cpu'nun bu işlemlerle başa çıkmak için özel talimatlar ve kayıtlar olması nedeniyle.


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.