PyTorch

pytorch — библиотека для тензорных вычислений и глубокого обучения

Раздел
Инструменты
Обновлено
05.09.26

PyTorch — библиотека с открытым исходным кодом для работы с тензорами, нейросетями и автоматическим дифференцированием. Модель описывается обычным Python-кодом, autograd вычисляет градиенты, а модули обучения и распределённых вычислений помогают собрать процесс обучения. Для ускорения отдельные графы можно компилировать, но результат всегда проверяют на конкретной модели и устройстве.

Коротко

PyTorch даёт Python-интерфейс для тензорных вычислений и обучения нейросетей. Его основной цикл выглядит просто: forward → loss → backward → optimizer.step(). За этой короткой записью стоят граф операций, вычисление градиентов и работа на выбранном устройстве.

Тензор — основная единица

Тензор похож на многомерный массив. У него есть:

  • форма — shape, размеры по осям;
  • тип чисел — dtype;
  • устройство размещения — device;
  • способ организации данных — layout;
  • при необходимости — история операций для autograd.
import torch

x = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
w = torch.randn(2, 1, requires_grad=True)
y = x @ w

Тот же код можно выполнять на CPU или поддерживаемом ускорителе, если операции и типы данных доступны в выбранной вычислительной среде. Перенос устройства не гарантирует одинаковую скорость и побитовый результат.

Выполнение по мере вызова

По умолчанию Python-код выполняется по мере вызова операций. Условие остаётся условием, цикл — циклом, а промежуточный тензор можно посмотреть в обычном отладчике.

Это называют eager или define-by-run. Такой режим удобен для исследования и отладки. Он не означает, что внутренние операции выполняются только по одной: вычислительные ядра могут использовать параллельную обработку.

Autograd

Если тензор отмечен requires_grad=True, PyTorch отслеживает операции, необходимые для обратного прохода. После вызова loss.backward() градиенты накапливаются в .grad у листовых тензоров, например обучаемых параметров. Принцип показан в учебнике PyTorch по autograd.

prediction = x @ w
target = torch.zeros_like(prediction)
loss = ((prediction - target) ** 2).mean()

loss.backward()
print(w.grad)

Градиенты накапливаются, а не заменяются автоматически. Поэтому обычный цикл обучения обнуляет их перед следующим обратным проходом, если намеренное накопление не входит в схему обучения.

Модель через nn.Module

torch.nn.Module объединяет параметры, подмодули и forward-вычисление:

from torch import nn

class Regressor(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(2, 1)

    def forward(self, x):
        return self.linear(x)

Модуль помогает переносить параметры между устройствами, переключать режимы train/eval и сохранять состояние. Он не навязывает один тип архитектуры.

Цикл обучения

model = Regressor()
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3)

for inputs, targets in loader:
    optimizer.zero_grad()
    predictions = model(inputs)
    loss = loss_fn(predictions, targets)
    loss.backward()
    optimizer.step()

Это фрагмент цикла: loader должен выдавать входы и цели, а loss_fn — вычислять ошибку. Скорость обучения, размер группы примеров, точность вычислений и оптимизатор подбираются с проверкой на данных, которые не участвуют в обновлении весов.

Train и eval

model.train() и model.eval() переключают поведение слоёв, которым важен режим, например Dropout или BatchNorm. Они не включают и не отключают градиенты.

Для инференса отдельно используют контекст без построения ненужного графа:

model.eval()
with torch.inference_mode():
    output = model(inputs)

Забытый eval() способен сделать результат нестабильным, а забытый inference mode — потратить лишнюю память.

Данные

Dataset описывает получение одного примера, а DataLoader собирает группы примеров — батчи, перемешивает данные и может готовить их в нескольких процессах.

Реальная производительность зависит не только от модели. Медленное чтение файлов, тяжёлая аугментация и маленькие случайные запросы к диску способны оставить ускоритель без работы.

Устройства и точность

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

Смешанная точность — mixed precision — использует разные типы чисел для разных операций. Она может уменьшить расход памяти и ускорить вычисления, но также меняет численную устойчивость. Поэтому проверяют ошибку, градиенты и качество результата, а не только факт запуска.

torch.compile

