Kavun notaları yiyin | Momenta Wang Jinwei: Derin öğrenmeyi daha verimli hale getirmek için iki bakış açısı

Konuşmacı: Wang Jinwei | Momenta'nın Ortağı

Qu Xin Kurgu ve bitirme

Qubit Üretildi | Genel Hesap QbitAI

1 Şubat akşamı, Qubit · Cuguashe ve Momenta, Chiguashe'nin beşinci aşamasını getirdi: Derin öğrenmenin daha verimli çalışmasını sağlayacak iki bakış açısı.

En iyi otonom sürüş şirketi olan Momenta, otonom sürüşü mümkün kılmak için derin öğrenme ortamı algısına, yüksek hassasiyetli haritalara ve karar verme teknolojisini yönlendirmeye dayalı otonom bir sürüş beyni oluşturmaya odaklanıyor.

Sunum yapan Wang Jinwei, bir özellik noktası konumlandırma uzmanı, derin öğrenme modeli hızlandırma uzmanı ve Momenta ortağıdır. O Hesaplama miktarını ve bellek erişimini optimize edin İki açıdan bakıldığında, hesaplama süresini kısaltmak ve çıkarım görevinin tamamlanmasını hızlandırmak için bir optimizasyon yöntemi önerilmiştir.

Okuyucuların isteği üzerine, Qubit heyecan verici içeriği şu şekilde düzenler:

Video oynatmayı paylaş

Temel arka plan

İlk önce anlaşılması gereken arka plandan bahsedin.

İlki Tavan Hattı Modeli. Bu Model, iki ana kaynak türünü kullanan bir bilgisayardaki bir uygulamayı ifade eder: aritmetik mantık birimlerinin hesaplama kaynakları ve belleğin bant genişliği kaynakları. Buradaki bilgi işlem kaynakları FLOPS cinsinden ifade edilir; bant genişliği kaynakları bayt / sn cinsinden ifade edilir.

Tavan hattı modeli ne anlama geliyor? Yatay eksen, FLOPS / bayt cinsinden hesaplanan yoğunluk olan Operasyonel Yoğunluktur; FLOPS'ta dikey eksen performanstır.

Şekilde bir çoklu çizgi vardır Bu çoklu çizgi başlangıçta hesaplama yoğunluğunun artmasıyla artar ve sonunda sabit bir performansta stabilize olur. Bunun anlamı: Bu uygulama programının hesaplama yoğunluğu belirli bir değerden büyük olduğunda, aritmetik mantık biriminin hesaplama miktarı ile sınırlı bir program haline gelecek; hesaplama yoğunluğu belirli bir değerin altında ise bellek bant genişliği ile sınırlı bir program haline gelecektir. .

Kesik çizginin bükülme noktası burada çok önemlidir. Bu bükülme noktası donanımla çok ilgilidir ve aslında donanımın teorik hesaplama gücü ile bellek bant genişliği arasındaki oranı temsil eder.

İki somut örnek vermek gerekirse, ilki matris çarpım matrisidir, C matrisi A'ya eşittir B ile çarpılır ve A ve B sırasıyla bin çarpı bin matrisleridir. Depolamanın ve hesaplamaların her ikisinin de float 32 bit ile temsil edildiğini varsayarsak, böyle bir hesaplama 1000 kere 1000 kere 1000 kayan nokta çarpma ve toplama, yani 2G FLOPS işlemi yapacaktır. A ve B'yi okuduktan sonra C'yi hesaplamalı ve geri yazmalıyız.Minimum bellek erişimi, 12 MB olan üç matrisin boyutudur.

Diğeri matris çarpım vektörü, yani matris A, vektör C'ye eşit olan B vektörüyle çarpılır. Boyut hala 1000 olduğunda, hesaplama miktarı 1000 çarpı 1000 kayan nokta çarpımı ve toplamı olan 2M'dir. Minimum bellek erişimi, 4MB olan 1000 kayan nokta sayısının yaklaşık 1000 katıdır.

Yukarıdaki matrisi çarpma işlemini net bir şekilde görebilirsiniz.Hesaplama hacmi 2G ve hafıza erişim hacmi 12M'dir.Daha sonra hesaplama hacmi az önce bahsedilen hesaplama yoğunluğu olan hafıza erişim hacmine bölünür, yani yaklaşık 200. Aşağıdaki matris ve vektörde, hesaplama miktarı 2M ve hafıza erişim miktarı 4M'dir.Daha sonra hesaplama miktarı hafıza erişim miktarına bölünerek sadece 0.5 civarındadır.Açık ki bu ikisi çok farklı programlardır.

