カレーちゃんブログ

Kaggleや競技プログラミングなどのこと

Colaboratoryで分析コンペをする時のテクニック集

3月2日に開催された、分析コンペ 勉強会で、「Colaboratoryで分析コンペをする時のテクニック集」として発表をしました。

speakerdeck.com

この記事では、その内容を書きたいと思います。

Colaboratoryテクニック9つ

ここでは9つの小ネタを紹介します。

1. テーマの設定(darkモード等)、エディタの設定(インデント幅等)

Colaboratory上部の「ツール > 設定」では、次の画像のように、テーマ、デスクトップ通知の表示の有無、フォント、インデント幅などを設定可能です。

f:id:currypurin:20210303005657p:plain

テーマは、light、dark、adaptiveから選択でき、darkでは文字の色も選択できます。

f:id:currypurin:20210303005846p:plain

2. ColaboratoryかKaggleNotebookか判別

実行しているのがColaboratoryかKaggleなのか判別するコードです。

import sys

# Colaboratory環境ならTrue
'google.colab' in sys.modules
# Kaggle Notebook環境ならTrue
'kaggle_web_client' in sys.modules

例えば、INPUTの位置を動的に変えるようにして、ColaboratoryでもKaggleでも動くコードにすることができます。

import sys
from pathlib import Path

if 'google.colab' in sys.modules:  # colab環境
    INPUT = Path(‘/content/input/’)
elif 'kaggle_web_client' in sys.modules:  # kaggle環境
    INPUT = Path(‘../input/’)

3. Notebook名を取得

Notebookのタイトルを取得するコードです。

from requests import get

name_notebook = get('http://172.28.0.2:9000/api/sessions').json()[0]['name']

Notebook名を利用して、DriveにそのNotebook名のフォルダを作成し、学習した重みを保存するようにしています。

Notebook名の変更は、新しくNoteを作成した際にすることにすれば忘れないので、学習した重みの上書きを防ぐことができます。

4.Google Driveのファイルへのアクセスを許可

Google Driveのマウントの仕方です。

f:id:currypurin:20210304015823p:plain

左にあるディレクトリの右端をクリックすることで、パスを取得することができます。 次の画像のkaggleフォルダであれば、‘/content/drive/MyDrive/kaggle’、sample_dataフォルダであれば、‘/content/sample_data’です。

f:id:currypurin:20210304015918p:plain

5.学習する際は、MyDriveはなるべく使わない

MyDriveのファイルの読み書きは遅いので、なるべくcontent直下にファイルを移動して読み込んだ方が良いという小ネタです。 f:id:currypurin:20210304020319p:plain

上の画像のように、今回の学習条件だと、MyDriveの方が1epochあたり、1分ほど遅い。

なので、MyDriveからcontent直下にコピーしてから学習した方が良いことが多いと思います。

6.a Kaggle Apiを使用する

次の画像のように、データがKaggleのデータの場合は、MyDriveからのコピーよりも、Kaggle apiでデータをダウンロードした方がやや速いです。

f:id:currypurin:20210304020653p:plain

Kaggle apiを使用するためには、'root/.kaggle'にkaggle.jsonを置く必要があります。

f:id:currypurin:20210304020813p:plain

6.b データのKaggleDatasetsへのアップロード

学習が終わった後、重みは自動的にKaggle Datasetsにアップロードするようにすると良いと思います。

Kaggle Datasetsを新規に作る場合は次のコード。

import json
from kaggle.api.kaggle_api_extended import KaggleApi

ID = ‘<自分のkaggleのID>’
DATASET_ID = ‘<datasetのid>’
UPLOAD_DIR = ‘<colaboratoryでのフォルダのパス>’
def dataset_create_new():
    dataset_metadata = {}
    dataset_metadata['id'] = f'{ID}/{DATASET_ID}'
    dataset_metadata['licenses'] = [{'name': 'CC0-1.0'}]
    dataset_metadata['title'] = DATASET_ID
    with open(UPLOAD_DIR / 'dataset-metadata.json', 'w') as f:
        json.dump(dataset_metadata, f, indent=4)
    api = KaggleApi()
    api.authenticate()
    api.dataset_create_new(folder=UPLOAD_DIR, convert_to_csv=False, dir_mode='tar')

Kaggle データセットを更新する場合は、次のコード。

import json
from kaggle.api.kaggle_api_extended import KaggleApi

UPLOAD_DIR = ‘<colaboratoryでのフォルダのパス>’
VERSION_NOTES = ‘<version notes(前の版からの変更点)>’

