PyTorch — это фреймворк, на котором сегодня собирают и обучают большинство нейросетей: от распознавания котиков на фото до языковых моделей вроде тех, с которыми вы переписываетесь в чатах. При этом сам PyTorch устроен проще, чем кажется: это обычный пакет для Python, который умеет быстро считать и сам находит производные.
В статье разберём, как устроен фреймворк и из каких модулей он состоит, установим его на компьютер, обучим первую модель на 60 строк кода и посмотрим, по каким критериям его выбирают вместо конкурентов.
ВАМ ПРИШЛО ПРИГЛАШЕНИЕ 💌
Приходите к нам в соцсети поделиться своим мнением и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте — шпаргалки, опросы и разная дурка. В общем, вот тележка, вот ВК — велком!
Что такое PyTorch
PyTorch — это фреймворк с открытым исходным кодом для тензорных вычислений, построения и обучения моделей машинного обучения. Писать на нём код вы будете на Python, а всю тяжёлую математику за вас выполнят внутренние механизмы фреймворка, написанные на C++ и специализированных вычислительных бэкендах. Получается удобное разделение труда: человек описывает модель на понятном языке, а машина считает на быстром.
Машинное обучение — это подход, при котором программа учится решать задачу на примерах, а не по заранее прописанным правилам. Его продвинутая ветка, глубокое обучение, использует для этого нейронные сети: если хотите освежить в памяти, как работают нейросети, у нас есть подробный разбор для новичков. PyTorch как раз и создавался как инструмент для глубокого обучения, поэтому вся его архитектура заточена под работу с нейросетями.
Проект появился в исследовательской лаборатории FAIR (Fundamental AI Research). Со временем он вырос из внутреннего инструмента в индустриальный стандарт, и с 2022 года им управляет PyTorch Foundation в структуре Linux Foundation. Организация поддерживает нейтральную модель управления: над фреймворком работают инженеры из разных компаний, а решения о развитии принимаются коллективно, о чём проект рассказал в объявлении о переходе.
Если свести всё к сути, фреймворк умеет четыре базовые вещи:
- выполнять операции с тензорами — перемножать, складывать и преобразовывать многомерные массивы чисел;
- автоматически вычислять градиенты — находить производные, без которых невозможно обучение нейросетей;
- собирать модели — конструировать нейросети из готовых блоков, как из деталей конструктора;
- запускать вычисления на разных устройствах — на обычном процессоре, видеокарте или специализированном ускорителе.
Дальше разберём каждую из этих способностей подробнее, но сначала посмотрим, кому и зачем всё это нужно.
Для чего нужен PyTorch
PyTorch сопровождает модель машинного обучения на всём жизненном пути: на нём исследуют идеи, собирают прототипы, обучают и тестируют модели, а затем запускают их в реальных продуктах. Проще перечислить, где глубокое обучение обходится без него, чем наоборот. Вот основные направления, в которых используют фреймворк.
- Классификация и обработка изображений. Модель смотрит на снимок с камеры на производстве и отмечает бракованные детали, которые человек глазами уже не успевает отследить.
- Обработка текста и речи. Голосовой помощник превращает вашу фразу «поставь будильник на семь» в текст, понимает смысл и выполняет команду.
- Рекомендательные и ранжирующие системы. Онлайн-кинотеатр анализирует, что вы смотрели раньше, и выводит на главный экран сериалы, которые вы досмотрите, а не бросите на второй серии.
- Генеративные модели. Нейросеть рисует картинку по текстовому описанию или дописывает код за программистом.
- Обучение с подкреплением. Алгоритм управляет персонажем в игре, получает награду за правильные действия и постепенно учится играть лучше человека.
- Научные и инженерные расчёты. Физики моделируют поведение молекул, а инженеры оптимизируют форму деталей, используя автоматическое дифференцирование фреймворка.
Основная аудитория фреймворка — ML-инженеры, дата-сайентисты и исследователи. Ещё им пользуются Python-разработчики, которые сами модели не обучают, но встраивают готовые в свои приложения: подключил модель, передал ей данные, получил предсказание.
Как работает фреймворк PyTorch
Чтобы обучить нейросеть, фреймворк PyTorch использует четыре механизма: тензоры хранят данные, autograd считает градиенты, модули собирают модель, а загрузчики подают данные на обучение. Разберём каждый по отдельности, а потом соберём из них полный цикл обучения.
Тензоры и вычислительные устройства
Тензор — это многомерный массив чисел, основная структура данных в PyTorch. У каждого тензора есть форма (сколько элементов по каждому измерению), тип данных (например, числа с плавающей точкой) и устройство, на котором он хранится. Число — это тензор нулевой размерности, список чисел — одномерный тензор, таблица — двумерный, а цветная картинка — уже трёхмерный: высота, ширина и три цветовых канала.
Если вы работали с NumPy, тензоры покажутся знакомыми: они устроены как массивы ndarray и поддерживают похожие операции. Отличий два, и оба важные: тензоры умеют участвовать в автоматическом дифференцировании и выполняться на ускорителях, а массивы NumPy живут только на процессоре.
Создадим тензор и посмотрим на его свойства:
import torch
# создаём двумерный тензор из шести чисел
t = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
# выводим форму, тип данных и устройство
print(t.shape, t.dtype, t.device)
Программа выведет:
torch.Size([2, 3]) torch.float32 cpu
Разберём результат. torch.Size([2, 3]) — это форма: две строки по три числа. torch.float32 — тип данных: 32-битные числа с плавающей точкой, стандарт для обучения нейросетей. cpu — устройство: тензор лежит в оперативной памяти и обрабатывается процессором.
Кроме CPU, тензоры могут жить на ускорителях: CUDA (видеокарты NVIDIA), ROCm (видеокарты AMD), MPS (чипы Apple) и XPU (ускорители Intel). Код при этом почти не меняется: вы просто указываете устройство, а фреймворк сам разбирается, где выполнять вычисления.