Yukarıdaki matris çarpım matrisi, hesaplama miktarı ile sınırlandırılmış tipik bir programdır; aşağıdaki matris çarpım vektörü, bellek bant genişliği ile sınırlandırılmış tipik bir programdır.

Tanıtılacak diğer bir arka plan, bilgisayarın bellek mimarisi ve bellek hiyerarşisidir.

Bir bilgisayardaki CPU'nun hızı çok hızlıdır ve bellek genellikle buna ayak uyduramaz.Bu nedenle, CPU'nun kararlı bir şekilde çalışması için bellek birden fazla seviyeye bölünür.Üst seviye, en hızlı ve aynı zamanda en pahalı ve en küçük kapasiteli kayıttır. Bu aritmetik mantık birimi etrafında, doğrudan bu hesaplama talimatı ile kullanılabilir.

Bir sonraki seviye, hesap makinesinden çok daha büyük bir kapasiteye sahip olan önbellektir, ancak hız yaklaşık bir kat daha yavaştır ve gecikme yaklaşık bir kat daha yüksektir. Aşağıda, genellikle bellek olarak adlandırılan ana bellek yer almaktadır.Genellikle işlemcinin yongasının dışındadır ve çok büyük bir kapasiteye sahiptir.Gecikme, CPU'nun ana frekansından 100 kat daha düşük veya daha fazla olabilir. Esas olarak yukarıdaki üç şeye odaklanıyoruz: yazmaçlar, önbellek ve ana bellek.

Derin öğrenmeyle kullanılabilecek bazı tipik donanımları listeleyin: Nvidia'nın Tesla V100'ü , Şu anda en güçlü bilgi işlem kartıdır, TensorCore'a dayalı 120T FLOPS hesaplama performansı sağlayabilir. Ana bellek olarak HBM2'yi sağlayın, bant genişliği 900 GB / sn'dir, 20 MB yonga üzerinde paylaşılan depolama ve 16 MB yonga üzerinde önbellek, toplam 36 MB yonga üzerinde depolama.

Ortada NVIDIA'dan Xavier , Yakın zamanda piyasaya sürülen SoC, yaklaşık 30T bilgi işlem performansı sağlarken, LPDDR4'ü ana bellek olarak kullanırken, bant genişliği yaklaşık 137GB / s'dir.

Sağda bir Tipik gömülü cihaz: Raspberry Pi 3 Sıradan bir ARM yongası kullanıyor, 1.2G Hz'de çalışıyor ve en yüksek hesaplama gücü 38.4G FLOPS'tur. Aynı zamanda, bellek olarak yaklaşık 3.6GB / s bant genişliğine sahip LPDDR2 kullanıyor ve ayrıca 512KB yonga üzerinde önbelleğe sahip.

Bu üç donanımı karşılaştırırken, ister bilgi işlem performansı, bellek bant genişliği ve yonga üzerinde önbellek olsun, çok farklılar.

İki perspektif: hesaplama ve hafıza erişimi

Geçtik Hesaplama miktarı ile Bellek erişimi Derin öğrenme modelinin performansını değerlendirmek için.

Hesaplama miktarı, çok aşina olduğumuz bir performanstır, ancak genellikle bellek erişim miktarına daha az dikkat edilir. Aslında daha önce bahsettiğimiz şeye göre bellek erişiminin değeri modelin performansını çok ciddi şekilde etkileyecektir. Hesaplamayı basitleştirmek için, burada önbelleğin varlığını göz ardı ediyoruz, çünkü genellikle hızlandırılması gereken ürünler gömülü cihazlardır ve bu cihazdaki yonga üzerinde depolama nispeten küçüktür.

Fp32'nin hesaplama ve depolama birimi olarak kullanıldığını varsayarsak, modelin hesaplama miktarı ve bellek erişiminin yanı sıra hesaplama yoğunluğunu da hesaplayabiliriz. Buradaki bellek erişimini hesaplama kuralı şudur: her bir Operatör veya katman için, tüm giriş Tensörünü, tüm Tensör parametrelerini ve hafıza erişimi olarak çıkış Tensörünün toplam boyutunu hesaplayın.

Tabloda listelenen bellek erişimi aslında orijinal modelin sonucu değil, bazı optimizasyonların sonucudur. Bazı temel optimizasyon işlemlerinden daha sonra bahsedilecektir.

Önce bu tablonun dördüncü sütunundaki hesaplanan yoğunluk olan değere bakın. VGG 16, ResNet veya Inception gibi bazı büyük modeller, hepsi 30 veya 40 veya 50 sırasıyla çok büyük hesaplama yoğunluklarına sahiptir. Aslında, VGG 16'nın bellek erişiminin çoğu, son büyük, tamamen bağlı katman tarafından işgal edilmektedir. Tam bağlantıyı kaldırırsanız veya ResNet'te, önce ROI havuzlaması yapın ve ardından tam bağlantıya bağlanırsanız, bu tür bellek erişimi 170M'den 180M'ye düşecek ve hesaplama yoğunluğu çok büyük olacaktır.

