Початок роботи з PyTorch за 5 кроків - KDnuggets

Початок роботи з PyTorch за 5 кроків – KDnuggets

Вихідний вузол: 2909439

Початок роботи з PyTorch за 5 кроків

Початок роботи з PyTorch за 5 кроків
 

PyTorch це популярна платформа машинного навчання з відкритим кодом, яка базується на Python і оптимізована для обчислень із прискоренням GPU. Спочатку розроблений Meta AI у 2016 році, а тепер є частиною Linux Foundation, PyTorch швидко став одним із найпоширеніших фреймворків для досліджень і програм глибокого навчання.

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

  • Простий та інтуїтивно зрозумілий API Python для створення нейронних мереж
  • Широка підтримка прискорення GPU/TPU
  • Вбудована підтримка автоматичної диференціації
  • Розподілені навчальні можливості
  • Взаємодія з іншими бібліотеками Python, такими як NumPy

Блискавка PyTorch — це легка оболонка, створена на основі PyTorch, яка ще більше спрощує процес роботи дослідника та розробки моделі. Завдяки Lightning дослідники даних можуть більше зосередитися на розробці моделей, а не на шаблонному коді. Основні переваги Lightning:

  • Надає структуру для організації коду PyTorch
  • Обробляє шаблонний код циклу навчання
  • Прискорює дослідницькі експерименти з налаштуванням гіперпараметрів
  • Спрощує масштабування та розгортання моделі

Поєднуючи потужність і гнучкість PyTorch з високорівневими API Lightning, розробники можуть швидко створювати масштабовані системи глибокого навчання та виконувати ітерації швидше.

Щоб почати використовувати PyTorch і Lightning, вам спочатку потрібно встановити кілька попередніх умов:

  • Python 3.6 або вище
  • Інсталятор пакетів Pip
  • Графічний процесор NVidia рекомендується для прискорених операцій (можливе налаштування лише для ЦП, але повільніше)

Встановлення Python і PyTorch

Рекомендується використовувати Anaconda для налаштування середовища Python для обробки даних і глибокого навчання. Виконайте наведені нижче дії.

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

Переконайтеся, що PyTorch встановлено правильно, виконавши швидкий тест у Python:

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

Це роздрукує випадковий тензор 3×3, підтверджуючи, що PyTorch працює належним чином.

Встановлення PyTorch Lightning

Після встановлення PyTorch тепер ми можемо встановити Lightning за допомогою pip:

pip install lightning-ai

Давайте підтвердимо, що Lightning налаштовано правильно:

import lightning_ai
print(lightning_ai.__version__)

Це повинно роздрукувати номер версії, наприклад 0.6.0.

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

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 класів. The forward() Метод визначає, як дані проходять через мережу.

Тепер ми можемо навчити цю модель на зразках даних за допомогою Lightning.

Блискавка забезпечує a LightningModule клас для інкапсуляції коду моделі PyTorch і шаблону навчального циклу. Перетворимо нашу модель:

import pytorch_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)

Тренер обробляє цикли епохи, перевірку та журналювання автоматично. Ми можемо оцінити модель на тестових даних:

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

Для порівняння, ось код мережі та навчального циклу в чистому PyTorch:

import torch
import torch.nn.functional as F
from torch.utils.data import DataLoader # Assume Net class and train_dataloader, val_dataloader, test_dataloader are defined class Net(torch.nn.Module): # Define your network architecture here pass # Initialize model and optimizer
model = Net()
optimizer = torch.optim.Adam(model.parameters(), lr=0.02) # Training Loop
for epoch in range(10): # Number of epochs 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() # Validation Loop
model.eval()
with torch.no_grad(): for x, y in val_dataloader: y_hat = model(x) # Testing Loop and Evaluate
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 неймовірно швидкою та інтуїтивно зрозумілою.

Lightning надає багато вбудованих можливостей для налаштування гіперпараметрів, запобігання переобладнанню та керування моделлю.

