Swift for TensorFlow był eksperymentem na platformie nowej generacji do uczenia maszynowego, obejmującym najnowsze badania z zakresu uczenia maszynowego, kompilatorów, programowania różnicowalnego, projektowania systemów i nie tylko. Został zarchiwizowany w lutym 2021 r. Do ważnych osiągnięć tego projektu należą:
- Dodano zróżnicowane programowanie zintegrowane z językiem w języku Swift. Ta praca jest kontynuowana w oficjalnym kompilatorze Swift.
- Opracowano interfejs API do głębokiego uczenia się zorientowany na zmienną wartość i semantykę
- Wspierał rozwój modelowego ogrodu z ponad 30 modelami z różnych dyscyplin uczenia głębokiego .
- Umożliwienie nowatorskich badań, które łączą głębokie uczenie się z probabilistycznymi modelami graficznymi do śledzenia ruchu 3D i nie tylko.
- Zasilany (prawie) czystym prototypem Swift środowiska wykonawczego GPU + CPU obsługującego pmap .
- Wydzielone z wielu działań pobocznych open source, które nadal są aktywnie rozwijane:
- PythonKit : współdziałanie Pythona z Swift.
- swift-jupyter : umożliwia korzystanie z języka Swift w notebookach Jupyter.
- swift-benchmark : Zapewnia solidny zestaw testów porównawczych dla kodu Swift.
- Powstało kilka innych projektów open source:
- pingwin : programowanie równoległe, struktury danych, algorytmy wykresów i nie tylko.
- Idealne dopasowanie tensorów : Analiza statyczna niedopasowania kształtu tensorów.
- Propozycje dotyczące szybkiej ewolucji zaproponowane i wdrożone:
- SE-0195 : Zdefiniowane przez użytkownika typy „Dynamic Member Lookup”
- SE-0216 : Wprowadzenie dynamicznie definiowanych przez użytkownika typów „wywoływalnych”
- SE-0233 : Make Numeric Udoskonal nowy protokół AdditiveArithmetic
- SE-0253 : Wywoływalne wartości typów nominalnych zdefiniowanych przez użytkownika
Ta witryna nie będzie otrzymywać dalszych aktualizacji. Dokumentacja API i pliki do pobrania binarne będą nadal dostępne, podobnie jak nagrania spotkań Open Design Review .
Szybki
Swift to język programowania ogólnego przeznaczenia typu open source , który ma dużą i stale rosnącą bazę użytkowników. Wybraliśmy Swift, ponieważ ma otwarty proces projektowania języka i ze względów technicznych szczegółowo opisanych w dokumencie „ Why Swift for TensorFlow ”. Zakładamy, że większość czytelników go nie zna, więc pokrótce omówimy tutaj kilka dodatkowych ważnych rzeczy na jego temat.
Rozwój Swift rozpoczął się w 2010 roku i miał na celu połączenie najlepszych praktyk w projektowaniu języków programowania w jednym systemie, zamiast próbować wprowadzać akademickie nowości lub religijnie propagować metodologie programowania. W rezultacie obsługuje tworzenie wielu paradygmatów (np. Funkcjonalne, OOP, ogólne, proceduralne itp.) W jednym systemie i zawiera wiele dobrze znanych pojęć z języków akademickich (np. Dopasowywanie wzorców , algebraiczne typy danych i klasy typów) na pierwszy plan. Zamiast mocno zachęcać programistów do przepisania całego kodu w Swift, pragmatycznie koncentruje się na interoperacyjności z innymi językami, np. Umożliwiając bezpośrednie importowanie plików nagłówkowych C i używanie ich bez FFI oraz (teraz) możliwość korzystania z API Pythona bez opakowań .
Swift ma odważny cel, jakim jest od programowania systemów niskiego poziomu do tworzenia skryptów wysokiego poziomu, z naciskiem na łatwość uczenia się i użytkowania . Ponieważ Swift musi być łatwy do nauczenia i używania, ale także potężny, opiera się na zasadzie stopniowego ujawniania złożoności , która agresywnie wpływa na koszt złożoności dla osób, które z niej korzystają. Wrażenie języka skryptowego w połączeniu z wysoką wydajnością jest bardzo przydatne w uczeniu maszynowym.
Ostatnim istotnym aspektem projektu Swift jest to, że znaczna część języka Swift jest faktycznie zaimplementowana w jego bibliotece standardowej. Typy „wbudowane”, takie jak Int i Bool, to w rzeczywistości struktury zdefiniowane w standardowej bibliotece, które zawijają magiczne typy i operacje. W związku z tym czasami żartujemy, że Swift jest po prostu „cukrem syntaktycznym dla LLVM”.
Jest o wiele więcej fajnych rzeczy w Swift i mnóstwo treści dostępnych online. Jeśli chcesz dowiedzieć się więcej o ogólnych koncepcjach programowania w języku Swift, oto kilka linków ułatwiających rozpoczęcie:
- A Swift Tour to wycieczka po wysokim poziomie składni i stylu Swift, będąca częścią większej książki „The Swift Programming Language”.
- Semantyka wartości jest potężna i odgrywa ważną rolę w kodzie Swift, jak wyjaśniono w artykule „ Tworzenie lepszych aplikacji z typami wartości w języku Swift ” [ YouTube ].
- Swift obsługuje klasyczne OOP, ale zaadaptował pomysły z systemu typów Haskell. Jest to wyjaśnione w „ Programowaniu zorientowanym na protokół w języku Swift ” [ YouTube ].
Jedno ostrzeżenie: Swift ewoluował szybko we wczesnych latach, więc powinieneś uważać na wszystko przed Swift 3 (wydanym w 2016 roku).
Dlaczego Swift dla TensorFlow?
Swift for TensorFlow to nowy sposób tworzenia modeli uczenia maszynowego. Zapewnia moc TensorFlow bezpośrednio zintegrowaną z językiem programowania Swift . Uważamy, że paradygmaty uczenia maszynowego są tak ważne, że zasługują na najwyższej klasy obsługę języka i kompilatora .
Podstawowym prymitywem w uczeniu maszynowym jest optymalizacja oparta na gradientach: obliczanie pochodnych funkcji w celu optymalizacji parametrów. Dzięki Swift for TensorFlow możesz łatwo różnicować funkcje za pomocą operatorów różnicowych, takich jak gradient(of:)
, lub różnicować w odniesieniu do całego modelu, wywołując metodę gradient(in:)
. Te API różnicowania są nie tylko dostępne dla Tensor
kondensatorem-koncepcje są uogólnione dla wszystkich typów, które są zgodne z Differentiable
protokół obejmujący Float
, Double
, SIMD wektorów oraz własnych struktur danych.
// 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
Oprócz produktów pochodnych projekt Swift for TensorFlow zawiera wyrafinowany łańcuch narzędzi zwiększający produktywność użytkowników. Możesz uruchomić Swift interaktywnie w notatniku Jupyter i uzyskać pomocne sugestie dotyczące autouzupełniania, które pomogą Ci odkryć ogromną powierzchnię interfejsu API nowoczesnej biblioteki głębokiego uczenia. Możesz rozpocząć pracę bezpośrednio w przeglądarce w kilka sekund !
Migracja do Swift dla TensorFlow jest naprawdę łatwa dzięki zaawansowanej integracji Swift z Pythonem. Możesz stopniowo migrować swój kod Pythona (lub nadal używać swoich ulubionych bibliotek Pythona), ponieważ możesz łatwo wywołać swoją ulubioną bibliotekę Pythona za pomocą znanej składni:
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!