囲碁アプリ「詰碁の森」開発秘話
どーもこんにちは!
今回は、僕が作った囲碁アプリ「詰碁の森」の開発の裏話などをしていきたいと思います!
- いつからアプリ開発を始めましたか?
2016年7月のある日、知り合いに「囲碁のアプリ作ってよ」と軽いノリで言われ、開発経験ゼロにも関わらず、なぜか根拠の無い自信を持ち「わかった!面白そうだしつくる!」と軽いノリでJavaプログラミングの勉強をスタートしました。
今思えば、よくそれだけで始めたなと思います(笑)
- 詰碁の森の開発費や開発期間はどのくらいかかりましたか?
詰碁の森は開発費がほとんどかかっていません。
かかった費用はプログラミング学習に使った書籍やオンラインサービスくらいですね。
開発期間は、プログラミングの勉強を始めてからストアへのリリースまで11か月でした。
ただ、バイトしながら平日は8時間、休日に至っては10時間もの時間を開発に費やしていたので、濃度が高い11か月だったのではないかなと思っています。
2017年6月7日(水)にandroid囲碁アプリ「詰碁の森」をリリースしました!https://t.co/k48QVmkuyz
— 欧米か@囲碁スタ開発者 (@oubeika11) June 7, 2017
- 詰碁の森は結構ダウンロードされてるようですが、どんな工夫をしましたか?
まずは毎日詰碁ですね。ログインボーナスのような感覚で毎日継続してアプリを起動してもらうのが狙いでした。
次に、ASO(検索表示順位を上げる施策)を頑張ったのが効果絶大。
アプリストアの検索表示順位が上がったことでアプリを見てもらえる機会が増え、次第にDL数が増えていきました。
そして、最も効果あったのが入門詰碁の追加。
入門詰碁には、ただ石を取るだけの問題を30問入れてみましたが、これが囲碁初心者にかなりウケたようです。
囲碁に限らず、強くなるにつれて始めたの頃の感覚を忘れてしまいがちですが、初心に戻る大切さを痛感しました。
- 詰碁の森の今後の展望を聞かせてください
詰碁の森は、今後のアップデートにて問題追加、検討機能追加などを予定しています。
詰碁の森とのコラボ企画なんかもできるといいなーと考えてます(そういうお話いただけると嬉しいです!)
以上!
Google DeepMind社が公開したOpenSpielって何?
- OpenSpielとは?
OpenSpiel is a collection of environments and algorithms for research in general reinforcement learning and search/planning in games.
OpenSpiel公式GitHubより引用
ゲームの強化学習に利用可能なアルゴリズムをまとめて公開したよ、といったところでしょうか。
- どんなゲームのアルゴリズムがあるの?
このプロジェクトを公開したのは、AlphaGo / AlphaZeroで世界中に大きな衝撃を与えたデミス・ハサビス氏がCEOを務めるGoogle DeepMind社です。
囲碁、チェス、バックギャモン、ポーカーなど、主にボードゲームのアルゴリズムが数十種類含まれています。
- これ使えばAlpha(Go)Zero作れるじゃん!
残念ながら、現時点(2019/09/13現在)で強化学習用プログラムは公開されておらず、アルゴリズムのみとなっています。
※「強化学習用プログラムは無いから誰か作ってプルリクエスト送ってね」と公式GitHubに明記されてる。
僕もそう思ってウッキウキでOpenSpiel環境を構築したのは秘密
- アルゴリズムだけでどうすりゃいいってんだ!
DeepMindのアルゴリズムはとてもシンプルで分かりやすいです。
ソースコードを読んでアルゴリズムの勉強をするもよし。
手元に強化学習プログラムがあるなら、そこにOpenSpielのアルゴリズムを取り入れることで飛躍的に実行速度が上がるのではないでしょうか。
OpenSpielはアルゴリズムの宝庫です。
とても勉強になるので、ぜひとも多くの人に活用していってもらいたいですね!
戦闘狂囲碁格言
どーもこんにちは!ブログ継続記録を更新しました!(4日目)
今回は、(自称)戦闘狂の僕が生み出した戦闘狂囲碁格言を紹介していきたいと思います!
-
戦闘狂囲碁格言
- 取ろう取ろうは取れるの元
- 実利は投げ捨てろ
- 99目勝ちは実質負け
- ヨセまで行くな
- 石取って地作れ
- 石は取れるまで追いかけろ
- 弱い石には旅をさせよ
- 獲物は逃すな
- 隙あらば取れ
- やられる前にやれ
我ながら物騒な格言...!!
それでは、1つ1つ意味を解説していきます(ネタを解説するようで少し恥ずかしい。。。)
1. 取ろう取ろうは取れるの元
(大石を)取ろうとしなければ決して取れない。取ることを意識して初めて、石取りのスタートラインに立つことが出来る。
2. 実利は投げ捨てろ
相手の石への攻めが消えるくらいなら目先の確定地は投げ捨てろ。
3. 99目勝ちは実質負け
100目以上勝つくらいの勢いで攻めよ。半目教の人とは分かり合えない。
4. ヨセまで行くな
ヨセに入るまでに石を取りまくれ。ヨセに持ち込まれると大抵負ける。
5. 石取って地作れ
僕の陣地は僕のもの。相手の石も僕のもの。
6. 石は取れるまで追いかけろ
絶対に逃がさない.....マテ...マテ...
7. 弱い石には旅をさせよ
弱い石は外に逃がして大きくなってから美味しくいただく。
8. 獲物は逃すな
の が れ ら れ な い
9. 隙あらば取れ
相手が隙を見せたとき、それは死を意味する。
10. やられる前にやれ
攻撃は最大の防御
ハライチのコントみたいになっちゃったよ!
どーもーありがとうございましたー!
機械学習環境をGCPで構築する方法
- 必要なもの
・Google Chrome 最新版
・Googleアカウント
・クレジットカード
- 作ったインスタンスの構成
OS: Ubuntu 16.04 LTS 永続ディスク100GB + Cloud Storageのバケット
CPU: custom(vCPU x 12、メモリ 78 GB)
GPU: NVIDIA Tesla V100 ×1
ゾーン: asia-east1-c
CUDA: 10.1
cuDNN: 7.6.3
- GCEでGPUを利用するために割り当て申請する(参考ページ)
ひとことメモ:「GPUS_ALL_REGIONS」の割り当てが0になっている場合、そちらも1以上に増やして、割り当て申請する必要があります。
- GPU割り当て申請を完了させる
割り当て申請したあとに以下のような英語のメールが届くかと思います(先払いしてくださいメールが来なければ料金を先払いする手順は不要)
Make a payment of $140 US Dollars or the same amount in your currency
following the instructions linked below [1] and reply to this message when the
charge clears. Your payment will be applied to any charges you incur in the future
and will be visible as a credit in your account.
要するに「140ドル(金額は条件次第で違うっぽい?)を先払いしないと割り当てしませんよ」ということらしい。
料金先払いで不正利用じゃないことを証明してくださいってことだと思います(たぶん)
・料金を先払いする手順
- Google Cloud Platformからお支払い画面を開く
- 請求先アカウントを登録してなかったら登録する(クレカ必須)
- 登録できたらお支払い画面の「お支払いの概要」タブを開く
- 「早期払い」ボタンから指定された金額以上($140だったら余裕を持って16000円以上入れるといいかも)
- ひたすら割り当て完了メールが来るのを待つ
- 割り当てされましたメールが届く
- テンション上がる(^ω^ ≡ ^ω^)
- GPUが割り当てされた後、GCEのVMインスタンス画面からGPUインスタンスを作成する
- 名前 ⇒ 任意
- ゾーン ⇒ asia-east1-c
※1 使いたいGPUに対応してるゾーンを選択する必要があります
※2 GPU対応ゾーン一覧表: https://cloud.google.com/compute/docs/gpus/?hl=ja&_ga=2.186643945.-1732709063.1508124456#gpus-list
- マシンタイプ ⇒ 必要に応じて選択(例:custom vCPU x 12、メモリ 78 GB)
- GPU種別 ⇒ NVIDIA Tesla V100(予算と相談の上、GPUを選択してください)
- GPU個数 ⇒ 1個
- ブートディスク ⇒ 必要に応じて選択(例:Ubuntu 16.04 LTS)
- ディスクサイズ(GB) ⇒ 必要に応じて増減(例:永続ディスク100GB)
- ID と API へのアクセス ⇒ すべての Cloud API に完全アクセス権を許可を選択
- ファイアウォール ⇒ HTTP トラフィックを許可する、HTTPS トラフィックを許可するの両方にチェック
- プリエンプティブ ⇒ オンにする(任意)
※オンにすると利用料金は大幅に抑えることができますが、途中でインスタンスがシャットダウンされるリスクが伴います。
- 管理、ディスク、ネットワーク、SSH 認証鍵 ⇒
管理タブ⇒自動化⇒起動スクリプトに以下の内容を入力(Ubuntu 16.04 LTSの場合)
#!/bin/bash
echo "Checking for CUDA and installing."
# Check for CUDA and try to install.
if ! dpkg-query -W cuda-10-1; then
# The 16.04 installer works with 16.10.
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-ubuntu1604.pin
sudo mv cuda-ubuntu1604.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget http://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda-repo-ubuntu1604-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1604-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-10-1-local-10.1.243-418.87.00/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda
fi
# Enable persistence mode
nvidia-smi -pm 1
- Google Cloud Storageにバケットを作成する(参考ページ)
・ローカルPCとインスタンスとの間でデータのやり取りを行いたいときは、Google Cloud Storage経由で行う。
・メニューから[Storage]⇒[ブラウザ]を選択
・バケットがなければ作成。Multi-Regionalで場所はどこでもOK!
・バケットを選択するとファイル一覧が見ることができる。ファイル名をクリックするとダウンロード可能。
- GCEのVMインスタンス画面から作成したインスタンスにSSH接続する
SSHボタンを押すと別ウィンドウでインスタンスのコンソール画面を開いてくれる(作業しやすい)
- GPU関連のドライバが入ってるか確認(なんかたくさん出力されたら入ってる)
dpkg -l | grep nvidia
dpkg -l | grep cuda
ドライバが入ってなければ、インスタンスを停止してからもう一度開始を押す。
※それでもダメだったらインスタンス作成からやり直す。
- GPUを高速化するcuDNNを導入
echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64 /" | sudo tee /etc/apt/sources.list.d/nvidia-ml.list
sudo apt update
sudo apt install libcudnn7-dev=7.6.3.30-1+cuda10.1
Do you want to continue? [Y/n] と表示されたら y と入力してエンター
- .bashrcでCUDAのPATH設定を行う
export PATH="/usr/local/cuda-10.1/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-10.1/lib64:$LD_LIBRARY_PATH"
source ~/.bashrc
- Anaconda環境のインストール(このバージョンが古ければ公式サイトから最新版を入れてください)
wget https://repo.anaconda.com/archive/Anaconda3-2019.07-Linux-x86_64.sh
bash Anaconda3-2019.07-Linux-x86_64.sh
- Anacondaインストーラー実行後の操作手順
- ライセンスの表示をしますか?と聞かれるので yes を入力してエンター
- 長文のライセンスが表示されるのでエンター or スペースキーでスキップ
- ライセンスへの同意を求められるので yes を入力してエンター
- Anacondaをどこのディレクトリにインストールするか指定してエンター(何も入力しなくてもOK)
- PATHに追加するか(.bashrcに追記するか)聞かれるので yes を入力してエンター
- 追加したPATHを反映
source ~/.bashrc
- PATH(環境変数)にanaconda3のディレクトリパスが登録されていなければ登録する
・PATHの一覧を表示して確認
echo $PATH
※出力されたPATHの一覧に /home/<Gmailアドレス>/anaconda3/bin があればPATHの登録は不要
・PATHを登録する
export PATH="/home/<Gmailアドレス>/anaconda3/bin:$PATH"
echo $PATH
source ~/.bashrc
※Gmailアドレスのところには、「@」や「.」などの記号をアンダーバー「_」に置き換えたものを入力する
例: tekitou1515@gmail.com -> tekitou1515_gmail_com
- Anacondaバージョン確認
conda -V
※バージョンが表示されなかったらPATHがしっかり設定できてない可能性が高い(インスタンス再起動推奨)
- 仮想環境作成
conda create -n py36 python=3.6
※Proceed ([y]/n)? と表示されたら y と入力してエンター
conda activate py36
- これは必要に応じてインストール(zipファイルを扱えるようになるので入れておくと便利)
sudo apt-get install zip unzip
- おまけ
[インスタンス⇔Cloud Storage(GCS)バケット間のファイル転送コマンド]
- BUCKET_NAME変数を定義
export BUCKET_NAME=<プロジェクト名>
※プロジェクト名はインスタンスの名前ではありません。
- ファイルをインスタンスからCloud Storageへコピー
gsutil cp -r <インスタンス側のファイルパス> gs://$BUCKET_NAME/<GCS側のフォルダパス>
例:gsutil cp -r ~/igo_ai/models/igo_model-1.txt gs://$BUCKET_NAME/igo_ai/models/v1
- ファイルをCloud Storageからインスタンスへコピー
gsutil cp -r gs://$BUCKET_NAME/<GCS側のファイルパス> <インスタンス側のフォルダパス>
例:gsutil cp -r gs://$BUCKET_NAME/igo_ai/models/v1/igo_model-1.txt ~/igo_ai/models
APIの有効化とかバケットのファイル権限とか、まだまだつまづくポイントはあるけど大体こんな感じ。
戦闘狂囲碁AI「BSK」誕生秘話
どーもこんにちは!これでブログ継続2日目!快挙!
今回は、普段開発している囲碁AI「BSK」について紹介したいと思います。
囲碁AIは有名どころだとGoogle DeepMindのAlphaGoやTencentの絶芸、ベルギーのLeelaZeroなどがありますよね。
そして、BSKはLeelaZeroの枠組みを利用させてもらっています。
先人の知恵を活用しているわけですね!(LeelaZero開発チームの皆さんに感謝!)
- BSKの特徴を教えてください
まず、BSKは普通の囲碁AIでは無いです。
何が普通では無いのかというと、、、
自分の棋譜データ約4700局しか学習させていない!
強い囲碁AIは何百万局にも及ぶ棋譜を学習させているので、いかにサンプル数が少ないかが分かりますね。
- いつからBSKの開発を始めたんですか?
囲碁AIは去年4月(2018年4月)に作り始めたんですが、始めた理由が「(自称)戦闘狂である僕のクローン囲碁AIを作りたい!」だそうです(他人事)
当初は、ちょっとアプリが作れるくらいの技術があったくらいで、機械学習のことは全く分かりませんでした(※)
自分のクローン囲碁AIを作るという囲碁キチ的発想から、戦闘狂囲碁AI「BSK」は誕生したのです。
※最初はcdコマンド(change directory)が何を意味するのかすら分からないレベルでした。
- どんな内容の碁を打つのか見せて!
昨日、野狐囲碁7段の知り合いにBSKと打ってもらったときのワンシーン。
黒:BSK
白:相手(7段)
白の中央手抜きに、すかさず黒のBSKが中央白一団を取りにいきます(いいぞ!)
よし!右下の黒1子を繋げば白全滅だ!(いいぞいいぞ!)
えぇ・・・
どうやら探索の対象となる石が大きくなりすぎると黒1子を繋いで白の一団を取れるといったカンタンなことも分からなくなるようですね。
ここでBSKの弱点が出てしまい白が生還。
この後、BSKは投了しました。
しかし、戦闘的な棋風になっていることは間違いないので、このまま強化していきたいと思います。
- 最後に
BSKって何の略?とよく聞かれるんですが、Berserker(バーサーカー)の略です。
ビスケでもブレイクストーンキラーでもありません。バーサーカーです!!!
絶対に僕の実力(野狐6~9段)を超えさせてみせます。ご期待ください!