PyTorch: что это за фреймворк и для чего нужен

Разбираем главный ML-фреймворк

PyTorch: что это за фреймворк и для чего нужен

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() посчитает градиент по каждому параметру, и станет понятно, в какую сторону этот параметр двигать.

Модель, функция потерь и оптимизатор

Теперь соберём из деталей полный цикл обучения. В нём участвуют три компонента: модель, которая делает предсказания, функция потерь, которая измеряет ошибку, и оптимизатор, который обновляет параметры. Цикл повторяется много раз и на каждой итерации проходит пять шагов:

  1. модель получает порцию данных;
  2. выполняется прямой проход — модель считает предсказания;
  3. функция потерь сравнивает предсказания с правильными ответами и выдаёт число: чем оно больше, тем сильнее модель ошиблась;
  4. autograd вычисляет градиенты ошибки по всем параметрам модели;
  5. оптимизатор сдвигает параметры в сторону уменьшения ошибки.

За модели отвечает модуль 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, то есть немедленное выполнение операций. Сравним фреймворки по делу.

КритерийPyTorchTensorFlow
Основной стиль разработкиИмперативный Python-код, операции выполняются сразуEager execution по умолчанию, плюс графовый режим через tf.function
Построение и отладка моделейМодели на nn.Module, отладка обычными инструментами PythonМодели чаще собирают через высокоуровневый API Keras
ЭкосистемаДоменные библиотеки, большинство свежих открытых моделей выходит в формате PyTorchЗрелая экосистема TFX для промышленных пайплайнов
Компиляцияtorch.compile ускоряет код без его переписыванияКомпиляция через XLA и tf.function
Экспорт и развёртываниеtorch.export и ExecuTorchSavedModel и 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.

Теория вероятности в машинном обучении: с формулами и примерами кода — математика под функциями потерь: почему ошибка считается именно так и что означает её значение.

Бонус для читателей

Если вам интересно погрузиться в мир ИТ и при этом немного сэкономить, держите наш промокод на курсы Практикума. Он даст вам скидку при оплате, поможет с льготной ипотекой и даст безлимит на маркетплейсах. Ладно, окей, это просто скидка, без остального, но хорошая.

Вам может быть интересно
medium