torch.compile пытается захватить участки Python-программы и оптимизировать их. Это может уменьшить накладные расходы и объединить операции, но эффект зависит от:

  • формы входов;
  • динамического управления;
  • поддерживаемых операций;
  • вычислительной среды и устройства;
  • стоимости первой компиляции;
  • числа повторных запусков.

Разрывы графа и повторная компиляция могут свести выигрыш на нет. Для сравнения удобно оставить обычное выполнение eager, а скорость компилированной версии измерять после прогрева. Семантика некоторых сложных случаев может отличаться, и актуальные ограничения лучше сверять в документации PyTorch.

Распределённое обучение

Вычисления распределяют, чтобы ускорить обучение или разместить модель, которой не хватает памяти одного устройства. Есть разные способы:

  • параллелизм по данным размещает копии модели на устройствах и делит между ними примеры;
  • тензорный параллелизм делит отдельные тензоры и операции;
  • конвейерный параллелизм распределяет слои;
  • шардирование распределяет параметры, градиенты или состояния оптимизатора.

Распределение добавляет обмен данными, синхронизацию и новые точки отказа. Масштабирование измеряют по полезной пропускной способности, а не по числу устройств.

Сохранение модели

state_dict содержит параметры и зарегистрированные постоянные буферы, например статистики некоторых слоёв. Чтобы восстановить модель, приложению всё равно нужна совместимая архитектура и конфигурация.

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

PyTorch и ComfyUI

ComfyUI использует PyTorch для тензорных операций и запуска моделей. Узлы задают порядок обработки, а библиотека выполняет тензорные вычисления.

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

Экспорт и развёртывание

В рабочем приложении модель можно оставить в среде Python или преобразовать в более ограниченное представление для другого движка. Экспорт требует фиксировать поддерживаемые операции, динамические формы входов и подготовку данных.

Успешный экспорт ещё не доказывает эквивалентность. Сравниваются выходы на контрольных данных, производительность после прогрева и поведение на крайних формах входа.

С чем часто путают

  • PyTorch и CUDA. PyTorch — библиотека, CUDA — платформа вычислений на устройствах NVIDIA, которую может использовать PyTorch.
  • PyTorch и модель. Библиотека выполняет операции; веса и архитектура приходят отдельно.
  • Eager и медленный. Eager описывает способ исполнения Python-графа, а сами вычислительные операции могут быть хорошо оптимизированы.
  • Compile и export. Compile оптимизирует выполнение, export создаёт представление для развёртывания; маршруты и ограничения различаются.
  • Checkpoint и готовое приложение. Нужны подготовка данных, конфигурация, код запуска и, в зависимости от модели, токенизатор или VAE.

Частые ошибки

  • Не обнулять градиенты. Они накапливаются между backward.
  • Забыть eval-режим. Dropout и некоторые слои нормализации могут вести себя иначе.
  • Смешать устройства. Большинство совместных операций требует, чтобы тензоры находились на одном устройстве; иначе нужен перенос. У отдельных операций есть исключения.
  • Не проверять форму тензоров. Автоматическое расширение совместимых размеров — broadcasting — может дать допустимый по синтаксису, но неверный по смыслу результат.
  • Измерять только первый запуск после компиляции. В него входит подготовка и компиляция.
  • Загружать недоверенный pickle. Такой файл может выполнить код.

Частые вопросы

PyTorch работает только с GPU? Нет. CPU поддерживается как вычислительное устройство, а доступность других ускорителей зависит от сборки и поддерживаемых операций.

Нужно ли использовать torch.compile? Нет. Он полезен, если измерения показывают выигрыш без регрессий. Для отладки и динамического кода eager может быть проще.

Чем Tensor отличается от NumPy array? Tensor интегрирован с autograd, устройствами и нейросетевыми модулями. Между форматами можно обмениваться данными, но правила памяти и dtype нужно учитывать.

Где искать правильную команду установки? В официальном подборщике установки PyTorch: выберите ОС, пакетный менеджер и подходящую вычислительную платформу. Затем проверьте требования к Python и драйверу. Для готовой сборки приложения сначала лучше посмотреть её собственные инструкции.

Главное

Чтобы разобраться с PyTorch, удобно сначала проследить один небольшой расчёт: вход, результат, ошибку и обновление весов. Когда он работает ожидаемо, можно добавлять ускорение и распределение по устройствам. После каждого изменения остаётся тот же вопрос: совпадают ли результаты и действительно ли уменьшились затраты.