Swift per TensorFlow (in modalità archivio)

Swift per TensorFlow è stato un esperimento sulla piattaforma di prossima generazione per l'apprendimento automatico, che incorpora le ultime ricerche su apprendimento automatico, compilatori, programmazione differenziabile, progettazione di sistemi e altro ancora. È stato archiviato nel febbraio 2021. Alcuni risultati significativi di questo progetto includono:

Questo sito non riceverà ulteriori aggiornamenti. La documentazione API e i download binari continueranno a essere accessibili, così come le registrazioni delle riunioni di Open Design Review .

Veloce

Swift è un linguaggio di programmazione generico open source , che ha una base di utenti ampia e in crescita. Abbiamo scelto Swift perché ha un processo di progettazione del linguaggio aperto e per ragioni tecniche specifiche dettagliate nel documento " Perché Swift per TensorFlow ". Partiamo dal presupposto che la maggior parte dei lettori non lo conosce, quindi qui toccheremo brevemente alcuni aspetti importanti aggiuntivi a riguardo.

Lo sviluppo di Swift è iniziato nel 2010 e mirava a riunire le migliori pratiche nella progettazione del linguaggio di programmazione in un unico sistema piuttosto che cercare novità accademiche o propagare religiosamente metodologie di programmazione. Di conseguenza, supporta lo sviluppo multi-paradigma (ad esempio funzionale, OOP, generico, procedurale, ecc.) tutto in un unico sistema e porta molti concetti ben noti dai linguaggi accademici (ad esempio corrispondenza di modelli , tipi di dati algebrici e classi di tipi) in prima linea. Invece di incoraggiare fortemente gli sviluppatori a riscrivere tutto il loro codice in Swift, si concentra pragmaticamente sull'interoperabilità con altri linguaggi, ad esempio consentendo di importare direttamente file di intestazione C e utilizzarli senza FFI e (ora) la possibilità di utilizzare API Python senza wrapper .

Swift ha l'audace obiettivo di spaziare dalla programmazione di sistemi di basso livello allo scripting di alto livello, con l'obiettivo di essere facile da apprendere e utilizzare . Poiché Swift deve essere facile da imparare e da usare ma anche potente, si basa sul principio della progressiva divulgazione della complessità , che fattorizza in modo aggressivo il costo della complessità sulle persone che ne beneficiano. La "sensazione del linguaggio di scripting" combinata con prestazioni elevate è molto utile per l'apprendimento automatico.

Un ultimo aspetto pertinente della progettazione di Swift è che gran parte del linguaggio Swift è effettivamente implementato nella sua libreria standard. I tipi "costruiti" come Int e Bool sono in realtà solo strutture definite nella libreria standard che racchiudono tipi e operazioni magici. Pertanto, a volte scherziamo dicendo che Swift è solo "zucchero sintattico per LLVM".

C'è molto di più di interessante in Swift e un sacco di contenuti disponibili online. Se sei interessato a saperne di più sui concetti generali di programmazione di Swift, ecco alcuni link per iniziare:

Un avvertimento: Swift si è evoluto rapidamente nei suoi primi anni, quindi dovresti stare attento a qualsiasi cosa prima di Swift 3 (rilasciato nel 2016).

Perché Swift per TensorFlow?

Swift per TensorFlow è un nuovo modo di sviluppare modelli di machine learning. Ti offre la potenza di TensorFlow direttamente integrata nel linguaggio di programmazione Swift . Riteniamo che i paradigmi di machine learning siano così importanti da meritare un supporto di linguaggio e compilatore di prima classe .

Una primitiva fondamentale nell'apprendimento automatico è l'ottimizzazione basata sul gradiente: calcolo delle derivate delle funzioni per ottimizzare i parametri. Con Swift per TensorFlow, puoi facilmente differenziare le funzioni utilizzando operatori differenziali come gradient(of:) o differenziare rispetto a un intero modello chiamando il metodo gradient(in:) . Queste API di differenziazione non sono disponibili solo per i concetti relativi Tensor : sono generalizzate per tutti i tipi conformi al protocollo Differentiable , inclusi Float , Double , vettori SIMD e le tue strutture dati.

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

Oltre ai derivati, il progetto Swift per TensorFlow è dotato di una sofisticata toolchain per rendere gli utenti più produttivi. Puoi eseguire Swift in modo interattivo in un notebook Jupyter e ottenere utili suggerimenti di completamento automatico per aiutarti a esplorare l'enorme superficie API di una moderna libreria di deep learning. Puoi iniziare direttamente nel tuo browser in pochi secondi !

La migrazione a Swift per TensorFlow è davvero semplice grazie alla potente integrazione Python di Swift. Puoi migrare in modo incrementale il tuo codice Python (o continuare a utilizzare le tue librerie Python preferite), perché puoi facilmente chiamare la tua libreria Python preferita con una sintassi familiare:

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!