PyTorch
PyTorch — открытая библиотека для машинного обучения, основанная на библиотеке Torch[1][2][3], предназначенная для задач, таких как компьютерное зрение, исследование в области глубокого обучения[4] и обработка естественного языка[4]. Первоначальная разработка велась Meta AI, в дальнейшем проект стал под эгидой Linux Foundation[5][6][7][8]. Является одной из самых популярных платформ глубокого обучения наряду с TensorFlow[9] и распространяется как свободное ПО под изменённой BSD-лицензией. Хотя большее внимание уделяется интерфейсу на Python, PyTorch также имеет интерфейс на C++[10].
PyTorch использует тензоры как основной тип данных, похожий на массивы NumPy. Обучение моделей реализовано с помощью системы автоматического дифференцирования Autograd, которая строит ориентированный ациклический граф для прямого прохода модели по заданному входу и, используя правило цепочки, вычисляет градиенты по всей модели[11]. Библиотека умеет прозрачно использовать SIMD-вычисления, включая GPU (GPGPU).
На PyTorch построен ряд коммерческих и исследовательских архитектур для глубокого обучения, включая Tesla Autopilot, Pyro от Uber[12], Transformers от Hugging Face[13][14] и Catalyst[15][16].
Что важно знать
| PyTorch | |||
|---|---|---|---|
| Тип | библиотека для машинного обучения и глубокого обучения | ||
| Авторы | Адам Пашке, Сэм Гросс, Сумит Чинтала, Грегори Чанан | ||
| Разработчик | Meta AI | ||
| Написана на | Python, C++, CUDA | ||
| Интерфейс | программный интерфейс (API) | ||
| Движки | C++-бэкенд | ||
| Операционные системы | Linux, macOS, Windows | ||
| Языки интерфейса | английский | ||
| Первый выпуск | сентябрь 2016 | ||
| Аппаратные платформы | IA-32, x86-64, ARM64 | ||
| Последняя версия | 2.9.1 (12 ноября 2025) | ||
| Репозиторий | github.com/pytorch/pytor… | ||
| |||
| |||
| Состояние | активное | ||
| Лицензия | BSD-3 | ||
| Сайт | pytorch.org | ||
История
В 2001 году библиотека Torch была написана и выпущена под лицензией GPL. Это была библиотека для машинного обучения на C++, поддерживавшая методы, включая нейронные сети, метод опорных векторов (SVM), скрытые марковские модели и др[17][18].[19] В 2012 году вышла улучшенная версия Torch7. Разработка Torch прекратилась в 2018 году и была поглощена проектом PyTorch[20].
Компания Meta (ранее — Facebook) занималась разработкой как PyTorch, так и Convolutional Architecture for Fast Feature Embedding (Caffe2), но модели, создаваемые этими фреймворками, были несовместимы друг с другом. Для решения этой проблемы в сентябре 2017 года Meta и Microsoft представили проект Open Neural Network Exchange (ONNX), обеспечивающий переносимость моделей между фреймворками. В конце марта 2018 года Caffe2 был объединён с PyTorch[21]. В сентябре 2022 года Meta объявила, что дальнейшее развитие PyTorch будет курировать независимый Фонд PyTorch, организованный как дочерняя структура Linux Foundation[22].
PyTorch 2.0 вышла 15 марта 2023 года. Одним из ключевых нововведений стала технология TorchDynamo — компилятор на уровне Python, ускоряющий выполнение кода до 2 раз[23][24]. В этой же версии была представлена функция torch.nn.functional.scaled_dot_product_attention (SDPA) — высокопроизводительная реализация механизма внимания для ускорения моделей-трансформеров[25].
Дальнейшее развитие было направлено на улучшение производительности и расширение возможностей компилятора. В версии 2.1 (2023) была представлена функция torch.export для захвата графа модели[26]. В версии 2.2 (2024) в SDPA была интегрирована библиотека FlashAttention-v2, что значительно ускорило её работу[27], а версия 2.3 (2024) добавила поддержку пользовательских ядер Triton внутри torch.compile[28].
15 октября 2025 года вышла версия 2.9.0, в которой был представлен стабильный ABI для библиотеки libtorch и технология Symmetric Memory для упрощения программирования на нескольких GPU[29]. 12 ноября того же года последовал корректирующий выпуск 2.9.1 для исправления ошибок[30].
Архитектура
Архитектура PyTorch имеет двухуровневую структуру: на верхнем уровне находится основной интерфейс (API) на языке Python, а ядром библиотеки является высокопроизводительный бэкенд, написанный на C++[31][32]. Взаимодействие между Python-интерфейсом и C++ бэкендом осуществляется через специальные привязки (bindings)[33].
Бэкенд выполняет все основные вычисления и состоит из нескольких ключевых компонентов[31]:
- ATen — библиотека на C++, которая является ядром для всех тензорных вычислений[34].
- Autograd — система автоматического дифференцирования, которая вычисляет градиенты, необходимые для обучения моделей[34].
- LibTorch — полноценный C++ интерфейс, позволяющий определять, обучать и развертывать модели без использования Python[31].
- Диспетчер операторов (Operator Dispatcher) — механизм, который вызывает конкретную реализацию операции в зависимости от устройства (CPU, GPU) и типа данных, что обеспечивает расширяемость для поддержки нового оборудования[33].
Одной из ключевых особенностей архитектуры PyTorch является использование динамического вычислительного графа, также известного как «определение по ходу выполнения» (define-by-run)[34][35]. В отличие от фреймворков со статическими графами, где граф вычислений определяется и компилируется до запуска, в PyTorch он строится «на лету» в процессе выполнения кода[32]. Такой подход обеспечивает большую гибкость и значительно упрощает отладку моделей[32].
Тензоры в PyTorch
Основной тип данных в PyTorch — это Tensor (torch.Tensor), предназначенный для хранения и обработки однородных многомерных прямоугольных массивов чисел. Тензоры PyTorch схожи с массивами NumPy, но могут обрабатываться с использованием GPU, совместимого с CUDA, например, NVIDIA[36], а также поддерживается интеграция с платформами AMD по технологии ROCm и с Metal Framework от Apple[37]. Ядром для этих тензорных вычислений является C++ библиотека ATen.
PyTorch поддерживает различные подтипы тензоров[38].
Отметим, что термин «тензор» здесь отличается от используемого в математике или физике — в машинном обучении так обозначают многомерные массивы.
Нейронные сети в PyTorch
PyTorch предоставляет модуль nn (torch.nn) для описания и обучения нейронных сетей. Модуль содержит широкий набор строительных блоков, включая различные слои и функции активации, позволяя создавать сложные модели. Нейросети определяются как классы, унаследованные от torch.nn.Module, а последовательность операций задаётся в методе forward().
Начиная с версии 2.0, в модуль были добавлены значительные улучшения для повышения производительности. Ключевым нововведением стала функция torch.nn.functional.scaled_dot_product_attention (SDPA) — высокопроизводительная реализация механизма внимания для ускорения моделей-трансформеров. В версии 2.2 её производительность была дополнительно увеличена за счёт интеграции с библиотекой FlashAttention-v2. Другие нововведения включают поддержку полуструктурированной разреженности (2:4) для ускорения моделей на графических процессорах NVIDIA и функцию torch.export для захвата графа модели с целью дальнейшей оптимизации и развертывания.
Форматы моделей
PyTorch предлагает несколько способов сохранения и загрузки моделей, предназначенных для различных сценариев, таких как возобновление обучения, перенос весов или развёртывание в производственной среде. Основные подходы включают использование словаря состояний (state_dict), формата TorchScript и открытого стандарта ONNX.
Словарь состояний (state_dict) — это наиболее распространённый и рекомендуемый способ сохранения модели[39]. Он представляет собой объект словаря в Python, который содержит только обучаемые параметры модели (веса и смещения), но не её архитектуру[40]. Такой подход обеспечивает гибкость, так как для загрузки весов достаточно иметь класс модели, совместимый по архитектуре[41]. Файлы с параметрами обычно имеют расширения .pth или .pt[42]. Внутренне для сериализации используется модуль pickle, а начиная с версии 1.6 по умолчанию применяется формат на основе ZIP-архива[43]. Помимо параметров модели, для возобновления обучения часто сохраняют «контрольные точки» (checkpoints), которые также включают состояние оптимизатора и номер эпохи; для таких файлов принято использовать расширение .tar[39].
TorchScript — это формат, который позволяет сериализовать модель PyTorch в статическое представление графа вычислений. Это делает модель независимой от среды Python и позволяет выполнять её в других окружениях, например, на C++ или на мобильных устройствах[44]. Модель, сохранённая как TorchScript, представляет собой единый файл (обычно с расширением .pt), содержащий как архитектуру, так и веса, что делает его полностью автономным[44].
ONNX (Open Neural Network Exchange) — это открытый стандарт, предназначенный для обеспечения совместимости моделей между различными фреймворками машинного обучения. PyTorch позволяет экспортировать модель в формат .onnx[45]. Это даёт возможность использовать обученную модель в других средах, оптимизированных для инференса, таких как TensorFlow, ONNX Runtime или TensorRT[46].
Разработка и версии
Разработка PyTorch ведётся под эгидой PyTorch Foundation и фокусируется на повышении производительности, расширении аппаратной поддержки и развитии экосистемы для ИИ[47]. Команда разработчиков из Meta регулярно публикует дорожные карты (roadmaps), в которых описываются планы на ближайшие полгода[48][49]. Ключевые направления включают улучшение компилятора `torch.compile`, поддержку распределённого обучения и развёртывания моделей на конечных устройствах (Edge), а также интеграцию с новым оборудованием, таким как GPU от NVIDIA (CUDA), AMD (ROCm) и Intel (XPU).
Цикл выпуска новых версий PyTorch включает несколько этапов. Разработка ведётся непрерывно, и самые последние изменения доступны в ночных сборках (Nightly Builds), которые генерируются ежедневно, но не являются стабильными[50]. Перед выпуском новой минорной версии создаётся отдельная ветка релиза, в которой формируется серия версий-кандидатов (Release Candidates, RC)[51]. Они предназначены для тестирования и исправления ошибок перед финальным выпуском и доступны в тестовых репозиториях[51]. После стабилизации выходит стабильный релиз (Stable), который рекомендуется для производственного использования. Впоследствии для него могут выпускаться корректирующие выпуски (patch releases) для исправления критических ошибок[51].
Начиная с версии 2.8, была введена упрощённая система классификации API, заменившая предыдущие категории «Prototype», «Beta» и «Stable»[52][53]. Новая система делит функции на два типа:
- Stable — API функции является стабильным, и для него гарантируется обратная совместимость.
- Unstable — API функции находится в активной разработке и может измениться. Эта категория объединяет то, что ранее называлось «Prototype» и «Beta»[53].
Несмотря на это, в примечаниях к выпускам отдельные экспериментальные функции, включённые в стабильный релиз, всё ещё могут помечаться как «BETA FEATURES»[54].
Пример
Ниже приведён простой пример работы с тензорами:
import torch
dtype = torch.float
device = torch.device("cpu") # Все вычисления выполняются на CPU
# device = torch.device("cuda:0") # Все вычисления выполняются на GPU
# Создать тензор со случайными числами
a = torch.randn(2, 3, device=device, dtype=dtype)
print(a)
# Вывод: tensor([[-1.1884, 0.8498, -1.7129],
# [-0.8816, 0.1944, 0.5847]])
b = torch.randn(2, 3, device=device, dtype=dtype)
print(b)
# Вывод: tensor([[ 0.7178, -0.8453, -1.3403],
# [ 1.3262, 1.1512, -1.7070]])
print(a * b)
# Вывод: tensor([[-0.8530, -0.7183, 2.58],
# [-1.1692, 0.2238, -0.9981]])
print(a.sum())
# Вывод: tensor(-2.1540)
print(a[1, 2]) # Элемент в третьем столбце второй строки (с нуля)
# Вывод: tensor(0.5847)
print(a.max())
# Вывод: tensor(0.8498)
Следующий пример задаёт простую нейронную сеть на основе линейных слоёв с использованием модуля nn:
from torch import nn # Импорт модуля nn из PyTorch
class NeuralNetwork(nn.Module): # Сеть определяется как класс
def __init__(self): # Слои и переменные описываются в __init__
super().__init__() # Необходимый вызов суперкласса
self.flatten = nn.Flatten() # Слой выпрямления
self.linear_relu_stack = nn.Sequential( # «Стек» слоёв
nn.Linear(28 * 28, 512), # Линейные слои с входом/выходом указанной размерности
nn.ReLU(), # ReLU — одна из функций активации
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 10),
)
def forward(self, x): # Прямой проход (forward)
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits


