AIの作り方の復習 演習編2
以下では、課題を PyTorch(ディープラーニング) と RAPIDS(GPU加速機械学習) の両方で実装し、比較しながら学べるように構成しました。
(注意)pytorchを実行するため、Rapids AIのconda環境の中にpytorch環境をインストールして比較できるようにして実行します。
conda install pytorch torchvision torchaudio pytorch-cuda=12.4 -c pytorch -c nvidia
ステップ2: 機械学習基礎
目標
PyTorchとRAPIDSの使い方を比較しながら学ぶ。
基礎的な回帰や分類タスクを両方で実装して、速度とパフォーマンスの違いを体感する。
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など)を選んで進めていきましょう!😊