colaboratoryでkaggleをするときに便利なコード
kaggle環境とcolaboratory環境を判別
import os
# kaggle環境ならTrue
'KAGGLE_URL_BASE' in set(os.environ.keys())
# colaboratory環境ならTrue
'COLAB_GPU' in set(os.environ.keys()):
環境を判別するスニペットはどういう場合に利用しますか?
例えばGithubに本コードがあり、clone先がkaggle notebook / colabratoryどちらか判定するときに使うのでしょうか。
主に2つの用途があって
1つ目は、ライブラリのinstallです。kaggleならデータセットから!pip install
してだけれど、colaboratoryなら普通に!pip install
、ローカルならinstall済みなので何もしないという感じで。
2つめは、下のスクラップでも書いたんですが、colaboratoryの現在のディレクトリの設定で
CURRENT_DIR = Path(<現在のディレクトリのパスを入力>)
みたいなことをやっています。
をみて、IN_COLAB = 'google.colab' in sys.modules
の方が良いのかと思った。
学習済みモデルを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')
改良版
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()
サブミット後の実行時間(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='')
discordに通知
webhookを使えば簡単。
notebook nameの取得
from requests import get
filename = get('http://172.28.0.12:9000/api/sessions').json()[0]['name']
以下は古い
from requests import get
filename = get('http://172.28.0.2:9000/api/sessions').json()[0]['name']
Kaggleのデータをcolaboratoryで扱う例
良く使うマジックコマンド
-
Colaboratoryの基本コマンドの使い方 - Qiita
- 自分が使うのはほぼ網羅されている。
- JupyterやColabのマジックコマンドに対してセル内で定義した変数を引数として与える - Qiita
その他、良く使うもの
-
!ls
ファイルのリスト表示 -
!du -h
- ディスクの使用量をディレクトリごとに集計
- -hは、human-readable
githubのプライベート repositoryをclone
- GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~ - Qiita
- お前らのSSH Keysの作り方は間違っている - Qiita
- GitでSSH接続のHost Key Verificationを無視する - Qiita
- Bringing data into the Google Colab environment
などを参考にすると良い。以下手順の例。
公開鍵・秘密鍵の作成
!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:<自分のプライベートレポジトリ>
colabとmlflowの連携(更新中)
https://recruit.gmo.jp/engineer/jisedai/blog/kaggleops-mlflow/
を参考に。
colabでデータを共有する方法
共有アイテムのショートカットをマイドライブに置くことでシンボリックリンクを作ることができる。
colabでgoogledriveにマウントしたときにその共有アイテムにアクセスできるようになる。
colabでkaggleにチームで参加するときに重みや推論結果の共有がしやすくなる。
また、自分のマイドライブの容量を消費しない。