Вычислительный граф и autograd
Обучение нейросети сводится к простой идее: посчитать, насколько модель ошиблась, и понять, как подкрутить каждый её параметр, чтобы ошибка уменьшилась. За «понять, как подкрутить» отвечают градиенты — производные ошибки по параметрам. Считать их вручную для сети с миллионами параметров невозможно. Поэтому PyTorch делает это сам с помощью механизма autograd.
Работает это так. Когда вы выполняете операции над тензорами, фреймворк незаметно записывает их в вычислительный граф: какая операция была применена, к каким тензорам и в каком порядке. Потом он проходит по этому графу в обратную сторону и по цепочке вычисляет производные. Чтобы включить запись, тензору нужно задать флаг requires_grad=True.
Посмотрим на минимальный пример:
import torch
# создаём тензор и просим PyTorch следить за операциями над ним
x = torch.tensor(3.0, requires_grad=True)
# считаем функцию y = x² + 2x
y = x ** 2 + 2 * x
# запускаем обратный проход: PyTorch сам считает производную
y.backward()
# производная y по x равна 2x + 2, при x = 3 получается 8
print(x.grad)
Программа выведет:
tensor(8.)
Метод backward() запустил обратный проход по графу, а результат появился в поле .grad тензора x. В настоящем обучении вместо игрушечной функции будет ошибка модели, а вместо одного x — миллионы параметров нейросети. Принцип при этом останется тем же: backward() посчитает градиент по каждому параметру, и станет понятно, в какую сторону этот параметр двигать.

Модель, функция потерь и оптимизатор
Теперь соберём из деталей полный цикл обучения. В нём участвуют три компонента: модель, которая делает предсказания, функция потерь, которая измеряет ошибку, и оптимизатор, который обновляет параметры. Цикл повторяется много раз и на каждой итерации проходит пять шагов:
- модель получает порцию данных;
- выполняется прямой проход — модель считает предсказания;
- функция потерь сравнивает предсказания с правильными ответами и выдаёт число: чем оно больше, тем сильнее модель ошиблась;
- autograd вычисляет градиенты ошибки по всем параметрам модели;
- оптимизатор сдвигает параметры в сторону уменьшения ошибки.
За модели отвечает модуль torch.nn. Любая модель наследуется от класса nn.Module и собирается из готовых слоёв, как дом из кирпичей: линейные слои, свёртки, функции активации. Функции потерь тоже лежат в torch.nn: для каждой задачи своя, например для бинарной классификации подходит BCEWithLogitsLoss.
Оптимизаторы живут в модуле torch.optim. Они реализуют разные стратегии обновления параметров, но в основе почти всех лежит один алгоритм: параметры сдвигаются маленькими шагами против направления градиента. Мы подробно разбирали, как работает градиентный спуск, в отдельном гайде — если хотите понять математику под капотом, загляните туда.

