Swift dla TensorFlow był eksperymentem na platformie nowej generacji do uczenia maszynowego, obejmującym najnowsze badania z zakresu uczenia maszynowego, kompilatorów, programowania różniczkowego, projektowania systemów i nie tylko. Archiwizacja odbyła się w lutym 2021 r. Do znaczących osiągnięć tego projektu należą:
- Dodano programowanie różniczkowe zintegrowane z językiem do języka Swift. Prace te są kontynuowane w oficjalnym kompilatorze Swift.
- Opracowano interfejs API głębokiego uczenia się zorientowany na zmienną wartość i semantykę
- Wspierał rozwój ogrodu modelowego obejmującego ponad 30 modeli z różnych dyscyplin głębokiego uczenia się .
- Umożliwiło nowatorskie badania, które łączą głębokie uczenie się z probabilistycznymi modelami graficznymi do śledzenia ruchu 3D i nie tylko.
- Obsługiwany (prawie) czysty prototyp Swift środowiska wykonawczego GPU + CPU obsługującego pmap .
- Wydzielił wiele działań związanych z oprogramowaniem open source, które nadal są aktywnie rozwijane:
- PythonKit : współdziałanie Pythona z Swiftem.
- Swift-jupyter : Umożliwia używanie języka Swift w notatnikach Jupyter.
- Swift-benchmark : zapewnia solidny zestaw testów porównawczych dla kodu Swift.
- Wydzielił kilka innych wysiłków związanych z oprogramowaniem open source:
- penguin : programowanie równoległe, struktury danych, algorytmy grafów i nie tylko.
- Idealnie dopasowane tensory : analiza statyczna niedopasowań kształtu tensora.
- Propozycje szybkiej ewolucji zaproponowane i wdrożone:
- SE-0195 : Zdefiniowane przez użytkownika typy „Dynamicznego wyszukiwania elementów”.
- SE-0216 : Wprowadzenie zdefiniowanych przez użytkownika, dynamicznie „wywoływanych” typów
- SE-0233 : Udoskonal numeryczny nowy protokół arytmetyki addytywnej
- SE-0253 : Możliwe do wywołania wartości typów nominalnych zdefiniowanych przez użytkownika
Ta witryna nie będzie otrzymywać dalszych aktualizacji. Dokumentacja API i pliki binarne do pobrania 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 wciąż rosnącą bazę użytkowników. Wybraliśmy Swift, ponieważ ma proces projektowania w otwartym języku i ze specyficznych powodów technicznych szczegółowo opisanych w dokumencie „ Dlaczego Swift dla TensorFlow ”. Zakładamy, że większość czytelników nie jest z nim zaznajomiona, dlatego pokrótce poruszymy tutaj kilka dodatkowych ważnych rzeczy na ten temat.
Rozwój Swifta rozpoczął się w 2010 roku i miał na celu połączenie najlepszych praktyk w projektowaniu języków programowania w jeden system, zamiast szukać nowości akademickich lub religijnie propagować metodologie programowania. W rezultacie obsługuje rozwój wielu paradygmatów (np. funkcjonalnych, OOP, ogólnych, proceduralnych itp.) wszystko w jednym systemie i wykorzystuje wiele dobrze znanych koncepcji z języków akademickich (np. dopasowywanie wzorców , algebraiczne typy danych i klasy typów). na czoło. Zamiast mocno zachęcać programistów do przepisania całego kodu w Swift, pragmatycznie skupia 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 śmiały cel, aby obejmować wszystko, od programowania systemów niskiego poziomu po skrypty wysokiego poziomu, ze szczególnym naciskiem na łatwość nauki i obsługi . 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 przenosi koszt złożoności na ludzi, którzy z tej złożoności korzystają. „Wyczucie języka skryptowego” w połączeniu z wysoką wydajnością jest bardzo przydatne w uczeniu maszynowym.
Ostatnim istotnym aspektem projektu Swifta jest to, że znaczna część języka Swift jest faktycznie zaimplementowana w jego standardowej bibliotece. Typy „wbudowane”, takie jak Int i Bool, to tak naprawdę struktury zdefiniowane w standardowej bibliotece, które otaczają magiczne typy i operacje. W związku z tym czasami żartujemy, że Swift to po prostu „cukier składniowy 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 Swift, oto kilka linków, od których możesz zacząć:
- Wycieczka po Swift to łatwa do przejrzenia wycieczka po składni i działaniu języka Swift na wysokim poziomie, stanowiąca część większej książki „Język programowania Swift”.
- Semantyka wartości ma ogromne znaczenie i odgrywa ważną rolę w kodzie Swift, jak wyjaśniono w artykule „ Tworzenie lepszych aplikacji za pomocą typów wartości w języku Swift ” [ YouTube ].
- Swift obsługuje klasyczny OOP, ale zaadaptował pomysły z systemu typu Haskell. Wyjaśniono to w „ Programowaniu zorientowanym na protokół w Swift ” [ YouTube ].
Jedno ostrzeżenie: Swift ewoluował szybko w pierwszych latach swojej działalności, dlatego przed wydaniem Swift 3 (wydanym w 2016 r.) należy zachować ostrożność.
Dlaczego Swift dla TensorFlow?
Swift dla TensorFlow to nowy sposób tworzenia modeli uczenia maszynowego. Daje Ci moc TensorFlow bezpośrednio zintegrowaną z językiem programowania Swift . Wierzymy, że paradygmaty uczenia maszynowego są na tyle ważne, że zasługują na pierwszorzędne wsparcie językowe i kompilatorowe .
Podstawowym elementem uczenia maszynowego jest optymalizacja oparta na gradientach: obliczanie pochodnych funkcji w celu optymalizacji parametrów. Dzięki Swift dla TensorFlow możesz łatwo różnicować funkcje za pomocą operatorów różniczkowych, takich jak gradient(of:)
, lub różnicować w odniesieniu do całego modelu, wywołując metodę gradient(in:)
. Te interfejsy API różnicowania są dostępne nie tylko dla koncepcji związanych z Tensor
— są uogólnione dla wszystkich typów zgodnych z protokołem Differentiable
, w tym wektorów Float
, Double
, SIMD i 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 instrumentów pochodnych projekt Swift for TensorFlow zawiera wyrafinowany zestaw narzędzi, dzięki którym użytkownicy mogą zwiększyć produktywność. Możesz uruchomić Swift interaktywnie w notatniku Jupyter i uzyskać przydatne sugestie autouzupełniania, które pomogą Ci eksplorować ogromną powierzchnię API nowoczesnej biblioteki głębokiego uczenia się. Możesz rozpocząć pracę bezpośrednio w przeglądarce w ciągu kilku sekund !
Migracja do Swift dla TensorFlow jest naprawdę łatwa dzięki potężnej integracji z Pythonem w Swift. Możesz stopniowo migrować swój kod Pythona (lub nadal korzystać z 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!