Gorgonia是一個有助於促進Go中的機器學習的圖書館。編寫和評估涉及多維陣列的數學方程式。如果這聽起來像Theano或Tensorflow,那是因為這個想法非常相似。具體而言,圖書館像Theano一樣是相當低的級別,但是具有更高的目標,例如TensorFlow。
Gorgonia:
Gorgonia的主要目的是成為高性能的機器學習/基於圖形計算的庫,可以在多個計算機上進行擴展。它應該將GO的吸引力(簡單的彙編和部署過程)帶入ML世界。但是,目前距離那裡還有很長的路要走,但是,嬰兒步驟已經存在。
Gorgonia的次要目標是為探索非標準的深度學習和與神經網絡相關的事物提供一個平台。這包括諸如Neo-Hebbian學習,角落切割算法,進化算法等之類的東西。
使用Gorgonia的主要原因是開發人員的舒適性。如果您廣泛使用GO堆棧,那麼現在您可以訪問在您已經熟悉和滿足的環境中創建可生產的機器學習系統的能力。
ML/AI總體通常分為兩個階段:一個實驗階段,其中一個建立了各種模型,測試和重新測試;以及部署測試和播放模型的部署狀態。這需要不同的角色,例如數據科學家和數據工程師。
通常,這兩個階段具有不同的工具:Python(Pytorch等)通常用於實驗階段,然後以C ++(使用DLIB,MLPACK等)(使用DLIB,MLPACK等)進行了一些更具性能的語言來重寫。當然,如今的差距正在縮小,人們經常在它們之間共享工具。 TensorFlow就是彌合差距的一種工具。
Gorgonia的目的是做同樣的事情,但對於GO環境。 Gorgonia目前表現出色 - 它的速度與Pytorch和Tensorflow的CPU實現相當。由於重型CGO稅,GPU實施方法可以比較有點挑剔,但請確保這是一個積極改善的領域。
該軟件包是可抓的: go get -u gorgonia.org/gorgonia 。
Gorgonia與GO模塊兼容。
Gorgonia官方網站https://gorgonia.org上存在最新文檔,參考文獻和教程。
Gorgonia的項目在Gopherslack和Twitter帳戶上有一個鬆弛的頻道。官方更新和公告將發佈到這兩個站點。
Gorgonia通過創建計算圖然後執行它來起作用。將其視為一種編程語言,但僅限於數學函數,並且沒有分支功能(否IF/then或Loops)。實際上,這是用戶應使用的主要範式。計算圖是AST。
Microsoft的CNTK及其BrainScript,也許是最好的觀念,即構建計算圖和運行計算圖是不同的事物,並且用戶在進行時應以不同的思維方式處於不同的思維方式。
儘管Gorgonia的實現並不能像CNTK的Brainscript一樣強制執行思想的分離,但語法確實有所幫助。
這是一個例子 - 說您想定義數學表達式z = x + y 。這是您的方式:
package gorgonia_test
import (
"fmt"
"log"
. "gorgonia.org/gorgonia"
)
// Basic example of representing mathematical equations as graphs.
//
// In this example, we want to represent the following equation
// z = x + y
func Example_basic () {
g := NewGraph ()
var x , y , z * Node
var err error
// define the expression
x = NewScalar ( g , Float64 , WithName ( "x" ))
y = NewScalar ( g , Float64 , WithName ( "y" ))
if z , err = Add ( x , y ); err != nil {
log . Fatal ( err )
}
// create a VM to run the program on
machine := NewTapeMachine ( g )
defer machine . Close ()
// set initial values then run
Let ( x , 2.0 )
Let ( y , 2.5 )
if err = machine . RunAll (); err != nil {
log . Fatal ( err )
}
fmt . Printf ( "%v" , z . Value ())
// Output: 4.5
}您可能會注意到,它比其他類似性質的包裝要多一些。例如,Gorgonia沒有將其編譯到一個*program中,而不是將*TapeMachine運行。它還需要手動一個Let(...)呼叫。
作者想認為這是一件好事 - 將自己的思維轉移到基於機器的思維上。它有助於弄清楚事情可能出錯的地方。
此外,沒有對分支的支持 - 也就是說,沒有有條件的(如果/其他)或循環。目的不是構建圖靈完整的計算機。
該項目的example子文件夾中顯示了更多示例,並且在主網站上存在分步教程
Gorgonia開箱即用。請參閱有關CUDA如何在gorgonia.org網站上工作的參考文獻文檔,或跳到教程。
我們使用SEMVER 2.0.0進行版本控制。在1.0之前,Gorgonia的API有望改變很多。 API由導出的函數,變量和方法定義。對於開發人員的理智,我們將在1.0版之前將其應用的SEMVer差異很小。他們在下面列舉:
Gorgonia的API目前是穩定的。它將從1.0版本的Forward版本中穩定。
Gorgonia支持GO主分支下方的2個版本。這意味著Gorgonia將支持當前發布的GO版本,並最多4個以前的版本 - 提供某些內容不會破裂。在可能的情況下,將提供墊片(對於新的API或GO 1.9中出現的新sort或math/bits之類的東西)。
GO的當前版本為1.13.1。最早的Gorgonia支持的版本為1.11.x,但Gonum僅支持1.12+。因此,運行主分支的最低GO版本為> 1.12。
Gorgonia運行:
如果您已經在其他平台上測試過Gorgonia,請更新此列表。
Gorgonia使用一些純粹的彙編指令來加速一些數學操作。不幸的是,僅支持AMD64。
顯然,由於您很可能會在GitHub上閱讀此內容,因此Github將構成工作流程的主要部分,以供該軟件包貢獻。
另請參閱:貢獻
歡迎所有貢獻。但是,有一類新的貢獻者,稱為重要貢獻者。
一個重要的貢獻者對圖書館的運作方式和/或其周圍環境有了深刻的了解。以下是構成重大貢獻的示例:
重要的貢獻者列表將每月更新一次(如果有人甚至使用Gorgonia,那就是)。
現在最好的支持方法是在Github上打開票。
runtime.GC()調用?答案很簡單 - 軟件包的設計以特定方式使用CUDA:具體來說,CUDA設備和上下文與VM相關,而不是在軟件包級別上。這意味著每個創建的VM ,每個VM每個設備都會創建不同的CUDA上下文。這樣,所有操作都將與可能使用CUDA的其他應用程序效果很好(但是,需要進行壓力測試)。
僅當VM收集垃圾時,CUDA上下文才會被破壞(借助最終功能)。在測試中,大約100 VM s得到創建,並且大部分垃圾收集可以被視為隨機。這導致了GPU用完記憶的情況,因為使用了太多上下文。
因此,在任何可能使用GPU的測試結束時,都會對runtime.GC()調用迫使垃圾收集,從而釋放GPU記憶。
在生產中,一個人不太可能啟動這麼多VM ,因此這不是問題。如果有的話,請在GitHub上打開票,我們將研究為VM s添加Finish()方法。
Gorgonia在Apache 2.0的變體下獲得許可。它與Apache 2.0許可證相同,除非無法直接從包裝中獲利,除非您是重要的貢獻者(例如,為包裝提供商業支持)。直接從Gorgonia的衍生品中獲利是完全可以的(例如,如果您將Gorgonia用作產品中的圖書館)
仍然允許每個人都將Gorgonia用於商業目的(例如:在您的企業中使用軟件)。
Gorgonia使用的依賴項很少 - 而且它們都非常穩定,因此到目前為止,不需要供應工具。這些是Gorgonia調用的外部軟件包列表,按照此軟件包的依賴順序排名(省略了子包裝):
| 包裹 | 用於 | 活力 | 筆記 | 執照 |
|---|---|---|---|---|
| Gonum/Graph | 排序*ExprGraph | 必不可少的。刪除意味著Gorgonia將行不通 | Gorgonia的開發致力於跟上最新更新的版本 | Gonum許可證(MIT/BSD狀) |
| Gonum/Blas | 張量子包線性代數操作 | 必不可少的。刪除意味著gorgonial將行不通 | Gorgonia的開發致力於跟上最新更新的版本 | Gonum許可證(MIT/BSD狀) |
| 銅 | CUDA司機 | CUDA操作所需的 | 與Gorgonia相同的維護者 | MIT/BSD狀 |
| MATH32 | float32操作 | 可以用float32(math.XXX(float64(x)))替換 | 與Gorgonia相同的維護器,與內置math軟件包相同的API | MIT/BSD狀 |
| 嗯 | Gorgonia的類型系統 | Gorgonia的圖與類型系統非常緊密結合 | 與Gorgonia相同的維護者 | MIT/BSD狀 |
| VECF64 | 優化[]float64操作 | 可以在tensor/genlib包裝中生成。但是,將進行大量優化/將進行 | 與Gorgonia相同的維護者 | MIT/BSD狀 |
| VECF32 | 優化[]float32操作 | 可以在tensor/genlib包裝中生成。但是,將進行大量優化/將進行 | 與Gorgonia相同的維護者 | MIT/BSD狀 |
| 放 | 各種設置操作 | 可以輕鬆更換 | 過去一年的穩定API | 設置許可證(MIT/BSD狀) |
| 戈格維茲 | 用於打印圖 | 圖形打印僅對於調試至關重要。 Gorgonia可以在沒有的情況下生存,但具有重大(但可以說是非致命的)損失 | 最後更新2017年4月12日 | Gographviz許可證(Apache 2.0) |
| RNG | 用於實現輔助功能以生成初始權重 | 可以很容易地更換。 Gorgonia也可以在沒有便利功能的情況下做 | RNG許可證(Apache 2.0) | |
| 錯誤 | 錯誤包裝 | 沒有它,戈爾戈尼亞就不會死。實際上,Gorgonia過去還使用了Goerrors/錯誤。 | 過去6個月穩定的API | 錯誤許可證(MIT/BSD狀) |
| Gonum/Mat | Tensor與Gonum的矩陣之間的兼容性 | Gorgonia的開發致力於跟上最新更新的版本 | Gonum許可證(MIT/BSD狀) | |
| 作證/斷言 | 測試 | 可以沒有,但會在屁股上痛苦地進行測試 | 證明許可證(MIT/BSD狀) |
這些是在編寫Gorgonia的過程中啟發和適應的包裝和庫(上面已經宣布了使用的GO包):
| 來源 | 它是如何使用的 | 執照 |
|---|---|---|
| numpy | 啟發了大部分。直接適用於幾種方法的算法(在文檔中明確標記) | MIT/BSD狀。 Numpy許可證 |
| Theano | 啟發了大部分。 (不確定:直接適應算法的數量) | MIT/BSD般的Theano的許可證 |
| 咖啡餅 | im2col和col2im直接取自Caffe。受原始Caffee方法啟發的捲積算法 | CAFFE許可證 |