Swift для TensorFlow — это эксперимент с платформой машинного обучения нового поколения, включающий в себя новейшие исследования в области машинного обучения, компиляторов, дифференцируемого программирования, проектирования систем и многого другого. Он был заархивирован в феврале 2021 года. Некоторые важные достижения этого проекта включают:
- В язык Swift добавлено дифференцируемое программирование, интегрированное в язык . Эта работа продолжается в официальном компиляторе Swift.
- Разработан API глубокого обучения, ориентированный на семантику изменяемых значений.
- Способствовал развитию модельного сада с более чем 30 моделями из различных дисциплин глубокого обучения .
- Проведены новые исследования, сочетающие глубокое обучение с вероятностными графическими моделями для отслеживания 3D-движений и не только.
- Создан (почти) чистый прототип Swift для среды выполнения GPU+CPU, поддерживающей pmap .
- Выделено несколько проектов с открытым исходным кодом, которые продолжают активно развиваться:
- PythonKit : совместимость Python со Swift.
- Swift-jupyter : позволяет использовать Swift в блокнотах Jupyter.
- Swift-benchmark : предоставляет надежный набор тестов для кода Swift.
- Выделил несколько других проектов с открытым исходным кодом:
- Penguin : Параллельное программирование, структуры данных, графовые алгоритмы и многое другое.
- Тензоры идеально подходят : статический анализ несоответствий формы тензоров.
- Предложения по быстрой эволюции предложены и реализованы:
- SE-0195 : Определяемые пользователем типы «динамического поиска элементов»
- SE-0216 : введение определяемых пользователем динамически «вызываемых» типов.
- SE-0233 : Сделайте числовое уточнение нового протокола аддитивной арифметики.
- SE-0253 : Вызываемые значения определяемых пользователем номинальных типов.
Этот сайт не будет получать дальнейшие обновления. Документация по API и загружаемые двоичные файлы будут по-прежнему доступны, а также записи совещаний Open Design Review .
Быстрый
Swift — это язык программирования общего назначения с открытым исходным кодом , который имеет большую и растущую базу пользователей. Мы выбрали Swift, потому что он имеет открытый процесс разработки языка и по конкретным техническим причинам, подробно описанным в документе « Почему Swift для TensorFlow ». Мы предполагаем, что большинство читателей с ним незнакомы, поэтому кратко коснемся здесь некоторых дополнительных важных моментов.
Разработка Swift началась в 2010 году и была направлена на объединение лучших практик в разработке языков программирования в одну систему, а не на поиск академических новинок или религиозное распространение методологий программирования. В результате он поддерживает разработку нескольких парадигм (например, функциональную, ООП, универсальную, процедурную и т. д.) в одной системе и объединяет множество хорошо известных концепций из академических языков (например, сопоставление с образцом , алгебраические типы данных и классы типов). на первый план. Вместо того, чтобы настоятельно поощрять разработчиков переписывать весь свой код на Swift, он прагматично фокусируется на совместимости с другими языками, например, позволяет напрямую импортировать заголовочные файлы C и использовать их без FFI и (теперь) возможность использовать API Python без оболочек. .
Swift ставит перед собой амбициозную цель — охватить весь путь от системного программирования низкого уровня до написания сценариев высокого уровня, уделяя особое внимание простоте изучения и использования . Поскольку Swift должен быть простым в освоении и использовании, но при этом мощным, он опирается на принцип постепенного раскрытия сложности , который агрессивно перекладывает стоимость сложности на людей, которые получают от этой сложности выгоду. «Ощущение языка сценариев» в сочетании с высокой производительностью очень полезно для машинного обучения.
Последний важный аспект конструкции Swift заключается в том, что большая часть языка Swift фактически реализована в его стандартной библиотеке. «Встроенные» типы, такие как Int и Bool, на самом деле являются просто структурами, определенными в стандартной библиотеке, которые обертывают магические типы и операции. Поэтому иногда мы шутим, что Swift — это просто «синтаксический сахар для LLVM».
В Swift есть еще много интересного и масса контента, доступного в Интернете. Если вы хотите узнать больше об общих концепциях программирования на Swift, вот несколько ссылок для начала:
- Swift Tour — это обзорный обзор высокоуровневого синтаксиса и ощущений от Swift, который является частью более крупной книги «Язык программирования Swift».
- Семантика значений является мощной и играет важную роль в коде Swift, как описано в статье « Создание лучших приложений с типами значений в Swift » [ YouTube ].
- Swift поддерживает классический ООП, но адаптировал идеи системы типов Haskell. Это объясняется в разделе « Протокольно-ориентированное программирование на Swift » [ YouTube ].
Одно предупреждение: Swift быстро развивался в первые годы своего существования, поэтому вам следует быть осторожными со всем, что было до Swift 3 (выпущенного в 2016 году).
Почему Swift для TensorFlow?
Swift для TensorFlow — это новый способ разработки моделей машинного обучения. Он дает вам возможности TensorFlow, напрямую интегрированные в язык программирования Swift . Мы считаем, что парадигмы машинного обучения настолько важны, что заслуживают первоклассной поддержки языка и компилятора .
Фундаментальным примитивом машинного обучения является оптимизация на основе градиента: вычисление производных функций для оптимизации параметров. Используя Swift для TensorFlow, вы можете легко дифференцировать функции, используя дифференциальные операторы, такие как gradient(of:)
, или дифференцировать по всей модели, вызывая метод gradient(in:)
. Эти API-интерфейсы дифференциации доступны не только для концепций, связанных с Tensor
— они обобщены для всех типов, соответствующих протоколу Differentiable
, включая векторы Float
, Double
, SIMD и ваши собственные структуры данных.
// 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
Помимо производных, проект Swift for TensorFlow включает в себя сложную цепочку инструментов, позволяющую повысить продуктивность работы пользователей. Вы можете запустить Swift в интерактивном режиме в блокноте Jupyter и получить полезные рекомендации по автозаполнению, которые помогут вам изучить огромную поверхность API современной библиотеки глубокого обучения. Вы можете начать работу прямо в браузере за считанные секунды !
Переход на Swift для TensorFlow действительно прост благодаря мощной интеграции Swift с Python. Вы можете постепенно переносить свой код Python (или продолжать использовать свои любимые библиотеки Python), поскольку вы можете легко вызвать свою любимую библиотеку Python со знакомым синтаксисом:
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!