こんにちは。 DSOC R&D グループの高橋寛治です。
最近は、ことあるごとにMLOpsと言っています。 そんなMLOpsの本丸とも言えるパイプラインツールの一つであるgokartを開発された西場さん(@m_nishiba)が部長ということで、使ってみないわけにはいかないgokartを使ってみました*1。
わからないときは、直接聞けます。
Luigiとgokart
LuigiはSpotifyが開発しているPythonによるパイプラインパッケージです。
下記の以前の記事でも紹介しましたが、Luigiが提供するお作法(クラス設計)に従うことで、依存関係を持つパイプラインを簡潔に記載することができます。
gokartはLuigiのラッパーとして、チーム開発を志向した機械学習パイプラインに特化した機能を提供しています。
使ってみて感じた特徴を二つあげます。
一つ目に、入出力の制約が強くなっていることがあげられます。
Luigiでは入出力を行うために、様々な記述が必要です。
一方のgokartではload
メソッドとdump
メソッドが用意されており、基本的に記述が不要となります。
pickleでシリアライズされ、入出力の方式が統一されることとなります。
機械学習でありがちな、形式を考慮しながら読み書きするといったコードが不要になります。
二つ目に、再現性を担保するための入出力の記録がフレームワークによりサポートされることがあげられます。 タスクへのパラメータが異なると、パラメータごとのハッシュがファイル名に自動的に付与されて出力されます。 これにより、機械学習でありがちな一部のパラメータを変えて再実行する場合において、過去の結果の利用が容易となります。 仮にLuigiで実現する場合はパラメータをファイル名に加えたり、gokartと同様にハッシュを計算したりといった工夫を自分で記述する必要があると思います。
他に、TaskInstanceParameterと呼ばれるタスクをパラメータとして渡せる機能がありますが、次のサンプルコードでは使っていないため割愛します。
MNISTを題材とした機械学習パイプラインで比べる
サンプルコードを書いてみました。 MNISTデータセットを取得し、前処理、学習、評価を行う単純なパイプラインです。
mnist-gokartはcookiecutterを利用してプロジェクトを作成しています。
一つ目の特徴で述べた入出力の制約について、わかりやすい箇所を上げます。 なお、下記ではgokartとLuigiの例を併記していますが、実際は別ファイルとなります。
# luigiやgokart関連のimportは省略 from sklearn.datasets import load_digits # gokartの例(mnist_gokart/model/mnist.py) class GetMNISTDatasetTask(GokartTask): def run(self): digits = load_digits() self.dump(digits) # Luigiの例(mnist_luigi/tasks/data_fetcher.py) class GetMNISTDatasetTask(luigi.Task): def output(self): return luigi.LocalTarget( "data/mnist.pickle", format=luigi.format.Nop ) def run(self): digits = load_digits() with self.output().open("wb") as fout: joblib.dump(digits, fout)
一目でわかるように、出力ファイルの設定が不要となります。
ボイラープレートコードを記述することなく、run
部分、すなわち実際の処理に集中してコードを書くことができます。
二つ目の特徴については、前処理のrandom_state
を変更して実行すると結果がわかるかと思います。
使いどころを考えて
Luigiもgokartもいずれもお作法に則った記法を行うことで、パイプラインを簡潔に記述および構築することができます。 gokartは中間ファイルの記録が省略されることから、機械学習モデルの構築や分析といった試行錯誤を行うタスクにおいて、特に優れていると思います。
またフレームワークのメリットとして、記法を理解することで、他メンバーが書いたコードが実行できて読めるようになります。 これは、データ分析や機械学習プロジェクトにおいて競争力の一つであると思います。
ひとまず、分析業務ではgokartを使ってみようと思います。
執筆者プロフィール
高橋寛治 Sansan株式会社 DSOC (Data Strategy & Operation Center) R&Dグループ研究員
阿南工業高等専門学校卒業後に、長岡技術科学大学に編入学。同大学大学院電気電子情報工学専攻修了。在学中は、自然言語処理の研究に取り組み、解析ツールの開発や機械翻訳に関連する研究を行う。大学院を卒業後、2017年にSansan株式会社に入社。キーワード抽出など自然言語処理を生かした研究に取り組む。
▼執筆者による連載記事はこちら
*1:強制されている訳ではありません笑