Gorgonia es una biblioteca que ayuda a facilitar el aprendizaje automático en GO. Escriba y evalúe las ecuaciones matemáticas que implican matrices multidimensionales fácilmente. Si esto suena como theano o tensorflow, es porque la idea es bastante similar. Específicamente, la biblioteca es bastante de bajo nivel, como Theano, pero tiene objetivos más altos como TensorFlow.
Gorgonia:
El objetivo principal para Gorgonia es ser una biblioteca basada en el cálculo de aprendizaje automático/gráfico de altamente desempeñado que puede escalar en múltiples máquinas. Debería llevar el atractivo de GO (proceso simple de compilación y despliegue) al mundo de ML. Actualmente es un largo camino a partir de allí, sin embargo, los pasos de bebé ya están allí.
El objetivo secundario para Gorgonia es proporcionar una plataforma para la exploración de cosas no estándar de aprendizaje profundo y relacionado con la red neuronal. Esto incluye cosas como el aprendizaje neo-hebado, los algoritmos de corte de esquina, los algoritmos evolutivos y similares.
La razón principal para usar Gorgonia es la comodidad del desarrollador. Si está utilizando una pila GO ampliamente, ahora tiene acceso a la capacidad de crear sistemas de aprendizaje automático listos para la producción en un entorno con el que ya está familiarizado y que se siente cómodo.
ML/AI en general generalmente se divide en dos etapas: la etapa experimental donde uno construye varios modelos, pruebas y vueltas; y el estado desplegado en el que se implementa un modelo después de ser probado y jugado. Esto requiere diferentes roles como científico de datos e ingeniero de datos.
Por lo general, las dos fases tienen herramientas diferentes: Python (Pytorch, etc.) se usa comúnmente para la etapa experimental, y luego el modelo se reescribe en un lenguaje más performante como C ++ (usando DLIB, MLPACK, etc.). Por supuesto, hoy en día la brecha se está cerrando y las personas con frecuencia comparten las herramientas entre ellas. TensorFlow es una de esas herramientas que une la brecha.
Gorgonia tiene como objetivo hacer lo mismo pero para el entorno GO. Gorgonia actualmente es bastante desempeñada: sus velocidades son comparables a las implementaciones de CPU de Pytorch y Tensorflow. Las implementaciones de GPU son un poco complicadas para comparar debido al pesado impuesto al CGO, pero tenga la seguridad de que este es un área de mejora activa.
El paquete es GO -Getable: go get -u gorgonia.org/gorgonia .
Gorgonia es compatible con los módulos GO.
La documentación actualizada, las referencias y los tutoriales están presentes en el sitio web oficial de Gorgonia en https://gorgonia.org.
El proyecto de Gorgonia tiene un canal Slack en Gopherslack, así como una cuenta de Twitter. Las actualizaciones y anuncios oficiales se publicarán en esos dos sitios.
Gorgonia funciona creando un gráfico de cálculo y luego ejecutándolo. Piense en ello como un lenguaje de programación, pero se limita a funciones matemáticas, y no tiene capacidad de ramificación (no si/entonces o bucles). De hecho, este es el paradigma dominante en el que el usuario debe estar acostumbrado a pensar. El gráfico de cálculo es un AST.
El CNTK de Microsoft, con su Brainscript, es quizás el mejor para ejemplificar la idea de que construir un gráfico de cálculo y ejecutar los gráficos de cálculo son cosas diferentes y que el usuario debe estar en diferentes modos de pensamiento al realizarlos.
Mientras que la implementación de Gorgonia no hace cumplir la separación del pensamiento en cuanto a CNTK's Brainscript, la sintaxis ayuda un poco.
Aquí hay un ejemplo: digamos que desea definir una expresión matemática z = x + y . Así es como lo harías:
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
} Puede tener en cuenta que es un poco más detallado que otros paquetes de naturaleza similar. Por ejemplo, en lugar de compilarse a una función invocable, Gorgonia se compila específicamente en un *program que requiere una *TapeMachine para ejecutarse. También requiere manual una llamada Let(...) .
El autor desea afirmar que esto es algo bueno: cambiar el pensamiento de uno al pensamiento basado en la máquina. Ayuda mucho a averiguar dónde pueden salir las cosas mal.
Además, no hay soporte para la ramificación, es decir, no hay condicionales (si/else) ni bucles. El objetivo no es construir una computadora completa de Turing.
Hay más ejemplos presentes en la subcarpeta example del proyecto, y los tutoriales paso a paso están presentes en el sitio web principal
Gorgonia viene con soporte CUDA fuera de la caja. Consulte la documentación de referencia sobre cómo funciona CUDA en el sitio web de Gorgonia.org, o salta al tutorial.
Usamos Semver 2.0.0 para nuestro versiones. Antes de 1.0, se espera que las API de Gorgonia cambien bastante. La API se define por las funciones, variables y métodos exportados. Para la cordura de los desarrolladores, existen diferencias menores en Semver que aplicaremos antes de la versión 1.0. Se enumeran a continuación:
La API de Gorgonia es a partir de ahora, no se considera estable. Será estable desde la versión 1.0 hacia adelante.
Gorgonia admite 2 versiones debajo de la rama maestra de GO. Esto significa que Gorgonia admitirá la versión actualizada actual de GO, y hasta 4 versiones anteriores: proporcionar algo no se rompe. Siempre que sea posible se proporcione una cuña (para cosas como API sort o math/bits que salieron 1.9).
La versión actual de GO es 1.13.1. La versión más temprana que admite Gorgonia es Go 1.11.x pero Gonum admite solo 1.12+. Por lo tanto, la versión mínima de Go para ejecutar la rama maestra es Go> 1.12.
Gorgonia corre en:
Si ha probado Gorgonia en otras plataformas, actualice esta lista.
Gorgonia utiliza algunas instrucciones de ensamblador puro para acelerar algunas operaciones matemáticas. Desafortunadamente, solo es compatible con AMD64.
Obviamente, dado que probablemente esté leyendo esto en GitHub, Github formará la mayor parte del flujo de trabajo para contribuir a este paquete.
Ver también: contribuyente.md
Todas las contribuciones son bienvenidas. Sin embargo, hay una nueva clase de contribuyentes, llamada contribuyentes significativos.
Un contribuyente significativo ha mostrado una comprensión profunda de cómo funciona la biblioteca y/o sus alrededores. Aquí hay ejemplos de lo que constituye una contribución significativa:
La lista significativa de contribuyentes se actualizará una vez al mes (si alguien incluso usa Gorgonia).
La mejor manera de apoyo en este momento es abrir un boleto en Github.
runtime.GC() aparentemente aleatoria en las pruebas? La respuesta a esto es simple: el diseño del paquete utiliza CUDA de una manera particular: específicamente, un dispositivo CUDA y un contexto están vinculados a una VM , en lugar de a nivel de paquete. Esto significa que para cada VM creada, se crea un contexto CUDA diferente por dispositivo por VM . De esta manera, todas las operaciones jugarán muy bien con otras aplicaciones que pueden estar usando CUDA (sin embargo, esto debe ser probado por estrés).
Los contextos CUDA solo se destruyen cuando la VM recolecta la basura (con la ayuda de una función finalizador). En las pruebas, se crean alrededor de 100 VM s, y la recolección de basura en su mayor parte puede considerarse aleatoria. Esto lleva a casos en los que la GPU se queda fuera de la memoria, ya que se utilizan demasiados contextos.
Por lo tanto, al final de cualquier prueba que pueda usar GPU, se realiza una llamada de runtime.GC() para forzar la recolección de basura, liberando recuerdos de GPU.
En la producción, es poco probable que comiencen que muchas VM S, por lo tanto, no es un problema. Si lo hay, abra un boleto en GitHub, y buscaremos agregar un método Finish() para las VM .
Gorgonia tiene licencia bajo una variante de Apache 2.0. Es lo mismo que la licencia Apache 2.0, excepto no poder beneficiarse comercialmente directamente del paquete a menos que sea un contribuyente significativo (por ejemplo, proporcionar soporte comercial para el paquete). Está perfectamente bien beneficiarse directamente de un derivado de Gorgonia (por ejemplo, si usa Gorgonia como biblioteca en su producto)
A todos se les permite usar Gorgonia con fines comerciales (por ejemplo: usarlo en software para su negocio).
Hay muy pocas dependencias que usa Gorgonia, y todas son bastante estables, por lo que a partir de ahora no hay necesidad de ampliar herramientas. Estas son la lista de paquetes externos que Gorgonia llama, clasificado en orden de dependencia que tiene este paquete (se omiten los subgrupos):
| Paquete | Utilizado para | Vitalidad | Notas | Licencia |
|---|---|---|---|---|
| gonum/gráfico | Clasificación *ExprGraph | Vital. La eliminación significa que Gorgonia no funcionará | El desarrollo de Gorgonia se compromete a mantenerse al día con la versión más actualizada | Licencia de Gonum (MIT/BSD) |
| gonum/blas | Subpackage de tensor Operaciones de álgebra lineal | Vital. La eliminación significa que Gorgonial no funcionará | El desarrollo de Gorgonia se compromete a mantenerse al día con la versión más actualizada | Licencia de Gonum (MIT/BSD) |
| Cu | Conductores de cuda | Necesario para operaciones CUDA | El mismo mantenedor que Gorgonia | MIT/BSD-Like |
| Math32 | Operaciones float32 | Puede ser reemplazado por float32(math.XXX(float64(x))) | El mismo mantenedor que Gorgonia, la misma API que el paquete math incorporado | MIT/BSD-Like |
| hm | Sistema de tipo para Gorgonia | Los gráficos de Gorgonia están bastante bien junto con el sistema de tipos | El mismo mantenedor que Gorgonia | MIT/BSD-Like |
| vecf64 | Optimizadas []float64 | Se puede generar en el paquete tensor/genlib . Sin embargo, se han realizado muchas optimizaciones | El mismo mantenedor que Gorgonia | MIT/BSD-Like |
| vecf32 | Optimizadas []float32 | Se puede generar en el paquete tensor/genlib . Sin embargo, se han realizado muchas optimizaciones | El mismo mantenedor que Gorgonia | MIT/BSD-Like |
| colocar | Varias operaciones establecidas | Se puede reemplazar fácilmente | API estable durante el último 1 año | Establecer licencia (MIT/BSD-Like) |
| gographviz | Utilizado para imprimir gráficos | La impresión de gráficos solo es vital para la depuración. Gorgonia puede sobrevivir sin pérdida de características, pero con una pérdida importante (pero posiblemente no vital) | Última actualización 12 de abril de 2017 | Licencia GographViz (Apache 2.0) |
| rng | Se utiliza para implementar funciones auxiliares para generar pesos iniciales | Se puede reemplazar con bastante facilidad. Gorgonia también puede prescindir de las funciones de conveniencia | Licencia RNG (Apache 2.0) | |
| errores | Envoltura de error | Gorgonia no morirá sin ella. De hecho, Gorgonia también ha usado Goerrors/errores en el pasado. | API estable durante los últimos 6 meses | Licencia de errores (MIT/BSD) |
| gonum/estera | Compatibilidad entre Tensor y Gonum's Matrix | El desarrollo de Gorgonia se compromete a mantenerse al día con la versión más actualizada | Licencia de Gonum (MIT/BSD) | |
| testificar/afirmar | Pruebas | Puede prescindir pero será un dolor masivo en el culo para probar | Testificar la licencia (MIT/BSD-Like) |
Estos son los paquetes y bibliotecas que se inspiraron y se adaptaron en el proceso de escritura de Gorgonia (los paquetes GO que se usaron ya se declararon anteriormente):
| Fuente | Cómo se usa | Licencia |
|---|---|---|
| Numpy | Inspiradas grandes porciones. Algoritmos adaptados directamente para algunos métodos (etiquetados explícitamente en los documentos) | MIT/BSD-Like. Licencia Numpy |
| Eano | Inspiradas grandes porciones. (Inseguro: número de algoritmos adaptados directamente) | Licencia de MIT/BSD-Like theano |
| Cafetería | im2col y col2im tomados directamente de la cafe. Algoritmos de convolución inspirados en los métodos de cafetería originales | Licencia de cafe |