1. 程式人生 > 其它 >AlphaGo Zero程式碼遲遲不開源,TF等不及自己推了一個

AlphaGo Zero程式碼遲遲不開源,TF等不及自己推了一個

Root 編譯自GitHub 量子位 出品 | 公眾號 QbitAI

TensorFlow官方在GitHub上推了一個AlphaGo Zero的開原始碼!

這個叫做Minigo的圍棋AI引擎,是一個使用Python語言、在TensorFlow框架實現的基於神經網路的圍棋演算法。

這個專案確實是受到DeepMind的AlphaGo演算法的啟發,但TensorFlow官方再三強調這個專案不屬於DeepMind,也不是官方正式的AlphaGo專案

不是行貨!不是行貨!不是行貨!

重要的事情說三遍!

DeepMind遲遲不開源AlphaGo程式碼,看來Google自己人也等不及了。

以下內容搬運自TensorFlow的GitHub專案網頁。

Minigo其實基於Brian Lee此前釋出的MuGo。

MuGo是依據首篇AlphaGo論文Mastering the Game of Go with Deep Neural Networks and Tree Search用Python復現的結果。

Minigo裡所新增的引數,以及所做的架構調整是參考AlphaGo Zero的論文Mastering the Game of Go without Human Knowledge

最近,這個經調整的架構已經擴充套件運用到了國際象棋和將棋的論文Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm

中了。

這些論文的工作都會在Minigo中用AG(AlphaGo),AGZ(AlphaGo Zero),AZ(AlphaZero)縮寫表示。

這個專案的目標

  • 提供一套清晰的學習樣板,能夠運用TensorFlow、Kubernetes及谷歌雲平臺來建立硬體加速器上的增強學習的流程。
  • 儘可能還原重現原始DeepMind AlphaGo論文中的方法,通過開源的流程工具及開源的實現。
  • 把我們的資料,結果,發現都公開出來,讓圍棋,機器學習,Kubernetes社群獲益。

這個專案還有一個明確但不是目標的願景,就是做出來一個具有競爭力的圍棋專案,甚至能成為頂級的圍棋演算法。

我們致力於做一個可讀的、可理解的操作手冊,能夠對圈子裡的人有幫助,即使這麼做意味著我們操作起來效率和速度上會受到影響。

儘管最後的結果是會做出來一個強大的模型,但是我們是更看重和享受其中的過程:)

我們希望這個專案,對於感興趣的開發者來說,可以通過容易理解的python程式碼平臺觸及到強大的圍棋模型,來擴充套件,適配更多的專案任務。

如果你想知道我們是怎麼訓練這個模型的,請看RESULTS.md

也想加入我們看看能幫忙做些什麼的話,請參考CONTRIBUTING.md

發車!

想做這個專案,你需要有以下的:

1.virtualenv / virtualenvwrapper

2.Python 3.5+ 3.Docker 4.Cloud SDK

搭便車指南(Hitchhiker’s guide)是非常棒的python開發及虛擬環境使用的入門資料。往後的指導沒有一個不是在非虛擬環境下測試的。

pip3 install virtualenv pip3 install virtualenvwrapper

安裝TensorFlow

首先建立一個新的虛擬環境,進去之後,開始安裝TensorFlow和依賴工具:

pip3 install -r requirements-gpu.txt

當你要用GPU的時候,開啟requirements-gpu.txt這個檔案。一定要安裝CUDA 8.0。具體看TensorFlow 那堆文件。

如果你不用GPU跑,或者你沒有,那麼你搞個較早的版本:

pip3 uninstall tensorflow-gpu pip3 install tensorflow

或者安裝CPU要求:

pip3 install -r requirements-cpu.txt

建立一個環境

你可能需要用到一個雲來存資源,如果是醬安裝:

PROJECT=foo-project

然後,執行

source cluster/common.sh

這樣可以設定其他環境可變的預設引數。

執行單元測試

BOARD_SIZE=9 python3 -m unittest discover tests

基礎條件(basic )

所有請求必須相容谷歌雲盤(作為遠端檔案系統),或者你本地的檔案系統。這裡舉得例子是用谷歌雲,你要用本地檔案路徑是一樣OK噠。

用谷歌雲的伐呢,就要設定BUCKET_NAME引數,然後驗證登入谷歌雲。不然的話,所有的請求都會被擱置。

比如說,設定一個桶,驗證,然後查詢一個最近的模型。

export BUCKET_NAME=your_bucket; gcloud auth application-default login gsutil ls gs://minigo/models | tail -3

看起來是醬紫的:

gs:/BUCKET_NAME/models/000193-trusty.index gs://$BUCKET_NAME/models/000193-trusty.meta

這三個檔案共同組成這個模型。而一個模型所需的指令需要一個路徑傳遞給模型的basename。比如說,gs://$BUCKET_NAME/models/000193-trusty

你需要把這個複製到你的本地盤上。這一節(fragment)把最近的模型拷貝到目錄下的MINIGO_MODELS。

