AIの作り方の復習 演習編2

以下では、課題を PyTorch(ディープラーニング) と RAPIDS(GPU加速機械学習) の両方で実装し、比較しながら学べるように構成しました。

(注意)pytorchを実行するため、Rapids AIのconda環境の中にpytorch環境をインストールして比較できるようにして実行します。

conda install pytorch torchvision torchaudio pytorch-cuda=12.4 -c pytorch -c nvidia


ステップ2: 機械学習基礎

目標

  1. PyTorchとRAPIDSの使い方を比較しながら学ぶ。

  2. 基礎的な回帰や分類タスクを両方で実装して、速度とパフォーマンスの違いを体感する。


1️⃣ 線形回帰 (Linear Regression)

PyTorch (ディープラーニングで実装)

import torch
from torch import nn
from sklearn.model_selection import train_test_split

# データ作成
X = torch.rand(10000, 1) * 10
y = 3 * X + torch.randn(10000, 1) * 2

# データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# モデル定義
model = nn.Linear(1, 1)
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 学習
for epoch in range(500):
    optimizer.zero_grad()
    y_pred = model(X_train)
    loss = criterion(y_pred, y_train)
    loss.backward()
    optimizer.step()

# 評価
with torch.no_grad():
    y_pred = model(X_test)
    loss = criterion(y_pred, y_test)
print("Mean Squared Error (PyTorch):", loss.item())

RAPIDS (CuMLを使用)

import cudf
import cupy as cp
from cuml.linear_model import LinearRegression
from cuml.metrics import mean_squared_error

# データ作成
X = cp.random.rand(10000, 1) * 10
y = 3 * X + cp.random.randn(10000, 1) * 2

# CuDFデータフレーム化
data = cudf.DataFrame({'X': X.squeeze(), 'y': y.squeeze()})

# データ分割
X_train, X_test = data[['X']][:8000], data[['X']][8000:]
y_train, y_test = data['y'][:8000], data['y'][8000:]

# 線形回帰モデル
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

# 評価
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error (CuML):", mse)

2️⃣ ロジスティック回帰 (Logistic Regression)

PyTorch (ディープラーニングで実装)

# データ作成
X = torch.rand(10000, 10)
y = ((X[:, 0] + X[:, 1]) > 1).float().reshape(-1, 1)

# データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# モデル定義
model = nn.Sequential(nn.Linear(10, 1), nn.Sigmoid())
criterion = nn.BCELoss()  # バイナリクロスエントロピー
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 学習
for epoch in range(100):
    optimizer.zero_grad()
    y_pred = model(X_train)
    loss = criterion(y_pred, y_train)
    loss.backward()
    optimizer.step()

# 評価
with torch.no_grad():
    y_pred = model(X_test)
    accuracy = ((y_pred > 0.5) == y_test).float().mean()
print("Accuracy (PyTorch):", accuracy.item())

RAPIDS (CuMLを使用)

from cuml.linear_model import LogisticRegression
from cuml.metrics import accuracy_score

# データ作成
X = cp.random.rand(10000, 10)
y = (X[:, 0] + X[:, 1] > 1).astype(cp.float32)

# データ分割
X_train, X_test = X[:8000], X[8000:]
y_train, y_test = y[:8000], y[8000:]

# ロジスティック回帰モデル
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

# 評価
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy (CuML):", accuracy)

3️⃣ CPUとGPUの速度比較

コード例

以下のコードで、PyTorch(GPU)とRAPIDS(GPU)の速度を比較できます。

import timeit

# PyTorchで線形回帰
pytorch_time = timeit.timeit(
    setup="import torch; from torch import nn; X = torch.rand(100000, 1); y = 3 * X + torch.randn(100000, 1) * 2; model = nn.Linear(1, 1); optimizer = torch.optim.SGD(model.parameters(), lr=0.01); criterion = nn.MSELoss()",
    stmt="for epoch in range(10): optimizer.zero_grad(); loss = criterion(model(X), y); loss.backward(); optimizer.step()",
    number=10
)

# RAPIDSで線形回帰
rapids_time = timeit.timeit(
    setup="from cuml.linear_model import LinearRegression; import cupy as cp; X = cp.random.rand(100000, 1); y = 3 * X + cp.random.randn(100000, 1) * 2; model = LinearRegression()",
    stmt="model.fit(X, y)",
    number=10
)

print(f"PyTorch Time: {pytorch_time:.4f} seconds")
print(f"RAPIDS Time: {rapids_time:.4f} seconds")

まとめ

  • PyTorchはディープラーニングフレームワークとして柔軟性が高い。

  • RAPIDSは、機械学習タスクのGPU加速に特化しており、特に大規模データで優位性を発揮。

  • どちらもGPUを活用できる点で、データやタスクに応じて選択できます。


これを基に、さらに深掘りしたい方向(SVM、決定木、CNNなど)を選んで進めていきましょう!😊

いいなと思ったら応援しよう!