sakamomo554101 / YouyakuAI

日本語用の要約を行うデモサービス
0 stars 0 forks source link

モデルの学習パイプラインの作成(ローカル実行でOK) #16

Closed sakamomo554101 closed 2 years ago

sakamomo554101 commented 3 years ago

GPUを使えるようにもしたい

sakamomo554101 commented 3 years ago

MLFlowとかで学習パイプラインを作ってみようかなぁ

sakamomo554101 commented 3 years ago
sakamomo554101 commented 3 years ago

create_initial_model.pyをkedroのパイプライン処理に落としていけば良い。

sakamomo554101 commented 3 years ago

kedroのrunnerとしては、Apache Sparkが使えて、AWSで動かす場合は、EMRを使うのが良さそう?(あんまりここらへん良くわかっていない)

sakamomo554101 commented 3 years ago
sakamomo554101 commented 3 years ago

とりあえずローカルで学習できるようにするか・・

sakamomo554101 commented 3 years ago
sakamomo554101 commented 3 years ago

うーむ、kedroのプロジェクトをリポジトリに含めた方が楽な気もするなぁ。

sakamomo554101 commented 3 years ago

DataCatalogのCSVDataSetを使って、trainやtestのcsvデータを入れるのが多分正しいが、ちょっとコード修正が面倒なので、一旦MemoryDatasetにパス情報を埋め込む感じがいいかな

sakamomo554101 commented 3 years ago

https://kedro.readthedocs.io/en/stable/02_get_started/04_new_project.html#create-a-new-project-from-a-configuration-file config.ymlに設定して、Kedroプロジェクトを作成することが可能

sakamomo554101 commented 3 years ago

https://kedro.readthedocs.io/en/stable/02_get_started/06_starters.html#list-of-official-starters

kedroプロジェクト作成時のstarter(テンプレート的な)は上記にリストアップされてる。

sakamomo554101 commented 3 years ago

https://github.com/quantumblacklabs/kedro-docker

dockerfileを自前で作っても良いけど、kedro-dockerでやるのが楽そう?

sakamomo554101 commented 3 years ago

https://github.com/quantumblacklabs/kedro-docker#generating-a-dockerfile

kedro projectのルートでコマンド実行すると、勝手にdockerfile作って、docker image作成やcontainer作成が出来そう。 なるほど、便利だな。

sakamomo554101 commented 3 years ago

やることを整理する。

sakamomo554101 commented 3 years ago

パイプラインを別インスタンスでやるケースを考えると、モデルファイルは実際はクラウドのモデルリポジトリに保存する感じなんだろうな(kedroにそういう仕組みはあるのか?)

sakamomo554101 commented 3 years ago

https://cyberagent.ai/blog/research/12898/ 参考になりそうな情報

sakamomo554101 commented 3 years ago

モデルファイルや実験結果の格納はLogging的な機能となるから、MLFlowを使うのが手頃そうではある。 ※Kubeflowには全部揃ってるけどね・・(ハイパラチューニング、Logging、Workflow)

sakamomo554101 commented 3 years ago

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

sakamomo554101 commented 3 years ago

Hydraって、パラメーター管理用のフレームワークってイメージか https://ymym3412.hatenablog.com/entry/2020/02/09/034644

sakamomo554101 commented 3 years ago

https://kedro.readthedocs.io/en/stable/03_tutorial/04_create_pipelines.html#slice-a-pipeline Data Pipelineのsliceできるいいな。

データ取得部分+学習部分+モデル保存とかでわけて、必要箇所だけ都度実施するのが効率よさそう。 (ハイパラチューニング時は学習部分のみ対応する的な)

sakamomo554101 commented 3 years ago

単純にparameters.ymlにハイパラを出力するようにすると、parameters.ymlが無限増殖(チューニング範囲の分だけparameters.ymlができてしまう)するので、そこをHydraでラッピングすると、繋ぎ込みがスムーズそう。 (ちょっと今回のissueでは対象外かなぁ。まずはparameters.ymlのハイパラをそのまま使う感じに留める)

