Swift para TensorFlow fue un experimento en la plataforma de próxima generación para el aprendizaje automático, que incorporó las últimas investigaciones sobre aprendizaje automático, compiladores, programación diferenciable, diseño de sistemas y más. Se archivó en febrero de 2021. Algunos logros importantes de este proyecto incluyen:
- Se agregó programación diferenciable integrada en el lenguaje en el lenguaje Swift. Este trabajo continúa en el compilador oficial de Swift.
- Desarrolló una API de aprendizaje profundo orientada a la semántica de valores mutables
- Fomento el desarrollo de un jardín modelo con más de 30 modelos de una variedad de disciplinas de aprendizaje profundo .
- Habilitó una investigación novedosa que combina el aprendizaje profundo con modelos gráficos probabilísticos para el seguimiento de movimiento en 3D y más.
- Desarrolló un prototipo Swift puro (n casi) de un tiempo de ejecución de GPU + CPU compatible con pmap .
- Derivó múltiples esfuerzos laterales de código abierto que continúan en desarrollo activo:
- PythonKit : interoperabilidad de Python con Swift.
- swift-jupyter : permite el uso de Swift en los cuadernos de Jupyter.
- swift-benchmark : proporciona un sólido conjunto de evaluaciones comparativas para el código Swift.
- Derivó varios otros esfuerzos de código abierto:
- pingüino : programación en paralelo, estructuras de datos, algoritmos de gráficos y más.
- Tensores que se ajustan perfectamente : análisis estático de desajustes de forma de tensor.
- Propuestas de evolución rápida propuestas e implementadas:
Este sitio no recibirá más actualizaciones. La documentación de la API y las descargas binarias seguirán estando disponibles, así como las grabaciones de reuniones de Open Design Review .
Rápido
Swift es un lenguaje de programación de uso general de código abierto , que tiene una base de usuarios grande y creciente. Elegimos Swift porque tiene un proceso de diseño de lenguaje abierto y por razones técnicas específicas que se detallan en el documento " Por qué Swift para TensorFlow ". Suponemos que la mayoría de los lectores no están familiarizados con él, por lo que trataremos brevemente algunos aspectos importantes adicionales al respecto aquí.
El desarrollo de Swift comenzó en 2010 y tenía como objetivo reunir las mejores prácticas en el diseño de lenguajes de programación en un solo sistema, en lugar de intentar la novedad académica o la propagación religiosa de metodologías de programación. Como resultado, admite el desarrollo de múltiples paradigmas (por ejemplo, funcional, OOP, genérico, procedimental, etc.) todo en un sistema y trae muchos conceptos bien conocidos de lenguajes académicos (por ejemplo , coincidencia de patrones , tipos de datos algebraicos y clases de tipos) a la vanguardia. En lugar de alentar fuertemente a los desarrolladores a reescribir todo su código en Swift, se enfoca pragmáticamente en la interoperabilidad con otros lenguajes, por ejemplo, permitiéndole importar directamente archivos de encabezado C y usarlos sin un FFI y (ahora) la capacidad de usar las API de Python sin envoltorios. .
Swift tiene el audaz objetivo de abarcar desde la programación de sistemas de bajo nivel hasta las secuencias de comandos de alto nivel, con un enfoque en que sea fácil de aprender y usar . Debido a que Swift debe ser fácil de aprender y usar, pero también poderoso, se basa en el principio de divulgación progresiva de la complejidad , que determina agresivamente el costo de la complejidad en las personas que se benefician de esa complejidad. La "sensación del lenguaje de secuencias de comandos" combinada con un alto rendimiento es muy útil para el aprendizaje automático.
Un último aspecto pertinente del diseño de Swift es que gran parte del lenguaje Swift está realmente implementado en su biblioteca estándar. Los tipos "incorporados" como Int y Bool son en realidad solo estructuras definidas en la biblioteca estándar que envuelven tipos y operaciones mágicas. Como tal, a veces bromeamos diciendo que Swift es simplemente "azúcar sintáctico para LLVM".
Hay muchas más cosas interesantes sobre Swift y un montón de contenido disponible en línea. Si está interesado en aprender más sobre los conceptos generales de programación de Swift, aquí hay algunos enlaces para comenzar:
- Un Swift Tour es un recorrido desnatado de la sintaxis de alto nivel y la sensación de Swift, y es parte del libro más grande "The Swift Programming Language".
- La semántica de valor es poderosa y juega un papel importante en el código Swift, como se explica en " Creación de mejores aplicaciones con tipos de valor en Swift " [ YouTube ].
- Swift es compatible con la programación orientada a objetos clásica, pero ha adaptado las ideas del sistema de tipos de Haskell. Esto se explica en " Programación orientada a protocolos en Swift " [ YouTube ].
Una advertencia: Swift evolucionó rápidamente en sus primeros años, por lo que debe tener cuidado con cualquier cosa antes de Swift 3 (lanzado en 2016).
¿Por qué Swift para TensorFlow?
Swift para TensorFlow es una nueva forma de desarrollar modelos de aprendizaje automático. Le brinda el poder de TensorFlow directamente integrado en el lenguaje de programación Swift . Creemos que los paradigmas de aprendizaje automático son tan importantes que merecen un lenguaje y un compilador de primera clase .
Una primitiva fundamental en el aprendizaje automático es la optimización basada en gradientes: calcular derivadas de funciones para optimizar parámetros. Con Swift para TensorFlow, puedes diferenciar funciones fácilmente usando operadores diferenciales como gradient(of:)
, o diferenciar con respecto a un modelo completo llamando al método gradient(in:)
. Estas API de diferenciación no solo están disponibles para conceptos relacionados con Tensor
, sino que están generalizadas para todos los tipos que se ajustan al protocolo Differentiable
, incluidos los vectores Float
, Double
, SIMD y sus propias estructuras de datos.
// Custom differentiable type.
struct Model: Differentiable {
var w: Float
var b: Float
func applied(to input: Float) -> Float {
return w * input + b
}
}
// Differentiate using `gradient(at:_:in:)`.
let model = Model(w: 4, b: 3)
let input: Float = 2
let (𝛁model, 𝛁input) = gradient(at: model, input) { model, input in
model.applied(to: input)
}
print(𝛁model) // Model.TangentVector(w: 2.0, b: 1.0)
print(𝛁input) // 4.0
Más allá de los derivados, el proyecto Swift for TensorFlow viene con una cadena de herramientas sofisticada para que los usuarios sean más productivos. Puede ejecutar Swift de forma interactiva en un cuaderno de Jupyter y obtener sugerencias útiles de autocompletado que le ayudarán a explorar la enorme superficie de API de una biblioteca de aprendizaje profundo moderna. ¡Puede comenzar directamente en su navegador en segundos !
Migrar a Swift para TensorFlow es realmente fácil gracias a la poderosa integración de Python de Swift. Puede migrar gradualmente su código de Python (o continuar usando sus bibliotecas de Python favoritas), porque puede llamar fácilmente a su biblioteca de Python favorita con una sintaxis familiar:
import TensorFlow
import Python
let np = Python.import("numpy")
let array = np.arange(100).reshape(10, 10) // Create a 10x10 numpy array.
let tensor = Tensor<Float>(numpy: array) // Seamless integration!