🔬

大学の研究室でClearMLをホストして研究を効率化する

2022/12/21に公開約6,900字

要約

大学の研究室でClearMLを導入して実験記録やデータセットの管理を自動化した結果、
研究の本質的な作業に使える時間が増えたよという話です。
単にMLOps導入の話であれば既に多くの知見がありますが、それほど規模が大きくない大学の研究室でMLOpsツールを活用する一つの事例として参考になれば幸いです。
(特に自分の研究室でこういったツールを使ってみたいけど、周りが興味なくて導入に踏み切れない同士がいたら参考にしてください。)

はじめに

zennでは初めまして、SIY1121です。
ここ数年は主にweb系・音響系の開発をしていますが、
現在は大学院1年で音響処理と深層学習を組み合わせた研究もしています。

さて、最近特にweb系ではCI/CDを始め、可能なものは自動化する文化がすっかり浸透したように思います。そんなweb畑にいたこともあって、研究室に入ってからも「自動化できる部分は自動化して楽をしたい!」というモチベがありました。

DevOps / MLOps

一般に、DevOps(Development and Operation)とはサービスの開発と運用を円滑に進めるための枠組み・手法を指します。一方MLOpsという言葉はDevOpsからの派生で、機械学習プロジェクトを円滑に進めるための枠組みを指します。

プロジェクトを円滑に進めるためには、必然的に自動化というコンセプトを導入することになります。CI/CD(Continuous Integration/Continuous Delivery)はそんな自動化の仕組みを表す言葉として用いられます。

特にMLOpsでは

  • モデルの実験・開発速度の向上
  • モデルの本番環境への迅速的なデプロイ
  • 品質保証

等を実現するために自動化の仕組みを取り入れています。
MLOps系のツールはこれらを実現するために開発されています。

自分の研究室ではサービスを運用することはありませんが、特に「モデルの実験・開発速度の向上」が達成できればそれは研究の進捗に直結します。
よって、研究室でもMLOpsツールの恩恵を得られるのでは?と考えたわけです。

MLOpsツールの選定

研究室への導入にあたって要件は3つありました。

  • 無料で複数人で使えること
  • オンプレ運用できること
  • ツールを使わない人とも共存できること

一つ目の「無料で複数人で使えること」は、手軽に始められる・長期的に使ってみて使いこなせるかを判断することができるので重要です。また、他のメンバーに試してもらうためにも複数人で使えることは必要です(無料プランだとオンプレでも人数制限があるケースが多いです)。
二つ目の「オンプレで運用できること」、これは機密情報を研究室外のサーバーに置きたくないという基本的な要求だと思います。
三番目の「ツールを使わない人とも共存できること」、これはまず自分だけで試してみて、良さそうだったら後から他のメンバー布教していくという手順を踏むときに必要になります。

結果、ClearMLがこれらの条件を満たしていそうだと判断したため導入に踏み切りました。

ClearMLとは

ClearMLはAllegro. AIが開発するMLOpsシステムの総称です。
実験結果の管理から、データセットの管理、計算リソースの管理までMLOpsを実現する多種多様な機能がありますが、使いたい機能から小さく始めることができます。
また、関連コンポーネントはすべてGitHubでOSSとして公開されており、開発に参加することもできます。最近は特にアップデートが活発で新しい機能がどんどん増えています。

https://github.com/allegroai

ClearMLは小さく始めることができます。自分なりにstepに分けてみたので見てみましょう。

Step1 実験の記録と比較

まずは、普段の実験結果をClearMLサーバーに記録し、WebUIを使って実験結果の表示・比較ができることを目指します。ストレスなく様々な実験の結果を参照できることは特にゼミなど複数人で議論しているときにスムーズな議論につながります。

ClearMLは、LossやAccuracy等、イテレーションごとに変化していくスカラー値を始め、任意の種類のグラフ、動画像や音声、htmlファイルなどのマルチメディアファイルを記録できます。
もちろん、実験ごとに設定した引数やハイパーパラメータ等も記録できます。

