Open15

colaboratoryでkaggleをするときに便利なコード

currypurincurrypurin

kaggle環境とcolaboratory環境を判別

import os

# kaggle環境ならTrue
'KAGGLE_URL_BASE' in set(os.environ.keys())

# colaboratory環境ならTrue
'COLAB_GPU' in set(os.environ.keys()):
wakamewakame

環境を判別するスニペットはどういう場合に利用しますか?
例えばGithubに本コードがあり、clone先がkaggle notebook / colabratoryどちらか判定するときに使うのでしょうか。

currypurincurrypurin

主に2つの用途があって
1つ目は、ライブラリのinstallです。kaggleならデータセットから!pip installしてだけれど、colaboratoryなら普通に!pip install、ローカルならinstall済みなので何もしないという感じで。

2つめは、下のスクラップでも書いたんですが、colaboratoryの現在のディレクトリの設定で
CURRENT_DIR = Path(<現在のディレクトリのパスを入力>)みたいなことをやっています。

currypurincurrypurin

学習済みモデルをKaggleDatasetsに追加

1 kaggle.jsonを所定の場所に移動する

%cd
!mkdir .kaggle
!cp <kaggle jsonがあるフォルダのパス>/kaggle.json .kaggle/

2 dataset_initialize_cliを実行

from pathlib import Path
PRETRAIN_DIR = Path('<アップロードするフォルダのパス>')
api = KaggleApi()
api.authenticate()
api.dataset_initialize_cli(folder=PRETRAIN_DIR) 

3 作成されたdataset-matadata.jsonを編集する

  • title にデータセットのタイトルを入力
  • id にデータセットのurlを入力
    • title, id ともに、文字数制限や使える文字の制限があるので、公式参照
    • アルファベットと_である程度入力しておけば大丈夫

4 データセットを新しく作る

api.dataset_create_new(folder=PRETRAIN_DIR,
                       convert_to_csv=False,
                       dir_mode='zip')
currypurincurrypurin

改良版

UPLOAD_DIR = '<uploadするdirのpath>'
EX_NO = '<実験番号>'  # 実験番号などを入れる、folderのpathにする
USERID = '<Kaggleのuserid>'


def dataset_upload():
    import json
    from kaggle.api.kaggle_api_extended import KaggleApi

    id = f'{USERID}/{EX_NO}'

    dataset_metadata = {}
    dataset_metadata['id'] = id
    dataset_metadata['licenses'] = [{'name': 'CC0-1.0'}]
    dataset_metadata['title'] = f'{EX_NO}'

    with open(UPLOAD_DIR / 'dataset-metadata.json', 'w') as f:
        json.dump(dataset_metadata, f, indent=4)

    api = KaggleApi()
    api.authenticate()

    # データセットがない場合
    if f'{USERID}/{EX_NO}' not in [str(d) for d in api.dataset_list(user=USERID, search=f'"{EX_NO}"')]:
        api.dataset_create_new(folder=UPLOAD_DIR,
                               convert_to_csv=False,
                               dir_mode='skip')
    # データセットがある場合
    else:
        api.dataset_create_version(folder=UPLOAD_DIR,
                                   version_notes='update',
                                   convert_to_csv=False,
                                   delete_old_versions=True,
                                   dir_mode='skip')
dataset_upload()
currypurincurrypurin

サブミット後の実行時間(Public LBのスコアが出るまで)がわかるコード これにlin notifyやdiscordを組み込んだりする

line notify

Lineに通知を送る。
notebookをチームメートに共有すること等を考えると、TOKEN_PATHは自分だけがアクセスできるフォルダに格納しておくと良い。

Lineに通知を送る設定などは、コピペで使える。Kaggleでの実験を効率化する小技まとめ - 天色グラフィティ参照。

import requests
from pathlib import Path
TOKEN_PATH = Path('<line_tokenのpath>')


def send_line_notification(message):
    with open(TOKEN_PATH, 'r') as f:
      line_token = f.read()
    endpoint = 'https://notify-api.line.me/api/notify'
    message = "\n{}".format(message)
    payload = {'message': message}
    headers = {'Authorization': 'Bearer {}'.format(line_token)}
    requests.post(endpoint, data=payload, headers=headers)
  
send_line_notification("<message を入力>")
# tokenを書き出すコード (初回のみ)
line_token = '<自分のTOKENを入力>'

with open(TOKEN_PATH  / 'line_token.txt', 'w') as f:
    print(line_token, file=f, end='')
currypurincurrypurin

githubのプライベート repositoryをclone

などを参考にすると良い。以下手順の例。

公開鍵・秘密鍵の作成

!ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

SSH Keyを作成する。保存先やパスフレーズを求められるので、適当に入力する
ファイル名を下のconfigファイルに使用している。このconfigは、id_rsa_colabという名前にした例。

公開鍵をGithubにアップする。

https://github.com/settings/ssh
で設定する。

configファイルの作成

~/.ssh/configに次のファイルを置く

Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_colab
  User git
  StrictHostKeyChecking no

接続確認

!ssh -T git@github.com

clone

!git clone git@github.com:<自分のプライベートレポジトリ>
currypurincurrypurin

colabとmlflowの連携(更新中)

https://recruit.gmo.jp/engineer/jisedai/blog/kaggleops-mlflow/ を参考に。

山本大悟山本大悟

colabでデータを共有する方法
共有アイテムのショートカットをマイドライブに置くことでシンボリックリンクを作ることができる。
colabでgoogledriveにマウントしたときにその共有アイテムにアクセスできるようになる。

colabでkaggleにチームで参加するときに重みや推論結果の共有がしやすくなる。
また、自分のマイドライブの容量を消費しない。