Küçük modelde, genellikle, hesaplama miktarı çok küçük olmasına rağmen, bellek erişim miktarı büyük modelinkinden önemli ölçüde daha küçük değildir ve hesaplama yoğunluğunun önemli ölçüde daha küçük olacağını söylüyoruz. Örneğin ShuffleNet 0.5x, 3 grup kullandığında hesaplama yoğunluğu sadece 3.61'dir. 8 grup ise yani hesaplamalar daha fazla bölündüğünde hesaplama yoğunluğu sadece 2.91'dir.

Bu şu demek, Bu donanıma yerleştirilen küçük modeller, hesaplama miktarıyla sınırlı olmaktan ziyade, genellikle depolama bant genişliği ile sınırlıdır.

Başlangıç noktası olarak bu iki perspektiften yola çıkarak, halihazırda çok yaygın olan veya çok iyi kullanılan bazı derin öğrenme modellerinin hızlandırma yöntemlerine bakacağım.

Darboğaz

İlk yöntem darboğazdır. Darboğazın yapısından, GoogLeNet belgelerinde ve ResNet belgesinde bahsedilmektedir. ResNet belgesinde bir resim örneği burada verilmiştir. ResNet'te sadece 3x3 evrişim kullanıyoruz, 256 kanal girişi olacak ve sonra 256 kanal çıkışı olacak ve sonra kendimizle bir toplam yapıp bir relu geçireceğiz.

Bu hesaplanabilir: özellik haritasının soldaki yapıda 56 × 56 olduğunu varsayarsak, hesaplama miktarı yaklaşık 3,7G ve bellek erişim miktarı yaklaşık 8,8M'dir. Darboğaz yapısı kullanılırsa, yani 1x1 evrişime bölünür, kanal sayısı azaltılır ve ardından 3x3 evrişim gerçekleştirilir ve ardından kanal sayısı 1x1 evrişim ile geri yüklenir. Bu, yaklaşık 0.43G hesaplamaya ve yaklaşık 9.9M hafıza erişimine karşılık gelen sağdaki resimdir.

Yani böyle bir işlemden sonra hesaplama miktarı önemli ölçüde azaldı, neredeyse on kat daha fazla. Aynı zamanda, bellek erişim miktarı azalmadı, ancak arttı.

Darboğazın yapısını özetleyin: bellek erişim miktarı aynı kalırken veya biraz yükselirken hesaplama miktarını büyük ölçüde azaltın, böylece hesaplama yoğunluğu önemli ölçüde düşecektir.

Hesaplama miktarı açısından, modeli optimize etmenin çok iyi bir yoludur.

Derinlemesine evrişim

Diğer bir yöntem derinlemesine evrişimdir.

Örneğin, birkaç kanal çıkışının 3 × 3 evrişimi iki bölüme ayrılmıştır. İlk kısım derinliklidir, sadece uzamsal korelasyon yapar ve evrişim her kanalda bağımsız olarak gerçekleştirilir ve sadece bir kanal vardır. İkinci bölüm, yalnızca farklı kanallar arasında ilişki kuran noktasaldır. Böyle bir sökme işleminden sonra, Ayrıca, hesaplama miktarını büyük ölçüde azaltacak ve bellek erişim miktarını artıracak, böylece hesaplama yoğunluğu önemli ölçüde düşecektir.

Bu iki yapı neden hesaplama yoğunluğunda bir azalmaya yol açar?

Hesaplama yoğunluğu, algısal bakış açısından, yani bir sayıyı yüklemek için, onu kaç hesaplama için kullanabileceğimizle anlaşılır. Basit bir örnek olarak, 3x3 evrişimli bir çekirdek kullanıldığını varsayalım.Girişe bir nokta yüklediğimizde, bir çıktı kanalında (evrişim çekirdeği 3 × 3) 9 işlem gerçekleştirecek. Ancak 1 × 1 evrişim için 9 işlem bire indirgenmiştir. Derinlemesine evrişim için, tek bir evrişimin çıktı kanallarının sayısını 1'e düşürmeye eşdeğeriz.

Şimdi forma dönüp bakıyorum.

