Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

【Techの道も一歩から】第44回「Prefectでパイプラインを構築してみる」

f:id:kanjirz50:20190104142720j:plain

こんにちは。 DSOC R&D グループの高橋寛治です。

本記事は Sansan Advent Calendar 2021 - Adventar の初日の記事です*1

Pythonによるパイプラインツールについて、Prefectというフレームワークが良さそうという話を小耳に挟みました。

第42回の記事と同様にMNISTを題材にパイプラインを作ってみます。

buildersbox.corp-sansan.com

Prefect

Prefectは、Pythonで書かれたオープンソースのワークフロー管理システムです。

特徴は、タスクを定義し、タスクを利用したフローを書くというシンプルな構成となっていることです。 タスクはフローを構成する処理を表します。 タスクとフローを定義する箇所以外は、Prefectが吸収してくれます。

説明よりも実際のコードを見た方が早いと思いますので、MNISTを題材に見ていきます。

パイプラインを構築する

MNISTデータセットを取得し、前処理、学習、評価を行う単純なパイプラインを構築します。

タスクは、クラスもしくは関数で定義します。 ここでは、関数によるタスクを例に挙げます。

from prefect import task, Flow
from sklearn.datasets import load_digits


@task
def load_digits_data():
    return load_digits()


def build_mnist_experiment_flow():
    with Flow("mnist-experiment-flow") as flow:
        digits_data = load_digits_data()

    return flow


flow = build_mnist_experiment_flow()
flow.run()

タスクを実装する関数にtaskデコレータを適用します。

フローについては、with文の中で定義します。 上記の例だと、build_mnist_experiment_flow関数で何をするかを記述します。

次にパラメータです。 安直ですが、学習とテストの分け方の乱数の種をパラメータで与えることを考えます。

from prefect import Parameter

# 中略

@task
def preprocesing_task(digits_data, random_state):
    X_train, X_test, y_train, y_test = train_test_split(
        digits_data.images.reshape((len(digits_data.images), -1)),
        digits_data.target,
        test_size=0.5,
        shuffle=True,
        random_state=random_state
    )

    dataset = {
        "X_train": X_train,
        "X_test": X_test,
        "y_train": y_train,
        "y_test": y_test
    }

    return dataset


def build_mnist_experiment_flow():
    with Flow("mnist-experiment-flow") as flow:
        random_state = Parameter("random_state", default=42)

        digits_data = load_digits_data()
        dataset = preprocesing_task(digits_data, random_state)

    return flow


flow = build_mnist_experiment_flow()
flow.run(random_state=42)

フロー作成時に、Parameterによりパラメータを定義します。 これにより、flow.run時に引数としてパラメータを与えることが可能となります。

こちらをもとに学習や評価を追加したコードはこちらにあります。 実行すると、モデルや評価結果が出力されます。

github.com

Prefectを使ってみて

まだPrefectの一部の機能しか使えていませんが、かなり簡素にパイプラインを記述できることがわかりました。

処理の流れが、with文内で一望できるというのは、見通しがいいように思います。

UIによる可視化や、キャッシュ機構、タスクライブラリなど、ワークフローを扱う上で使う機能が実装されているようですので、勉強して使ってみたいと思います。

執筆者プロフィール

高橋寛治 Sansan株式会社 DSOC (Data Strategy & Operation Center) R&Dグループ研究員

阿南工業高等専門学校卒業後に、長岡技術科学大学に編入学。同大学大学院電気電子情報工学専攻修了。在学中は、自然言語処理の研究に取り組み、解析ツールの開発や機械翻訳に関連する研究を行う。大学院を卒業後、2017年にSansan株式会社に入社。キーワード抽出など自然言語処理を生かした研究に取り組む。

▼執筆者による連載記事はこちら

buildersbox.corp-sansan.com

*1:他の年のアドベントカレンダーはこちらです。2020, 2019, 2018, 2017

© Sansan, Inc.