sakamomo554101 commented 3 years ago

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`.
sakamomo554101 commented 3 years ago

https://kedro.readthedocs.io/en/stable/06_nodes_and_pipelines/01_nodes.html#syntax-for-output-variables list, dictではsyntaxが違うっぽいな。

sakamomo554101 commented 3 years ago

データ取得用のパイプラインも作ってしまう。

パイプライン構成としては、

sakamomo554101 commented 3 years ago

kedroのDataCatalogでデータセットを扱えるように(DataFrameとする)、testやtrainで分ける処理もDataFrameで対応し、DataFrameで受け取れるようにtrain処理も修正するか。

sakamomo554101 commented 3 years ago

https://kedro.readthedocs.io/en/stable/03_tutorial/04_create_pipelines.html#slice-a-pipeline

上記のように--pipelineオプションをつけて、処理を走らせられる

sakamomo554101 commented 3 years ago

下記のログの意味はちょっと調べておきたい

kedro.framework.session.store - INFO - `save()` not implemented for `BaseSessionStore`. Skipping the step.
sakamomo554101 commented 3 years ago

https://kedro.readthedocs.io/en/stable/05_data/01_data_catalog.html

datacatalogを用いて、pytorchのモデルファイルを保存したいが、どうやるのがよい?

sakamomo554101 commented 3 years ago

https://kedro.readthedocs.io/en/stable/kedro.extras.datasets.html

上記を見ると、pytorchのモデルフォーマットには対応してなさそう

sakamomo554101 commented 3 years ago

https://github.com/quantumblacklabs/kedro/blob/956dbed2289397b69506a8d79cca831032e89163/kedro/extras/datasets/pandas/csv_dataset.py#L48

例えば、CSVDataSetとかを参考にして、hugging faceのモデル保存用のクラスを作ってしまうかなぁ

sakamomo554101 commented 3 years ago

https://www.mlflow.org/docs/latest/python_api/mlflow.pytorch.html

mlflowを用いて、モデル保存するという手もあるな(kedroはworkflowのみで、モデル管理ふくめたloggingはmlflowに任せる感じ)

sakamomo554101 commented 3 years ago

https://recruit.gmo.jp/engineer/jisedai/blog/kedro_and_mlflow_tracking/

公式も確認必要だけど、RestfulなAPI経由でデータ取得する場合には、DataCatalogに登録するだけで、よしなにとってくれそう。(つまり、実装が減りそう)

sakamomo554101 commented 2 years ago

https://kedro.readthedocs.io/en/latest/10_deployment/06_kubeflow.html kubeflowへの変換 ※VertexAI Pipelineを使う際にkedro -> kfp -> VertexAI、としたい。

sakamomo554101 commented 2 years ago

kubeflowでの実装し直しをすることにした。その方がシンプルそうだし。 https://github.com/kubeflow/pipelines/blob/master/sdk/python/kfp/dsl/types.py#L67-L72

parametersをdictにした場合、ちゃんとcomponentに渡せそう

sakamomo554101 commented 2 years ago

data_generatorとtrainerは実装したから、次はパイプライン の実装を行う。 ※各componentの簡易的な試験もパス済み

sakamomo554101 commented 2 years ago

パイプライン で、ローカルにもリモートにもデプロイできるようにしたい。 ちょっと検討する。

sakamomo554101 commented 2 years ago

https://www.kubeflow.org/docs/components/pipelines/sdk/build-pipeline/

pipelineのbuild時にpipeline_rootをどう渡すかが悩ましい

sakamomo554101 commented 2 years ago

以下のエラーがよくわからん・

TypeError: Input "train_data_path" with type "{'String': OrderedDict([('data_type', 'CSV')])}" cannot be paired with InputPathPlaceholder.
sakamomo554101 commented 2 years ago

上記エラーは、inputPathではなく、inputValueを設定すればOKだった。 ※これでパイプライン処理が全て通るかは検証が必要だなぁ。

sakamomo554101 commented 2 years ago

残件整理

sakamomo554101 commented 2 years ago

まだ結構先は長いな・・

sakamomo554101 commented 2 years ago

dockerHub(リモート)にdocker imageはデプロイしないと動かない? ※ローカルのdocker imageは見てくれない?

sakamomo554101 commented 2 years ago

もう面倒だから、先にリモート(GCP)で動かすようにしちゃおうかな・・

sakamomo554101 commented 2 years ago

下記エラーが出て、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

sakamomo554101 commented 2 years ago

わかった、docker hostが入ってないからか・・。入れる。

sakamomo554101 commented 2 years ago

yamlをロードする処理がいくつもあるから、共通化したい。

sakamomo554101 commented 2 years ago

data-generatorの名前が間違ってた・・。imageはpullできるようになった。 (ひょっとして、ローカルのdocker imageを取れていなかったのも、名前の違いかも・・)

次は以下のエラーがdata_generatorの実行中に発生。

failed to save outputs: Request entity too large: limit is 3145728
sakamomo554101 commented 2 years ago

https://nbviewer.org/github/kubeflow/pipelines/blob/8dfa2d9/samples/tutorials/Data%20passing%20in%20python%20components.ipynb 上記を参考にした方が良いらしい

sakamomo554101 commented 2 years ago

kfp.dsl.InputArgumentPathを使って、outputに指定している文字列に被せてみる。 ※多分、パス、と明示的に指定すれば、大丈夫かもしれない・・