Az önce VGG16 hafıza erişiminin esas olarak son tam bağlantı tarafından kullanıldığından bahsetmiştik, kaldırılırsa hesaplama yoğunluğunun 160 civarında olduğunu düşünüyoruz. VGG16'nın hesaplama yoğunluğunun diğerlerine göre oldukça yüksek olduğu görülmektedir, çünkü yapısı çok basittir ve iç kısımları en yüksek hesaplama yoğunluğuna sahip yapıya ait 3 × 3 konvolüsyonlardır.

ResNet 152 veya ResNet 50 gibi bazı diğer modeller, az çok darboğaz getirdiği için hesaplama yoğunluğunda bir miktar düşüşe neden oldu. ResNet18'de herhangi bir darboğaz yapısı yoktur veya darboğaz yapısı da 3x3 evrişimle tamamlanır, bu nedenle hesaplama yoğunluğu nispeten yüksektir. Mobilenet ve Shufflenet, vb., İçlerinde büyük ölçekli 3 × 3 evrişim yoktur, yalnızca derinlemesine 3 × 3 evrişim ve 1 × 1 evrişim vardır.

Aslında ilk iki yöntem de çok iyi yöntemler ... Neden hesaplama yoğunluğunu azaltıyorlar ama aynı zamanda çok pratik yöntemler? Daha önce bahsettiğimiz üç tipik donanıma geri dönelim: Tesla V100, Xavier ve Raspberry Pi.

Raspberry Pi gibi tipik bir gömülü sinir ağı senaryosunda, küçük bir model gereklidir ve bellek bant genişliği kaynakları nispeten zengindir (Çatı Hattı Modelinin bükülme noktasının konumunu hatırlayın) Böyle bir cihazda GPU ile karşılaştırıldığında Hala çok değer var. Bu tür bir işlem, model performansını iyileştirmek için bazı bilgi işlem kaynakları karşılığında bellek bant genişliği kaynaklarını kullanır.

FFT / Winograd evrişim algoritması

Ardından aşağıdaki optimizasyondan söz ediyoruz: FFT / Winograd evrişim algoritması. Bu yöntemle önceki ikisi arasındaki fark nedir? Özellik haritasını ve evrişim çekirdeğini belirli bir doğrusal dönüşüm yoluyla başka bir alana dönüştürmeyi ifade eder.Uzamsal alandaki evrişim, bu alanda nokta nokta çarpma olur ve ardından sonucu başka bir doğrusal dönüşüm yoluyla uzamsal alana dönüştürür. . FFT evrişimi, özellik haritasını ve evrişim çekirdeğini işlemek için Fourier dönüşümünü kullanır ve ters Fourier sonuçları dönüştürür; Winograd evrişimi diğer doğrusal dönüşümleri kullanır.

Spesifik olarak, FFT, uzaysal anlamda bir gerçek sayıyı frekans alanındaki karmaşık bir sayıya dönüştürür ve son olarak karmaşık sayıyı nokta nokta çarparak bu frekansın karmaşık sayısını uzay alanındaki gerçek bir sayıya dönüştürür.

Winograd her zaman gerçek sayı alanında dönüşüyor . Aslında, FFT karmaşık sayı çarpımı gerektirdiğinden, özel bir komut desteği yoksa, simüle etmek için gerçek sayı çarpımını kullanması gerekir, gerçek sayının kayan nokta hesaplama miktarı fazla düşmeyebilir. Bu nedenle, FFT Winograd kadar pratik değildir.

Winograd / FFT dönüşümünün evrişim algoritmasını hesaplama ve bellek erişimi açısından analiz edin. Aslında, hesaplama miktarını büyük ölçüde azaltacaktır ve azaltılmış hesaplama miktarının değeri, görüntü bloğunun boyutuna göre belirlenir. Aynı zamanda, bellek erişimi üzerindeki etki önbellek kapasitesi ile ilişkilidir.İyi uygulanırsa, bellek erişimi büyük ölçüde artmaz, ancak belirli bir derecede doğruluk kaybı olacaktır.

FFT / Winograd dönüşümü, esasen hız için doğruluğu değiştiren bir yöntemdir.

FFT ve Winograd'ın değişikliklerini özetleyerek, aslında çok yüksek bir hızlanma sağlayabilir.Örneğin, Winograd dönüşümü 3x3 evrişim için 9 kata kadar hızlanma sağlayabilir, ancak doğruluk kaybı ciddi. Tabii ki, aslında o kadar kullanmıyoruz ve 6 kez kullanabiliriz, bu durumda doğruluk kaybı şu anda hala kabul edilebilir.

Diğer yöntemler

Diğer bazı yöntemleri kısaca listeleyin.

İlki seyrekliktir. Dezavantajı, mühendisliği uygulamanın zor olması, ince ayar gerektirmesi ve model araştırması ile dağıtım hızlandırmayı birbirinden ayırmanın kolay olmamasıdır. Ek olarak, seyrek matris işlemlerinin gerçek verimliliği genellikle yüksek değildir.