また、pythonのバージョンやインストール済みパッケージ、gitを使用していればコミットID等、実験の再現に役立つ情報も記録されます。

タグによる実験の管理も可能で、実験の種類や出した会議の名前など、好きなタグを作って管理できます。


これらはClearMLの最小構成で実現できます。
最小構成では

  • ClearMLサーバー
  • ClearMLクライアントライブラリを導入したPython環境

の2つが必要になります。
クライアントはpip等のパッケージマネージャから、サーバーは公式のdockerイメージがあるため簡単に立てることができます。[1]

実際に利用する流れは

  1. 実験スクリプト内でClearMLライブラリの関数を呼び出し
  2. ライブラリが内部でClearMLサーバーにデータを送信
  3. ClearMLサーバーが記録した実験データをWebUIで閲覧

となります。

# 実験スクリプト冒頭で以下を呼ぶ
from clearml import Task
task = Task.init(project_name='プロジェクト名', task_name='実験名') # 環境情報や標準出力は自動で記録される

# ハイパーパラメータの記録
hparams = {
  "learning_rate": 1e-3,
}
task.connect(hparams)

# 学習中
# スカラー記録
task.logger.report_scalar(title, series, value, iteration)

# メディアファイル記録
task.logger.report_media(
            title=title,
            series=series,
            iteration=iteration,
            local_path=path_to_file, # 動画像、音声、htmlファイルなど
            delete_after_upload=True,
        )

ClearMLライブラリの関数を自分で呼び出すこともできるほか、ClearMLライブラリがTensorboard,Matplotlib等の別のライブラリにランタイムでパッチを当てる機能もあり、特に何もしなくても自動で記録してくれるケースもあります。

自分は普段PytorchLightningを使っていますが、PytorchLightning標準のログ関数を呼び出していればClearMLでも自動で記録されました。[2]
動画像の記録など、一部はClearMLライブラリを直接呼ぶ必要がありましたが、上記のように簡単に記述できるため問題にはなりませんでした。

詳しい内容は公式ドキュメントに記載があります。
https://clear.ml/docs/latest/docs/clearml_sdk/task_sdk

Step2 データセットの管理

研究によっては扱うデータセットの種類が多かったり、自分でデータセットを準備する場合があると思います。ClearMLでは各データセットに一意のIDを付けて、どのデータセットをどの実験に使用したかトラッキングすることもできます。特に自分の研究室では様々なシミュレーション条件で生成したデータセットが数多く存在しており、シミュレーション条件と一緒にデータセットをIDで管理できるため非常に助かっています。

既に存在するデータをCLIから追加したり、Pythonスクリプトでデータセットを生成しながら追加することもできます。データはClearMLによって不変性が保証され、バージョニングにも対応するため、誤ってデータを改変してしまうこともありません。データセットはClearMLサーバー本体に保存できる他、s3互換のストレージなどいくつかのストレージサービスと接続することもできます。
ClearMLに追加されたデータセットは任意の実験スクリプト内でIDを指定することで該当のデータを使用することができます。

from clearml import Dataset

# データセット作成
dataset = Dataset.create('データセット名', "プロジェクト名")
dataset.add_files(path_to_folder)
dataset.upload()
dataset.finalize()
from clearml import Dataset
# 利用
dataset = Dataset.get(dataset_id="f1b9919d326746f58ca8e0d583c749bb")
dataset_path = dataset.get_local_copy()

追加したデータセットはWebUI上でも内容の確認ができます。

詳しい内容は公式ドキュメントに記載があります。
https://clear.ml/docs/latest/docs/clearml_data/

Step3 Worker & Queue

ClearMLではWorkerとQueueの概念によって計算リソースのオーケストレーションが実現できます。概念としては、任意のQueueに対して投げられたタスクを任意のWorkerが拾って実行するものです。

