Введение в 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 стал предпочтительным фреймворком для многих исследователей и разработчиков в области глубокого обучения.
| Характеристика | TensorFlow | PyTorch |
|---|---|---|
| Разработчик | Facebook (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 был выпущен, и в нём появился режим компиляции, который значительно повышает производительность