Peki mühendislikte nasıl çözülür? Yapılandırılmış seyreklik yoluyla, seyrek matris işlemlerinin etkisini en üst düzeye çıkarmak için seyrek matristeki 0'ların aynı sütun, aynı satır, belirli bloklar vb. Gibi belirli bir modelde görünmesini sağlamak için bazı yöntemler kullanılır.

Diğeri düşük hassasiyetli aritmetiktir. Özellikle, düşük hassasiyetli aritmetik, katlanarak azaltılmış bellek erişimi sağlamak için daha düşük bit genişliği kullanmak ve aynı zamanda bazı işlemcilerde performansı iki katına çıkarmaktır.

Örneğin, fp32 ile karşılaştırıldığında, fp16 yarı yarıya bit genişliğine sahiptir ve neredeyse hiç doğruluk kaybı yoktur; Int8, bit genişliğinin 1 / 4'ü fp32 ile karşılaştırıldığında, doğru şekilde nicemlemeden sonra neredeyse hiç doğruluk kaybı yoktur. Dezavantajı şu anda desteklenen donanımın fazla olmaması, yeni nesil ARM işlemcileri ve bazı NVIDIA GPU desteğidir.

Grafik seviyesi

Daha önce operatör seviyesinden bahsediyoruz.

Şimdi operatör seviyesinden grafik seviyesine çıkın ve hesaplamalı grafik kavramını tanıtın: hesaplamalı grafik. Özellikle, hesaplamalı grafik nedir? Belirli bir dilde bir hesaplama sürecini ifade etmektir.Örneğin, yukarıdaki C eşittir A çarpı B artı iki, bu da bir hesaplama grafiğine karşılık gelir Bu hesaplama grafiği, hesaplama sürecindeki veri akışını ve bağımlılıkları açıkça gösterir.

İlk olarak NNVM Derleyicisini tanıtın , Mxnet yazarları tarafından önerilen bir sinir ağının ara temsilidir. İki bölümden oluşur: NNVM ve TVM. NNVM, esas olarak grafik seviyesinde bir temsil yapar, Operatörü, düğümler ve düğümler arasındaki bağlantı ilişkisini temsil ederek bir hesaplama grafiğine bağlar ve ardından son çalıştırılabilir kodu oluşturmak için TVM aracılığıyla her düğümü optimize eder.

Bir diğer çok değerli çalışma da Nvidia tarafından başlatılan TensorRT'dir. , TensorRT, özellikle NVIDIA GPU'lar için bir sinir ağı dağıtım aracıdır. TensorRT'de yapılabilecek çok şey var ve Operator ve Tensor'un çok iyi bir füzyon operasyonu gerçekleştirilebilir. Momenta'nın sonraki araştırma ve geliştirme çalışmaları için çok değerli bir referans değeri sağlayan NNVM ve TensorRT'nin mevcut iki sonucu için çok teşekkür ederiz.

Operatör seviyesinden grafik seviyesine kadar daha aşağıya baktığımızda ne yapabiliriz. Operatör seviyesinin üstünde, darboğaz ve derinlemesine evrişim gibi önceki optimizasyon yöntemleriyle karşılaştırıldığında, yani grafiğin yapabilecekleri daha ilginç.

Örneğin, en soldaki mavi bağlantı ilişkisi caffe'de çok yaygın bir hesaplama sürecidir: bir evrişimi hesaplayın ve arkaya bir ReLU işlemi ekleyin. Analizden sonra, Önyargı ve ReLU ekleme işleminin nokta nokta gerçekleştirildiği görülebilir. Bu matris çarpımının kodunu tamamen değiştirebiliriz.Matris çarpımı bittikten sonra, önyargı ekleyin ve bir ReLU yapın. Matris çarpımının üç işlemi ve Eğilim ve ReLU tek bir işlemde birleştirilebilir.

BN veya scale and conv füzyonu, shuffle channel ve deepwise conv füzyonu, Momenta tarafından önerilen SENet'te Excitation ve conv füzyonu ve depolama adreslerinin makul tahsisi yoluyla concat ve slice'ın ortadan kaldırılması gibi gerçekleştirilebilecek birçok füzyon işlemi vardır.

Bu Operatörü neden entegre etmek istiyoruz? Çünkü düşük seviyeli hafızadan yüksek seviyeli hafızaya aktarımı azaltabilir. Örneğin, relu gemm ile birleşirse, birleştirilmezse, gemm ve relu hesaplanırken, en azından verilerin önbellekten kayda ve ardından önbelleğe geri taşınması gerekir. Entegrasyon için, onu yalnızca kasaya taşımanız ve ardından bir kez önbelleğe geri taşımanız gerekir. Verilerin taşınmasına ilişkin talimatlar ve gecikmeler maliyet tasarrufu sağlar.

