Swift pour TensorFlow était une expérience dans la plate-forme de nouvelle génération pour l'apprentissage automatique, intégrant les dernières recherches sur l'apprentissage automatique, les compilateurs, la programmation différenciable, la conception de systèmes et au-delà. Il a été archivé en février 2021. Certaines réalisations importantes de ce projet comprennent:
- Ajout de la programmation différentiable intégrée au langage dans le langage Swift. Ce travail se poursuit dans le compilateur officiel Swift.
- Développement d'une API d'apprentissage en profondeur orientée vers la sémantique à valeur mutable
- A favorisé le développement d' un jardin modèle avec plus de 30 modèles issus d'une variété de disciplines d'apprentissage en profondeur .
- Recherche novatrice qui combine l'apprentissage en profondeur avec des modèles graphiques probabilistes pour le suivi de mouvement 3D et au-delà.
- Propulsé un prototype (presque) pur-Swift d'un GPU + CPU prenant en charge pmap .
- Spun off plusieurs efforts parallèles open source qui continuent d'être en développement actif:
- PythonKit : interopérabilité Python avec Swift.
- swift-jupyter : permet d'utiliser Swift dans les blocs-notes Jupyter.
- swift-benchmark : fournit une suite d'analyse comparative robuste pour le code Swift.
- Spun plusieurs autres efforts open source:
- penguin : programmation parallèle, structures de données, algorithmes graphiques, etc.
- Tensors Fitting Perfectly : Analyse statique des discordances de forme de tenseur.
- Propositions Swift-evolution 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 : Make Numeric Affiner un nouveau protocole additif arithmétique
- SE-0253 : Valeurs appelables de types nominaux définis par l'utilisateur
Ce site ne recevra plus de mises à jour. La documentation de l'API et les téléchargements binaires continueront d'être accessibles ainsi que les enregistrements de la réunion Open Design Review .
Rapide
Swift est un langage de programmation open source polyvalent, qui a une base d'utilisateurs large et croissante. Nous avons choisi Swift parce qu'il a 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 allons donc aborder brièvement quelques points importants supplémentaires à ce sujet ici.
Le développement de Swift a débuté en 2010 et visait à rassembler les meilleures pratiques de conception de langage de programmation dans un seul système plutôt que d'essayer la nouveauté académique ou de propager religieusement des méthodologies de programmation. En conséquence, il prend en charge le développement multi-paradigme (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, vous permettant d'importer directement des fichiers d'en-tête C et de les utiliser sans FFI et (maintenant) la possibilité d'utiliser des API Python sans wrappers .
Swift a l'objectif audacieux de s'étendre de la programmation de systèmes de bas niveau à la création de 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 repose sur le principe de la divulgation progressive de la complexité , qui répercute de manière agressive le coût de la complexité sur les personnes qui bénéficient de cette complexité. La "sensation de langage de script" associé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 en fait implémentée dans sa bibliothèque standard. Les types "intégrés" comme Int et Bool ne sont en fait que des structures définies dans la bibliothèque standard qui encapsulent les types et les 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 cool à propos de Swift et une tonne de contenu disponible en ligne. Si vous souhaitez en savoir plus sur les concepts généraux de programmation Swift, voici quelques liens pour commencer:
- Un Swift Tour est une visite skimmable de la syntaxe et de la sensation de haut niveau de Swift, et fait partie du livre plus grand "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 valeur dans Swift » [ YouTube ].
- Swift prend en charge la POO classique, mais a adapté les idées du système de type 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 faire attention à tout avant Swift 3 (sorti en 2016).
Pourquoi Swift pour TensorFlow?
Swift for TensorFlow est une nouvelle façon de développer des modèles d'apprentissage automatique. Il vous donne la puissance de TensorFlow directement intégré dans le langage de programmation Swift . Nous pensons que les paradigmes d'apprentissage automatique sont si importants qu'ils méritent un langage de premier ordre et un support de compilateur .
Une primitive fondamentale de l'apprentissage automatique est l'optimisation basée sur le gradient: calculer des dérivés de fonctions pour optimiser les paramètres. Avec Swift pour TensorFlow, vous pouvez facilement différencier les 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 pour 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 for 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 l'énorme surface d'API d'une bibliothèque moderne d'apprentissage en profondeur. Vous pouvez démarrer directement dans votre navigateur en quelques secondes !
La migration vers Swift pour TensorFlow est vraiment facile 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!