Gorgonia ist eine Bibliothek, die das maschinelle Lernen in Go erleichtert. Schreiben und bewerten Sie mathematische Gleichungen, an denen mehrdimensionale Arrays beteiligt sind. Wenn dies nach Theano oder TensorFlow klingt, liegt es daran, dass die Idee ziemlich ähnlich ist. Insbesondere ist die Bibliothek wie Theano ziemlich niedrig, hat aber höhere Ziele wie Tensorflow.
Gorgonia:
Das Hauptziel für Gorgonia ist es, eine leistungsstarke Berechnungsbibliothek mit maschinellem Lernen/Graph zu sein, die über mehrere Maschinen hinweg skalieren kann. Es sollte die Attraktivität von GO (einfache Zusammenstellung und Bereitstellungsprozess) in die ML -Welt bringen. Es ist derzeit ein langer Weg von dort, aber die Babyschritte sind bereits vorhanden.
Das sekundäre Ziel für Gorgonia ist es, eine Plattform für die Erkundung von nicht standardmäßigen Tiefen und neuronalen Netzwerken zu bieten. Dies schließt Dinge wie Neo-Hebbian-Lernen, Algorithmen des Eckschneiders, evolutionäre Algorithmen und dergleichen ein.
Der Hauptgrund für die Verwendung von Gorgonia ist der Entwicklerkomfort. Wenn Sie einen go-Stack ausgiebig verwenden, haben Sie jetzt Zugriff auf die Möglichkeit, produktionsbereite maschinelle Lernsysteme in einer Umgebung zu erstellen, mit der Sie bereits vertraut sind und mit denen Sie sich vertraut machen.
ML/AI insgesamt wird normalerweise in zwei Stufen aufgeteilt: die experimentelle Phase, in der man verschiedene Modelle, Tests und erneut testet; und der eingesetzte Zustand, in dem ein Modell nach dem Testen und gespielt wird, wird eingesetzt. Dies erfordert unterschiedliche Rollen wie Datenwissenschaftler und Dateningenieur.
Typischerweise haben die beiden Phasen unterschiedliche Werkzeuge: Python (Pytorch usw.) wird üblicherweise für die experimentelle Stufe verwendet, und dann wird das Modell in einer stärker leistungsfähigeren Sprache wie C ++ umgeschrieben (unter Verwendung von DLIB, MLPack usw.). Heutzutage schließt sich die Lücke natürlich und die Menschen teilen die Tools häufig zwischen ihnen. TensorFlow ist ein solches Werkzeug, das die Lücke überbrückt.
Gorgonia zielt darauf ab, dasselbe zu tun, aber für die GO -Umgebung. Gorgonia ist derzeit ziemlich leistungsfähig - seine Geschwindigkeiten sind vergleichbar mit den CPU -Implementierungen von Pytorch und TensorFlow. Die GPU -Implementierungen sind aufgrund der schweren CGO -Steuer etwas pieffler, um zu vergleichen, seien jedoch versichert, dass dies ein Bereich mit aktiver Verbesserung ist.
Das Paket ist Go -Settable: go get -u gorgonia.org/gorgonia .
Gorgonia ist mit Go -Modulen kompatibel.
Aktuelle Dokumentation, Referenzen und Tutorials finden Sie auf der offiziellen Gorgonia-Website unter https://gorgonia.org.
Das Projekt von Gorgonia verfügt über einen Slack -Kanal auf Gopherslack sowie einen Twitter -Account. Offizielle Updates und Ankündigungen werden auf diesen beiden Websites veröffentlicht.
Gorgonia erstellt ein Berechnungsdiagramm und führt es dann aus. Stellen Sie sich dies als Programmiersprache vor, beschränkt sich jedoch auf mathematische Funktionen und verfügt über keine Verzweigungsfunktion (nein if/dann oder Loops). Tatsächlich ist dies das dominierende Paradigma, an das der Benutzer gewohnt sein sollte. Das Berechnungsdiagramm ist ein AST.
Microsofts CNTK mit seinem Brainscript ist möglicherweise das Beste, um die Idee zu veranschaulichen, dass das Erstellen eines Berechnungsdiagramms und das Ausführen der Berechnungsdiagramme unterschiedliche Dinge sind und dass der Benutzer in verschiedenen Denkmodi sein sollte.
Während die Umsetzung von Gorgonia die Trennung des Denkens in Bezug auf das Brainskript von CNTK nicht durchsetzt, hilft die Syntax ein wenig.
Hier ist ein Beispiel - sagen Sie, Sie möchten einen mathematischen Ausdruck z = x + y definieren. So würden Sie es tun:
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
} Sie werden möglicherweise feststellen, dass es etwas ausführlicher ist als andere Pakete ähnlicher Natur. Anstatt beispielsweise eine aufrufbare Funktion zu kompilieren, kompiliert Gorgonia speziell in ein *program , für das eine *TapeMachine ausgeführt werden muss. Es erfordert auch manuelle A Let(...) Anruf.
Der Autor möchte behaupten, dass dies eine gute Sache ist, um das Denken auf maschinenbasiertes Denken zu verlagern. Es hilft sehr, herauszufinden, wo die Dinge schief gehen könnten.
Darüber hinaus gibt es keine Unterstützung für die Verzweigung - das heißt, es gibt keine Bedingungen (wenn/sonst) oder Schleifen. Ziel ist es nicht, einen Turing-Completen-Computer zu erstellen.
Weitere Beispiele finden Sie im example des Projekts, und Schritt-für-Schritt-Tutorials finden Sie auf der Hauptwebsite
Gorgonia kommt mit Cuda -Unterstützung aus der Schachtel. Bitte beachten Sie die Referenzdokumentation darüber, wie CUDA auf der Website gorgonia.org funktioniert oder zum Tutorial springt.
Wir verwenden Semver 2.0.0 für unsere Versioning. Vor 1.0 wird erwartet, dass sich die APIs von Gorgonia ziemlich stark ändern. Die API wird durch die exportierten Funktionen, Variablen und Methoden definiert. Für die geistige Gesundheit der Entwickler gibt es geringfügige Unterschiede zu SEMVern, die wir vor Version 1.0 anwenden werden. Sie werden unten aufgezählt:
Gorgonias API ist derzeit nicht als stabil angesehen. Es wird aus Version 1.0 stabil sein.
Gorgonia unterstützt 2 Versionen unter dem Master -Zweig von Go. Dies bedeutet, dass Gorgonia die aktuelle veröffentlichte Version von GO und bis zu 4 vorherige Versionen unterstützen wird, sofern etwas nicht brechen. Wenn möglich, wird ein Shim zur Verfügung gestellt (für Dinge wie neue sort -APIs oder math/bits , die in Go 1.9 herauskamen).
Die aktuelle Version von Go ist 1.13.1. Die früheste Version, die Gorgonia unterstützt, ist Go 1.11.x, aber Gonum unterstützt nur 1.12+. Daher ist die minimale GO -Version, um den Master -Zweig auszuführen, GO> 1.12.
Gorgonia läuft weiter:
Wenn Sie Gorgonia auf anderen Plattformen getestet haben, aktualisieren Sie diese Liste.
Gorgonia verwendet einige Anweisungen für reine Assembler, um einige mathematische Operationen zu beschleunigen. Leider wird nur AMD64 unterstützt.
Da Sie dies höchstwahrscheinlich auf GitHub lesen, wird GitHub den größten Teil des Workflows für den Beitrag zu diesem Paket bilden.
Siehe auch: beitragen.md
Alle Beiträge sind willkommen. Es gibt jedoch eine neue Klasse von Mitwirkenden, die als bedeutende Mitwirkende bezeichnet werden.
Ein bedeutender Mitwirkender hat ein tiefes Verständnis dafür gezeigt, wie die Bibliothek funktioniert und/oder ihre Umgebung. Hier sind Beispiele dafür, was einen bedeutenden Beitrag darstellt:
Die wichtige Liste der Mitwirkenden werden einmal im Monat aktualisiert (wenn jemand überhaupt Gorgonia verwendet).
Der derzeit beste Weg zur Unterstützung ist es, ein Ticket für Github zu eröffnen.
runtime.GC() Anrufe in den Tests? Die Antwort darauf ist einfach - das Design des Pakets verwendet CUDA auf eine bestimmte Weise: Insbesondere ist ein CUDA -Gerät und ein Kontext an ein VM gebunden, anstatt auf der Paketebene. Dies bedeutet, dass für jedes erstellte VM ein anderer CUDA -Kontext pro Gerät pro VM erstellt wird. Auf diese Weise spielen alle Operationen gut mit anderen Anwendungen, die CUDA verwenden können (dies muss jedoch stressgeprüft werden).
Die CUDA -Kontexte werden nur zerstört, wenn der VM Müll erfasst wird (mit Hilfe einer Finalizer -Funktion). In den Tests werden etwa 100 VM erstellt und die Müllsammlung zum größten Teil als zufällig angesehen werden. Dies führt zu Fällen, in denen die GPU aus dem Speicher ausgeht, da zu viele Kontexte verwendet werden.
Daher wird am Ende aller Tests, die GPU verwenden, eine runtime.GC() verwendet.
In der Produktion ist es unwahrscheinlich, dass viele VM ein Problem darstellen, daher kein Problem. Wenn ja, öffnen Sie ein Ticket für GitHub und wir werden nach hinzufügen, dass eine Finish() -Methode für die VM s hinzugefügt wird.
Gorgonia ist unter einer Variante von Apache 2.0 lizenziert. Es ist dasselbe wie bei der Apache 2.0 -Lizenz, außer dass es nicht in der Lage ist, direkt aus dem Paket zu profitieren, es sei denn, Sie sind ein wesentlicher Beitrag (z. B. die kommerzielle Unterstützung für das Paket). Es ist vollkommen in Ordnung, direkt von einem Derivat von Gorgonia zu profitieren (zum Beispiel, wenn Sie Gorgonia als Bibliothek in Ihrem Produkt verwenden)
Jeder darf Gorgonia immer noch für kommerzielle Zwecke verwenden (z. B. in Software für Ihr Unternehmen verwenden).
Es gibt nur sehr wenige Abhängigkeiten, die Gorgonia verwendet - und sie sind alle ziemlich stabil, so dass es ab sofort keine Notwendigkeit für die Lieferung von Tools benötigt. Dies sind die Liste der externen Pakete, die Gorgonia aufruft, die in der Reihenfolge der Vertrauensgruppe eingestuft wird, die dieses Paket hat (Unterverpackungen werden weggelassen):
| Paket | Verwendet für | Vitalität | Notizen | Lizenz |
|---|---|---|---|---|
| Gonum/Graph | Sortieren *ExprGraph | Vital. Entfernung bedeutet, dass Gorgonia nicht funktioniert | Die Entwicklung von Gorgonia ist verpflichtet, mit der aktuellsten Version Schritt zu halten | Gonum-Lizenz (MIT/BSD-ähnlich) |
| Gonum/Blas | Tensor Subpackage Lineare Algebraoperationen | Vital. Entfernung bedeutet, dass Gorgonial nicht funktioniert | Die Entwicklung von Gorgonia ist verpflichtet, mit der aktuellsten Version Schritt zu halten | Gonum-Lizenz (MIT/BSD-ähnlich) |
| cu | CUDA -Treiber | Benötigt für CUDA -Operationen | Gleicher Betreuer wie Gorgonia | MIT/BSD-ähnlich |
| math32 | float32 Operationen | Kann durch float32(math.XXX(float64(x))) | Gleicher Betreuer wie Gorgonia, gleiche API wie das integrierte math | MIT/BSD-ähnlich |
| Hm | Typsystem für Gorgonia | Die Grafiken von Gorgonia sind ziemlich eng mit dem Typsystem verbunden | Gleicher Betreuer wie Gorgonia | MIT/BSD-ähnlich |
| VECF64 | optimiert []float64 Operationen | Kann im tensor/genlib -Paket erzeugt werden. Es wurden jedoch zahlreiche Optimierungen durchgeführt/werden vorgenommen | Gleicher Betreuer wie Gorgonia | MIT/BSD-ähnlich |
| VECF32 | optimierte []float32 Operationen | Kann im tensor/genlib -Paket erzeugt werden. Es wurden jedoch zahlreiche Optimierungen durchgeführt/werden vorgenommen | Gleicher Betreuer wie Gorgonia | MIT/BSD-ähnlich |
| Satz | Verschiedene festgelegte Operationen | Kann leicht ersetzt werden | Stabile API seit 1 Jahr | Lizenz festlegen (MIT/BSD-ähnlich) |
| GOGRAPHVIZ | Wird zum Drucken von Graphen verwendet | Der Diagrammdruck ist nur für das Debuggen von entscheidender Bedeutung. Gorgonia kann ohne überleben, aber mit einem großen (aber wohl nicht vitalen) Feature -Verlust | Letztes Update 12. April 2017 | GoGraphviz -Lizenz (Apache 2.0) |
| rng | Wird verwendet, um Helferfunktionen zu implementieren, um Anfangsgewichte zu erzeugen | Kann ziemlich leicht ersetzt werden. Gorgonia kann auch ohne die Bequemlichkeitsfunktionen verzichten | RNG -Lizenz (Apache 2.0) | |
| Fehler | Fehlerverpackung | Gorgonia wird ohne es nicht sterben. Tatsächlich hat Gorgonia in der Vergangenheit auch GoErrors/Fehler verwendet. | Stabile API in den letzten 6 Monaten | Fehlerlizenz (MIT/BSD-ähnlich) |
| Gonum/Mat | Kompatibilität zwischen Tensor und Gonums Matrix | Die Entwicklung von Gorgonia ist verpflichtet, mit der aktuellsten Version Schritt zu halten | Gonum-Lizenz (MIT/BSD-ähnlich) | |
| aussagen/durchsagen | Testen | Kann ohne, aber ein massiver Schmerz im Arsch zu testen sein | Lizenz aussagen (MIT/BSD-ähnlich) |
Dies sind die Pakete und Bibliotheken, die im Prozess des Schreibens von Gorgonia inspiriert und angepasst wurden (die verwendeten GO -Pakete wurden bereits oben deklariert):
| Quelle | Wie es verwendet wird | Lizenz |
|---|---|---|
| Numpy | Große Portionen inspiriert. Direkt angepasste Algorithmen für einige wenige Methoden (explizit in den Dokumenten gekennzeichnet) | MIT/BSD-ähnlich. Numpy Lizenz |
| Theano | Große Portionen inspiriert. (Unsicher: Anzahl der direkt angepassten Algorithmen) | MIT/BSD-ähnliche Theano-Lizenz |
| Kaffe | im2col und col2im direkt aus Kaffe genommen. Faltungsalgorithmen, die von den ursprünglichen Kaffee -Methoden inspiriert sind | Kaffe -Lizenz |