Dataset и DataLoader
Данные для обучения редко влезают в память целиком. Поэтому за них отвечает связка из двух классов с чётким разделением обязанностей. Dataset хранит или получает отдельные примеры: по запросу «дай элемент номер 42» он возвращает один объект и его метку. DataLoader работает поверх него: собирает примеры в батчи, перемешивает данные между эпохами и по очереди выдаёт порции в цикл обучения.
Батч — это порция объектов, которую модель обрабатывает за один шаг. Обучать на батчах выгодно по двум причинам: вычисления над группой объектов хорошо ускоряются на видеокартах, а градиент по порции получается стабильнее, чем по одному примеру. Кстати, о том, что такое датасет и откуда данные вообще берутся, у нас есть отдельная статья.
Минимальный пример выглядит так:
import torch
from torch.utils.data import TensorDataset, DataLoader
# создаём 200 объектов с двумя признаками
X = torch.randn(200, 2)
# создаём метки: один правильный ответ на каждый объект
y = torch.randint(0, 2, (200, 1)).float()
# упаковываем признаки и метки в датасет
dataset = TensorDataset(X, y)
# нарезаем датасет на батчи по 32 объекта и перемешиваем
loader = DataLoader(dataset, batch_size=32, shuffle=True)
Класс TensorDataset — самый простой вариант датасета. Он просто склеивает готовые тензоры с признаками и метками. Для реальных задач пишут собственные классы, которые читают картинки с диска или строки из базы, но интерфейс остаётся тем же, что описан в официальном руководстве PyTorch.

Большая скидка — 16% на все курсы Практикума
Если вы читаете эту статью, тогда вы точно разбираетесь в технологиях. Стать лучше и зарабатывать больше можно после курсов Практикума — по программированию, анализу данных и искусственному интеллекту.
До 17 сентября на все курсы действует скидка 16%, она применится автоматически при оплате. Потом цены станут выше, поэтому не откладывайте!
В Практикуме есть программы для начинающих и специалистов с опытом, которые хотят обновить знания или освоить новое направление.
Как связаны PyTorch, torch и Python
У новичков здесь регулярно случается путаница, поэтому разложим термины по полочкам. PyTorch — название всего проекта и фреймворка: так называется сайт, документация и сообщество. А библиотека torch — это основной Python-пакет проекта: именно его вы устанавливаете через pip и импортируете в код командой import torch. Пакета с именем pytorch в природе нет, и попытка поставить его закончится ошибкой или установкой чужого пакета.
Внутри пакета torch живут пространства имён, каждое со своей зоной ответственности: torch.nn, torch.optim, torch.autograd, torch.utils.data. А вокруг ядра выросли доменные проекты вроде TorchVision: они расширяют базовые возможности готовыми моделями и инструментами для конкретных областей. Про соседей torch в Python-экосистеме мы писали в обзоре лучших Python-библиотек для машинного обучения.
Вот из чего состоит основной инструментарий:
torch— тензоры и базовые операции над ними;torch.nn— слои, готовые блоки и функции потерь для сборки моделей;torch.optim— оптимизаторы для обновления параметров;torch.utils.data— Dataset, DataLoader и всё для работы с наборами данных;torch.compile— компиляция модели для ускорения обучения и запуска;torch.export— экспорт модели для развёртывания вне Python;- TorchVision — отдельная библиотека для задач компьютерного зрения: датасеты, готовые модели, преобразования картинок.
Держите в голове иерархию: проект PyTorch включает библиотеку torch, а та состоит из модулей. Тогда ни одна строчка в документации вас не запутает.

