Google ColaboratoryのTPUランタイムを使ってKeras Tunerでパラメタ探索

この記事は  GMOアドマーケティングAdvent Calendar 2020   23日目の記事です。

みなさんこんにちは、GMOアドマーケティングのM.H.と申します。

突然ですがみなさんは機械学習する時にどのような環境で実行していますか?Google Colaboratoryでは、制限はありますが無料でTPUを使用し、高いパフォーマンスで学習を進めることができます。

今回はこのTPUを使って、モデル内のハイパーパラメータを自動で探索してくれるKeras Tunerを使っていく方法と注意点についてお話しします。


そもそも、TPUとは

TPU(Tensor Processing Unit)とは、Googleが開発した機械学習特化型のプロセッサのことで、基本的にGPUよりも高速で学習を進めることができます。計算量が多く、バッチサイズが大きい場合に特にその効果を発揮します。

私たちがこのパワーを使いたい場合、Cloud TPUというサービスで利用することができますが、これは有料でありお試しで使ってみたい方には少し壁を感じてしまうかもしれません。

しかし、Google Colaboratoryではなんと無料でこのTPUが利用できます。ColabはPythonを記述し、実行できる環境が整えられているため、まさに機械学習でTPUを動かしてみる環境にうってつけです。

※ ただし利用リソースに制限はあります。

Keras Tunerについて

Kerasで作られた学習モデル内で使うハイパーパラメータ(例えば、Adamの学習率など)を、自動で探索してくれるライブラリです。sklearnで作られた学習モデルに対しても探索はできますが、今回は触れません。

事前準備

Google Colaboratoryを開き、「ランタイム」>「ランタイムのタイプを変更」>「ノートブックの設定」から、「ハードウェア アクセラレータ」の項目を「TPU」に変更してください。

コード

早速コードを書いて実装してみます。

学習用のデータ整備

あらかじめKeras Tunerをインストールします。今回は、定番であるmnistのデータを用いていきます。訓練データと評価データとテストデータの3つに分けています。

CNNモデルの構築

次に、Kerasを使ってCNNモデルを構築していきます。この時は自作のメソッドを定義し、引数には hp を指定してください。

探索したいハイパーパラメータは hp.xxx の形で指定します。ここでは例としてInt, Float, Choiceを使っています。メソッドの詳しい内容については公式ドキュメントがありますのでこちらを参考にしてください。

nameを同じに設定すれば同じ探索値が使われることに注意してください。

TPUを使うための設定

Google ColaboratoryでTPUランタイムを使用するための各種設定をしておきます。3行目にある COLAB_TPU_ADDR は、ランタイムでTPUに設定していないと取得できません。7行目で使用できるTPUについての情報が表示され、 INFO:tensorflow:*** Available Device: _DeviceAttributes ... がたくさん出てくるはずです。

GCSへのアクセス権限

後述しますが、Tunerクラスを定義する際にはGCSへのパスを指定する必要があります。そのため、GCSにアクセスするためGoogleアカウントで認証しなければなりません。

authenticate_user でアカウントに紐づいたコードを取得しコンソールに入力します。

Tunerクラスの定義

TunerクラスとしてRandomSearchクラスを定義していきます。他にはHyperbandやBayesianOptimizationクラスもあります。

このクラスには先ほど作成した自作の学習モデルメソッドを渡します。

注意点として

  • directoryにはGCSのパスを指定する
  • distribution_strategyには先ほど作成したstrategyを指定する

があります。TPUランタイムを使用する場合学習モデルの重み情報などはローカルに保存できないため、GCSに保存する必要があります。Keras Tunerでは各探索で重みを保存するためこのような設定をします。

ハイパーパラメータ探索

search メソッドを呼び出して実際にハイパーパラメータの探索を開始します。今回はコールバック関数としてEarlyStoppingと、出力クリアのための自作コールバックを指定していますが、設定はお好みです。

results_summary() で探索の結果を表示します。RandomSearchクラスを作成する際に指定したobjectiveの値が高い上位のパラメタ群が表示されます。

以下のような出力がされ、探索の結果を簡単に確認することができます。

まとめ

今回は、簡単なCNNモデルをKerasで構築し、ハイパーパラメータの探索をGoogle ColaboratoryのTPUランタイムを使用しKeras Tunerで実行してみました。いかがだったでしょうか。

実際にはCNNよりもTPUが効果を発揮しやすいモデルなどありますが、今回は使ってみるということで簡単に触ってみました。更に使いこなしていきたいですね!

明日は、T.Mさんによる「スクラムガイド2020を読んで自分たちのスクラムを振り返りました。」です。
引き続き、GMOアドマーケティング Advent Calendar 2020 をお楽しみください!
■エンジニア採用ページ ~福利厚生や各種制度のご案内はこちら~
https://www.gmo-ap.jp/engineer/
■noteページ ~ブログや採用、イベント情報を公開中!~
https://note.gmo-ap.jp/