DDPG by gymnasium 13日目

GPUによる計算に成功しました。

GPUとCPUの速度比較

episods=11 step=500
    GPUで80秒
    CPUで48秒
    episods=5 step=500
    GPUで40秒
    CPUで25秒

結論 CPUのほうが速い!!うそーん!

ショックすぎて、今日はもうやめます。CPU買ったほうがいいじゃん!

スクリプト

 

DDPG by gymnasium 12日目

GPUをニューラルネットワークのテンソル演算に利用します。

GPUへの飛ばし方

#変数deviceを’cuda’にする

device = torch.device(“cuda” if torch.cuda.is_available() else “cpu”)

#ネットワークのインスタンスを.to(‘cuda’)する

net_gpu.to(device)

# ネットワークへの入力xを.to(‘cuda’)する

x = x.to(device)

# ネットワークへの正解ラベルyをy.to(‘cuda’)する

y = y.to(device)

これでGPU上のnetへxとyを入れることができるので演算可能になります。

 

速度比較

 

class SimpleNet(nn.Module):クラスとしてネットワークを作成します。
n_inputs:2
バッチ数:4
n_output:1
n_hidden:1024
hidden layer 4層をもつ全5層のネットワークです。
ネットワークのインスタンスを2つ作って
net_cpu = SimpleNet()
net_gpu = SimpleNet()
エポック数:1000でそれぞれ回してみましょう。
結果は
CPU training time: 9.972002267837524 seconds
GPU training time: 2.5578291416168213 seconds
ということで。GPUのほうが高速です。
しかし、n_hiddenを64にすると、
CPU training time: 0.5419738292694092 seconds
GPU training time: 2.506857395172119 seconds
となり、node数が少ない場合はcpuのほうが高速になります。
GPUならいつでも高速というわけではないことに注意しましょう。

スクリプト

 

次回はDDPGコードをGPU対応していきます。

DDPG by gymnasium 11日目

  1. 計算の高速化(GPUの利用)
  2. 適切なエピソード数
  3. 適切なメモリバッファ数
  4. ネットワークの入力値?パラメータ?の正規化。
  5. 保存したパラメータを読み出すのはactorとtarget_actorまたcriticとtarget_criticで共通で良いのだろうか。

計算の高速化:GPUを使ってみる。

今日は下準備をやっていきます。

GPUの準備ができているPCなら

 

で’cuda’が出力されます。
‘cpu’が出力されたならGPUの準備から始める必要があります。

GPUの準備

PCIスロットに入っているGPUを調べる

$ nvidia-smi –query-gpu=name –format=csv
出力:NVIDIA GeForce RTX 3070 Ti

cudaバージョンを調べる

$ nvidia-smi

出力:

NVIDIA-SMI 528.49 Driver Version: 528.49 CUDA Version: 12.0

CUDA Toolkit のバージョンを調べる

$ nvcc -V

出力:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Fri_Jan__6_19:04:39_Pacific_Standard_Time_2023
Cuda compilation tools, release 12.0, V12.0.140
Build cuda_12.0.r12.0/compiler.32267302_0

NVIDIAのGPUドライバを最新にする

https://www.nvidia.co.jp/Download/index.aspx?lang=jp
でNVIDIA GeForce RTX 3070 Tiのドライバをインストールします。Driver Version: 531.14 にアップデートしました。
再度 $ nvidia-smiで確認すると
CUDA Version: 12.1 にアップデートしていました。

CUDA ToolkitをGPUドライバに合わせてインストールする

https://developer.nvidia.com/cuda-toolkit-archive

GPUドライバをアップデートした結果CUDAバージョンは12.1になったので、それに合わせてCUDA Toolkit 12.1.0 (February 2023), Versioned Online Documentationを選択。

次にwindows10, exeファイルを選択して、ダウンロードしてインストール。

PytorchのGPU使用バージョンをインストールする

https://pytorch.org/get-started/locally/

Pytorchがインストールされているようであれば、アンインストールしておくのが良いです。

$ pip uninstall torch

下記のように自分に合ったOS, CUDAバージョンを指定すると、インストール用のコマンドが生成されるので、実行します。

確認する

今一度下記でdeviceが’cuda’と出力されれば完了です。

Pythonからもいろいろ情報を取得できます。

 

GPUでPytorchのテンソルを計算してみよう。

結果

GPU同士でないと計算できないので注意です。

演算後にCPU上の数値またはNumpy.arrayと演算するためにはGPU上からCPU上へ戻す必要があります。

 

また、GPU上にあるとmatplotlibでグラフが書けないので、GPU→CPUまたは、Numpy.arrayにしてからmatplotlibで描画します。

gpu上にある数値でグラフ描画を試みたときの警告

plt.plot(gpu_tensor)
#TypeError: can’t convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

次回

次回はニューラルネットワークに
device = torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’)

tensor.to(device)

numpy_array = gpu_tensor.cpu().detach().numpy()
を入れ込んでみます。