<<前回の記事>>
機械学習やディープラーニングの学習プロセスでは、膨大な計算が発生します。特に、ニューラルネットワークの学習では行列乗算などの計算が頻繁に行われるため、処理速度は非常に重要です。今回は、Kaggle Notebook(P100環境)で実際にCPUとGPUによる行列乗算の実行速度を計測し、その結果と背景にある計算の並列性について詳しく解説します。
実験内容:行列乗算の比較
以下のPythonコードを用いて、ランダムな大きな行列の乗算を行いました。PyTorchを使って、CPUとGPUのそれぞれで計算時間を計測しています。
import torch
import time
# 行列サイズの設定
N = 5000
# CPU上でランダムな行列を作成
A_cpu = torch.randn(N, N)
B_cpu = torch.randn(N, N)
# CPUでの行列乗算計測
start_cpu = time.time()
C_cpu = torch.matmul(A_cpu, B_cpu)
end_cpu = time.time()
print("CPUでの行列乗算時間: {:.4f}秒".format(end_cpu - start_cpu))
# GPUが利用可能な場合、行列をGPUに移動して計算
if torch.cuda.is_available():
device = torch.device("cuda")
A_gpu = A_cpu.to(device)
B_gpu = B_cpu.to(device)
# GPUでは計算前後に同期が必要
torch.cuda.synchronize()
start_gpu = time.time()
C_gpu = torch.matmul(A_gpu, B_gpu)
torch.cuda.synchronize()
end_gpu = time.time()
print("GPUでの行列乗算時間: {:.4f}秒".format(end_gpu - start_gpu))
else:
print("GPUが利用できません。")
実行結果
- CPUでの行列乗算時間: 1.1088秒
- GPUでの行列乗算時間: 0.1037秒
この結果から、GPUでの行列乗算がCPUに比べて約10倍高速であることが確認できました。
数式で見る行列乗算と並列処理
行列乗算は、機械学習の多くの計算で利用される基本的な演算です。サイズ $m \times k$ の行列 $A$ とサイズ $k \times n$ の行列 $B$ の積は、各要素 $C_{ij}$ が以下のように計算されます。 $$C_{ij} = \sum_{l=1}^{k} A_{il} \cdot B_{lj} \quad \text{for } 1 \leq i \leq m,\; 1 \leq j \leq n$$
CPUでの計算
CPUは、数個の高性能なコアでこの計算を逐次または限られた並列度で処理します。個々の $C_{ij}$ の計算はシリアルに近い処理が多いため、コア数が少ない環境では計算全体が遅くなりがちです。
GPUでの計算
一方、GPUは数百〜数千のシンプルなコア(CUDAコアやシェーダーコア)を持っており、各 $C_{ij}$ の計算を独立に並列処理できます。GPUのアーキテクチャは以下のようにSIMT(Single Instruction, Multiple Threads)に基づいており、同一の命令を大量のスレッドが同時に実行するため、大規模な行列乗算で大幅な高速化を実現します。
実測結果の解説
上記の実験結果から、P100 GPU環境では行列乗算がCPUに比べて約10倍高速であることが分かります。これは以下の点に起因します。
- 並列処理の強み:
GPUは、各要素の計算を数千のコアに分散して同時に実行できるため、大規模な行列乗算のようなデータ並列性の高いタスクに非常に適しています。 - シンプルなコア設計:
GPUのコアは、個々の処理能力自体はCPUの高性能コアに劣りますが、シンプルで大量に搭載されるため、並列に処理する際の総合性能が大きく向上します。 - 同期処理:
GPUでは計算前後に同期を取る必要がありますが、それでも全体の並列実行の恩恵により、処理速度の向上が顕著に現れます。
まとめ
今回の実験では、実際のコード実行結果をもとに、CPUとGPUの行列乗算における速度の違いを確認しました。具体的なポイントは以下の通りです。
- CPU: 少数の高性能コアでシリアルな処理に優れるが、大規模な並列計算では処理時間が長くなる。
- GPU: 数百〜数千のコアによる大量並列処理が得意であり、行列乗算のような演算で大幅な高速化を実現できる。
- 実測結果: Kaggle NotebookのP100環境で、行列乗算がCPUで約1.1秒、GPUで約0.1秒と、GPUの方が約10倍高速。
このような違いを理解することで、機械学習の学習や推論時に適切なハードウェアを選択する判断材料となります。特に、ディープラーニングの学習や大規模なデータ処理が必要なタスクでは、GPUの利用が大きなメリットとなります。
コメント