どうも、僕です。
将棋とか好きでよく見たりするんですが、藤井聡太二冠、すごいですよね。
先日の朝日杯の準決勝とか見ましたか?いや、すごい逆転でしたね↓
https://www.asahi.com/articles/ASP2C4TCPP2CUCVL006.html
そういえば将棋に集中するために高校は中退するのだとか。
準位戦も昇格しましたし、今後の益々の活躍に期待ですね。
藤井二冠もそうですが、最近の棋士はプロでも将棋AIを使って研究したりするそうですね。
最近の将棋AIの進化は目覚ましいものがあります。
将棋AIではありませんが、最近エッチな画像を作るAIも話題になってましたね。
やっぱりこれからの時代はAIですね。
これからの時代、一般教養としてAIくらい自作できなくては。
と、いうことで、私も将棋AIを試しに作ってみる事にしました。
将棋AIで学ぶディープラーニング
将棋AIを作るにあたって参考にしたのは「将棋AIで学ぶディープラーニング」という書籍です。
この本ですが、非常にお勧めです。この本の通りにやればAIを作ることができます。
「将棋AIで学ぶディープラーニング?強いよね、理論、実装、応用、隙がないよね。
でも、オイラ負けないよ!」
(将棋好きにはわかるネタ)
AIについて全く知らない初心者の方にもおすすめです。
AIについて全く知らない初心者の私が言うんだから、間違いないよ。
基本的にはこの本の通りに進めればAIを作ることができます……
……なんですが
実は問題がまったく無いわけではなくって、
この本が出版されたのが2018年で3年前なんですが、情報分野の発展は日進月歩なので、3年前の記述だとすでに古くなってしまってる部分があるんですね。
別に理論が古いとかそういう高度な話をしてるわけではなくて、具体的にはソフトのバージョン管理です。
多分プログラミングする人はみんな一度は困ったりすると思うのですが、実際に私もこのバージョン管理に困ったので(というか現在進行形で困っているので)ちょっとお話ししたいです。
同じ本を買って同じ罠にはまった人の多少助けになれば幸いです。
ディープラーニングフレームワークについて
AIを作る道具であるディープラーニングフレームワークについては、本の第6章に書いてあります。
この本ではフレームワークとしてChainerを使用してます。登場人物の相関図を示します。
(相関図は偏見とイメージで書いてるので間違ってるかもしれません。ごめんね)

GPUって知らない人のためにちょっと説明すると、グラフィックボードに入ってる計算装置で、CPUより並列計算が得意なやつです。CPUを1人の天才だとしたら、GPUは10万人の凡人という感じです。
だいたい最近のスパコンなんかもGPUベースで作られてますね。
いろんな登場人物がいるんですが、特に赤い丸がついてるやつらのバージョンを合わせてあげないといけなくて、これが地味に大変です。
まず、本の中で使われてるバージョンは以下の通りです。
Python | pip | Visual Studio | GPU(本体) | GPUドライバー | CUDA | cuDNN | Cupy | Chainer |
3.5.2 | ? | 2015 | GeForce GTX1080 | ? | 9.0 | 7.0 | 2.3.0 | 3.3.0 |
大体当時の最新バージョンを使っているそうですが、一部
・Cupyインストールでエラーが出るのでPython3.6ではなくPython3.5
・Cupyが対応していないのでCUDA9.1ではなくCUDA9.0
など、理由があって古いバージョンを使用しているものも一部あります。
私も本を参考に環境を構築していこうと思うのですが、まず最初のスタートは以下の状態です。
Python | pip | Visual Studio | GPU(本体) | GPUドライバー | CUDA | cuDNN | Cupy | Chainer |
ー | ー | ー | GeForce GT520 | 388.13 | 4.0 | ー | ー | ー |
以下、環境構築の変遷を示しますが、問題のある個所を赤字で示し、その際に生じたエラーを紹介していきます。
さて、初期状態でいきなり赤字があります。
私のPCは10年前に購入したものなのでGT520という古いグラフィックボードなのですが、こいつのcuda capabiityという能力が2.1しかない……

