Введение в PyTorch

PyTorch — это открытая библиотека машинного обучения для Python, основанная на библиотеке Torch, реализованная на нижнем уровне на C++ и применяемая в таких областях искусственного интеллекта, как компьютерное зрение и обработка естественного языка.

PyTorch изначально был разработан командой исследователей ИИ Meta Platforms и теперь является частью Linux Foundation.

Многие программные пакеты для глубокого обучения построены на PyTorch, включая Tesla Autopilot, Pyro от Uber, Transformers от Hugging Face, PyTorch Lightning и Catalyst.

PyTorch имеет две основные особенности:

  • Тензорные вычисления, аналогичные NumPy, которые можно ускорять на аппаратных ускорителях, таких как GPU или MPS.
  • Глубокие нейронные сети, основанные на системе автоматического дифференцирования.

PyTorch включает такие подмодули, как torch.autograd, torch.nn и torch.optim.

PyTorch включает множество функций потерь, включая MSE (среднеквадратичная ошибка = норма L2), кросс-энтропийную потерю и потерю отрицательного логарифмического правдоподобия (полезно для классификаторов), среди прочих.

Возможности PyTorch

  • Динамические графы вычислений: Графы вычислений PyTorch являются динамическими, то есть они строятся во время выполнения и могут быть изменены в любой момент. Это обеспечивает большую гибкость для экспериментов и отладки, поскольку разработчики могут выполнять код строка за строкой и просматривать промежуточные результаты.

  • Автоматическое дифференцирование: Система автоматического дифференцирования PyTorch позволяет разработчикам легко вычислять градиенты, что критически важно для обучения моделей глубокого обучения. Она автоматически вычисляет градиенты функции потерь по параметрам модели с помощью алгоритма обратного распространения ошибки.

  • Тензорные вычисления: PyTorch предоставляет тензорные операции, аналогичные NumPy, которые могут выполняться на CPU и GPU, тем самым ускоряя процесс вычислений. Тензоры — это базовая структура данных в PyTorch, используемая для хранения и обработки данных.

  • Богатый API: PyTorch предоставляет большое количество предопределённых слоёв, функций потерь и алгоритмов оптимизации, которые являются распространёнными компонентами для построения моделей глубокого обучения.

  • Поддержка нескольких языков: Хотя PyTorch использует Python в качестве основного интерфейса, он также предоставляет интерфейс C++, позволяющий осуществлять интеграцию и управление на более низком уровне.

Динамический граф вычислений

Одной из самых заметных особенностей PyTorch является механизм динамического графа вычислений.

В отличие от статического графа вычислений TensorFlow, PyTorch строит граф вычислений во время выполнения, что означает, что при каждом вычислении граф автоматически изменяется в соответствии с формой входных данных.

Преимущества динамического графа вычислений:

  • Более гибкий, особенно подходит для сценариев, требующих условных проверок или рекурсии.
  • Удобен для отладки и модификации, позволяет напрямую проверять промежуточные результаты.
  • Ближе к стилю программирования на Python и прост для освоения.

Тензоры и Autograd

Основная структура данных в PyTorch — этоTensor, представляющий собой многомерную матрицу, которая может эффективно выполнять вычисления на CPU или GPU. Операции с Tensor поддерживают механизм Autograd, позволяя автоматически вычислять градиенты во время обратного распространения, что крайне важно для алгоритмов оптимизации градиентного спуска в глубоком обучении.

Tensor:

  • Поддерживает переключение между CPU и GPU.
  • Предоставляет интерфейс, похожий на NumPy, и поддерживает поэлементные операции.
  • Поддерживает автоматическое дифференцирование, что делает вычисление градиентов удобным.

Autograd:

  • Встроенный движок автоматического дифференцирования PyTorch может автоматически отслеживать все операции с тензорами и вычислять градиенты во время обратного распространения.
  • Черезrequires_gradатрибут, вы можете указать, что тензор требует вычисления градиента.
  • Поддерживает эффективное обратное распространение, подходящее для обучения нейронных сетей.

Определение и обучение модели

PyTorch предоставляетtorch.nnмодуль, позволяющий пользователям наследоватьnn.Moduleclass для определения моделей нейронных сетей. Используйтеforwardфункция для указания прямого распространения; автоматическое обратное распространение (черезautograd), а вычисление градиентов также выполняется внутри PyTorch.

Модуль нейронных сетей (torch.nn):

  • Предоставляет часто используемые слои (такие как линейные слои, свёрточные слои, слои пулинга и т. д.).
  • Поддерживает определение сложных архитектур нейронных сетей (включая сети с несколькими входами и выходами).
  • Совместим с оптимизаторами (такими какtorch.optim) для совместного использования.

Ускорение на GPU

PyTorch полностью поддерживает работу на GPU для ускорения обучения моделей глубокого обучения. С помощью простого.to(device)метода пользователи могут переносить модели и тензоры на GPU для вычислений. PyTorch поддерживает обучение на нескольких GPU и может использовать технологию NVIDIA CUDA для значительного повышения вычислительной эффективности.

Поддержка GPU:

  • Автоматически выбирает GPU или CPU.
  • Поддерживает ускорение с помощью CUDA.
  • Поддерживает параллельные вычисления с использованием нескольких GPU (DataParallelилиtorch.distributed)。

Экосистема и поддержка сообщества

