MLOpsフレームワーク Kedro入門


はじめに

最近人気なMLOpsフレームワークのKedroを紹介したいと思います。
日本語の記事が少ないため、この記事が何かの参考になれば幸いです。

本記事では、Kedroの中の中心的なコンセプトと実際の使い方、サンプルの動かし方を説明します。
また、筆者の経験から、導入時のメリットや相性の良いMLOpsツールなども紹介しています。

Kedroとは

KedroとはオープンソースのMLOps用Pythonフレームワークです。Kedroを使うことでコードの保守のしやすさや再利用性を考慮したデータサイエンスプロジェクトを作成することができます。2022/3/31時点でGithubのスター数が6800程度と類似ツールの中では人気がある方です。

MLOpsの文脈で言うと、データカタログやパイプラインの管理なんかを提供してくれます。
また、Spark、Airflow、Kubeflowなどのツールとの統合も提供されています。

インストール方法

# pip
pip install kedro

# conda
conda install -c conda-forge kedro

2022/3/31日時点でPython3.7以下でしかインストールできないので注意。(参考Issue

Hello Worldとコンセプトの解説

公式ドキュメントで紹介されているチュートリアルコードの再掲です。

hello_kedro.py
from kedro.io import DataCatalog, MemoryDataSet
from kedro.pipeline import node, Pipeline
from kedro.runner import SequentialRunner

# Prepare a data catalog
data_catalog = DataCatalog({"my_salutation": MemoryDataSet()})

def return_greeting():
    return "Hello"


def join_statements(greeting):
    return f"{greeting} Kedro!"
    
# Prepare first node  
return_greeting_node = node(func=return_greeting, inputs=None, outputs="my_salutation")
# Prepare second node
join_statements_node = node(
    join_statements, inputs="my_salutation", outputs="my_message"
)

# Assemble nodes into a pipeline
pipeline = Pipeline([return_greeting_node, join_statements_node])

# Create a runner to run the pipeline
runner = SequentialRunner()

# Run the pipelinet
print(runner.run(pipeline, data_catalog))

hello_kedro.pyに保存した後、Pythonで実行します。

python hello_kedro.py
# {'my_message': 'Hello Kedro!'}

解説

Node

Nodeでは最終的に実行するパイプラインの各ステップで実行したい処理をPython関数として定義します。
inputs, outputsでNodeの依存関係を定義することができます。この例では、join_statements_nodeinputsとしてmy_salutationをしてすることで、return_greeting_nodeのoutputsを入力にとるように定義しています。

Pipeline

PipelineにNodeのリストを渡すことで処理パイプラインが構築されます。ちなみにこの時、Pipelineに渡すリストの順番は任意で構いません。具体的にはこの例の Pipelineは以下のように定義しても同様に動作します。

pipeline = Pipeline([join_statements_node, return_greeting_node])

DataCatalog

DataCatalogはNodeのinputsもしくはoutputs をKeyとして受け取り、Datasetに書き出す、もしくは読み込みます。
Datasetはファイルへの読み書き機能を提供し、さまざまなファイルフォーマットへ対応しています。今回の例では、MemoryDataSetを使ってメモリにデータをストアしています。そのほかのDatasetこちらから確認できます。

Runner

Pipelineの実行を担当します。Pipelineの最初から最後まで実行し、最終的な結果を出力します。

Kedro Project

Hello WorldではKedroの機能を使って自分でパイプラインを定義しましたが、Kedroにはプロジェクトをテンプレートから作成する機能があります。
基本的にこの機能を使ってプロジェクトを作成していくことになります。

Projectの作成

2通りのプロジェクト作成方法があります。

  1. シェルインタラクティブ

以下のコマンドを実行すると、インタラクティブにプロジェクトを作成していくことができます。

kedro new

イメージはpoetry initとかに近いですかね。質問された通りに、project_name, repo_name, python_packageを入力するとプロジェクトが作成されます。

  1. Configファイルから作成

以下のようなconfig.yamlを作成します。

config.yaml
output_dir: ~/code
project_name: Get Started
repo_name: get-started
python_package: get_started

以下のコマンドを実行することでプロジェクトを作成できます。チームでプロジェクト名を自動生成したいときなんかはこちらを使うことが多いです。

kedro new --config config.yml

Irisデータセットをつかったプロジェクト例

starterpandas-iris を指定することでirisデータセットのテンプレートプロジェクトを作成することができます。

kedro new --starter=pandas-iris

実行すると以下のようなディレクトリが作成されていると思います。

<DIRECTORY_NAME>    # Parent directory of the template
├── conf            # Project configuration files
├── data            # Local project data (not committed to version control)
├── docs            # Project documentation
├── logs            # Project output logs (not committed to version control)
├── notebooks       # Project related Jupyter notebooks (can be used for experimental code before moving the code to src)
├── README.md       # Project README
├── setup.cfg       # Configuration options for `pytest` when doing `kedro test` and for the `isort` utility when doing `kedro lint`
└── src             # Project source code

以下のコマンドで依存パッケージのインストールとパイプラインの実行が行えます。

cd <DIRECTORY_NAME>
# Install dependecy
kedro install
# Run pipeline
kedro run

ここで押さえておきたいポイントとしては以下の通りです。

  • src/<package_name>以下にPipelineとNodeが定義してある
  • conf/base以下にデータカタログやパラメータを設定したファイルが置いてある。
    • conf/base/catalog.ymlで設定したデータセットはNodeの引数として指定できる。
    • conf/base/parameters.ymlで設定したパラメータはparams:xxx のような形でNodeの引数として指定できる。(参照

実際にパイプラインを実行してみてわかったと思いますが、依存関係の管理から実行まで直感的に利用できます。kedroを導入することで、部署や組織においてコードの属人性の排除などで大きなメリットを得られる可能性があります。

その他のIrisを使ったハンズオンの詳細な説明は公式ドキュメントに譲りたいと思います。

その他便利なコマンドなど

jupyterをインストールした環境で以下を実行することでkedro環境でjupyterを起動できる。

kedro jupyter notebook
kedro jupyter lab

IPythonも同様。

kedro ipython

Jupyterセルにnodeタグをつけて以下を実行することでsrc/<package_name>/nodes/以下に対象のセルのコードを自動でコピーできます。
タグの付け方はこちらを参考にしてください。

kedro jupyter convert <filepath_to_my_notebook>

その他のMLOpsツールとの使い方

 
最初に言及した通り、KedroはデータカタログとPipeline、プロジェクト管理などを提供してくれます。
他のMLOpsツールと用いるとしたら、wandbmlflowによる実験管理やkubeflowmlflowを用いたモデルのデプロイなんかは相性がいいです。
ちなみに、kedroで作成したパイプラインをKubeflow Pipelineに変換してそのまま実行できたりもします。

大規模処理をする場合はSparkやAirflowをバックエンドにして実行することもできます。

終わりに

チームの状況によってはKedroを導入することで得られるメリットは大きそうですね。プロジェクト自体活発に開発が進んでいるので、とりあえず導入してみるのもいいかと思います。
今回の記事が何かの参考になれば幸いです。