Swift pour TensorFlow était une expérience sur la plate-forme d'apprentissage automatique de nouvelle génération, intégrant les dernières recherches en matière d'apprentissage automatique, de compilateurs, de programmation différenciable, de conception de systèmes et au-delà. Il a été archivé en février 2021. Parmi les réalisations importantes de ce projet figurent :
- Ajout de la programmation différenciable intégrée au langage dans le langage Swift. Ce travail se poursuit dans le compilateur officiel Swift.
- Développement d'une API de deep learning orientée sémantique de valeurs mutables
- Favorisé le développement d' un jardin modèle avec plus de 30 modèles issus d'une variété de disciplines d'apprentissage profond .
- Nous avons permis de nouvelles recherches combinant l'apprentissage profond et des modèles graphiques probabilistes pour le suivi de mouvement 3D et au-delà.
- Propulsé par un (presque) prototype purement Swift d'un runtime GPU+CPU prenant en charge pmap .
- Déploiement de plusieurs efforts parallèles open source qui continuent d'être en cours de développement actif :
- PythonKit : Interopérabilité Python avec Swift.
- swift-jupyter : Permet l'utilisation de Swift dans les notebooks Jupyter.
- swift-benchmark : Fournit une suite d'analyse comparative robuste pour le code Swift.
- Déploiement de plusieurs autres efforts open source :
- pingouin : programmation parallèle, structures de données, algorithmes graphiques, etc.
- Tenseurs parfaitement ajustés : analyse statique des disparités de forme des tenseurs.
- Propositions d'évolution rapide proposées et mises en œuvre :
- SE-0195 : Types de "Recherche dynamique de membres" définis par l'utilisateur
- SE-0216 : Introduire des types "appelables" dynamiquement définis par l'utilisateur
- SE-0233 : Rendre numérique affiner un nouveau protocole AdditiveArithmetic
- SE-0253 : Valeurs appelables de types nominaux définis par l'utilisateur
Ce site ne recevra pas d'autres mises à jour. La documentation de l'API et les téléchargements binaires continueront d'être accessibles ainsi que les enregistrements des réunions Open Design Review .
Rapide
Swift est un langage de programmation open source à usage général, qui compte une base d'utilisateurs large et croissante. Nous avons choisi Swift car il dispose d'un processus de conception de langage ouvert et pour des raisons techniques spécifiques détaillées dans le document « Pourquoi Swift pour TensorFlow ». Nous supposons que la plupart des lecteurs ne le connaissent pas, nous aborderons donc brièvement ici quelques éléments supplémentaires importants à son sujet.
Le développement de Swift a débuté en 2010 et visait à rassembler les meilleures pratiques en matière de conception de langages de programmation en un seul système plutôt que de rechercher la nouveauté académique ou de propager religieusement les méthodologies de programmation. En conséquence, il prend en charge le développement multi-paradigmes (par exemple fonctionnel, POO, générique, procédural, etc.) dans un seul système et apporte de nombreux concepts bien connus des langages académiques (par exemple correspondance de modèles , types de données algébriques et classes de types). au premier plan. Au lieu d'encourager fortement les développeurs à réécrire tout leur code dans Swift, il se concentre de manière pragmatique sur l'interopérabilité avec d'autres langages, par exemple en vous permettant d'importer directement des fichiers d'en-tête C et de les utiliser sans FFI et (maintenant) la possibilité d'utiliser les API Python sans wrappers. .
Swift a l'objectif audacieux de s'étendre de la programmation système de bas niveau aux scripts de haut niveau, en mettant l'accent sur la facilité d'apprentissage et d'utilisation . Parce que Swift doit être facile à apprendre et à utiliser, mais aussi puissant, il s'appuie sur le principe de divulgation progressive de la complexité , qui fait supporter de manière agressive le coût de la complexité aux personnes qui bénéficient de cette complexité. La « sensation de langage de script » combinée à des performances élevées est très utile pour l’apprentissage automatique.
Un dernier aspect pertinent de la conception de Swift est qu’une grande partie du langage Swift est réellement implémentée dans sa bibliothèque standard. Les types "intégrés" comme Int et Bool ne sont en réalité que des structures définies dans la bibliothèque standard qui enveloppent les types et opérations magiques. En tant que tel, nous plaisantons parfois en disant que Swift n'est qu'un "sucre syntaxique pour LLVM".
Il y a beaucoup plus de choses intéressantes à propos de Swift et une tonne de contenu disponible en ligne. Si vous souhaitez en savoir plus sur les concepts généraux de la programmation Swift, voici quelques liens pour commencer :
- Un Swift Tour est une visite guidée de la syntaxe et de la convivialité de haut niveau de Swift, et fait partie du livre plus vaste "The Swift Programming Language".
- La sémantique des valeurs est puissante et joue un rôle important dans le code Swift, comme expliqué dans « Créer de meilleures applications avec des types de valeurs dans Swift » [ YouTube ].
- Swift prend en charge la POO classique, mais a adapté les idées du système de types Haskell. Ceci est expliqué dans " Programmation orientée protocole dans Swift " [ YouTube ].
Un avertissement : Swift a évolué rapidement au cours de ses premières années, vous devez donc être prudent avec tout ce qui précède Swift 3 (sorti en 2016).
Pourquoi Swift pour TensorFlow ?
Swift pour TensorFlow est une nouvelle façon de développer des modèles d'apprentissage automatique. Il vous offre la puissance de TensorFlow directement intégré au langage de programmation Swift . Nous pensons que les paradigmes d'apprentissage automatique sont si importants qu'ils méritent un support de langage et de compilateur de premier ordre .
Une primitive fondamentale de l’apprentissage automatique est l’optimisation basée sur le gradient : calculer les dérivées des fonctions pour optimiser les paramètres. Avec Swift pour TensorFlow, vous pouvez facilement différencier des fonctions à l'aide d'opérateurs différentiels comme gradient(of:)
, ou différencier par rapport à un modèle entier en appelant la méthode gradient(in:)
. Ces API de différenciation ne sont pas uniquement disponibles pour les concepts liés à Tensor
: elles sont généralisées à tous les types conformes au protocole Differentiable
, y compris les vecteurs Float
, Double
, SIMD et vos propres structures de données.
// 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
Au-delà des dérivés, le projet Swift pour TensorFlow est livré avec une chaîne d'outils sophistiquée pour rendre les utilisateurs plus productifs. Vous pouvez exécuter Swift de manière interactive dans un bloc-notes Jupyter et obtenir des suggestions de saisie semi-automatique utiles pour vous aider à explorer la vaste surface API d'une bibliothèque d'apprentissage en profondeur moderne. Vous pouvez commencer directement dans votre navigateur en quelques secondes !
La migration vers Swift pour TensorFlow est vraiment simple grâce à la puissante intégration Python de Swift. Vous pouvez migrer progressivement votre code Python (ou continuer à utiliser vos bibliothèques Python préférées), car vous pouvez facilement appeler votre bibliothèque Python préférée avec une syntaxe familière :
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!