Operatör ayrıntı düzeyi

Tartışmak istediğim başka bir kavram da Operatör ayrıntı düzeyi . Ayrıntı düzeyi, tartışmaya değer bir sorudur. İlk olarak, ayrıntı düzeyinin ne olduğunu tanımlayın: bir operatörün ne kadar karmaşık görevleri başarabileceği.

Örneğin, soldaki mavi olan, kaba taneli bir hesaplama grafiğidir.İlk olarak, içinde bir kanal bulunan bir Havuzlama yapın ve ardından içinde bir kanal bulunan Derinlemesine bir evrişim yapın. Mavi, büyük taneli bir işlemin hesaplama grafiğidir. İnce taneli bir işlem kullanılırsa, sağdaki görüntüye genişletilir. Sağdaki resme genişletildiğinde birçok avantajı olacaktır.

Her şeyden önce, hesaplama grafiği daha karmaşık hale gelecek ve her operatörün ayrıntı düzeyi daha ince olacaktır.Bu aynı zamanda, hesaplama grafiğinin optimize edicisine daha fazla ayrıntı göstereceğiniz anlamına gelir, böylece hesaplama grafiği optimize edicisi daha fazla ayrıntıya sahip olur. Optimizasyon için daha fazla alan. Örneğin, sağda, işlem yürütme sırasını makul bir şekilde seçerek, havuzlama ve derinlemesine dönüşüm arasındaki ana bellek erişimi mümkün olduğunca önlenebilir ve bellek bant genişliği üzerindeki baskı azaltılabilir.

Önceki örnek o kadar uygun değildir, ancak daha sezgiseldir. Başka bir örnek vermek gerekirse: bir evrişimi ve ardından bir evrişimi izledik Bu zamanda, evrişimin tanecikliği hala daha ince bölünebilir, ancak bu sefer onu kanal boyutunda değil, uzay boyutunda böleceğiz. Alt bölümlere ayırın.

Evrişim 2'nin çıktısını uzayda dilimleyebiliriz. Örneğin, Convolution 2 sonunda 16'ya 16 özellik haritası çıkarır ve ardından bunu çıktı olarak dört adet 8'e 8 özellik haritasına böleriz.

Böyle bir bölünme sayesinde, iri taneli evrişim sağda bir forma dönüştürülebilir.Bunlardan birden fazla, yani uzayda böyle bir blok vardır.Her blok, önceki örnekle aynı olan nihai sonucu hesaplar. nın-nin. Conv1Tile1 ve Conv2Tile1, Conv1Tile2 ve Conv2Tile2, veri alışverişleri, Dönüşüm1 ve Dönüşüm2 arasındaki önceki veri alışverişinden çok daha küçüktür. Sonuçta, uzamsal boyut daha küçüktür, yani önbellek onu yerleştirebilir, bu da daha az veri alışverişi anlamına gelir.

Ödediğimiz fiyat, Dönş1'in parçalarının üst üste gelip ek hesaplamalara neden olabilmesidir. Aynı zamanda, bu durumda ince ayar, hesaplama verimliliğinde bir düşüşe neden olabilir. Ancak benzer şekilde, op ve op arasında değiş tokuş edilen veriler azaltılır ve önbellek, ana belleğe erişimi önlemek ve bellek bant genişliği baskısını azaltmak için olabildiğince kullanılabilir.

ve bu yüzden Operatör granülerliği için bu, kaba bir tanecikliliğin iyi olması gerektiği veya ince bir tanecikliğin iyi olması gerektiği anlamına gelmez.Ayrıca, derin öğrenmenin performansını etkilerken, hem hesaplama miktarı hem de bellek erişim miktarı açısından da budur.

Bahsetmeye değer diğer bir kavram, hafif çalışma zamanıdır. TensorFlow veya NNVM olsun, hepsinin hafif bir şekli vardır. Örnek olarak NNVM'yi ele alırsak, daha önce bahsedilen optimizasyon sürecini görebilirsiniz.Örneğin, kaba taneli bir gösterim elde edersem, onu ince taneli olarak bölmeye mi karar veririm? Hangisinin daha yüksek performansa sahip olduğunu görmek için sökerek veya sökmeden test etmek için bazı buluşsal yöntemler kullanabilirsiniz.

