teacup. [ 掲示板 ] [ 掲示板作成 ] [ 有料掲示板 ] [ ブログ ]

 投稿者
 メール
  題名
  内容 入力補助画像・ファイル<IMG>タグが利用可能です。(詳細)
    
 URL
[ ケータイで使う ] [ BBSティッカー ] [ 書込み通知 ]


Winograd アルゴリズム

 投稿者:gg  投稿日:2016年 8月24日(水)02時10分22秒
  cuDNN v5.0 で 3x3 の畳み込みが 2倍速くなったのは Winograd アルゴリズムを
使っているからです.論文は https://arxiv.org/abs/1509.09308
これを使った上で内部の行列乗算に cuBLAS を使うのが(普通レベルで)最速ですが,
最近 Intel に買収された NervanaSystems の Neon は,さらに Maxwell の
アセンブラを使って一割前後速くしたとか.Scott Gray さんは半端ない.
#GPU ではなく CPU での計算を高速化したければ自分で実装するしか...
 
 

cudnn スピードテスト

 投稿者:HiraBot  投稿日:2016年 8月23日(火)04時47分3秒
  DCNN 計算に cudnn を取り入れて速度を測定しました
net は 3x3-128-11層 + 3x3-1-1層  です(No211)

cublas  (windows, GTX960)  3.3ms
cudnn-v3(windows, GTX960)  2.14ms
cudnn-v5(windows, GTX960)  1.35ms

cudnn を使用することで 2.4倍に速度が向上しました
HiraBot3 も cublas から cudnn-v5 に乗り換える予定です
 

CUDA 7.5 と cuDNN 5.0

 投稿者:山下  投稿日:2016年 8月20日(土)15時14分12秒
編集済
  CUDA 7.0 と cuDNN 3.0 を使っていたGTX 980を
CUDA 7.5 と cuDNN 5.0 にバージョンアップしました。

1回の予測にかかる時間がFilter256, 128、どちらでもほぼ2倍近く速くなっています。

                  CUDA7.0+cuDNN3.0     CUDA7.5+cuDNN5.0
Filter256 Layer12     5.37ms                2.80ms
Filter128 Layer12     3.06ms                1.51ms
Filter 32 Layer11     0.98ms                0.60ms
(すべて19路、minibatch=1)

Filter256の構成は下で、3x3のFilterが10層と多いです。全Convolutionです。
256 5x5 x1, 256 3x3 x10, 1 3x3 x1
Filter128は256が128に減っただけです。
cuDNN 5.0 では3x3の計算が高速化されたそうで、それが効いているのかもしれません。

学習時間はほぼ似た構成のFilter128、L14の学習でminibatch128,100回が
25秒から16秒、と1.5倍速くなっています。

バージョンアップはかなり苦労したのですが、多分最終的には
CUDAを deb(network) からインストール、Caffeを再インストールしなおして
うまく動きました。
cuda_7.5.18_linux.run からインストールはうまくいきませんでした。

https://developer.nvidia.com/cuda-downloads
から deb (network) を選び
$ sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda
再起動
 

Re: AyaZBotについて (idle.sh)

 投稿者:山下  投稿日:2016年 8月19日(金)22時35分26秒
  reniceで最低の19に設定はしているのですがGPUを使うcaffeが
GPUの負担もほとんど0にしてくれるのかよく分からなかったです。
止めてるほうが安心、というのはあります。
(それでもGPU内でメモリ消費してるのが影響しないか、とかよく分かっていません)
 

Re: AyaZBotについて (idle.sh)

 投稿者:内巻  投稿日:2016年 8月19日(金)17時08分41秒
  わざわざ監視して切り替えなくても、nice/renice コマンドでプロセスの
優先度を低くしておけば、OSが自動的に遊休リソースを割り当ててくれる
と思うのですが、それではダメということですかね…。
SIGCONT/STOP ではなくプロセス自体を起動・終了させる必要がある場合なら、
自前で監視しないといけませんが。
 

(無題)

 投稿者:黒猫9  投稿日:2016年 8月19日(金)12時47分26秒
  AyaZBotは随分強くなったんですね
13路とはいえプロに勝つこともあるのはほんとに驚きです
残念ながら勉強不足でディープラーニングのことはさっぱり分かりませんが
 

(無題)

 投稿者:黒猫9  投稿日:2016年 8月19日(金)12時17分6秒
  ggさん、山下さん回答ありがとうございます。
山下さんの囲碁講習会のプログラムを見ると、プレイアウト時には自分の目に打たないので、自分の目には打たないものだと思い込んでいました。
 

Re: AyaZBotについて

 投稿者:山下  投稿日:2016年 8月19日(金)12時03分5秒
編集済
  深夜とかは対戦が組まれずにCPUとGPUが遊んでいることが多いので
下のようなシェルスクリプトを組んで、空き時間はCaffeの学習と自己対戦が
走るようになっています。
AyaZBotが12スレッドを使うのを10秒おきにチェックして他のプロセスを止めたり動かしたりしています。

