Начало работы с PyTorch в 5 шагах

Освоение PyTorch за 5 шагов

Введение в PyTorch и PyTorch Lightning

PyTorch – это популярный открытый фреймворк машинного обучения на основе Python, оптимизированный для ускоренных вычислений с использованием GPU. Изначально разработанный Meta AI в 2016 году и теперь являющийся частью Linux Foundation, PyTorch быстро стал одним из самых популярных фреймворков для исследований и применения глубокого обучения.

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

  • Простой и интуитивно понятный Python API для построения нейронных сетей
  • Широкая поддержка ускорения с помощью GPU/TPU
  • Встроенная поддержка автоматического дифференцирования
  • Возможности распределенного обучения
  • Совместимость с другими библиотеками Python, такими как NumPy

PyTorch Lightning – это легкий надстройка над PyTorch, которая дополнительно упрощает процесс работы и разработки моделей исследователя. С помощью Lightning, ученые-данные могут больше сосредоточиться на проектировании моделей, а не на шаблонном коде. Основные преимущества Lightning включают:

  • Предоставление структуры для организации кода на PyTorch
  • Обработка шаблонного кода цикла обучения
  • Ускорение экспериментов по настройке гиперпараметров
  • Упрощение масштабирования и развертывания моделей

Комбинируя мощность и гибкость PyTorch с высокоуровневым API Lightning, разработчики могут быстро создавать масштабируемые системы глубокого обучения и быстрее итерироваться.

Шаг 1: Установка и настройка

Для начала работы с PyTorch и Lightning вам сначала нужно установить несколько предварительных требований:

  • Python 3.6 или выше
  • Установщик пакетов Pip
  • Рекомендуется использовать графический процессор NVidia для ускоренных операций (возможна установка только с использованием ЦПУ, но это будет работать медленнее)

Установка Python и PyTorch

Рекомендуется использовать Anaconda для создания среды Python для работы с анализом данных и глубоким обучением. Выполните следующие шаги:

  • Скачайте и установите Anaconda для вашей ОС отсюда: here
  • Создайте среду Conda (или используйте другой менеджер среды Python): conda create -n pytorch python=3.8
  • Активируйте среду: conda activate pytorch
  • Установите PyTorch: conda install pytorch torchvision torchaudio -c pytorch

Проверьте, что PyTorch установлен правильно, выполнив быстрый тест в Python:

import torchx = torch.rand(3, 3)print(x)

Это выведет случайный 3×3 тензор, подтверждая, что PyTorch работает правильно.

Установка PyTorch Lightning

Теперь, когда установлен PyTorch, мы можем установить Lightning с помощью pip:

pip install lightning

Проверим, что Lightning настроен правильно:

import lightningprint(lightning.__version__)

Это должно вывести номер версии, например, 0.6.0.

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

Шаг 2: Создание модели с использованием PyTorch

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

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

import torch
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)
    
    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = torch.flatten(x, 1)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = Net()

 

Здесь определена сверточная нейронная сеть с двумя сверточными слоями и тремя полносвязными слоями для классификации 10 классов. Метод forward() определяет, как данные проходят через сеть.

Сейчас мы можем обучить эту модель на образцовых данных с помощью Lightning.

 

Шаг 3: Обучение модели с использованием Lightning

 

Lightning предоставляет класс LightningModule для инкапсуляции кода модели PyTorch и стандартного цикла обучения. Давайте преобразуем нашу модель:

import lightning as pl

class LitModel(pl.LightningModule):
    def __init__(self):
        super().__init__()
        self.model = Net()

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

    def training_step(self, batch, batch_idx):
        x, y = batch
        y_hat = self.forward(x)
        loss = F.cross_entropy(y_hat, y)
        return loss

    def configure_optimizers(self):
        return torch.optim.Adam(self.parameters(), lr=0.02)

model = LitModel()

 

Метод training_step() определяет прямой проход и расчет потерь. Мы настраиваем оптимизатор Adam с коэффициентом обучения 0.02.

Теперь мы можем легко обучать эту модель:

trainer = pl.Trainer()
trainer.fit(model, train_dataloader, val_dataloader)

 

Trainer автоматически обрабатывает эпохи, валидацию и журналирование. Мы можем оценить модель на тестовых данных (подробнее о модулях данных здесь):

result = trainer.test(model, test_dataloader)
print(result)

 

Для сравнения, вот код сети и цикла обучения на чистом PyTorch:

import torch
import torch.nn.functional as F
from torch.utils.data import DataLoader

# Предположим, что класс Net и train_dataloader, val_dataloader, test_dataloader уже определены

class Net(torch.nn.Module):
    # Здесь определена архитектура вашей сети
    pass

# Инициализация модели и оптимизатора
model = Net()
optimizer = torch.optim.Adam(model.parameters(), lr=0.02)

