やること
『書籍「将棋AIで学ぶディープラーニング」のプログラムコードを動かす』のコードがGPUありきなので、第7章のtrain_policy.pyを対象にCPUで動くように変更してみる。
Amazonのカスタマーレビュー
星一つの評価者が一人だけいまして、
理由が「GPU前提であるのが残念」らしいんです、
こちらに触発されまして
ChainerはGPUとCPUの切り替えが簡単
ただしCPUでは満足な学習のためにどれだけの時間がかかることかは知ったこっちゃないです
- いまどきの10万円のGPUを用意することが難しければ
- 古くても2万円のGPUくらい用意した方がまだましだし
- AWSでg2を1時間動かすだけなら百円くらいみたいですよ->見積り
- なんちゃって私は1万円のGPUで遅い遅いですけど
ChainerのコードをCPU対応にする
ChainerのコードをGPU対応にするの逆をする
- cuda.get_device()があれば消す
- model.to_gpu()があれば消す
- cuda.cupyをnpに置き換える(import numpy as np)
以上を念頭において、エラーを吐かせて直していくスタイル
通常のとおり学習をはじめる
>python train_policy.py kifulist_train_1000.txt kifulist_test_100.txt --eval_interval 100 --log log
"train_policy.py", line 38
Traceback (most recent call last):
File "train_policy.py", line 38, in <module>
model.to_gpu()
File "C:\home\bin\miniconda3\lib\site-packages\chainer\link.py", line 730, in to_gpu
super(Chain, self).to_gpu()
File "C:\home\bin\miniconda3\lib\site-packages\chainer\link.py", line 364, in to_gpu
cuda.check_cuda_available()
File "C:\home\bin\miniconda3\lib\site-packages\chainer\backends\cuda.py", line 80, in check_cuda_available
raise RuntimeError(msg)
RuntimeError: CUDA environment is not correctly set up
(see https://github.com/chainer/chainer#installation).No module named 'cupy'
念頭の2点めのやつ、38行めを消せばよい(行数変わると後がややこしいのでコメントアウト)
model.to_gpu()
↓
# model.to_gpu()
"train_policy.py", line 118
Traceback (most recent call last):
File "train_policy.py", line 118, in <module>
x, t = mini_batch(positions_train_shuffled, i, args.batchsize)
File "train_policy.py", line 94, in mini_batch
return (Variable(cuda.to_gpu(np.array(mini_batch_data, dtype=np.float32))),
File "C:\home\bin\miniconda3\lib\site-packages\chainer\backends\cuda.py", line 258, in to_gpu
check_cuda_available()
File "C:\home\bin\miniconda3\lib\site-packages\chainer\backends\cuda.py", line 80, in check_cuda_available
raise RuntimeError(msg)
RuntimeError: CUDA environment is not correctly set up
(see https://github.com/chainer/chainer#installation).No module named 'cupy'
118行めで呼ぶ94行めにcuda.to_gpu()がいる(cuda.cupyでなくcuda.to_gpu(np)なんですね)、
こちらも行数を変えずに書き換える
return (Variable(cuda.to_gpu(np.array(mini_batch_data, dtype=np.float32))),
Variable(cuda.to_gpu(np.array(mini_batch_move, dtype=np.int32))))
↓
return (Variable(np.array(mini_batch_data, dtype=np.float32)),
Variable(np.array(mini_batch_move, dtype=np.int32)))
つぎを実行する前にすぐ後の行が目にはいりました、105行めも同様にします。
return (Variable(cuda.to_gpu(np.array(mini_batch_data, dtype=np.float32))),
Variable(cuda.to_gpu(np.array(mini_batch_move, dtype=np.int32))))
↓
return (Variable(np.array(mini_batch_data, dtype=np.float32)),
Variable(np.array(mini_batch_move, dtype=np.int32)))
一応これぽちの修正で動きます。
ただし本当に遅いですよ!?
たったこれだけの書き換えをあきらめて
GPUないもんと拗ねるのは勿体ない
みんなでディープラーニングの流行に乗りましょう
おしまい