Будучи проектом с открытым исходным кодом, PyTorch имеет большое сообщество и экосистему. Он широко используется не только в академической среде, но и активно применяется в промышленности, особенно в таких областях, как компьютерное зрение и обработка естественного языка. PyTorch также предоставляет множество инструментов и библиотек, связанных с глубоким обучением, таких как:

  • torchvision: наборы данных и модели для задач компьютерного зрения.
  • torchtext: наборы данных и инструменты предварительной обработки для задач обработки естественного языка.
  • torchaudio: набор инструментов для обработки аудио.
  • PyTorch Lightning: высокоуровневая библиотека, которая упрощает код PyTorch и ориентирована на быструю итерацию в исследованиях и экспериментах.

Сравнение с другими фреймворками

Благодаря своей гибкости, простоте использования и поддержке сообщества PyTorch стал предпочтительным фреймворком для многих исследователей и разработчиков в области глубокого обучения.

TensorFlow против PyTorch

  • Динамический граф вычислений PyTorch делает его более гибким и подходящим для быстрых экспериментов и исследований, тогда как статический граф вычислений TensorFlow предоставляет больше возможностей для оптимизации в производственных средах.
  • PyTorch удобнее для отладки, тогда как TensorFlow более зрелый в развёртывании и поддерживает более широкий спектр аппаратного обеспечения и платформ.
  • В последние годы TensorFlow также представил динамические графы (например, TensorFlow 2.x), что делает эти два фреймворка всё более близкими по функциональности.
  • Другие фреймворки глубокого обучения, такие как Keras и Caffe, также находят определённое применение, но благодаря своей гибкости, простоте использования и поддержке сообщества PyTorch стал предпочтительным фреймворком для многих исследователей и разработчиков в области глубокого обучения.
ХарактеристикаTensorFlowPyTorch
РазработчикGoogleFacebook (FAIR)
Тип вычислительного графаСтатический вычислительный граф (определяется перед выполнением)Динамический вычислительный граф (выполняется при определении)
ГибкостьНизкая (вычислительный граф строится во время компиляции, и его нелегко изменить)Высокая (вычислительный граф динамически создаётся во время выполнения, его легко модифицировать и отлаживать)
ОтладкаСложно (требуется использоватьtf.debuggingили внешние инструменты для отладки)Просто (можно напрямую отлаживать в Python)
Простота использованияНизкий (сложнее, больше API, более крутая кривая обучения)Высокий (лаконичный API, синтаксис ближе к Python, легко начать)
РазвёртываниеСильная (поддерживает широкий спектр оборудования, например TensorFlow Lite и TensorFlow.js)Слабее (относительно мало инструментов и платформ для развертывания, хотя есть поддержка TensorFlow)
Поддержка сообществаОчень сильная (зрелое и большое сообщество, обширные руководства и документация)Очень сильная (активное сообщество, особенно в академической среде, быстро развивающаяся экосистема)
Обучение моделиПоддерживает распределенное обучение и поддерживает несколько устройств (таких как CPU, GPU, TPU)Поддерживает распределенное обучение, поддерживает multi-GPU, CPU и TPU
Уровень APIВысокоуровневый API: Keras; низкоуровневый API: TensorFlow CoreВысокоуровневые API: TorchVision, TorchText и т. д.; низкоуровневый API: Torch
ПроизводительностьВысокий (зрелая оптимизация, подходит для production-сред)Высокая (подходит для исследований и прототипирования, производительность в продакшене также улучшается)
Автоматическое дифференцированиеПоддерживаетсяtf.GradientTapeРеализует динамическое дифференцирование (более сложное)ПоддерживаетсяautogradДинамическое дифференцирование (более краткое и интуитивное)
Настройка и масштабируемостьСильная (поддерживает работу на нескольких платформах, таких как TensorFlow Serving, и т. д.)Слабее (хотя он превосходно проявляет себя в академических и экспериментальных средах, поддержка продакшен-среды относительно ограничена)
Гибкость фреймворкаНиже (TensorFlow 2.x представил функции динамического графа, но он всё ещё не полностью гибок)Высокая (динамический граф обеспечивает более высокую гибкость)
Поддерживает несколько языковПоддерживает несколько языков (Python, C++, Java, JavaScript и т. д.)В основном поддерживает Python (но также имеет C++ API)
Совместимость и миграцияTensorFlow 2.x хорошо совместим со старыми версиямиПлохая совместимость с TensorFlow, миграция затруднена

PyTorch против NumPy

Особенности PyTorch NumPy
Цель Предназначен для глубокого обучения Общие научные вычисления
Поддержка GPU Нативно поддерживает CUDA Не поддерживается напрямую
Автоматическое дифференцирование Встроенная автоматическая дифференциация Требуется ручное вычисление градиента
Нейронные сети Богатый набор модулей нейронных сетей Необходимо реализовать с нуля
Затраты на обучение Относительно высокая Относительно низкий

История и развитие PyTorch

Предшественником PyTorch был Torch — фреймворк для научных вычислений, основанный на языке Lua. С ростом популярности Python в машинном обучении команда Facebook решила перенести ключевые идеи Torch на Python, что привело к созданию PyTorch.

  • 2016: Facebook выпустила версию PyTorch 0.1
  • 2017: В PyTorch 0.2 появилась поддержка распределенного обучения
  • 2018: Был выпущен PyTorch 1.0, добавивший возможности развертывания в производственной среде
  • 2019: В PyTorch 1.3 появилась поддержка мобильных устройств
  • 2020: В PyTorch 1.6 добавлено автоматическое обучение со смешанной точностью
  • 2021: В PyTorch 1.9 появились TorchScript и C++ фронтенд
  • 2022: В PyTorch 1.12 оптимизированы производительность и стабильность
  • 2023: PyTorch 2.0 был выпущен, и в нём появился режим компиляции, который значительно повышает производительность
Другие расширения