$ ./idle.sh 23558 12574 12567 12571 12569 18342 29612
1min=7.23 , 7, (stop=8), 1min=7.23,  5min=6.72,  15min=6.82
cpu is idle. running 23558 12574 12567 12571 12569 18342 29612
1min=8.07 , 8, (stop=8), 1min=8.07,  5min=6.91,  15min=6.88
cpu is BUSY! stop 23558 12574 12567 12571 12569 18342 29612
1min=8.37 , 8, (stop=8), 1min=8.37,  5min=7.01,  15min=6.91
cpu is BUSY! stop 23558 12574 12567 12571 12569 18342 29612
1min=8.78 , 8, (stop=8), 1min=8.78,  5min=7.14,  15min=6.96

#!/bin/bash
while true ; do

up=`uptime | sed s/'.*load'/'load'/g`
w0=`echo $up | awk '{print $3}'`
w1=`echo $up | awk '{print $4}'`
w2=`echo $up | awk '{print $5}'`
w=`echo $w0 | tr "," " "`
wi=${w%.*}

pn=`expr $# + 1`
if [ $pn -eq 1 ]; then
  echo "one process is needed at least."
  exit
fi

echo "1min=$w, $wi, (stop=$pn), 1min=$w0  5min=$w1  15min=$w2"
if [ $wi -lt $pn ]; then
  echo -n "cpu is idle. running "
  sig="SIGCONT"
else
  echo -n "cpu is BUSY! stop "
  sig="SIGSTOP"
fi

num=1
while [ $num -le $# ] ; do
  eval pid=\$\{$num\}
  kill -s "${sig}" "${pid}"
  echo -n "$pid "
  num=`expr $num + 1`
done
echo ""

sleep 10s
done
 

AyaZBotについて

 投稿者:山下  投稿日:2016年 8月19日(金)11時47分17秒
編集済
  囲碁クエストの13路で1週間前から動かしているAyaZBotですが
自己対戦だとPolicy Networkで+400、Value Networkで+150強くなったものです。
マシンはW3680 3.3GHz 6コア + GTX 980、で12スレッドで動かしています。
AyaXBotはルートノードだけ1回Policyを呼んで1万playout/1手、で
AyaZBotは約30万playout/1手でPolicyが4000回、Valueが6000回呼ばれます。

レートは±50ぐらいは簡単に変動するのですが現在の値だと

AyaXBot 以前     ディープラーニング後
9x9     2248      2344
13x13   2243      2403

AyaZBot
9x9     2466      ----
13x13   2361      2725

AyaXBotは9路で+100、13路で+150、AyaZBotは+360ほど強くなっています。
AyaZBotの自己対戦での上昇は+550なので、200ほど小さいです。

Policy NetworkはFilter128、Layer12で作った19路用の学習データをそのまま使っています。
Policyだけを使った場合、19路だと+600、13路で、+400、9路で+300ほど上がります。
(全ノードでPolicyを適用)
GoGoDの7万8000局の棋譜から1500万局面、それを8回転させて1億2千万局面から
学習させています。一致率は51%で1台のGTX 980で1ヶ月ほどかかりました。

13路のValueNetworkは(500playout+ルートノードだけPolicy1回)の自己対戦で100万局
させた棋譜から、1つの棋譜から16局面を取り出して約1600万局面で作成しています。
16局面は8対称に回転させています。1番目と9番目は同じ回転です。

Filterは32、Layerは11です。2月の時はAyaのplayoutの結果(500playoutして勝率63%、
なら0.63)を使っていたのですが、自己対戦の対局の結果をそのまま使った方が
強かったです。つまり16局面すべてに同じ値が設定されます。
このままだと初期局面は勝ち+1、と負け-1が50%で出現して誤差が大きいです。
ただ、80手目終了の最終結果が勝ち(+1)で40手目の局面を半分の(+0.5)にする直線近似をした場合、
誤差は下がるのですが、学習後の強さはほとんど変わりませんでした。
さらに直線でなく、二次関数で近似するとはっきり弱くなります。playoutの結果を使った場合も
はっきり弱いです。

13路のValueNetはコミは7.5で作ったので囲碁クエストのコミ7.0では少し性能が
悪くなっているかもしれません。
囲碁クエストで動いているAyaZBotは今月のKGS大会に参加したのと同じ構成で20コア+GTX 960の
Zenに3勝5敗でした。
http://www.weddslist.com/kgs/past/125/index.html
AyaZBot
http://wars.fm/go13?lang=ja#user/:ayazbot
 

Re: AyaZBotの不可解な手

 投稿者:山下  投稿日:2016年 8月19日(金)11時00分34秒
  加藤さんのご指摘の通り、どこに打っても勝ちなので打っています。
Ayaは勝敗がほぼ確定したあとの着手があまりきれいではないです。
 

/215