nikkie-ftnextの日記

イベントレポートや読書メモを発信

GitHub ActionsでMLOpsをやりたくて、サンプルワークフローのChatOpsの仕組みを読み解きました

はじめに

頑張れば、何かがあるって、信じてる。nikkieです。
データサイエンティストとしてPythonを書く中で、徐々にMLOpsに興味が出てきました。
GitHub ActionsでMLOpsしているブログ記事を知り、「私もやりたい!」とその中のChatOpsの部分を読み解いてみました。

目次

GitHub ActionsでMLOpsの例

GitHub Blogに以下の記事があります。

ここで示されている例は、pull request上でコメントすると、GitHub Actionsのワークフローのうちコメントに対応するものが実行されるというものです。

  • pull requestに /run-full-test を含むコメントを投稿すると、Dockerイメージのビルドが走り、モデルが評価されます(結果がpull requestにコメントされます)
  • pull requestに /deploy を含むコメントを投稿すると、コメント内で指定したRun IDのモデルがデプロイされます

百聞は一見に如かず、以下も合わせてご覧ください。

私はこの例を見て、
「SlackのスラッシュコマンドのようにGitHub Actionsのワークフローを呼び出せるのかっこいい!✨
これがあったら、ブランチを切って仮説に基づく変更をプッシュするだけで試行錯誤できそう。やってみたい!🤩」
とめちゃくちゃテンション上がりました!
なお、pull requestにコマンドを入力することでワークフローを実行できるので、私はChatOpsと呼んでいます1

手元のリポジトリで再現させるまで

GitHub Action: ChatOps For Pull Requests

イシューへのコメントissue_commentドキュメント)で発火するワークフローを作ります。
このワークフローはコメントに含まれるコマンドを元に、後続のワークフローをディスパッチします。
1つのワークフローで全てをまかなっているわけではありませんでした。

ワークフローのステップには、以下のmachine-learning-apps/actions-chatops@masterを使います。

      - uses: machine-learning-apps/actions-chatops@master
        with:
          TRIGGER_PHRASE: "/test-trigger-comment"
          INDICATOR_LABEL: "test-label"
          APP_PEM: ${{ secrets.APP_PEM }}
          APP_ID: ${{ secrets.APP_ID }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

/test-trigger-commentが含まれていれば、machine-learning-apps/actions-chatops@masterが実行されます。
このActionでやることはINDICATOR_LABELラベルを当該プルリクエストに付けることです。
ラベルの付加をトリガーに後続のワークフローが実行されることで、ディスパッチが実現されます。

APP_PEM, APP_ID? → GitHub Apps

GitHubには疎いので、APP_PEM, APP_IDはピンときませんでしたが、GitHub Appsというものがあるそうです。
今回手を動かした範囲ではSlackのSlack Appと同様のものという理解です。
プルリクエストにラベルを付けるといった操作をコードから行うときに、必要な権限にアクセスできるGitHub Appを作るそうです。
それを当該リポジトリにインストールして使うという仕組みになっている2ことを今回知りました。

GitHubのヘルプページに沿ってGitHub Appを作成します。

Appには以下の権限が必要でした。

  • Read Metadata(最初から付いています)
  • Read Issue(後述)
  • Read & Write Pull Requests(ラベルを付けるため)

作ったAppを、ChatOpsをやりたいリポジトリにインストールします3
Appがアクセスする範囲を確認し、Acceptします。

ChatOpsをやりたいリポジトリにはSecretも設定します4

  • APP_PEM:生成したPrivate keys(pemファイル)の中身
  • APP_IDGitHub AppのApp ID
ChatOps For Pull Requestsの裏の仕組み

Dockerイメージが実行され、以下のPythonスクリプトが動いています。
actions-chatops/label_app.py at master · machine-learning-apps/actions-chatops · GitHub

この中でIssueを読み取っているところがあり、Read Issue権限が必要でした。

ディスパッチされるワークフロー

コマンドに応じてそれぞれのワークフローを追加します。

name: Workflow of /test-trigger-comment Command
on:
  pull_request:
    types: [labeled]

jobs:
  test-trigger-comment-workflow:
    if: github.actor == 'GitHub App名[bot]'
    runs-on: ubuntu-latest
    steps:
      - run: echo 'hello World'

onで定義する発火イベントをpull requestにラベルが付いたときとしています(ドキュメント)。
これでmachine-learning-apps/actions-chatops@masterからディスパッチされます。

ifによる分岐でgithub.actor(ワークフローを実行したユーザ(ドキュメント)=pull requestにラベルを付けたユーザ)を確認します。
ラベルを付けたのがリポジトリに設定したGitHub Appだった場合に限り、stepsの部分が実行されます。

まとめ

用意するワークフローのyamlファイルは少なくとも2つ

  • コマンドに応じてディスパッチするワークフロー
    • machine-learning-apps/actions-chatops@master Actionを使う
    • GitHub Appを作成する必要あり
  • コマンドに対応して呼び出されるワークフローを1つ以上作る
    • pull requestにラベルが付いたら発火するようにする

f:id:nikkie-ftnext:20200921212900p:plain

感想

GitHub Actionsを使ったMLOpsへの一歩目を踏み出せました!
コマンドをディスパッチしてラベルを付けるという仕組みだったんですねー

動かせたのですが、「GitHubが提供する環境でモデルの訓練をするのはグレーかも」と感じています。
GitHub Actionsには使用制限があり、どんなコンピューティングにでも使えるわけではありません5
変更したスクリプトでモデルを作り、それの性能評価をするMLOps用途が、GitHub Actionsの使用制限に抵触しないと言い切る自信が私にはありません(ご存じの方いたらコメントや @ftnext まで教えてください) 。
紹介したブログでもモデルの作成などは、別の環境6で行っています。
このあたりの線引きがはっきりすれば、GitHub Actionsはデータサイエンスにも一気に広がるかもしれませんね(使用制限が今のままでも、他の環境での実行連携が驚くほど簡単にできれば、広がりそうです)

GitHub Actionsはテンプレートを触るくらいで、体系的に理解できていなかったのですが、Software Design 2020年10月号のGitHub Actions特集に助けられました。

この特集を読んだ今、machine-learning-apps/actions-chatops@masterを改造したり、ラベルを付ける汎用Action labelerリポジトリ)を使うように改造したりできるかもしれないなと思っています。

今回手を動かしたのは、今週金曜日のLTに向けてのネタ探しでもあります。
枠はまだあるようですので、興味ある方はぜひお越しください。
別の実行環境が必要という結論ですが、まだ万策尽きてないです😏


  1. 紹介したブログ記事の大元のリポジトリのワークフローのymlファイルの名前もchatops.ymlでした

  2. IIJさんのブログに詳しかったです:人に紐付かない権限で連携機能を設定できるGithub Apps | IIJ Engineers Blog

  3. インストールしたあとでGitHub Appの権限を変えた場合は、新しい権限を適用するためにConfigurationを操作する必要がありました

  4. Encrypted secrets - GitHub Docs

  5. 「アクションは次の用途には使用しないでください。(中略)gitHubアクションが使用されるリポジトリに関連するソフトウェアプロジェクトの製造、テスト、デプロイ、公開に関連しないその他の行為。」ref: GitHub追加製品の利用規約 - GitHub Docs

  6. k8s上で実行しています(まだまだ先は長いぞ。。) https://youtu.be/Ll50l3fsoYs