Что изменилось в PyTorch к июню 2026 года
Фреймворк развивается быстро, поэтому зафиксируем его состояние на 30 июня 2026 года. Если вы читаете старый туториал и что-то не сходится, сверьтесь с этим списком.
- Актуальный стабильный релиз на эту дату — PyTorch 2.12, выпущенный 13 мая 2026 года. Подробности в официальном обзоре релиза.
- Вся ветка PyTorch 2.x развивает компиляцию через
torch.compile: одна строка кода ускоряет обучение и запуск модели без переписывания остального. - TorchScript, старый механизм сериализации моделей, признан устаревшим начиная с PyTorch 2.10 — проект официально объявил об этом. Если встретите его в туториале, знайте: так больше не делают.
- Для экспорта моделей теперь рекомендуется
torch.export, а для запуска на встроенных и мобильных устройствах используется ExecuTorch. - В PyTorch 2.12 появился единый API
torch.accelerator.Graphдля захвата и воспроизведения вычислительных графов на разных ускорителях, аtorch.export.saveнаучился сохранять модели с MX-квантизацией. - Команды установки и список поддерживаемых ускорителей зависят от платформы и версии сборки, поэтому перед установкой стоит свериться с официальным селектором — о нём в следующем разделе.
Как установить PyTorch и запустить первый пример
Переходим к практике: установим фреймворк PyTorch и обучим на нём первую нейросеть. Видеокарта не понадобится, всё заработает на обычном процессоре.
Подготовка окружения
Для работы понадобится установленный Python с менеджером пакетов pip. Если Python на компьютере ещё нет, у нас есть инструкция, как установить Python на компьютер на любой операционной системе. Перед установкой сверьте версию Python с требованиями в официальном селекторе PyTorch: поддерживаемые версии там указаны прямо на странице.
Пакет torch для Python лучше ставить в отдельное виртуальное окружение, чтобы его зависимости не конфликтовали с другими проектами. На Windows окружение создаётся и активируется так:
# создаём виртуальное окружение в папке .venv
python -m venv .venv
# активируем окружение
.venv\Scripts\activate
На macOS и Linux логика та же, отличается только команда активации: source .venv/bin/activate. После активации в начале строки терминала появится приписка (.venv) — значит, окружение работает и пакеты будут ставиться в него.
Выбор сборки и установка
Универсальной команды установки у PyTorch нет: она зависит от операционной системы, пакетного менеджера и ускорителя, на котором вы будете считать. Поэтому основной путь — зайти в официальный селектор установки, отметить свою конфигурацию и скопировать сгенерированную команду. Вы выбираете версию, операционную систему, пакетный менеджер, язык и ускоритель, а сайт собирает под них готовую строку установки.
Для обучения на процессоре команда выглядит просто:
pip install torch
Держите в уме два момента. Первый: команда выше подходит для CPU-сборки, а для видеокарт селектор сгенерирует другую команду с указанием версии CUDA или ROCm — копируйте именно её. Второй: устанавливаемый пакет называется torch, без «py» в начале. Команда pip install pytorch поставит вам совсем другой пакет.
После установки проверьте, что всё получилось: импортируйте torch в Python и выведите версию.
import torch
# выводим установленную версию PyTorch
print(torch.__version__)
Программа выведет номер версии, например:
2.12.0

