盤點:GPU加速的神經網絡與JavaScript的交叉

2020-12-04 IT168

【IT168 編譯】根據Github Octoverse 2017的報告,JavaScript是Github上最流行的語言。根據拉取請求的數量來衡量,JavaScript的活躍度與Python、Java和Go之和相當。

JavaScript已經徵服了網絡,並「滲入」了伺服器、移動端、桌面和其他平臺。

與此同時,GPU加速的使用已經遠遠超出了計算機圖形領域,現在已經成為機器學習的一個必需組成部分。

訓練神經網絡與深層架構是一個計算密集型過程,在機器智能領域帶來了許多重要的先進結果。

本文著眼於這些趨勢的不斷融合,並提供了將GPU加速的神經網絡引入到JavaScript世界的一些項目的概述。

概述

下面列出的所有項目都是受到了積極維護的,在Github上有數千顆星,而且在NPM或CDN上也有分布。

它們都是通過WebGL在瀏覽器中實現GPU加速,如果不存在合適的顯卡則可以退回到CPU。

本概述中不包括那些旨在運行現有模型的庫(特別是那些使用Python框架訓練的模型)。

最後,四個項目榜上有名。

雖然它的特性集面向神經網絡,但deeplearn.js可以被描述為通用機器學習框架。Propel是一個提供自動微分的科學計算的庫。Gpu.js提供了一種方便的方式來運行GPU上的JavaScript函數。Brain.js是舊的神經網絡庫的延續,並使用Gpu.js硬體加速。

Deeplearn.js

Deeplearn.js是這四個中最受歡迎的項目,被描述為「用於機器智能的硬體加速JavaScript庫」。它由谷歌大腦團隊和超過50個貢獻者組成的社區提供支持。兩位主要作者是Daniel Smilkov和Nikhil Thorat。

import * as dl from 'deeplearn'

const xs = inputXs.as4D(-1, IMAGE_HEIGHT, IMAGE_WIDTH, 1)

const conv1Weights = dl.variable(

dl.randomNormal([FILTER_HEIGHT, FILTER_WIDTH, 1, NUMBER_FILTERS], 0, 0.1) as dl.Tensor4D)

const layer1 = dl.tidy(() => {

return xs.conv2d(conv1Weights, 1, 'same')

.relu()

.maxPool([2, 2], STRIDES, PADDING)

})

在deeplearn.js中定義卷積層

在TypeScript中編寫,且仿照Tensorflow,deeplearn.js支持谷歌大腦的旗艦開源項目中所提供功能的日益增長的部分。API有三個部分。

第一部分介紹了用於創建、初始化和轉換張量的函數,即用於保存數據的類似數組的結構。

API的下一部分提供了在張量上執行的操作。這包括基本的數學運算,還原,歸一化和卷積。在這一點上,對遞歸神經網絡的支持是不成熟的,但它包含了大量的長短期記憶網絡細胞。

第三部分圍繞模型訓練展開。所有流行的優化器,從隨機梯度下降(SGD)到Adam都包括在內。另一方面,交叉熵損失函數是文獻中提到的唯一損失函數。

API的其餘部分用於設置環境和管理資源。

node.js上的實驗GPU加速,可以通過headless-gl實現。

該項目網站有許多令人難忘的演示。其中包括由一個由遞歸神經網絡生成的鋼琴表演,一個建立模型的視覺界面和一個基於SqueezeNet(一個參數相對較少的圖像分類器)的網絡攝像頭應用。

PropelJS

PropelJS被描述為「JavaScript的可微分編程」。主要作者是Ryan Dahl和Bert Belder,其工作得到了11位社區貢獻者的補充。

import * as pr from "propel"

export async function train(maxSteps = 0) {

const ds = pr.dataset("mnist/train").batch(128).repeat(100)

const exp = await pr.experiment("exp001")

for (const batchPromise of ds) {

const { images, labels } = await batchPromise

exp.sgd({ lr: 0.01 }, (params) =>

images.rescale([0, 255], [-1, 1])

.linear("L1", params, 200).relu()

.linear("L2", params, 100).relu()

.linear("L3", params, 10)

.softmaxLoss(labels))

if (maxSteps && exp.step >= maxSteps) break

}

}

一種前饋神經網絡,它有三個層次的訓練,在MNIST數據集上進行了訓練

自動微分(AD)是這個項目的核心,使我們不必手動指定衍生品。對於一個給定的函數f(x)定義了受支持的張量操作,梯度函數可以用grad來得到。多變量案例由multigrad覆蓋。