参考:https://developer.nvidia.com/cuda-gpus
そうすると何がまずいかというと、cuda capabilityが3.0以上ないとcuDNNが使えないんですね。
やる前からすでに負けが確定している……。
ただ、他の機能は使えるかもしれないので、とりあえずできるところまでやってみる事に。
第1の罠~pip install~
まずは、本に書いてある通り以下のところまでインストールを進めました。
Python | pip | Visual Studio | GPU(本体) | GPUドライバー | CUDA | cuDNN | Cupy | Chainer |
3.5.2 | ? | 2015 | GeForce GT520 | 388.13 | 9.0 | 7.0 | ー | ー |
ここで、CupyとChainerをインストールするためにpipのアップグレードをするために本の通り以下のコマンドを実行すると罠にかかります。
>python -m pip install -U pip |
これはpipを最新版にアップグレードするコマンドですが、これをすると
pipが死にます
具体的には sys.stderr.write(f”ERROR: {exc}”) ^ SyntaxError: invalid syntax というエラーが出るようになります。
これはpython3.5以下のバージョンがpipの最新バージョンの21だと対応してない為なんですね。
で、これの嫌なところはpipが死ぬので古いpipをpipコマンドで入れることができない。
上記コマンドの代わりに、
>python -m pip install --upgrade "pip < 21.0" |
と、バージョン指定してpipを入れれば使えるようですが、「pipの最新版をつかえ!」「もうpython3.5はサポートしないぞ!」と、pipを使うたびにワア煮がうるさいので新しいpythonを入れましょうね。
本ではcupyのインストールに問題あるからとpython3.5を使っていましたが、pipも新しくなってるし、最新のpythonでいいでしょ。
第2の罠~pip install cupy~
古いバージョンでやってもうまくいかないので新しいバージョンにしてみます。
まず、Visual Studioですが、最新版は2020なのですがインストーラーが2015からイメチェンしていてよくわからないし、2015でよさそうなのでそのままにしました。
次にCUDAですが、これは最新版が11.2なんですが、GPUのドライバーが388.13なので、こちらもCUDA9.0のままでいいか。(以下の表はCUDAとドライバーの対応表)

GPUのバージョンに関しては以下の記事も詳しい↓
参考:https://qiita.com/konzo_/items/a6f2e8818e5e8fcdb896
結局Pythonだけ最新の3.8.5 (Anaconda3.2020.11)にしました。
今度はpip21でいいので、普通に
>python -m pip install -U pip |
として、
>pip install cupy |
>pip install chainer |
とすると以下のバージョンになります。
Python | pip | Visual Studio | GPU(本体) | GPUドライバー | CUDA | cuDNN | Cupy | Chainer |
3.8.5 | 21 | 2015 | GeForce GT520 | 388.13 | 9.0 | 7.0 | 8.4.0 | 7.7.0 |
ただ、ここでも問題があって、普通に最新版のCupy8.4.0をインストールするとChainer7.7.0がサポートしていないのでダメです。
なのでcupyを入れてしまった場合は
>pip uninstall cupy |
で一度消去してから、
>pip install cupy-cuda90==7.8.0 –no-cache-dir |
とバージョンを指定してインストールします。CUDA9.0なのでcuda90としてます。–no-cache-dirは一応つけてます。
第3の罠~古いグラボ~
Python | pip | Visual Studio | GPU(本体) | GPUドライバー | CUDA | cuDNN | Cupy | Chainer |
3.8.5 | 21 | 2015 | GeForce GT520 | 388.13 | 9.0 | 7.0 | 7.8.0 | 7.7.0 |
紆余曲折経てここまで来て、普通のグラボなら多分問題なく動くんですが、
私のように古いグラボを使ってると
cupy.cuda.curand.CURANDError: CURAND_STATUS_LAUNCH_FAILURE
というエラーがでて動きません。以下の参考によると、古いグラボだとCUDA8.0じゃないとなんかだめみたいですね。
この記事を参考にCUDAを8.0にダウングレードし、CHAINER_CUDNNを0として環境変数に追加しました。
>pip install cupy-cuda80==7.8.0 –no-cache-dir |
Python | pip | Visual Studio | GPU(本体) | GPUドライバー | CUDA | cuDNN | Cupy | Chainer |
3.8.5 | 21 | 2015 | GeForce GT520 | 388.13 | 8.0 | (6.0) | 7.8.0 | 7.7.0 |
CHAINER_CUDNNが0だとcuDNNは使えないので()つけてます。
これでようやく動くようになりました。Chinerのサンプル(train_mnist.py)を実行した結果が以下の通りです。


左がCPUだけで計算した結果で、右がGPUを使ったものです。実行時間が942秒から393秒に減少しました。やったね!
cuDNN使えばもっと早くなるんでしょうが。
第4の罠~古いグラボ~
なんとかchainerのサンプルも動いたし、早速将棋AIに学習させてみよう!
と、思って学習実行した時のがこれ

エラーとしては”cupy.cuda.driver.CUDADriverError: CUDA_ERROR_INVALID_VALUE: invalid argument”というエラーらしい。
それで、これを解決しようとしたけど、結局よくわからなかったですね。
同じエラーで悩んでた人は「そもそもcupyは9.0以降のCUDAとcuda capabiity3.0以上のグラボじゃないと無理じゃない?」みたいなこと言われてました。

参考:https://docs.cupy.dev/en/stable/install.html
(でもcupy-cuda80でインストールできるんだからcupy7.8.0はCUDA8.0サポートしてるはずなんだけどな……。)
もし解決法わかる人がいたら教えてください。
まあここらが年貢の納め時だと思うので、おとなしく新しいグラボ買いましょうかね。
というわけで最近はグラボのことばっか考えてます。
新しいグラボ買ったらまた更新します。さようなら。
“吟遊詩人のDeep Learningその1〜将棋AIを作りたかった話〜” への2件のフィードバック