Optimizasyon süreci aslında oldukça zahmetli bir süreçtir, daha karmaşık olacaktır, ancak aslında statik bir hesaplama grafiği elde edersek, grafiğin ve operatörün optimizasyon sürecinin girdi verileriyle hiçbir ilgisi yoktur, bu nedenle optimizasyon süreci modelden tamamen değiştirilebilir. Aktüatör (çalışma süresi) bağımsız bir parça olarak dışarı çekilir. Karmaşık bir optimizasyon sürecinden sonra, hesaplama grafiğindeki her düğüm orijinalinden farklı olabilir, ancak yürütme performansı gerçekten de orijinalinden daha iyidir.

Hafif bir çalışma zamanının faydaları nelerdir? Yalnızca çalışma zamanında kullanılan operatörü sağlaması gerekir ve optimizasyondan sorumlu olması gerekmez, bu nedenle çok hafif olabilir ve aynı zamanda optimizasyondan sonra karmaşık hale gelebilecek hesaplama grafiği çok fazla ek yük getirmez.

Son olarak Momenta'nın yukarıda bahsettiğimiz yöntemlerle yapmış olduğu hızlanma efektlerinden bazılarını listeleyeyim.Burada Raspberry Pi 3'ü korteks A53, 1.2G Hz ile test olarak kullanıyoruz ve tüm testler bir CPU çekirdeği üzerinde yapılıyor. .

sonuç olarak

Daha önce bahsedilen derin öğrenme modelinin performans hesaplama optimizasyonunu özetleyin.

İki perspektif sunuyoruz: Yaygın olarak kullanılan hesaplama perspektifine ek olarak, diğeri hafıza erişim perspektifidir. Hesaplama miktarı, darboğaz ve derinlemesine evrişim gibi ağ yapısı tasarımı aracılığıyla optimize edilebilir. Hesaplama miktarı ayrıca Winograd, seyreklik ve düşük hassasiyetli aritmetik yoluyla optimize edilebilir. Bununla birlikte, düşük hassasiyetli işlem, hesaplama miktarını optimize etmek değil, cihazın sağlayabileceği hesaplama miktarının üst sınırını optimize etmektir.Aynı zamanda, hafıza erişim miktarı, düşük hassasiyetli aritmetik ve hesaplama grafiği optimizasyonu yoluyla da optimize edilebilir.

Son nokta, derleme ek yükünden kaçınmak ve dağıtım sırasında daha karmaşık bir modeli optimize etmek gibi çalışma süresini hafifleterek bazı ek yüklerden kaçınılabileceğidir.

QA

Hafıza erişimi nasıl tahmin edilir?

Daha önce bahsedildiği gibi, bellek erişiminin tahmini, her katmanı hesaplamaktır Her katmanın bellek erişimi, girdi, çıktı ve ağırlığının toplamıdır. Tahmin edildiğinde, aslında durum olan gerçek hafıza erişiminden oldukça farklı olabilir.

Burada bahsettiğimiz hesaplama süreci, önbelleğin varlığını göz ardı ediyor.Bunun nedeni, genellikle yukarıda bahsedilen Raspberry Pi gibi gömülü platformlar gibi derin öğrenme performansı için bazı platformları kesinlikle optimize etmemiz gerektiğidir. , Toplam 512K yonga üzerinde depolama ve aynı anda dört CPU çekirdeğine sahiptir.Sadece bir CPU çekirdeği kullanılıyorsa, yalnızca 128K önbellek işgal edebilir. Daha fazla yer kaplarsa, diğer çekirdekler zarar görür.Sonra 128K önbellek olabilir Ne kaydedilecek? 256 kanaldan oluşan bir özellik haritası ve ardından kayan noktalı sayı depolaması, yalnızca toplam 128 noktayı depolayabilir, ki bu aslında çok çok küçüktür.

Bu nedenle, genellikle gömülü senaryoda, çip üzerindeki önbelleği çoğu durumda yeterli değildir. Çip üstü önbelleği görmezden gelmek için bir yöntem benimsedik, çünkü yonga üzerindeki bellek erişimi yeterli olmadığında, bir dahaki sefere onu son kez okumanızın sıkışıp kaldığı anlamına gelir, yani aslında her zaman okuyorsunuz. Ana hafıza süreci. Ek olarak, bu yonga üzerindeki önbelleği görmezden gelmenin de şu amacı vardır: tahmini kolaylaştırmak. Aslında, bellek erişimini optimize etmek için yonga üzerinde önbellek kullanan birçok işlemden bahsettik. O zaman artık bu şekilde tahmin yapılamaz.

Bazı açık kaynak kütüphaneleri var, bu optimizasyonlara yine de dikkat etmemiz gerekiyor mu?