# Цикл обучения
for epoch in range(10):  # Количество эпох
    for batch_idx, (x, y) in enumerate(train_dataloader):
        optimizer.zero_grad()
        y_hat = model(x)
        loss = F.cross_entropy(y_hat, y)
        loss.backward()
        optimizer.step()

# Цикл валидации
model.eval()
with torch.no_grad():
    for x, y in val_dataloader:
        y_hat = model(x)

# Цикл тестирования и оценки
model.eval()
test_loss = 0
with torch.no_grad():
    for x, y in test_dataloader:
        y_hat = model(x)
        test_loss += F.cross_entropy(y_hat, y, reduction='sum').item()
test_loss /= len(test_dataloader.dataset)
print(f"Test loss: {test_loss}")

 

Lightning делает разработку моделей на PyTorch невероятно быстрой и интуитивной.

 

Шаг 4: Расширенные темы

 

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

 

Настройка гиперпараметров

 

Мы можем оптимизировать гиперпараметры, такие как learning rate, используя модуль tuner в Lightning:

tuner = pl.Tuner(trainer)tuner.fit(model, train_dataloader)print(tuner.results)

 

Это выполняет байесовский поиск по пространству гиперпараметров.

 

Преодоление переобучения

 

Стратегии, такие как слои dropout и ранняя остановка, могут снизить переобучение:

model = LitModel()model.add_module('dropout', nn.Dropout(0.2)) # Регуляризацияtrainer = pl.Trainer(early_stop_callback=True) # Ранняя остановка

 

 

Сохранение и загрузка модели

 

Lightning упрощает сохранение и перезагрузку моделей:

# Сохранениеtrainer.save_checkpoint("model.ckpt") # Загрузкаmodel = LitModel.load_from_checkpoint(checkpoint_path="model.ckpt")

 

Это сохраняет полное состояние модели и гиперпараметры.

 

Шаг 5: Сравнение PyTorch и PyTorch Lightning

 

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

 

Основные отличия

 

Вот краткое описание основных отличий между PyTorch и PyTorch Lightning:

Функция PyTorch PyTorch Lightning
Цикл обучения Мануальная реализация Автоматизированная
Заготовки кода Требуется Минимально
Настройка гиперпараметров Ручная установка Встроенная поддержка
Распределенное обучение Доступно, но требует ручной установки Автоматизированное
Организация кода Нет конкретной структуры Поощряет модульный дизайн
Сохранение и загрузка модели Необходима настраиваемая реализация Упрощена с помощью точек контроля
Отладка Расширенная, но мануальная Упрощена с помощью встроенных журналов
Поддержка GPU/TPU Доступна Упрощена настройка

 

Гибкость против удобства

 

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

Скорость разработки

Если вам предстоит начать проект с нуля или провести сложные эксперименты, PyTorch Lightning может сэкономить вам много времени. Класс LightningModule упрощает процесс обучения, автоматизирует журналирование и даже упрощает распределенное обучение. Это позволяет вам больше сосредоточиться на архитектуре вашей модели и меньше останавливаться на повторяющихся аспектах обучения и проверки модели.

Выводы

В итоге, PyTorch предлагает более детальный контроль и отлично подходит для исследователей, которым требуется такой уровень деталей. Однако PyTorch Lightning создан для того, чтобы сделать цикл исследований-производство более гладким и быстрым, не отнимая мощности и гибкости, которые предоставляет PyTorch. Какой из них выбрать – PyTorch или PyTorch Lightning – зависит от ваших конкретных потребностей, но хорошая новость в том, что вы можете легко переключаться между ними или даже использовать их вместе для разных частей вашего проекта.

Двигаясь вперед

В этой статье мы рассмотрели основы использования PyTorch и PyTorch Lightning для глубокого обучения:

  • PyTorch предоставляет мощный и гибкий фреймворк для построения нейронных сетей
  • PyTorch Lightning упрощает рабочие процессы обучения и разработки моделей
  • Особенности, такие как оптимизация гиперпараметров и управление моделями, ускоряют исследования в глубоком обучении

С этими базовыми знаниями вы можете начать создавать и обучать продвинутые модели, такие как сверточные нейронные сети, рекуррентные нейронные сети, генеративно-состязательные сети и многое другое. Активное сообщество открытого исходного кода также предлагает поддержку Lightning и дополнения, такие как Bolt, библиотеку компонентов и оптимизации.

Удачного глубокого обучения!

Matthew Mayo (@mattmayo13) имеет степень магистра компьютерных наук и диплом о дополнительном образовании в области разведки данных. Как главный редактор VoAGI, Мэттью стремится сделать доступными сложные концепции науки о данных. Его профессиональные интересы включают обработку естественного языка, алгоритмы машинного обучения и исследование новейших достижений искусственного интеллекта. Он движим миссией демократизации знаний в сообществе науки о данных. Мэттью начал программировать, когда ему было 6 лет.