前端高效能運算之四:GPU加速計算

發表於2017-10-21

人工智慧是最近兩年絕對的熱點,而這次人工智慧的復興,有一個很重要的原因就是計算能力的提升,主要依賴於GPU。去年Nvidia的股價飆升了幾倍,市面上好點的GPU一般都買不到,因為全被做深度學習以及挖比特幣的人買光了。

GPU,全稱Graphics Processing Unit,即影象處理器,早期主要用於顯示影象使用。因為影象處理主要偏簡單的矩陣運算,邏輯判斷等很少,因此GPU的設計跟CPU架構不一樣,也因此做到一個GPU上可以有很多計算單元,可以進行大量平行計算。網上找到一個視訊,應該是Nvidia某年的產品釋出會,形象地演示了CPU跟GPU的區別。http://v.youku.com/vshow/idXNDcyNTc1MjQ4==.html 。知乎上也有對CPU和GPU的對比https://www.zhihu.com/question/19903344

後來人們逐漸發現,GPU的這種特性還可以用於神經網路的訓練,因為神經網路訓練中也是大量的矩陣運算,然後原來的訓練速度提高了幾十倍,原來需要一週訓練的模型,現在幾個小時就可以出結果,於是神經網路飛速發展。。。

GPU雖快,但是寫起來很難寫,要用自己特殊的語言GLSL – OpenGL Shading Language編寫,一般都是是將其它語言編譯過來或者有很多庫封裝好了直接使用。經過搜尋發現了gpu.js這個庫。

gpu.js is a JavaScript library for GPGPU (General purpose computing on GPUs) in the browser. gpu.js will automatically compile specially written JavaScript functions into shader language and run them on the GPU using the WebGL API. In case WebGL is not available, the functions will still run in regular JavaScript.

也就是說gpu.js這個庫會把你寫的js編譯成GLSL然後在GPU上執行,以達到加速的效果。並且,如果電腦不支援GPU,它還會當成普通的js執行。可以先到gpu.js官網上體驗一下,能達到5-10倍的提速。根據不同的電腦gpu配置,提速可能更多,這篇文章裡面 https://hackernoon.com/introducing-gpu-js-gpu-accelerated-javascript-ba11a6069327 提到的Chrome提高了23倍,Firefox提高了125倍! gpurocks-disabled gpurocks-enabled

支援的語法

一開始說了,GPU的設計跟CPU差別很大,只適合做簡單的計算,不適合太多複雜的邏輯。所以gpu.js也只支援js的一個很小的子集:

  • 1D, 2D, 3D array of numbers or just numbers as kernel input
  • 1D, 2D, 3D array of numbers as kernel output
  • Number variables
  • Custom and custom native functions
  • Arithmetic operations (+, +=, -, *, /, %)
  • Javascript Math functions (Math.floor() and etc.)
  • Loops
  • if and else statements
  • const and let
  • No variables captured by a closure

Show Me Code

https://github.com/abhisheksoni27/gpu.js-demo

deeplearn.js

另外還有一個庫是最近Google剛開源的deeplearn.js, 如果要做深度學習的話是很好的工具。後面我們會找時間單獨介紹。

總結

由於架構設計不一樣,GPU很適合做簡單的併發計算,應用於影象處理、深度學習等領域能大大加快速度,也直接引爆了這一次人工智慧的發展。當然直接用gpu去開發程式很難編寫,一般都是由特殊編譯器將程式碼編譯成可以在gpu上執行的程式碼。本文提高的gpu.js就是在前端將js的一個子集編譯成能在webgl上執行的一個編譯器。

當然我們的業務邏輯比較複雜,發現很難把程式碼改寫成能在GPU上加速執行的,最後我們採用的是之前講過的WebWorkers+WebAssembly的方式,提速也能達到數十倍,程式碼還簡單很多,易於維護。當然不是說複雜的問題不能轉化到GPU上執行,這篇文章 https://amoffat.github.io/held-karp-gpu-demo/ 就講怎麼用GPU加速去解決TSP問題,方法很巧妙,有興趣的可以看看。

==============

話說我們後來根據對問題的深入分析,將問題的複雜度簡化了,瞬間提速100倍,所以說做優化工程之前,一定要先確保演算法已經沒有什麼優化的空間了。演算法對速度的提升是遠大於程式語言等的,當然演算法的提速是可以跟工程優化疊加的,將兩者結合起來我們的專案相比最之前的演算法有將近3000倍的提速,完全解決了問題。

Refers

相關文章