Aslında durum böyledir, mesela daha önce bahsettiğim optimizasyonlar Örneğin, bu hesaplama grafik seviyesi optimizasyonu. Aslında NNVM bazılarını yaptı ama aşırıya ulaşmadı.Hala optimize edilebileceğini düşündüğümüz birçok alan var. Ve sağlamadı. Elbette, NNVM herkesin koda katkıda bulunabileceği ve böyle bir açık kaynak topluluk kavramı oluşturabileceği böyle bir platform oluşturmak olabilir. Elbette, en yüksek performansı elde etmek istiyorsanız, bazen yine de böyle bir optimizasyon yöntemine dikkat etmeniz gerekir.

Kendimizi optimize etmek zorunda olmamızın nedeni, açık kaynak çerçevelerinin ve araçlarının iyi kavramlar ve referans anlamlar sağlamasıdır.Kavramlar aslında birbiriyle bağlantılıdır, ancak kendi uygulamamız genellikle daha iyidir. Sonuçta, bazen sektörde en üst düzeyde performansın peşinden gitmek gerekir.

Operatör füzyon yöntemi caffe veya TensorFlow çerçeve düzeyinde yapılabilir mi?

Caffe'yi tavsiye etmiyorum.Eğer operatörü entegre etmek istiyorsanız, çerçevenin kendisinin hesaplamalı grafikler temelinde oluşturulmasına ihtiyacınız var ve caffe değil. Caffe, operatörleri, hesaplama grafiğinin topolojik sıralama sonucuna eşdeğer olan yürütme sırasına göre bir dizi halinde düzenler. Bu çerçevede operatör entegrasyonu yapmak çok zahmetli ve veri bağımlılıklarını analiz etmek için bir hesaplama grafiğine geri yüklenmesi gerekiyor. TensorFlow'un kendisi grafikleri hesaplamak için bir çerçevedir.Elbette böyle bir şey yapabilir, ancak TensorFlow'un kendisi de bir alt katman önerir: XLA. Bu XLA aslında benzer şeyler yapıyor. Aslında, TensorFlow'un kendisinin aslında bazı benzer işlemler sağladığı anlamına gelir.

- Bitiş -

Samimi işe alım

Qubit, editörleri / muhabirleri işe alıyor ve merkezi Pekin, Zhongguancun'da bulunuyor. Yetenekli ve hevesli öğrencilerin bize katılmasını dört gözle bekliyoruz! Ayrıntılar için, lütfen QbitAI diyalog arayüzünde "işe alım" kelimesiyle yanıt verin.

Qubit QbitAI · Toutiao İmzalama Yazarı

' ' Yapay zeka teknolojisi ve ürünlerindeki yeni eğilimleri takip edin

Asfalt sönümlemesiz DS'yi düşünür müsünüz? DS, güven planının yukarı doğru mantığını zorluyor
önceki
İlk beş Hollanda şampiyonası takımının kapıları bu Asyalı forvet tarafından kırıldı.
Sonraki
Da Kui oyunun gereksinimlerini karşılar! Cui Kangxi, Lianjin savaşının anahtarını kabul ediyor, "küçük kaplan" ilk kazanan
2018'in en iyi 8 oyununa göz atın! "Garip Av Dünyası" 1 Numara ve Çin'in listede 2 modeli var!
Dongfeng Honda Çifte Mutluluk, CR-V 15 yılda 1.8 milyon kırdı, Chongqing Hanxin açılıyor
Bir zafer bulmak zor! Shen Xiangfu: Evde 1 puan susuzluğumu gidermiyor ama umut görüyorum
Blizzard'ın en akıllı kararı! Bir hamle World of Warcraft'ı zirveye getirdi ve eski oyuncular geri döndü!
Dağ şehrini ziyaret etmek için sınırı açın, bu "özel olarak tedarik edilen Ford" Chongqing halkının "hey düz" hissetmesini sağlar
Wenger hala Topçulara en kötü rekoru kırmayı umuyor ama ilk dördü çok az umut veriyor
Jiao Yanfeng, Zheng Long ile röportaj yaptı: İdol Hao Haidong, özellikle Evergrande'yi kazanmak istiyorum! TEDA'yı kaldır
Başarılı hırsızlık! EDG arka arkaya 2 oyun kazandı ve grupta geçici olarak birinci oldu. Oyuncular: Hepsi beni yumrukladı!
Ningbo'da çekilmiş, yeni Geely Boyue'ye benziyor
Central Plains derbisi, Jianye Expedition hayranları için acı çekerek ertelendi! Li Tie doğru bir şekilde konuşuyor: Utanıyorum!
Berkeley'in yeni araştırması: Robotlar, bir kez öğrendiklerinde insan eylemlerini taklit edebilir, aynı zamanda başka şeylerden de öğrenebilirler.
To Top