Налаштування гіперпараметрів

Ми можемо оптимізувати такі гіперпараметри, як швидкість навчання, за допомогою Lightning tuner модуль:

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

Це виконує байєсівський пошук у просторі гіперпараметрів.

Поводження з переобладнанням

Стратегії, такі як випадання шарів і рання зупинка, можуть зменшити переобладнання:

model = LitModel()
model.add_module('dropout', nn.Dropout(0.2)) # Regularization trainer = pl.Trainer(early_stop_callback=True) # Early stopping

Збереження та завантаження моделі

Lightning спрощує збереження та перезавантаження моделей:

# Save
trainer.save_checkpoint("model.ckpt") # Load
model = LitModel.load_from_checkpoint(checkpoint_path="model.ckpt")

Це зберігає повний стан моделі та гіперпараметри.

І PyTorch, і PyTorch Lightning є потужними бібліотеками для глибокого навчання, але вони служать різним цілям і пропонують унікальні функції. У той час як PyTorch забезпечує базові блоки для розробки та впровадження моделей глибокого навчання, PyTorch Lightning має на меті спростити повторювані частини навчання моделі, тим самим прискорюючи процес розробки.

Ключові відмінності

Ось короткий виклад ключових відмінностей між PyTorch і PyTorch Lightning:

особливість PyTorch Блискавка PyTorch
Навчальна петля Кодується вручну Автоматизований
Шаблонний код Вимагається Minimal
Налаштування гіперпараметрів Налаштування вручну Вбудована підтримка
Розподілене навчання Доступно, але ручне налаштування Автоматизований
Організація коду Немає конкретної структури Заохочує модульний дизайн
Збереження та завантаження моделі Необхідна індивідуальна реалізація Спрощено з контрольними точками
Налагодження Просунутий, але ручний Простіше з вбудованими колодами
Підтримка GPU/TPU наявний Простіше налаштування

Гнучкість проти зручності

PyTorch відомий своєю гнучкістю, особливо з динамічними обчислювальними графіками, що чудово підходить для досліджень і експериментів. Однак ця гнучкість часто обходиться ціною написання більшої кількості шаблонного коду, особливо для циклу навчання, розподіленого навчання та налаштування гіперпараметрів. З іншого боку, PyTorch Lightning абстрагує більшу частину цього шаблону, але все ще дозволяє повне налаштування та доступ до API нижнього рівня PyTorch, коли це необхідно.

Швидкість розвитку

Якщо ви починаєте проект з нуля або проводите складні експерименти, PyTorch Lightning може заощадити вам багато часу. Клас LightningModule оптимізує процес навчання, автоматизує ведення журналів і навіть спрощує розподілене навчання. Це дає змогу більше зосередитися на архітектурі моделі, а не на повторюваних аспектах навчання та перевірки моделі.

Вердикт

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

У цій статті ми розглянули основи використання PyTorch і PyTorch Lightning для глибокого навчання:

  • PyTorch надає потужну та гнучку структуру для побудови нейронних мереж
  • PyTorch Lightning спрощує навчання та робочі процеси розробки моделей
  • Такі ключові функції, як оптимізація гіперпараметрів і керування моделлю, прискорюють дослідження глибокого навчання

З цими основами ви можете розпочати створення та навчання передових моделей, таких як CNN, RNN, GAN тощо. Активна спільнота з відкритим кодом також пропонує підтримку Lightning і доповнення, такі як Bolt, бібліотека компонентів і оптимізації.

Щасливого глибокого навчання!

 
 
Метью Майо (@mattmayo13) має ступінь магістра з інформатики та диплом з інтелектуального аналізу даних. Як головний редактор KDnuggets, Метью прагне зробити доступними концепції складних наукових даних. Його професійні інтереси включають обробку природної мови, алгоритми машинного навчання та дослідження ШІ. Він керується місією демократизації знань у спільноті науки про дані. Метью кодує з 6 років.
 

Часова мітка:

Більше від KDnuggets