除了AD之外,項目的方向似乎並不完全清楚。雖然在網站上提到了「類似numpy 的基礎架構」作為目標,但是API在「繁重的開發」下,包括與神經網絡和計算機視覺相關的功能。使用load函數,可以解析npy文件的內容並作為張量使用。

在瀏覽器環境中,PropelJS使用了deeplearn.js中的WebGL功能。對於節點的GPU加速,項目使用了TensorFlow的C API。

gpu.js

雖然筆者常用的是CUDA而不是WebGL,但可以證明GPU編程的耗時性。因此,當筆者遇到gpu.js時,感到非常驚喜。Github上大約有5700顆星,這個項目有有18個貢獻者,其受歡迎程度可以與deeplearn.js媲美。隨著時間的推移,有幾個人做出了巨大的貢獻。Robert Plummer是主要作者。

import GPU from 'gpu.js'

const gpu = new GPU()

const multiplyMatrix = gpu.createKernel(function(a, b) {

var sum = 0;

for (var i = 0; i < 512; i++) {

sum += a[this.thread.y][i] * b[i][this.thread.x];

}

return sum;

}).setOutput([512, 512])

通過gpu.js實現矩陣乘法:在GPU編程中Hello World是等同的

一個內核,在當前上下文中,是在GPU上執行的函數,而不是CPU。通過gpu.js,內核可以在JavaScript的一個子集中編寫。然後編譯代碼並在GPU上運行。Node.js通過OpenCL的支持已經在幾個星期前增加了。

數字和數字數組的三個維度被用作輸入和輸出。除了基本的數學運算,gpu.js支持局部變量、循環和if/else語句。

為了使代碼重用和允許更模塊化的設計,可以在內核代碼中註冊和使用自定義函數。

在內核的JavaScript定義中,該對象提供了線程標識符,並持有在實際內核中保持不變的值,但在外部是動態的。

該項目專門研究加速JavaScript函數,並沒有嘗試提供一個神經網絡框架。為此,我們可以轉向一個取決於gpu.js的庫。

Brain.js

Brain.js是harthur/brain的繼承者,後者是一個可以追溯到2010年的歷史內容庫。

import brain from 'brain.js'

const network = new brain.recurrent.RNN()

const data = [

{input: [0, 0], output: [0]},

{input: [0, 1], output: [1]},

{input: [1, 0], output: [1]},

{input: [1, 1], output: [0]}

]

network.train(data)

總共有近30個人參與了這兩個內容庫。

對GPU加速的神經網絡的支持基於gpu.js,而且,可以說,這是該項目近期最重要的進展。

除了前饋網絡,Brain.js包括三種重要類型的遞歸神經網絡的實現:經典Elman網絡,長短期記憶網絡,以及最近的有門控的周期性單元的網絡。

主頁上顯示了一個學習顏色對比偏好的神經網絡。在原始碼中可以找到另外兩個演示,其中一個涉及到使用ASCII符號繪製的字符。

機器學習加速JavaScript庫的出現有幾個有趣的含義。

在線課程可以將與機器學習或GPU計算相關的練習直接融入到web應用程式中。學生不必在不同的作業系統和軟體版本之間建立單獨的開發環境。

基於神經網絡的許多演示可以更輕鬆地部署,不再需要伺服器端API。

對機器學習感興趣的JavaScript開發人員可以充分利用他們的專業技能,在集成問題上花費更少的時間。

此外,客戶端可用的計算資源可能更有效地使用。畢竟,並不是所有的顯卡都被用於虛擬實境和加密貨幣的挖掘。

要說明的是,筆者並不提倡將本文中提到的庫用於關鍵任務的神經網絡。Python的生態系統仍然是大多數應用程式的首選。

然而令人鼓舞的是,過去12個月裡取得了明顯的進展。Deeplearn.js在一年前並不存在。Gpu.js的活躍水平相對較低,Brain.js不支持GPU加速。

隨著時間的推移,這些項目將在某些方面與已建立的框架相競爭,並在某些最適合JavaScript的全新應用程式中使用。