Проверка устройства
Теперь узнаем, на чём фреймворк будет считать. Начиная с PyTorch 2.12 для этого удобно использовать API torch.accelerator: он одинаково работает с CUDA, ROCm, MPS и XPU.
import torch
# проверяем, доступен ли какой-нибудь ускоритель
if torch.accelerator.is_available():
# если да, выбираем его
device = torch.accelerator.current_accelerator()
else:
# если нет, работаем на процессоре
device = torch.device("cpu")
# выводим выбранное устройство
print(device)
На компьютере без видеокарты программа выведет cpu, и это нормально. Ускоритель нужен для обучения больших моделей, а для изучения API, маленьких моделей и проверки кода процессора хватает с запасом. Весь код из этой статьи спокойно работает на CPU.
Обучение простой модели
Соберём всё изученное в работающий пример: обучим нейросеть отличать два класса точек на плоскости. Данные сгенерируем сами, поэтому скачивать ничего не придётся. Правило разметки простое: если сумма двух признаков объекта больше нуля, объект относится к классу 1, иначе — к классу 0. Модель этого правила не знает, и её задача — вывести его из примеров.
import torch
import torch.nn as nn
from torch.utils.data import TensorDataset, DataLoader
# фиксируем генератор случайных чисел, чтобы результат воспроизводился
torch.manual_seed(42)
# создаём 200 объектов с двумя случайными признаками
X = torch.randn(200, 2)
# размечаем классы: сумма признаков больше нуля -- класс 1
y = (X.sum(dim=1) > 0).float().unsqueeze(1)
# упаковываем признаки и метки в датасет
dataset = TensorDataset(X, y)
# нарезаем датасет на батчи по 32 объекта и перемешиваем их
loader = DataLoader(dataset, batch_size=32, shuffle=True)
# собираем модель: два линейных слоя и активация между ними
model = nn.Sequential(
nn.Linear(2, 8),
nn.ReLU(),
nn.Linear(8, 1),
)
# выбираем функцию потерь для бинарной классификации
loss_fn = nn.BCEWithLogitsLoss()
# выбираем оптимизатор Adam с шагом обучения 0.01
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
# обучаем модель 20 эпох
for epoch in range(20):
for batch_X, batch_y in loader:
# прямой проход: модель считает предсказания
pred = model(batch_X)
# функция потерь измеряет ошибку
loss = loss_fn(pred, batch_y)
# обнуляем градиенты с прошлого шага
optimizer.zero_grad()
# autograd считает новые градиенты
loss.backward()
# оптимизатор обновляет параметры модели
optimizer.step()
# каждые 5 эпох выводим значение ошибки
if (epoch + 1) % 5 == 0:
print(f"Эпоха {epoch + 1}, ошибка: {loss.item():.4f}")
# переводим модель в режим оценки
model.eval()
# считаем предсказания без расчёта градиентов
with torch.no_grad():
# прогоняем все данные через обученную модель
logits = model(X)
# превращаем выходы модели в классы 0 и 1
predictions = (torch.sigmoid(logits) > 0.5).float()
# сравниваем предсказания с настоящими метками
accuracy = (predictions == y).float().mean()
print(f"Точность на обучающих данных: {accuracy.item():.2%}")
Пройдёмся по логическим этапам. Сначала мы готовим данные: генерируем 200 случайных точек, размечаем их по правилу и упаковываем в связку TensorDataset и DataLoader. Затем собираем модель через nn.Sequential — контейнер, который прогоняет данные через слои по очереди: линейный слой превращает 2 признака в 8 промежуточных, активация ReLU добавляет нелинейность, второй линейный слой сводит всё к одному выходному числу.
Дальше идёт тот самый цикл обучения из пяти шагов, который мы разбирали на схеме: прямой проход, расчёт ошибки, обнуление старых градиентов через zero_grad(), обратный проход через backward() и шаг оптимизатора через step(). Цикл крутится 20 эпох, то есть модель 20 раз просматривает весь датасет.
В конце мы переводим модель в режим оценки методом eval() и считаем предсказания внутри блока torch.no_grad(): он отключает запись вычислительного графа, потому что на этапе проверки градиенты уже не нужны. Запускаем и смотрим на фактический вывод программы (проверено на PyTorch 2.12.0):
Эпоха 5, ошибка: 0.1952
Эпоха 10, ошибка: 0.1690
Эпоха 15, ошибка: 0.0174
Эпоха 20, ошибка: 0.0211
Точность на обучающих данных: 99.50%
Обратите внимание: ошибка растёт между 15-й и 20-й эпохой в выводе программы: 0.0174 → 0.0211. Это нормально, потому что печатается loss последнего батча, а не средний по эпохе.
Ошибка упала почти в десять раз, а модель правильно классифицирует 99,5% точек. Нейросеть сама вывела правило разметки из примеров, и на это ушло меньше 60 строк кода вместе с комментариями.

