Swift para TensorFlow fue un experimento en la plataforma de próxima generación para el aprendizaje automático, que incorpora las últimas investigaciones sobre aprendizaje automático, compiladores, programación diferenciable, diseño de sistemas y más. Fue archivado en febrero de 2021. Algunos logros importantes de este proyecto incluyen:
- Se agregó programación diferenciable integrada en el lenguaje al 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
- Fomenté el desarrollo de un jardín modelo con más de 30 modelos de una variedad de disciplinas de aprendizaje profundo .
- Permitió una investigación novedosa que combina el aprendizaje profundo con modelos gráficos probabilísticos para el seguimiento del movimiento en 3D y más.
- Impulsado por un prototipo (casi) puro de Swift de un tiempo de ejecución de GPU+CPU compatible con pmap .
- Surgieron múltiples esfuerzos paralelos de código abierto que continúan en desarrollo activo:
- PythonKit : interoperabilidad de Python con Swift.
- swift-jupyter : permite el uso de Swift dentro de los cuadernos de Jupyter.
- swift-benchmark : proporciona un conjunto de pruebas comparativas sólidas para el código Swift.
- Se derivaron varios otros esfuerzos de código abierto:
- pingüino : programación paralela, estructuras de datos, algoritmos gráficos y más.
- Tensores que se ajustan perfectamente : análisis estático de desajustes de formas de tensores.
- Propuestas de evolución rápida propuestas e implementadas:
- SE-0195 : Tipos de "búsqueda dinámica de miembros" definidos por el usuario
- SE-0216 : Introducir tipos dinámicamente "invocables" definidos por el usuario
- SE-0233 : Hacer que el refinamiento numérico sea un nuevo protocolo aritmético aditivo
- SE-0253 : Valores invocables de tipos nominales definidos por el usuario
Este sitio no recibirá más actualizaciones. La documentación API y las descargas binarias seguirán siendo accesibles, así como las grabaciones de las reuniones de Open Design Review .
Rápido
Swift es un lenguaje de programación de propósito general de código abierto , que tiene una base de usuarios grande y en crecimiento. 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 abordaremos brevemente algunas cosas adicionales importantes 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 buscar novedades académicas o propagar religiosamente metodologías de programación. Como resultado, admite el desarrollo de múltiples paradigmas (por ejemplo, funcional, programación orientada a objetos, genérico, procedimental, etc.), todo en un solo sistema, y aporta 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 encarecidamente a los desarrolladores a reescribir todo su código en Swift, se centra 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 API de Python sin envoltorios. .
Swift tiene el audaz objetivo de abarcar desde la programación de sistemas de bajo nivel hasta el scripting de alto nivel, centrándose 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 factoriza 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 en realidad se implementa en su biblioteca estándar. Los tipos "integrados" 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 una gran cantidad de contenido disponible en línea. Si está interesado en aprender más sobre los conceptos generales de programación Swift, aquí hay algunos enlaces para comenzar:
- Un Swift Tour es un recorrido que se puede hojear por la sintaxis de alto nivel y la sensación de Swift, y es parte del libro más amplio "El lenguaje de programación Swift".
- La semántica de valores es poderosa y juega un papel importante en el código Swift, como se explica en " Creación de mejores aplicaciones con tipos de valores en Swift " [ YouTube ].
- Swift admite la programación orientada a objetos clásica, pero ha adaptado ideas del sistema de tipos 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 debes tener cuidado con todo lo anterior a 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 soporte de lenguaje y 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 diferenciarlas 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
: 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 para TensorFlow viene con una cadena de herramientas sofisticada para hacer que los usuarios sean más productivos. Puede ejecutar Swift de forma interactiva en un cuaderno Jupyter y obtener sugerencias útiles de autocompletar para ayudarle a explorar la enorme superficie API de una biblioteca moderna de aprendizaje profundo. ¡Puedes comenzar directamente en tu navegador en segundos !
Migrar a Swift para TensorFlow es realmente fácil gracias a la poderosa integración de Python de Swift. Puedes migrar incrementalmente tu código Python (o continuar usando tus bibliotecas Python favoritas), porque puedes llamar fácilmente a tu biblioteca 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!