PyTorch
pytorch — библиотека для тензорных вычислений и глубокого обучения
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, удобно сначала проследить один небольшой расчёт: вход, результат, ошибку и обновление весов. Когда он работает ожидаемо, можно добавлять ускорение и распределение по устройствам. После каждого изменения остаётся тот же вопрос: совпадают ли результаты и действительно ли уменьшились затраты.