👏

githubのcodeをgithub actionsの機能を使ってkaggle datasetにアップロードする

2020/12/02に公開1

やりたいこと

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"
    }
  ]
}

titleidを書き換えて、自分のデータセットにアップロードする形にします。
ここでは、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.KaggleUsernamesecrets.KaggleKeyについて、github secretsを使って登録をしておく必要があります。
ここでは、kaggle APIを使うときにインストールしてきた、 usernamekeyを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

masaki tsukadamasaki tsukada

投稿ありがとうございます!
2024年5月5日にやってみたんですけど
kaggle datasets version -p ./upload_kaggle_dir -m 'update' -dを実行すると403 - Forbidden - Permission 'datasets.update' was deniedというように権限エラーが出てしまいます。
こちらに関して、解決方法がわかる方はいらっしゃいますかね??
実行結果
(ローカルからならできた)