def dataset_create_version():
    api = KaggleApi()
    api.authenticate()
    api.dataset_create_version(folder=UPLOAD_DIR, version_notes=VERSION_NOTES,
     convert_to_csv=False, dir_mode='tar')

7 Mydriveからのweightのロードが遅い場合

たまにDriveからGPUへのweightのロードは遅い場合があったので、その場合はcontent直下にweightのファイルをコピーしてから読み込むと良いという小ネタです。

ただ、次の画像のように、昨日実験した際はロード時間に差がなかったので、気にする必要はないかもしれません。 f:id:currypurin:20210304021546p:plain

8 Githubのrepositoryをclone

次の公式のページに詳しく書いてあるので、参考にするのが良いと思います。 Data_into_Google_Collab_guide.ipynb - Colaboratory

以下は、その抜粋です。

public repositoryをcloneする場合
!git clone https://github.com/username/repository.git /content/foldername
private repositoryをcloneする場合

password method という方法。ただし、推奨されないようです。

!git clone https://username:password@github.com/username/repository.git

SSH keyを使う次の方法を使いましょう。

!ssh-keygen -t rsa -b 4096 -C "username@github.com"
!cat /root/.ssh/id_rsa.pub
# これで表示されたkeyを、githubのsettings>deploy keysに登録

!ssh-keyscan github.com >> /root/.ssh/known_hosts
!chmod 644 /root/.ssh/known_hosts

!chmod 600 /root/.ssh/id_rsa
!ssh -T git@github.com

!git clone git@github.com:username/privaterepo.git /content/foldername

/root/.ssh/はセッションが切れるとなくなってしまうため、ローカルに保存したり、Driveに保存するなどして、毎回アップロードやコピーして使うと良いと思います。

9. GitHubのプライベートリポジトリのipynbファイル開く、Colaboratoryで編集したのをGithubに保存する

Colaboratoryの ファイル > Notebookを開く > Githubに進んで認証し、未公開リポジトリも含めるにチェックすると、githubのプライベートリポジトリのipynbファイルを開くことができます。

また、編集後、ファイルのGithubにコピーを保存で、Githubに保存することができます。

Colabolatoryを使うモチベーション

以上がColabolatoryを使う小ネタですが、以下Kaggleをするに当たってColaboratoryを何故使っているかという説明です。

f:id:currypurin:20210303002901j:plain

Kaggleのnotebookは無料で使えたり、学習データや学習したweightの使用がとても簡単にできます。

でもGPU・TPUは週30~40時間程度の制限があり、もう少しGPUを使いたいとなります。

クラウドやオンプレを使う方法もあるわけですが、有料なのでできたら無料で使える環境が欲しい。

そこでColaboratoryであれば、GPUやTPUが無料で使えるので、嬉しいです。ただ上の画像の赤枠のように、学習データのダウンロードやKaggle Datasetsのアップロードは手動で行う必要がありやや面倒です。

ここをKaggleのコンペの参加などを通してスムーズにできるようになったので、この記事にしています。

Colaboratoryとは

Colaboratoryは公式ページでは次のように説明されています。

Colaboratory(略称: Colab)は、ブラウザから Python を記述、実行できるサービスです。次の特長を備えています。

  • 環境構築が不要
  • GPU への無料アクセス
  • 簡単に共有 「Colaboratoryとは」より

ただし、Colaboratoryはインタラクティブな使用を目的としており、長時間の学習には向いていないようです。

また、1セッション最大12時間の制限や、アイドル時間が長いと接続が切れることがあり、使い続けるためのいくつかのテクニック*1があります。

もう少しColaboratoryを使う人のために、Colab Proという有料版のサービスがあり、これは現在米国とカナダでのみ提供されています。3月中旬にColab Proが提供される地域が増えるとの噂があり、日本でも使えるようになることを期待しています。

Colab Proは公式ページでは次の画像のように説明がされています。

f:id:currypurin:20210303004929p:plain

終わりに

上記の小ネタにはtwitterで教えてもらったネタがいくつもあります。それをcolaboratoryでkaggleをするときに便利なコード で書き溜め、勉強会での発表にし、ブログの記事にしました。

参考にしたページ

追記(Colaboratory Proについて)

2019年3月19日、ついに日本でもColaboratory Proに申し込めるようになりました。

通常のColaboratoryとProの違いは、現状このような状況。

比較のため、V100で回してみましたが、次のツイートの画像のようにとても早かったです。