githubのcodeをgithub actionsの機能を使ってkaggle datasetにアップロードする
やりたいこと
code competitionや、kaggleの無料GPUを使いたい場合には、ローカルマシンのコードをコピペして使っており、ミスをすることがありました。
ここでのコピペを自動化して、ミスを減らし快適なkaggleライフを送りたいと思いました。
やったこと
github actionsの機能を使って、プルリクエストをマージするタイミングでkaggleのdatasetにアップロードするようにしてみました。
早い話が、kaggle adventカレンダーの2日前の cfikenがcircleCIを使ってやった内容のgithub actions版です。cfiken、パクってすまんやで。(※本人には了承を得ています。)
今回の実装した内容はgithubレポジトリにありますので、もしお使いになりたい場合にはそちらを参照してください。
参考: Reproducible Data Science using Kaggle and GitHub Actions
kaggle datasetsの準備
ディレクトリ構成を次のようにしておきます。
.
├── upload_kaggle_dir
│ └── dataset-metadata.json
└── src
├── __init__.py
└── foo.py
upload_kaggle_dir
がアップロードするディレクトリになり、src
の中に、使いたいコードを書いておくことを想定しています。後述のgithub actionsのyamlを読めばわかりますが、src
の中身をzipで固めて、upload_kaggle_dir
の中に置いておいて、それをアップロードする形にしています。
upload_kaggle_dir
ディレクトリにはアップロード先のデータセットの情報であるdataset-metadata.json
を用意する必要があります。
dataset-metadata.json
はkaggle APIを使って以下のコマンドで作成できます。
kaggle datasets init -p upload_kaggle_dir/
実行すると以下のjsonファイルが生成されます。
{
"title": "INSERT_TITLE_HERE",
"id": "hattan0523/INSERT_SLUG_HERE",
"licenses": [
{
"name": "CC0-1.0"
}
]
}
title
とid
を書き換えて、自分のデータセットにアップロードする形にします。
ここでは、Kaggle-Datasets-Upload-Testとしておきます。
{
"title": "Kaggle-Datasets-Upload-Test",
"id": "hattan0523/Kaggle-Datasets-Upload-Test",
"licenses": [
{
"name": "CC0-1.0"
}
]
}
何かファイルがないとアップロードができないので、空のファイルを作ってきます。
touch upload_kaggle_dir/README.md
次に以下のコマンドを入力するとデータセットにアップロードします。
自動化後は同じdatasetsのバージョンを変更していく想定ですので、まず一度目は手動でアップロードしておく必要があります。
kaggle datasets create -p upload_kaggle_dir/
ここまでできればkaggle datasetsの準備は終わりです。
github actionsの準備
現在までに以下のような構成になっていると思います。
.
├── upload_kaggle_dir
│ ├── dataset-metadata.json
│ └── README.md
└── src
├── __init__.py
└── foo.py
ここに.github/workflowsというフォルダを作っておき、その中にupload.yamlというファイル名(名前は適当)のyamlファイルを作っておきます。
.
├── .github
│ └── workflows
│ └── upload.yaml
├── upload_kaggle_dir
│ ├── dataset-metadata.json
│ └── README.md
└── src
├── __init__.py
└── foo.py
upload.yamlの内容は以下になります。
name: upload to kaggle
on:
pull_request:
types: closed
branches:
- 'main'
jobs:
UplodaKaggle:
name: Upload to kaggle
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.7]
steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python-version }}
- name: Install kaggle api
run: pip install kaggle
- name: zip source
run: zip -r ./upload_kaggle_dir/src.zip ./src
- name: Upload to kaggle
env:
KAGGLE_USERNAME: ${{ secrets.KaggleUsername }}
KAGGLE_KEY: ${{ secrets.KaggleKey }}
run: kaggle datasets version -p ./upload_kaggle_dir -m 'update' -d
アップロードするためにはkaggle apiを使っています。そのため、secrets.KaggleUsername
とsecrets.KaggleKey
について、github secretsを使って登録をしておく必要があります。
ここでは、kaggle APIを使うときにインストールしてきた、 username
とkey
をgithub secretsに登録をしておけばオッケーです。
上のactionsは、main
に別のブランチからマージしたときに実行するように設定しています。
例えば、main
ブランチに直接pushしたときに走らせたい!というのであれば、
on:
pull_request:
types: closed
branches:
- 'main'
を
on: push
なりに書き換えておけば使えます。
まとめ
- 本記事では、kaggleのコードコンペティションや無料GPUを使う際に、より快適にするためgithub actionsを使って、コードを自動アップロードする方法を公開しました。
- kaggle adventカレンダーの2日前の cfikenがcircleCIを使ってやった内容との差分は、彼がcircle CIを使っているのに対し、私はgithub actionsを使っている点にあります。
- コードはこちら
Discussion
投稿ありがとうございます!
2024年5月5日にやってみたんですけど
kaggle datasets version -p ./upload_kaggle_dir -m 'update' -d
を実行すると403 - Forbidden - Permission 'datasets.update' was denied
というように権限エラーが出てしまいます。こちらに関して、解決方法がわかる方はいらっしゃいますかね??
実行結果
(ローカルからならできた)