やましなぶろぐ

機械学習ワークフロー管理のkedro

開発初期段階の環境を構築する

🕒 Last mod: 2020-11-20


1. 機械学習ワークフロー管理のkedroで開発初期段階の環境を構築する

機械学習分野で開発しているとスクリプトが乱造されてすぐに収拾つかなくなってしまいます。

少しでも生成物を整理したいのでワークフロー管理のkedroを試してみます。

2. 開発初期段階を想定したkedro環境

この記事では開発初期段階を想定したkedro環境開発を目標とします。

ディレクトリやスクリプトがきれいに整理分割されたパイプラインができれば良いのでしょうが開発初期段階からそこを目指すのは違うような気がします。

開発初期段階ではまず動くものを作成して、それからリファクタリングする流れが一般的でしょう。

kedroのチュートリアルはリファクタリング後のきれいすぎる環境に感じました。その前段階のまずは動くものを作成する環境を構築します。

3. 公式のチュートリアルについて

公式のTutorialが充実しているので基本的にはそちらを参照すれば事足りるでしょう。

ただ、Hello World Example は単純すぎるし、Tutorialは最初に触るには複雑すぎます。

この2つの中間ぐらいの単純すぎず複雑過ぎない環境を構築してみます。

4. プロジェクトの処理内容

今回はモデルを構築することではなく環境構築にフォーカスしています。

実現する処理はシンプルです。csvファイルをコピーするだけです。

01_row/test.csv を 02_preprocessed_test.csvにコピーします。

この処理をnodeとpipelineで実現します。

5. 環境構築手順

5.1. venv環境作成

terminal
python -m venv venv
source venv/bin/activate

5.2. kedroのインストール

terminal
pip install kedro

5.3. kedroプロジェクト作成

プロジェクト概要のconfig.ymlを作成します。

terminal
cat <<'EOL' > config.yml
output_dir: .
project_name: trial
repo_name: trial
python_package: trial
include_example: false
EOL

config.ymlを読み込んでプロジェクトを作成します。

terminal
kedro new -c ./config.yml
cd trial

5.4. 必要なパッケージのインストール

必要なパッケージをsrc/requirements.txtで定義しkedro installします。

terminal
cat <<'EOL' > src/requirements.txt
ipython
pandas
EOL

kedro install

5.5. test.csv作成

terminal
cat <<'EOL' > data/01_raw/test.csv
var1, var2
1,a
2,b
EOL

5.6. catalog.yml作成

慣れるまでは少し難し感じますがkedroで一番大事なのはcatalog.ymlだと考えています。詳細は公式のマニュアルを良く読んで理解しましょう。

kedro ipythonを実行するとcatalog.ymlの内容がcatalogオブジェクトとして参照できます。

terminal
cat <<'EOL' > conf/base/catalog.yml
test:
  type: pandas.CSVDataSet
  filepath: data/01_raw/test.csv

preprocessed_test:
  type: pandas.CSVDataSet
  filepath: data/02_intermediate/preprocessed_test.csv

EOL

5.7. readwrite.py作成

開発の初期段階ということで処理する関数とnodeとpipelineと実行を一つのスクリプトにまとめます。

terminal
cat <<'EOL' > src/trial/pipelines/readwrite.py
from kedro.pipeline import node, Pipeline
from kedro.runner import SequentialRunner

def preprocess_test(test):
    return test

pipeline = Pipeline(
    [
        node(
            func=preprocess_test,
            inputs="test",
            outputs="preprocessed_test",
            name="preprocessing_test",
        ),
    ]
)
SequentialRunner().run(pipeline, catalog=catalog)
EOL

5.8. 実行

terminal
kedro ipython

#%load src/trial/pipelines/readwrite.py

6. まとめ

実際に手を動かしたことでkedro環境についての理解が深まりました。

公式のtutorialをなぞるだけでは分からないことも多かったので今後もいろいろ試したいと思います。

最後に今回の処理をまとめたシェルスクリプトです。

exampel.sh
python -m venv venv
source venv/bin/activate

pip install kedro

cat <<'EOL' > config.yml
output_dir: .
project_name: trial
repo_name: trial
python_package: trial
include_example: false
EOL


kedro new -c ./config.yml
cd trial


cat <<'EOL' > src/requirements.txt
ipython
pandas
EOL
kedro install


cat <<'EOL' > data/01_raw/test.csv
var1, var2
1,a
2,b
EOL


cat <<'EOL' > conf/base/catalog.yml
test:
  type: pandas.CSVDataSet
  filepath: data/01_raw/test.csv

preprocessed_test:
  type: pandas.CSVDataSet
  filepath: data/02_intermediate/preprocessed_test.csv

EOL


cat <<'EOL' > src/trial/pipelines/readwrite.py
from kedro.pipeline import node, Pipeline
from kedro.runner import SequentialRunner

def preprocess_test(test):
    return test

pipeline = Pipeline(
    [
        node(
            func=preprocess_test,
            inputs="test",
            outputs="preprocessed_test",
            name="preprocessing_test",
        ),
    ]
)
SequentialRunner().run(pipeline, catalog=catalog)
EOL

kedro ipython

# %load src/trial/pipelines/readwrite.py