相關焦點

  • GoogLeNet神經網絡的複雜交叉路口識別方法
    由圖9可知GoogLeNet神經網絡模型對於複雜交叉路口樣本測試集的最終分類loss值為0.0756,accuracy值為0.9652,同時可以看出該神經網絡模型在訓練過程中基本上得到了很好的收斂。GoogLeNet網絡模型對路網中複雜交叉路口的識別準確值accuracy為0.9652,所以說明GoogLeNet網絡模型對複雜交叉路口的深層次模糊特徵能夠進行有效的學習。
  • 生物電子-具有交叉模式整合和識別的生物啟發式多感覺神經網絡
    視覺,觸覺,聽覺,嗅覺和味覺在人類多感覺神經網絡中的集成和交互作用促進了高級認知功能,例如跨模態集成,識別和想像力,以準確評估和全面理解多模態世界
  • 代碼詳解:用Pytorch訓練快速神經網絡的9個技巧
    如果市面上有99個加速指南,但你可能只看過1個?(沒錯,就是這樣)。但這份終極指南,會一步步教你清除模型中所有的(GP模型)。不要讓你的神經網絡變成這樣。(圖片來源:Monsters U)這份指南的介紹從簡單到複雜,一直介紹到你可以完成的大多數PITA修改,以充分利用你的網絡。
  • 四大深度學習框架+四類GPU+七種神經網絡:交叉性能評測
    第一個評測對比不同 GPU 在不同神經網絡和深度學習框架下的表現。這是一個標準測試,可以在給定 GPU 和架構的情況下幫助我們選擇合適的框架。第二個測試則對比每個 GPU 在不同深度學習框架訓練時的 mini-batch 效率。根據以往經驗,更大的 mini-batch 意味著更高的模型訓練效率,儘管有時會出現例外。
  • 深度卷積神經網絡CNNs的多GPU並行框架 及其在圖像識別的應用
    將深度卷積神經網絡(Convolutional Neural Networks, 簡稱CNNs)用於圖像識別在研究領域吸引著越來越多目光。由於卷積神經網絡結構非常適合模型並行的訓練,因此以模型並行+數據並行的方式來加速Deep CNNs訓練,可預期取得較大收穫。
  • 神經記憶網絡技術白皮書NMN
    《神經記憶網絡技術白皮書》——基於仿生學原理的分布式數據分類、傳遞和存儲解決方案神經記憶網絡來源:origin仿生學原理仿生學(Bionics)是研究生物系統的結構、性狀、原理、行為,為工程技術提供新的設計思想、工作原理和系統構成的技術科學,是一門生命科學、物質科學、數學與力學、信息科學、工程技術以及系統科學等學科的交叉學科
  • 清華制人工神經網絡晶片,能效比GPU高兩個數量級
    (原標題:清華用憶阻器制人工神經網絡晶片,能效比GPU高兩個數量級)
  • 中科院計算所提出圖神經網絡加速晶片設計
    圖神經網絡加速晶片之後有望成為主流的機器學習晶片。近日,《中國計算機學會通訊》(CCCF)刊發了中科院計算所特別研究助理嚴明玉、研究員範東睿以及研究員葉笑春,共同撰寫的綜述文章《圖神經網絡加速晶片:人工智慧「認知智能」階段起飛的推進劑》。
  • 深度卷積神經網絡CNNs的多GPU並行框架及其應用
    如圖7所示,描述了將模型按「十字形」劃分到4 Worker上訓練的情景,不僅拆分了模型的可並行部分,也雖然這樣的劃分在Worker 0和Worker2之間,Worker 1和Worker 3之間達到並行加速效果,卻能使得整個模型得以存儲在4 GPU上。這種模型劃分方法能夠適用於訓練超大規模網絡等特殊模型的需求。
  • 七天學會javascript第一天javascript介紹
    javascript介紹javascript數據類型javascript運算符javascript對象javascript Date對象javascript String對象JavaScript常用於實現一些前端效果。前些年流行的flash已經慢慢的被淘汰,js盛行起來。javascript :客戶端編程。javascript是由客戶端去解釋運行的。
  • 亞馬遜加持,英偉達A100 GPU將無人匹敵?
    亞馬遜網絡服務(AWS)在10年前的NVIDIA M2050中首次啟動了GPU實例。單個NVIDIA DGX A100系統(帶有8個A100 gpu)在某些AI應用上可以提供與近1000臺雙插槽CPU伺服器相同的性能。 英偉達負責加速計算的副總裁伊恩 巴克(Ian Buck)在公布基準業績後表示:「每個行業都在尋求更好的方式,應用人工智慧來提供新的服務,並擴大業務,我們正處於一個歷史的轉折點。」
  • 基於憶阻器的神經網絡應用研究
    不難看出,在多層感知機神經網絡的計算過程中,輸入信息向量與權重矩陣之間的矩陣向量乘法運算消耗了大量計算資源,因而利用憶阻交叉陣列並行一步實現矩陣向量乘法計算,可以大大減少硬體化神經網絡的能耗。在基於憶阻突觸器件的多層感知機應用中,憶阻交叉陣列被用來存儲突觸權重矩陣,每一個交叉點處的憶阻器的電導值被用來表示一個突觸連接的權重值[40-42]。
  • 如何用張量分解加速深層神經網絡?(附代碼)
    完全不同的是,張量分解的辦法只用到層的權重,假設網絡層是參數化的,它的權重能夠用一個矩陣或者是一個低秩的張量來表示。這意味這個它們在參數化的網絡下效果最佳。像VGG神經網絡設計為完全參數化的。另外一個關於參數化模型的例子是使用更少的類別對網絡進行微調以實現更簡單的任務。和裁剪(pruning)相似,分解之後通過模型需要微調來恢復準確性。
  • 基於憶阻器的神經網絡應用研究
    不難看出,在多層感知機神經網絡的計算過程中,輸入信息向量與權重矩陣之間的矩陣向量乘法運算消耗了大量計算資源,因而利用憶阻交叉陣列並行一步實現矩陣向量乘法計算,可以大大減少硬體化神經網絡的能耗。在基於憶阻突觸器件的多層感知機應用中,憶阻交叉陣列被用來存儲突觸權重矩陣,每一個交叉點處的憶阻器的電導值被用來表示一個突觸連接的權重值[40-42]。
  • 在AWS上使用GPU實現分布式神經網絡
    然而,我們不會詳細說明我們如何使用人工神經元網絡的變量實現個性化,因為它現在還在研究階段。 許多研究人員指出,大部分流行的深度學習算法技術已經為大家熟知和了解。最近這一領域的革新已經能讓這些技術能夠實際應用,包括設計和實現的架構,可以在合理的資源和時間的情況下執行這些技術。第一個大規模深度學習成功實例是連續幾天使用1000臺機器的16000個CPU內核訓練一個神經網絡。
  • 亞馬遜開源神經機器翻譯框架Sockeye:基於Apache MXNet的NMT平臺
    近來,深度神經網絡(DNN)顯著提升了這些模型的性能。Sockeye 同時提供了一個當前最優的神經機器翻譯(NMT)模型的實現和一個開展 NMT 研究的平臺。Sockeye 是一個基於 Apache MXNet 的快速而可擴展的深度學習庫。Sockeye 代碼庫具有來自 MXNet 的獨特優勢。
  • 中科院計算所研究人員再獲進展 向圖神經網絡加速時代再進一步
    中新網北京1月9日電 (記者 張素)「『HyGCN』寓意向圖神經網絡的加速說『Hi』,也寓意圖神經網絡加速的時代即將開啟。」中國科學院計算技術研究所特別研究助理嚴明玉近日在受訪時說。「GCN」即圖卷積神經網絡的英文縮寫,這是圖神經網絡的一個分支。
  • 環信人工智慧專家李理:詳解卷積神經網絡
    接下來介紹一種非常重要的神經網絡——卷積神經網絡。這種神經網絡在計算機視覺領域取得了重大的成功,而且在自然語言處理等其它領域也有很好的應用。 前面的話 如果讀者自己嘗試了上一部分的代碼,調過3層和5層全連接的神經網絡的參數,我們會發現神經網絡的層數越多,參數(超參數)就越難調。但是如果參數調得好,深的網絡的效果確實比較淺的好(這也是為什麼我們要搞深度學習的原因)。所以深度學習有這樣的說法:「三個 bound 不如一個 heuristic,三個 heuristic 不如一個trick」。
  • 機器學習算法盤點:人工神經網絡、深度學習
    機器學習算法盤點:人工神經網絡、深度學習 佚名 發表於 2016-08-01 16:26:33   機器學習無疑是當前數據分析領域的一個熱點內容。很多人在平時的工作中都或多或少會用到機器學習的算法。
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    TensorFlow框架儘管意義非凡,引起極大關注和神經網絡學習風潮,但對一般開發者用戶太不友好。軟體開發者畢竟不是科學家,很多時候簡單易學易用是程式設計師選擇的第一要素。目前,兩個主要的深度學習庫Keras和Pytorch獲得了大量關注,主要是因為它們的使用比較簡單。