Частые ошибки при работе с PyTorch
Код из прошлого раздела работает, но стоит начать его менять, и вы быстро познакомитесь с классическими ошибками. Хорошая новость: почти все они сводятся к четырём ситуациям, и каждую легко проверить.
Тензоры находятся на разных устройствах
Представьте: вы перенесли модель на видеокарту командой model.to(device), запустили обучение и получили RuntimeError с жалобой на cuda и cpu в одном выражении. Причина в том, что модель уехала на GPU, а входные данные остались в оперативной памяти. Считать вместе они физически не могут, потому что лежат в разной памяти.
Правило простое: модель и данные должны находиться на совместимом устройстве. Если модель на GPU, каждый батч перед прямым проходом тоже нужно переносить: batch_X = batch_X.to(device). Проверить, где лежит тензор, всегда можно через атрибут .device.
Не совпадают формы или типы данных
Вторая по популярности ошибка: форма выхода модели не совпадает с тем, что ждёт функция потерь. Например, модель выдаёт тензор формы [32, 1], а метки имеют форму [32]. Некоторые функции потерь в такой ситуации упадут с ошибкой, а некоторые молча посчитают неправильно, что даже хуже.
Диагностируется это за минуту: выведите tensor.shape и tensor.dtype у предсказаний и меток перед расчётом ошибки. В нашем примере мы заранее привели метки к форме [200, 1] методом unsqueeze(1) и к типу float() именно для того, чтобы они совпали с выходом модели.
Градиенты накапливаются между итерациями
Фреймворк по умолчанию не стирает градиенты после шага оптимизатора, а прибавляет новые к старым. Такое поведение нужно для продвинутых техник обучения, но в обычном цикле оно превращается в ловушку: забудете обнулить градиенты, и каждый шаг будет опираться на мусор из прошлых итераций. Модель при этом обучается плохо, а ошибок в консоли нет.
Спасает вызов optimizer.zero_grad() внутри цикла обучения: он обнуляет градиенты перед новым обратным проходом. В нашем примере он стоит перед loss.backward(), и это его законное место.
Режим обучения остаётся включённым при проверке
У модели есть два режима: model.train() для обучения и model.eval() для проверки. Некоторые слои, например Dropout и BatchNorm, ведут себя в них по-разному, поэтому проверка модели в режиме обучения даёт искажённые результаты. Наша маленькая модель таких слоёв не содержит, но привычку вызывать eval() перед проверкой стоит выработать сразу.
Вторая часть той же привычки: считать предсказания внутри torch.no_grad() или более строгого torch.inference_mode(). Оба блока отключают запись вычислительного графа, поэтому проверка работает быстрее и не тратит память на градиенты, которые всё равно никто не использует.
Преимущества и ограничения PyTorch
Фреймворк PyTorch стал стандартом в глубоком обучении не случайно, но и серебряной пулей он тоже не является. Соберём аргументы за и против, чтобы вы могли примерить их на свою задачу.
Преимущества PyTorch
- Привычный Python API. Код модели читается как обычный Python: циклы, условия и функции работают так, как вы привыкли.
- Удобная отладка eager-кода. Операции выполняются сразу, в момент вызова, поэтому модель можно отлаживать print-ами и обычным отладчиком, строка за строкой.
- Autograd и модульная сборка моделей. Градиенты считаются автоматически, а модели собираются из готовых блоков
torch.nn. - Поддержка разных вычислительных устройств. Один и тот же код работает на CPU, CUDA, ROCm, MPS и XPU почти без изменений.
- Развитая экосистема. Вокруг ядра выросли доменные библиотеки, а большинство открытых моделей публикуются именно в формате PyTorch.
- Инструменты для взрослых задач.
torch.compileускоряет модель,torch.exportвыгружает её для развёртывания, а встроенные средства распределённого обучения позволяют считать на десятках видеокарт.
Ограничения PyTorch
- Порог входа в математику. Без понимания тензоров, форм и градиентов осмысленно работать не получится, поэтому перед серьёзными проектами придётся разобраться в основах.
- Зависимость от оборудования и сборки. Производительность упирается в железо, драйверы и правильно выбранную сборку: перепутали версию CUDA — и видеокарта простаивает.
- Аппетит к памяти. Обучение крупных моделей съедает десятки гигабайт видеопамяти, поэтому для больших архитектур нужно дорогое железо или аренда облака.
- Сервинг требует надстроек. Для промышленного запуска моделей с мониторингом и масштабированием понадобятся дополнительные инструменты поверх самого фреймворка.
- Дистанция от эксперимента до продакшена. Код исследовательского ноутбука и промышленный пайплайн — разные вещи: перенос модели в продукт потребует отдельной инженерной работы.
Заметьте, что каждое ограничение привязано к типу проекта. Для учебных задач и прототипов на CPU ни одно из них вам не помешает, а вот команде, которая запускает модель под нагрузкой, придётся учитывать их все.
PyTorch и TensorFlow
Главный сосед PyTorch среди ML-фреймворков — TensorFlow от Google. Спор «кто лучше» идёт годами и слегка устарел вместе со своими аргументами: например, формулировка «TensorFlow работает только со статическим графом» давно неверна, потому что TensorFlow 2 поддерживает eager execution, то есть немедленное выполнение операций. Сравним фреймворки по делу.
| Критерий | PyTorch | TensorFlow |
|---|---|---|
| Основной стиль разработки | Императивный Python-код, операции выполняются сразу | Eager execution по умолчанию, плюс графовый режим через tf.function |
| Построение и отладка моделей | Модели на nn.Module, отладка обычными инструментами Python | Модели чаще собирают через высокоуровневый API Keras |
| Экосистема | Доменные библиотеки, большинство свежих открытых моделей выходит в формате PyTorch | Зрелая экосистема TFX для промышленных пайплайнов |
| Компиляция | torch.compile ускоряет код без его переписывания | Компиляция через XLA и tf.function |
| Экспорт и развёртывание | torch.export и ExecuTorch | SavedModel и TensorFlow Serving |
| Мобильные и периферийные устройства | ExecuTorch для встроенного запуска | LiteRT (бывший TensorFlow Lite) с долгой историей на мобильных |
| Исследования и продукт | Силён в исследованиях и прототипировании | Силён в выстроенных продуктовых конвейерах |
Выбирать фреймворк стоит не по спорам в интернете, а по обстоятельствам конкретного проекта: какой стек уже используется в команде, куда нужно развернуть модель, что умеют коллеги и в каком формате доступны готовые модели, на которые вы рассчитываете. Если начинаете с нуля и планируете опираться на открытые модели и свежие исследования, чаще разумнее стартовать с PyTorch. Если продукт уже живёт на инфраструктуре TensorFlow, переезжать ради моды смысла нет.
Итоги
PyTorch — это фреймворк и целая экосистема для тензорных вычислений, создания и обучения моделей машинного обучения на Python. Внутри он опирается на четыре механизма: тензоры хранят данные, autograd автоматически считает градиенты, модули torch.nn и torch.optim собирают и обучают модель, а Dataset с DataLoader подают данные порциями. Быстрые вычисления обеспечивает ядро на C++, которое одинаково работает на процессоре и ускорителях.
Разумно выбирать PyTorch, когда вы изучаете глубокое обучение, ставите исследовательские эксперименты, разрабатываете собственные архитектуры или работаете в проекте, где экосистема PyTorch уже используется. Порог входа при этом ниже, чем кажется со стороны: как вы убедились на примере из статьи, первая обученная нейросеть занимает меньше 60 строк кода и спокойно работает на обычном ноутбуке.
Советуем дополнительно почитать
Что такое MLOps — что происходит с моделью после torch.export: версионирование, мониторинг и отслеживание дрейфа.
Локальные нейросети на ПК: 10 лучших инструментов для запуска AI без облака — готовые модели, которые поднимаются на своём железе, и требования к памяти под каждую.
OpenAI API в Python: как подключить ChatGPT к приложению — альтернативный путь для тех, кому нужна не своя модель, а чужая по запросу.
Кто такой Data Engineer и как им стать — кто готовит данные, которые потом попадают в Dataset и DataLoader.
Теория вероятности в машинном обучении: с формулами и примерами кода — математика под функциями потерь: почему ошибка считается именно так и что означает её значение.
Бонус для читателей
Если вам интересно погрузиться в мир ИТ и при этом немного сэкономить, держите наш промокод на курсы Практикума. Он даст вам скидку при оплате, поможет с льготной ипотекой и даст безлимит на маркетплейсах. Ладно, окей, это просто скидка, без остального, но хорошая.

