PyTorch
| Тип | фреймворк глубокого обучения |
|---|---|
| Разработчик | Meta AI (FAIR), с 2022 — PyTorch Foundation (Linux Foundation) |
| Первый выпуск | 2016 |
| Предшественник | Torch (Lua) |
| Языки | Python, C++, CUDA |
| Лицензия | BSD-3-Clause |
| Ключевые части | тензоры, autograd, torch.nn, torch.compile, DataLoader |
| Сайт | pytorch.org |
PyTorch — открытый фреймворк для глубокого обучения на Python. Он предоставляет многомерные массивы — тензоры — с вычислениями на CPU и GPU, автоматическое дифференцирование для обучения моделей градиентными методами и набор готовых строительных блоков нейронных сетей. PyTorch ценят за то, что модель — это обычный Python-код, который можно отлаживать построчно.[1]
PyTorch — самый популярный фреймворк в научных статьях по машинному обучению; на нём обучено большинство открытых языковых моделей, а библиотеки экосистемы Hugging Face используют его по умолчанию.
История
PyTorch вырос из библиотеки Torch, написанной на языке Lua. В лаборатории Facebook AI Research (FAIR) его переписали с интерфейсом на Python; первый выпуск состоялся в 2016 году, широкий анонс — в начале 2017-го. Главным отличием от тогдашнего TensorFlow был режим немедленного выполнения (eager mode): граф вычислений строится на лету при выполнении кода, а не описывается заранее, поэтому работают обычные if, циклы и отладчик.
В 2018 году с PyTorch объединили фреймворк Caffe2 для продакшена. В 2022 году проект перешёл под управление независимой PyTorch Foundation в составе Linux Foundation.[5] Версия 2.0 (2023) добавила компилятор torch.compile, ускоряющий модели без переписывания кода.[4]
Основные понятия
Тензоры
import torch
x = torch.randn(32, 784) # пакет из 32 векторов по 784 числа
w = torch.randn(784, 10, requires_grad=True)
device = "cuda" if torch.cuda.is_available() else "cpu" # на Mac — "mps"
x, w = x.to(device), w.detach().to(device).requires_grad_()
y = x @ w # матричное умножение на GPU
print(y.shape, y.dtype, y.device) # torch.Size([32, 10]) torch.float32 cuda:0
Тензоры похожи на массивы NumPy и легко конвертируются в них, но умеют работать на ускорителях и запоминать операции для вычисления градиентов.
Autograd
Если у тензора установлен requires_grad=True, PyTorch записывает все операции над ним. Вызов loss.backward() проходит запись в обратном порядке и вычисляет градиенты по правилу дифференцирования сложной функции — это и есть обратное распространение ошибки. Градиенты появляются в атрибуте .grad и используются оптимизатором для градиентного спуска.
Модули и обучение
from torch import nn
from torch.utils.data import DataLoader
class Classifier(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(nn.Linear(784, 256), nn.ReLU(), nn.Dropout(0.1), nn.Linear(256, 10))
def forward(self, x):
return self.net(x)
model = Classifier().to(device)
opt = torch.optim.AdamW(model.parameters(), lr=3e-4)
loss_fn = nn.CrossEntropyLoss()
loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
for epoch in range(5):
model.train()
for xb, yb in loader:
xb, yb = xb.to(device), yb.to(device)
loss = loss_fn(model(xb), yb)
opt.zero_grad()
loss.backward()
opt.step()
torch.save(model.state_dict(), "model.pt")
Класс nn.Module хранит параметры и вложенные слои, Dataset и DataLoader подают данные пакетами, а цикл обучения пишется явно — это даёт полный контроль, хотя для типовых задач используют обёртки.[3]
Производительность
- Смешанная точность (
torch.autocast, форматы bfloat16 и float16) ускоряет обучение и вдвое сокращает память. torch.compileпревращает модель в оптимизированные ядра, объединяя операции.- Распределённое обучение —
DistributedDataParallelдля нескольких GPU и машин,FSDPдля моделей, не помещающихся в память одной карты. - Поддержка ускорителей — NVIDIA CUDA, AMD ROCm, Apple Silicon (MPS), Intel и другие.
Установку под конкретную платформу и версию CUDA удобно подобрать в конфигураторе на сайте PyTorch.[6]
Экосистема
| Библиотека | Назначение |
|---|---|
| torchvision, torchaudio | наборы данных, модели и преобразования для изображений и звука |
| Hugging Face Transformers | тысячи предобученных моделей для текста, изображений, звука |
| PyTorch Lightning, Accelerate | обучение без шаблонного кода, масштабирование на кластеры |
| PEFT | эффективное дообучение, в том числе LoRA |
| vLLM, TorchServe | инференс и сервинг моделей |
| ONNX-экспорт, ExecuTorch | перенос моделей на другие среды выполнения и мобильные устройства (см. ONNX) |
PyTorch и другие фреймворки
TensorFlow от Google долго лидировал в продакшене, но в исследованиях уступил PyTorch; Keras 3 теперь работает поверх нескольких бэкендов, включая PyTorch. JAX от Google популярен в крупных исследовательских проектах благодаря функциональному стилю и компилятору XLA. Для классического машинного обучения на табличных данных PyTorch обычно не нужен — там удобнее scikit-learn и библиотеки градиентного бустинга. Полная справка по API — в документации PyTorch.[2]