Swift pour TensorFlow (en mode archive)

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 :

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 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!