空いているGPUに実験を次々と割り当てることができるため、計算リソースを効率的に活用するために用いられることが多いと思います。
ただ、自分の研究室ではClearMLがすべてのGPUを管理してしまうと、ClearMLを使わない人が作業できなくなるためこの活用方法にはあまり期待できません。

別の活用法として、一般的にターミナルから実行する必要がある実験を、WorkerをセットアップしているとWebUI上から直接回すことができます。具体的に言うと「過去の実験のハイパーパラメータを編集して新しい実験を開始」のような操作がWebUI上で完結します。
その発展としてClearMLのハイパーパラメータ最適化機能と併用することで放置しているだけでパラメター最適化の実験を自動で回してサマリーまでWebUI上に出力してくれる機能もあります。

ClearMLではWebUIでQueueを作成、Workerにしたいマシン上にclearml-agentをインストールし実行することでセットアップが完了します。
clearml-agent 1プロセスが1つのworkerなので、例えばマシンにGPUが4枚ある場合、4つのclearml-agentを立ち上げて各agentにGPUを一枚ずつ割り当てたり、1つのagentのみ立ち上げて4枚のGPUを割り当てることもできます。

# 0番目のgpuを使うworkerを起動する例
$ clearml-agent daemon --queue "my_queue" --gpus 0 --detached

自分の研究室ではGPUは一人〇枚のように固定で割り振られているため
自分用のQueueとそれを監視するWorkerを自分に割り当てられたGPU上で動かしています。

詳しい内容は公式ドキュメントに記載があります。
https://clear.ml/docs/latest/docs/fundamentals/agents_and_queues

導入してみて

導入してみた所感をstep毎にお伝えします。

まず 「Step1 実験の記録と比較」 だけでも実験結果の管理がかなり楽になりました。
視覚的に分かりやすいWebUIで複数実験の結果を比較できることはもちろん、
結果の議論に必要な指標やグラフなどを自動で出力するようにすれば、WebUIから直接グラフなどをゼミの発表資料や論文に張り付けることもできます。
指導教員などに実験結果を共有するときもurlを共有すれば記録されているすべての情報が閲覧できます。
また、実験に会議名等のタグをつけることで、重要な実験を見失うこともなくなりました。

こういったツールの導入が初めての方はこれだけでもかなりの恩恵があります。

「Step2 データセットの管理」 はたくさんのデータセットを使わない人にはあまり恩恵は無いかもしれませんが、自分はデータセットを生成することも多いのでIDで管理できるだけでも安心でした。不変性が担保されていることで間違ってデータセットを改変してしまうような事故も発生しません。

「Step3 Worker & Queue」 は、今回の使い方では時短機能として優秀だと感じました。
WebUIから実験を回したり自動ハイパーパラメータ最適化ができるので快適な研究ライフを送りたいならセットアップする価値はあると思います。

今回の用途では活用できなかったパイプラインの機能など、ClearMLには他にも様々な機能があるので、研究室のユースケースに合わせてぜひ色々試してみてください。

おわりに

今回は、研究室にMLOpsツールを導入してみて感じたことをお伝えしました。MLOps系のツールが大学の研究活動にも役立つことを知っていただけたら幸いです。

ClearML導入後の方が研究の本質的な部分に時間を使えている実感があり、ClearMLを導入していないメンバーと比較してもゼミ等における議論が活発になっていると感じています。

自動化できる部分は自動化して、より研究の本質的な作業に使える時間を増やしていきましょう!

脚注
  1. オンプレにこだわりが無ければ、公式が運用しているサーバーを使うこともできます。もちろん無料では容量などの利用制限はあります。 ↩︎

  2. 内部実装を見たところ、PytorchLightningをサポートしているというより、PytorchLightningがデフォルトでTensorboardに記録する挙動を利用して、実際にはTensorboardの関数経由で記録しているといった方が正しそうです。 ↩︎

Discussion

ログインするとコメントできます