Closed sakamomo554101 closed 2 years ago
MLFlowとかで学習パイプラインを作ってみようかなぁ
create_initial_model.pyをkedroのパイプライン処理に落としていけば良い。
kedroのrunnerとしては、Apache Sparkが使えて、AWSで動かす場合は、EMRを使うのが良さそう?(あんまりここらへん良くわかっていない)
とりあえずローカルで学習できるようにするか・・
うーむ、kedroのプロジェクトをリポジトリに含めた方が楽な気もするなぁ。
DataCatalogのCSVDataSetを使って、trainやtestのcsvデータを入れるのが多分正しいが、ちょっとコード修正が面倒なので、一旦MemoryDatasetにパス情報を埋め込む感じがいいかな
https://kedro.readthedocs.io/en/stable/02_get_started/04_new_project.html#create-a-new-project-from-a-configuration-file config.ymlに設定して、Kedroプロジェクトを作成することが可能
https://kedro.readthedocs.io/en/stable/02_get_started/06_starters.html#list-of-official-starters
kedroプロジェクト作成時のstarter(テンプレート的な)は上記にリストアップされてる。
https://github.com/quantumblacklabs/kedro-docker
dockerfileを自前で作っても良いけど、kedro-dockerでやるのが楽そう?
https://github.com/quantumblacklabs/kedro-docker#generating-a-dockerfile
kedro projectのルートでコマンド実行すると、勝手にdockerfile作って、docker image作成やcontainer作成が出来そう。 なるほど、便利だな。
やることを整理する。
パイプラインを別インスタンスでやるケースを考えると、モデルファイルは実際はクラウドのモデルリポジトリに保存する感じなんだろうな(kedroにそういう仕組みはあるのか?)
https://cyberagent.ai/blog/research/12898/ 参考になりそうな情報
モデルファイルや実験結果の格納はLogging的な機能となるから、MLFlowを使うのが手頃そうではある。 ※Kubeflowには全部揃ってるけどね・・(ハイパラチューニング、Logging、Workflow)
HyperParameterはkedroのparameters.ymlに書けば良いかなーと思ったが、後々HPOをする際にOptunaやHydraと組み合わせる際にはちょっと面倒そうである。
下記のように、kedroのProjectContextを外部から注入させる感じにすれば良さそう? https://scrapbox.io/miyamonz/optuna%E3%81%A8kedro%E3%82%92%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B
Hydraって、パラメーター管理用のフレームワークってイメージか https://ymym3412.hatenablog.com/entry/2020/02/09/034644
https://kedro.readthedocs.io/en/stable/03_tutorial/04_create_pipelines.html#slice-a-pipeline Data Pipelineのsliceできるいいな。
データ取得部分+学習部分+モデル保存とかでわけて、必要箇所だけ都度実施するのが効率よさそう。 (ハイパラチューニング時は学習部分のみ対応する的な)
単純にparameters.ymlにハイパラを出力するようにすると、parameters.ymlが無限増殖(チューニング範囲の分だけparameters.ymlができてしまう)するので、そこをHydraでラッピングすると、繋ぎ込みがスムーズそう。 (ちょっと今回のissueでは対象外かなぁ。まずはparameters.ymlのハイパラをそのまま使う感じに留める)
nodeの返し方に問題がありそう。
Traceback (most recent call last):
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/bin/kedro", line 10, in <module>
sys.exit(main())
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/kedro/framework/cli/cli.py", line 269, in main
cli_collection()
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/click/core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/kedro/framework/cli/cli.py", line 209, in main
super().main(
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/Users/shotasakamoto/development/python/YouyakuAI/model_pipeline/src/youyaku_ai_model_pipeline/cli.py", line 160, in run
session.run(
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/kedro/framework/session/session.py", line 408, in run
run_result = runner.run(filtered_pipeline, catalog, run_id)
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/kedro/runner/runner.py", line 106, in run
self._run(pipeline, catalog, run_id)
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/kedro/runner/sequential_runner.py", line 90, in _run
run_node(node, catalog, self._is_async, run_id)
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/kedro/runner/runner.py", line 218, in run_node
node = _run_node_sequential(node, catalog, run_id)
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/kedro/runner/runner.py", line 303, in _run_node_sequential
outputs = _call_node_run(node, catalog, inputs, is_async, run_id=run_id)
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/kedro/runner/runner.py", line 271, in _call_node_run
raise exc
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/kedro/runner/runner.py", line 261, in _call_node_run
outputs = node.run(inputs)
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/kedro/pipeline/node.py", line 466, in run
raise exc
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/kedro/pipeline/node.py", line 461, in run
return self._outputs_to_dictionary(outputs)
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/kedro/pipeline/node.py", line 567, in _outputs_to_dictionary
return _from_list()
File "/Users/shotasakamoto/.pyenv/versions/3.8.3/lib/python3.8/site-packages/kedro/pipeline/node.py", line 536, in _from_list
raise ValueError(
ValueError: Failed to save outputs of node preprocess: preprocess([parameters]) -> [preprocess_outputs].
The node definition contains a list of outputs ['preprocess_outputs'], whereas the node function returned a `dict`.
https://kedro.readthedocs.io/en/stable/06_nodes_and_pipelines/01_nodes.html#syntax-for-output-variables list, dictではsyntaxが違うっぽいな。
データ取得用のパイプラインも作ってしまう。
パイプライン構成としては、
kedroのDataCatalogでデータセットを扱えるように(DataFrameとする)、testやtrainで分ける処理もDataFrameで対応し、DataFrameで受け取れるようにtrain処理も修正するか。
https://kedro.readthedocs.io/en/stable/03_tutorial/04_create_pipelines.html#slice-a-pipeline
上記のように--pipelineオプションをつけて、処理を走らせられる
下記のログの意味はちょっと調べておきたい
kedro.framework.session.store - INFO - `save()` not implemented for `BaseSessionStore`. Skipping the step.
https://kedro.readthedocs.io/en/stable/05_data/01_data_catalog.html
datacatalogを用いて、pytorchのモデルファイルを保存したいが、どうやるのがよい?
https://kedro.readthedocs.io/en/stable/kedro.extras.datasets.html
上記を見ると、pytorchのモデルフォーマットには対応してなさそう
例えば、CSVDataSetとかを参考にして、hugging faceのモデル保存用のクラスを作ってしまうかなぁ
https://www.mlflow.org/docs/latest/python_api/mlflow.pytorch.html
mlflowを用いて、モデル保存するという手もあるな(kedroはworkflowのみで、モデル管理ふくめたloggingはmlflowに任せる感じ)
https://recruit.gmo.jp/engineer/jisedai/blog/kedro_and_mlflow_tracking/
公式も確認必要だけど、RestfulなAPI経由でデータ取得する場合には、DataCatalogに登録するだけで、よしなにとってくれそう。(つまり、実装が減りそう)
https://kedro.readthedocs.io/en/latest/10_deployment/06_kubeflow.html kubeflowへの変換 ※VertexAI Pipelineを使う際にkedro -> kfp -> VertexAI、としたい。
kubeflowでの実装し直しをすることにした。その方がシンプルそうだし。 https://github.com/kubeflow/pipelines/blob/master/sdk/python/kfp/dsl/types.py#L67-L72
parametersをdictにした場合、ちゃんとcomponentに渡せそう
data_generatorとtrainerは実装したから、次はパイプライン の実装を行う。 ※各componentの簡易的な試験もパス済み
パイプライン で、ローカルにもリモートにもデプロイできるようにしたい。 ちょっと検討する。
https://www.kubeflow.org/docs/components/pipelines/sdk/build-pipeline/
pipelineのbuild時にpipeline_rootをどう渡すかが悩ましい
以下のエラーがよくわからん・
TypeError: Input "train_data_path" with type "{'String': OrderedDict([('data_type', 'CSV')])}" cannot be paired with InputPathPlaceholder.
上記エラーは、inputPathではなく、inputValueを設定すればOKだった。 ※これでパイプライン処理が全て通るかは検証が必要だなぁ。
まだ結構先は長いな・・
dockerHub(リモート)にdocker imageはデプロイしないと動かない? ※ローカルのdocker imageは見てくれない?
もう面倒だから、先にリモート(GCP)で動かすようにしちゃおうかな・・
下記エラーが出て、docker imageがpullできていない。
This step is in Pending state with this message: ErrImagePull: rpc error: code = Unknown desc = Error response from daemon: pull access denied for data-generator, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
imageはdocker hubにpush済み https://hub.docker.com/repository/docker/shotasakamomo554101/trainer https://hub.docker.com/repository/docker/shotasakamomo554101/data_generator
わかった、docker hostが入ってないからか・・。入れる。
yamlをロードする処理がいくつもあるから、共通化したい。
data-generatorの名前が間違ってた・・。imageはpullできるようになった。 (ひょっとして、ローカルのdocker imageを取れていなかったのも、名前の違いかも・・)
次は以下のエラーがdata_generatorの実行中に発生。
failed to save outputs: Request entity too large: limit is 3145728
kfp.dsl.InputArgumentPathを使って、outputに指定している文字列に被せてみる。 ※多分、パス、と明示的に指定すれば、大丈夫かもしれない・・
GPUを使えるようにもしたい