MINIGO_MODELS=$HOME/minigo-models mkdir -p $MINIGO_MODELS gsutil ls gs://minigo/models | tail -3 | xargs -I{} gsutil cp “{}” $MINIGO_MODELS

先讓Minigo自己玩

看Minigo開一局,你需要specify模型。下面是個用最新模型在你桶裡執行的例子。

python rl_loop.py selfplay —readouts=$READOUTS -v 2

READOUTS那部分指的是,每一步需要做幾次搜尋。每一步的時間資訊和資料都會打印出來。把速度設定到3或更高,會把每一步都列印在板上。

再虐Minigo

Minigo用的是GTP協議,你可以使用任何的符合GTP協議的專案。

# Latest model should look like: /path/to/models/000123-something LATEST_MODEL=$(ls -d $MINIGO_MODELS/* | tail -1 | cut -f 1 -d ‘.’) BOARD_SIZE=19 python3 main.py gtp -l $LATEST_MODEL -r $READOUTS -v 3

(如果沒有模型的話,那它會隨機設個初始值)

在載入了幾個資訊之後,它會提示GTP引擎已經準備好,也就是說這一刻它可以接受指令。GTP的小抄(cheatsheet):

genmove [color] # Asks the engine to generate a move for a side play [color] [coordinate] # Tells the engine that a move should be played for color at coordinate showboard # Asks the engine to print the board.

拿GTP來玩的一個辦法是用gogui-display(含相容 GTP 的 UI)。

你可以在http://gogui.sourceforge.net/下載gogui工具。

看使用GTP的幾個好玩的方法。

gogui-twogtp -black ‘python3 main.py gtp -l gs://$BUCKET_NAME/models/000000-bootstrap’ -white ‘gogui-display’ -size 19 -komi 7.5 -verbose -auto

另外一個辦法呢,就是看Minigo和GnuGo互毆。

BLACK=”gnugo —mode gtp” WHITE=”python3 main.py gtp -l path/to/model” TWOGTP=”gogui-twogtp -black ”WHITE” -games 10 -size 19 -alternate -sgffile gnugo” gogui -size 19 -program “$TWOGTP” -computer-both -auto

訓練Minigo

概述

接下來呢,跟著這一串的指令做,你能得到增強學習在9x9圍棋上的迭代。這些很基礎的指令都是用來建前面提到的模型的。

這些指令是:

  • bootstrap:初始化模型;
  • 自我博弈:用最新版的模型自我對弈下棋,產生可用來訓練的資料;
  • 收集:把同一個模型產生的資料檔案匯入到訓練資料中;
  • 訓練:用N代自我對弈產生的結果訓練一個新模型。

Bootstrap

這一步的指令是建立模型,放在gs://MODEL_NAME(.index|.meta|.data-00000-of-00001)

export MODEL_NAME=000000-bootstrap python3 main.py bootstrap gs://MODEL_NAME

自我對弈

這步指令是輸出原始對戰資料,能夠相容TensorFlow格式以及目錄下的SGF。

gs://MODEL_NAME/local_worker/.tfrecord.zz gs://MODEL_NAME/local_worker/.sgf
python3 main.py selfplay gs://MODEL_NAME —readouts 10 -v 3 —output-dir=gs:/MODEL_NAME/local_worker —output-sgf=gs://MODEL_NAME/local_worker

蒐集

python3 main.py gather

這指令是把(可能只有幾KB大小的)tfrecord.zz檔案打亂重組成不到100MB的tfrecord.zz檔案。

根據模型的編號來蒐集資料,這樣同一個模型產生的資料就會放在一起。預設情況下,目錄裡的檔名,rl_loop.py之前後加個環境引數BUCKET_NAME的字首。

gs://MODEL_NAME-{chunk_number}.tfrecord.zz

gs://$BUCKET_NAME/data/training_chunks/meta.txt 檔案是用來檢視目前是在處理哪個遊戲。

python3 main.py gather —input-directory=gs:/BUCKET_NAME/data/training_chunks

訓練

這步指令刨出最新的50個模型的訓練,以及參考最新的模型權重來訓練新的模型。

執行訓練任務:

python3 main.py train gs://BUCKET_NAME/models/000001-somename —load-file=gs://$BUCKET_NAME/models/000000-bootstrap —generation-num=1 —logdir=path/to/tensorboard/logs

已經更新的模型權重會被儲存下來。

(要做的事兒:搞幾個本地的基於global_step的檢查點兒,醬回頭可以任性地恢復)

另外,你可以一步步跟著TensorBoard訓練的指南。如果你給每次執行都不同的名字的話,比方說,logs/my_training_run, logs/my_training_run2,你可以覆蓋掉之前的資料。

tensorboard —logdir=path/to/tensorboard/logs/

在Kubernetes Cluster上執行Minigo啦

自個兒去cluster/README.md看!

最後,附開原始碼地址, https://github.com/tensorflow/minigo