Leela Zero を GCE で動かす 〜 その１  Google Compute Engine 設定編

Google Compute Engine の高速な GPU を利用して、` Leela Zero/Lizzie を快適に使う方法の手順書です。

* **その１ Google Compute Engine 設定編**
* [その２ Leela Zero インストール編](https://qiita.com/miuraken/items/0f9003e0161f8921ef61)
* [その３ Lizzie 導入編（Mac/Linux対応版）](https://qiita.com/miuraken/items/118636854a96577cdbc4) / [Lizzie 導入編（Windows 10 対応版）](https://qiita.com/miuraken/items/a910675ef173854dc1ad)



※ 執筆時点（2018年11月）の Leela Zero のバージョンは 0.16, Lizzie のバージョンは 0.6 です。

# はじめに
Google のデータセンターの計算能力を様々な形でいろいろ利用できるようにした Google Cloud Platform (GCP) という製品群があります。その中のひとつである [Google Compute Engine](https://cloud.google.com/compute/?hl=ja) (GCE) を用いて、[AlphaGO Zero](https://deepmind.com/blog/alphago-zero-learning-scratch/) クローンの一つである [Leela Zero](http://zero.sjeng.org/home) を動かすための手順を記します。なるべく多くの人が 囲碁 AI を扱えるように願い、Linux やクラウドの経験があまりない人向けに書いてみたいと思います。

このエントリと同じような目的で、[Leela Zero の README](https://github.com/gcp/leela-zero/blob/master/README.md) からリンクが貼られている [Running Leela Zero client on a Tesla V100 GPU for free (Google Cloud Free Trial, Microsoft Azure, Oracle cloud, etc)](https://docs.google.com/document/d/1P_c-RbeLKjv1umc4rMEgvIVrUUZSeY0WAtYHjaxjD64/edit?usp=sharing) というドキュメントもあります。こちらもよく書けていて、アップデートもされていますが、クラウド上で Leela Zero を動かすことまでにフォーカスをおいていて、Lizzie などの GUI クライアントに関する記述は執筆時点では見当たりません。
当エントリは、手元の Lizzie から、GCE の計算リソースを使って、囲碁を研究できる環境の構築方法を日本語で提供することを目的として書かれています。

# GCP/GCE とは

Google は自社のデータセンター上のコンピュータやストレージ、機械学習技術などの計算資源を、主に有料のサービスとして外部に提供しています。これにより、Google のサービスで使われているものと同じデータセンター上のコンピューターやテクノロジーを第三者が使用することが可能になっています。[Google Cloud Platform (GCP)](https://cloud.google.com/?hl=ja) は、そういうサービスの総称です。

GCP の製品群のひとつで、データセンター上のコンピューターを１台から数百台、「仮想マシン」として借りて使えるサービスが [Google Compute Engine (GCE)](https://cloud.google.com/compute/?hl=ja) です。GCE では高性能な CPU やメモリー環境だけでなく、[Tesla V100](https://www.nvidia.com/ja-jp/data-center/tesla-v100/) などのかなり高速な GPU を使うことができます。そのため、Leela Zero のような大量の計算を必要とする機械学習系のプログラムを走らせることにも適しています。

Leela Zero の推論の部分を GCE に行わせることで、GPU を積んだパソコンを手元でブンブン走らせなくても、普通のノートパソコンから勝率の表示や有力手の探索を行うことが可能になります。


GCE は有料のサービスですが、はじめて利用する場合には、[12ヶ月で 300 ドル分、無料で使うことができます](https://cloud.google.com/free/?hl=ja) （2018 年 11 月現在）。課金が発生しない範囲でも、十分に Leela Zero を動かして試すことができます。

ここの手順で紹介する最小限の構成だと、１時間あたり約 0.18 ドルなので、365 日で割ると、毎日４時間程度は無料枠内で走らせられる計算になります。

# 必要なもの

* お手元のPC (Mac, Linux, または Windows)
    * ここでは Mac を使って実証しています。現時点では、Windows での使い方には触れていません。
* Google アカウント
* クレジットカード（無料枠内の範囲なら課金されません）
* コマンドラインや Linux に関する多少の知識

#GCP プロジェクトの作成

https://console.developers.google.com/ から、Google Cloud Platform (GCP) の、新規プロジェクトを作ります。 （この「GCP プロジェクトの作成」の作業は１度だけで構いません。一つのプロジェクトの下に複数のVMインスタンスを作成できます。）

Google Compute Engine は基本的に有料のサービスであるため、利用規約への同意に加えて、クレジットカードの登録が必要となります。$300 の無料枠も、ちゃっかり有効化しておきましょう。
<img width="792" alt="API_ダッシュボード_-_Google_API_コンソール.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/44cb8d37-ea6e-e226-2cd1-443115fe0289.png">

プロジェクト名は Leela-Zero にしました。
GCP においてプロジェクトは、プロジェクト ID （ここでは leela-zero-223718）で区別されるので、プロジェクト名は覚えやすい名前をつけて構いません。

<img width="638" alt="新しいプロジェクト_–_Google_API_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/02ee5ed3-b089-1e77-3750-2196fcbe3909.png">


プロジェクトが作成できたら、そのプロジェクトを選択した上で、ハンバーガーメニューから最下部の Google Cloud Platform を選びます。

<img width="266" alt="お知らせのユーザー設定_-_Leela-Zero_-_Google_API_コンソール.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/45720fd8-37f5-83c5-7403-463cea9d25ed.png">

Google Cloud Platform のコンソール画面に切り替わったら、Compute Engine を選択。
ここで英語のページになってしまった場合、URLの最後に &hl=ja　(または ?hl=ja) をつけてページを読み込み直すと日本語になります。（そして、$300 の無料枠を使えるようにプロジェクトのアップグレードも忘れずに。）

<img width="684" alt="ホーム_–_Leela-Zero_–_Google_Cloud_Platform.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/bcc86cf0-14d0-b732-6607-d099691eb4b3.png">


GPU を使うためには、無料枠の申請だけではなく、アカウントのアップグレードも必要です。

左上のナビゲーションメニューから、[「IAM と管理」> 「割り当て」](https://console.cloud.google.com/iam-admin/quotas)を選択します。
<img width="263" alt="IAM_と管理_-_Leela-Zero_-_Google_Cloud_Platform.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/c6b4f291-d958-5b70-8afd-f716bb73baf9.png">

そして、「アカウントのアップグレード」ボタンが現れている場合、それをクリックしてアップグレードの手続きを行います。
<img width="1389" alt="upgrade.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/d044f71b-c124-7520-d7c5-4e21b4861602.png">


#GCE VM インスタンスの作成


Compute Engine のタブが開いたら、メニューから「VM インスタンス」の設定画面に移ります。初回はここで Compute Engine の準備のため、多少時間がかかるかもしれません。

ここで出てくる 「VM」 とは Virtual Machine の略で、日本語では「仮想マシン」。物理的なマシンに対して、クラウド上で「仮想的」に扱えるマシンのことを指します。そして、「VM インスタンス」とは、具体的に CPU やメモリやディスクなどが与えられ、動かせる状態にある VM のことです。

VM インスタンス の「作成」が利用可能になったら、クリックします。

<img width="517" alt="Compute_Engine_-_My_First_Project_-_Google_Cloud_Platform.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/b2629a0f-9c4d-f922-bb16-f6d738e1defa.png">

VM インスタンス の作成で設定すべき箇所は以下のとおりです。

- **名前**：なんでもよいのですが、*leela-zero-1* としておくと、この一連の手順書に沿って作業がしやすくなります。
- **リージョン**: 後述
- **ゾーン**: 後述
- **マシンタイプ** （「カスタマイズ」をクリックすると、設定項目が出てきます。）
    - **GPU の数**：*1* （必要に応じて複数も）
    - **[GPU のタイプ](https://cloud.google.com/compute/docs/gpus/?hl=ja)**：*NVIDIA Tesla K80* とか。 [性能により、料金などに違いがあります。](https://cloud.google.com/compute/pricing?hl=ja#gpus)
- **ブートディスク**: 
    - オペレーションシステム：*Deep Learning on Linux* 
    - バージョン：*GPU Optimized Debian m○○* を選択。 
    - 不意に内容が消されないよう、 *標準の永続ディスク* を選びます。
- **可用性ポリシー > プリエンプティブ**: *オン*（「管理」をクリックすると、設定項目が出てきます。）

GPU はさらに計算能力の高い Tesla V100 を選択しても良いのですが、環境が安定して構築できるまでは料金単価の安い K80 で試すのが良いと思います。

選択した GPU によって、使えるリージョンとゾーンが決まります。

[GCE のドキュメント上のリスト](https://cloud.google.com/compute/docs/gpus/?hl=ja#gpus-list) を確認した上で、選択した GPU を利用できるリージョンを選択します。
ここでは GPU に NVIDIA Tesla K80 を選択しているので、asia-east1 (台湾) にある asia-east1-a を選びました。asia-east1-c を選ぶと、V100 を選べます。台湾を選んだのは、距離的に日本に近いため、ネットワークの遅延が比較的少ないことを期待できるからです。
（ゾーンとはデータセンターの名称、リージョンはデータセンターのある地域と思ってください。）

また、[プリエンプティブ](https://cloud.google.com/compute/docs/instances/preemptible?hl=ja) をオンにすることで、料金単価が大幅に下がり、24 時間以上のつけっぱなしを防止できます。ただし、使っている最中にマシンがいきなりシャットダウンされる可能性もあるので、そのような事態をどうしても避けたいならオフのままにしてください。

設定画面のスクリーンショットを載せておくので、参考にしてください。（最新のディスクのイメージ名は多少異なると思いますが、 少しスクロールダウンして、*Deep Learning Image: PyToach* から始まるものを選んでください。）

<img width="1394" alt="Untitled-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/fe1a9fdf-f5d6-32aa-e75f-7248ff52802b.png">

「作成」を押すと、設定にもとづいて VM インスタンスがつくられ、さっそく起動が始まります。
無事、VM インスタンスが起動すると、名前の隣に緑のチェックが入ります。
<img width="946" alt="Screenshot_2018_11_28_15_49.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/0d60a337-be2d-9eb1-f134-61d8e52ffa2b.png">

起動が失敗する場合は、おそらく GPU に応じたリージョンやゾーンを選んでいないか、GPU の数が割当制限に超えている可能性があります。

たとえば、以下のようなエラーは　プリエンプティブな V100 GPU の数が、asia-east1 リージョンでの割り当て上限である 1.0 を超えていますよ、というメッセージです。

<img width="328" alt="Screen Shot 2018-12-01 at 10.34.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/99d4ab20-0396-f2e2-c50c-b1fae6111545.png">

この制限に引っかかった場合は次のように割り当て上限の増加を申請します。
（審査には数時間、場合によっては数日間、かかります。）

##GPUの割り当て上限の申請

左上のナビゲーションメニューから、[「IAM と管理」> 「割り当て」](https://console.cloud.google.com/iam-admin/quotas)を選択します。
<img width="263" alt="IAM_と管理_-_Leela-Zero_-_Google_Cloud_Platform.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/c6b4f291-d958-5b70-8afd-f716bb73baf9.png">

次に「指標」のドロップダウンメニューを開き、いったん「なし」を選択して項目をクリアーにしてから、フィルターに「GPU」と入力します。GPU の一覧が出てくるので、使いたいGPUを選びます。今回の例だと、 K80 をプリエンプティブなインスタンスのみで使いたいので、「Preemptible NVIDIA K80 GPUs」を選択。

<img width="1284" alt="IAM_と管理_-_Leela-Zero_-_Google_Cloud_Platform-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/4d14c29b-61a6-038a-eb0f-5498742d8fa8.png">

ロケーション「east-asia1」の 「Preemptible NVIDIA K80 GPUs」を選択して、「割り当てを編集」。ダイアログで

- **新しい割り当て上限**: *1*
- **リクエストの説明**: *To run Leela Zero--AlphaGo Zero clone*

などと入れます。

「完了」を押してから、「リクエストを送信」します。

<img width="1284" alt="IAM_と管理_-_Leela-Zero_-_Google_Cloud_Platform.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/a3066d22-5b4a-3f82-9f1b-3cb8f74bb272.png">

同様に [「GPUS_ALL_REGIONS」 の割り当て](https://console.cloud.google.com/iam-admin/quotas?metric=GPUs%20(all%20regions)) が 0 になっている場合、そちらも 1 以上に増加して、GCE 全体で使える GPU の上限を申請します。（この項目が見つからない場合には、何もしなくても構いません。）


すぐに割り当て変更申請を受けたこと、審査を開始することの確認メールが送られてきます。
無事審査が通ると、数時間（から数日間後に割り当て上限が変更された通知がくるはずです。

割り当て上限が増えていれば、VM インスタンスを起動できるようになっているはずです。
（割り当て上限自体はさきほどの「IAM と管理」> 「割り当て」から確認できます。）

#VM インスタンスの起動
左上のナビゲーションメニューから、[「Compute Engine」> 「VM インスタンス」](https://console.cloud.google.com/compute/instances)を選択します。

<img width="274" alt="Compute_Engine_-_Leela-Zero_-_Google_Cloud_Platform.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/ee30fdaa-fc9e-8cf9-88ef-da9ee551979a.png">

軽く祈ってから、起動してみましょう。

<img width="643" alt="Screen_Shot_2018-12-01_at_11_02_32.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/2423a5da-1b75-6986-b418-72b7f99fd7f6.png">

しばらく待って...

<img width="946" alt="Screenshot_2018_11_28_15_49.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/0d60a337-be2d-9eb1-f134-61d8e52ffa2b.png">

緑のチェックがつき、VM インスタンスが起動することが確認できれば、GCE の設定は終了です。

[その２ Leela Zero インストール編](https://qiita.com/miuraken/items/0f9003e0161f8921ef61) へ続きます。

#課金についての留意点
無料枠があるとはいえ、接続しなくても VM インスタンスが起動している限り、使用料が積み上がります。使わないときは「停止」することをおすすめします。（とくにプリエンプティブを Off にした場合。）

<img width="472" alt="Compute_Engine_-_Leela-Zero_-_Google_Cloud_Platform.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/eab9a28c-d5ec-022d-0fcc-a8bc89cd63c4.png">

同様に、必要なときには、いつでもこの設定画面からVM インスタンスを「開始」できます。

##料金を見るには
料金や課金を確認するには、GCP の左上メニュー > 「お支払い 」から、「料金の履歴」を見ると、料金の発生や無料枠の適用を確認することができます。

<img width="593" alt="請求先アカウント_料金の履歴_-_Google_Cloud_Platform.png" src="https://qiita-image-store.s3.amazonaws.com/0/64605/adcf9a8f-81b4-9a92-d768-96284ca0b7a5.png">