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许可证 |