Cosnomi

プログラミングをする医学生。物を作ること、自動化すること、今まで知らなかったことを知ることが好き。TypeScript書いたり、Pythonで機械学習したりなど。

Twitter / GitHub / GPG key / Fediverse / My Page
TOP >

機械学習向けCIツール CMLを使った感想

Aug. 11, 2020機械学習私感

機械学習のモデル開発において、再現性はとても重要です。様々なアイデアを実装していき、それぞれについて有効なのかを検証する必要がありますし、場合によっては随分と前のコードまで必要もあります。そういった実験の記録・再現性の担保のためにいくつかのツールが存在します。例えば、comet.mlneptune.aiwandbなどです。AIブームのせいか、なかなか強気な価格設定だなという印象を受けます(個人利用は無料ですが)。

今回は、そのようなツールのうちOSSであるCML (Continuous Machine Learning)を個人の小さな機械学習プロジェクトに導入してみました。

CMLを使うと何ができるか

CMLはdvcと同じ団体が開発しているので、大きなフレームワークで何から何までお世話をするというよりは、既存のツール(Git, CI/CD)を機械学習でも上手く使えるようにしたいという思想が伺えます。

CMLの機能は次の2つだけです。

  1. repositoryへのpush時に自動で訓練・予測を行う
  2. 実験結果レポートをGitHubのPull Requestのページなどに投稿する

これを利用して、ソフトウェア開発でお馴染みのPull Requestベースの開発フローを、機械学習モデルの開発でも使えるというわけです。

1. 自動で訓練・予測

訓練や検証を行う際には、GitHub ActionsまたはGitLab CI/CDを使います。もちろん、デフォルトのrunnerでは遅すぎるので、docker-machineを用いてAWSやGCPにDockerコンテナを立ててself-hosted runnerを利用可能です。GPUも使えます。

CMLはここで何をしてくれるかというと、

  • Dockerコンテナをクラウドに立てるためのDockerイメージを提供
    • self-hosted runnerとして動くように上手く設定してくれる
  • 2つ目の機能であるレポート作成utilityとPythonが入ったDockerイメージ(dvcorg/cml-py3など)を提供
    • これをEC2インスタンスなどの中で立てれば良い

という比較的シンプルな機能です。

2. 実験結果レポートの投稿

ここでも、CMLの機能はシンプルで、次の3つです。

  • markdownをPRのコメントとして投稿
  • markdownをGitHub ActionsのCheckに投稿
  • CMLの提供するストレージに画像をアップロードし、それをmarkdownに埋め込む

前述のdvcorg/cml-py3といったDockerイメージを使えば、このコマンドが使えるようになっています。(実装はJavaScriptのようです。)

試してみたこと

CMLを用いて次のことを試しました。

  • push時にAWS EC2のGPUインスタンスを起動して、自動で訓練
    • すべてのpushで訓練されると困るので、[train]がついたコミットにのみ反応
  • 結果をGitHubのPull Requestのコメントとして投稿
    • markdownを使って表や画像などにまとめた

ハマったところ

AWS EC2でGPUを利用するときのAMI

GPUを使いたいのであれば、p2やg4dnなどのGPUインスタンスを選ぶのは当然ですが、CUDAなどのドライバが入っていないとGPUが使えないので、適切なAMIを選ぶ必要があります。PyTorchなどの依存はDockerコンテナ内でインストールしてしまうので、シンプルなAWS Deep Learning Base AMIを使いました。

しかし、起動したEC2インスタンスと通信ができず、コンテナを立てられないという問題が発生(しかも、rerunすると偶に成功するという再現性のないエラー)。原因はどうやら、unattended upgradeというEC2インスタンスのホストOSの機能のようです。これは、起動時に古いパッケージをapt upgradeしてくれるという機能ですが、量が多いと時間がかかるっぽい。対処法として、AWS Deep Learning Base AMIを用いて立てたインスタンスでapt upgradeした後のAMIを作成して、それをGitHub Actionsから利用するようにしました。設定で無効化できるようなので、セキュリティが気にならないという人は無効化しても良いのかも(良いのか? )

長いレポートは分割

レポートに多数の画像が含まれる場合、GitHub側の制限である65536文字を容易に超えます。markdownファイルを分割して、複数のコメントに分ければ良いです。が、そこまでしないと載らないレポートは、PR見るときも邪魔になるということに気づきました。(必要に応じて、<detail><summary>を使うとか…? )

実行失敗時にEC2インスタンスが落ちないことがある

失敗しなければ良い これもdocker-machine側の問題らしく、どうしようもないという結論に至りました。失敗時に何らかの方法でアラートを飛ばせば、つけっぱなしになってしまうということはなくなるのではないかと。

所感

便利だと思った点

  • 自動訓練のスクリプトが再現性を担保している
    • すべてのコミットに環境構築から性能評価までの流れが必ず書かれているはず
    • しかも、その状態で一通りエラーなく動いているはず
  • 実験を簡単に開始できる
    • pushするだけなので、スマホからでも可能(やりませんが)
    • 実験結果を待たずに次の実験に移れる
      • スケーラブルですしね
  • Pull Requestベースの開発は慣れているので便利
    • レポートを見て、コメントに効いてる/効いてないなどの評価を書く
    • 複数人ならPR上で議論できそう
  • 単純にこういう自動化が好き
    • 自宅サーバーとかやっていたので、インフラ周りもそこそこ興味がある
    • Infrastructure as Codeの考えが好きなので

不便だと思った点

  • 情報が少なく、ハマったときに大変だった
    • docker-machineの問題をCMLのissueに書いてもどうにもならないので、ブログに書きました
    • このブログが誰かの役に立てば嬉しいです
  • markdownでレポートを出さないといけない
    • 単純に表を作ったりグラフを作ったりが面倒
    • 何を出力するべきかを事前によく検討する必要がある
  • インタラクティブなグラフが作れない
    • comet.mlなどはできますよね
    • 例えば、横軸にAを取って、縦軸にBを取ってみたいなことを後からやりにくい
      • lossなどの生データが残っていれば、作れますが、面倒では?
  • Pull Requestベースの開発そのものが(自分の中で)まだ確立されていない
    • merge/closeの基準は?
    • 効かなかった手法も実装コードはmasterに取り込むべきでは?
    • ちゃんとモジュール構成を考えないと、容易にconflictする

感想

現段階では、使いにくいところはあるのですが、個人的には機械学習プロジェクトにおいてもソフトウェア開発に近いフローが使えるというのは好きです。また、全部入りフレームワークよりも、シンプルに保たれていてカスタマイズ性の高いライブラリのほうが好きなので、そういう点でもCMLには期待をしています。実行はCML+GitHub Actionsで、レポートはcomet.mlみたいな使い方もアリなのかなと思っています。

余談

ちょうど病理学の試験後だったので、CMLと聞くとどうしても慢性骨髄性白血病が思い浮かんでしまいました。

ところで、最近は機械学習系の勉強を自分の中では頑張っているつもりなのですが、Web系の開発と違ってブログに書けることが少ないのですよね。理論は比較的変わらないので本や他のWebページを読めば詳しく載っていますし、最新の手法は論文が一番のソースですし…。近頃は、自身の不勉強を悔いる日々が続いています。


Comments

記事一覧へ