PyTorch

Материал из llmdocs — справочник разработчика
Портал: ML и MLOps
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]

См. также

Источники

  1. A. Paszke et al. — PyTorch: An Imperative Style, High-Performance Deep Learning Library (NeurIPS 2019)
  2. PyTorch Documentation
  3. PyTorch Tutorials — Learn the Basics
  4. PyTorch — torch.compile tutorial
  5. PyTorch Foundation
  6. PyTorch — Get Started (установка)