Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ONNX Runtimeとモデルのシグネチャを隔離する #675

Merged
merged 48 commits into from
Nov 16, 2023

Conversation

qryxip
Copy link
Member

@qryxip qryxip commented Nov 5, 2023

内容

ONNX Runtimeとモデルのシグネチャ(?)の存在を、別のモジュールに分離します。

以下の改革の前準備です。

#553 (comment)

関連 Issue

#545

その他

@Hiroshiba
Copy link
Member

なかなか巨大になりそうですね…!!
お待ちしてます!!

@qryxip qryxip marked this pull request as ready for review November 6, 2023 17:36
@qryxip
Copy link
Member Author

qryxip commented Nov 6, 2023

大体考えて組んだので、draftを外します。

モジュールinferの登場人物は主に3つに分けられます。これらをもとに抽象化を組んでいます。
(ただinfer.rsは115行しかないといっても、中身の圧が強いのでファイル分割すべきかもしれません)

  • trait InferenceRuntime (e.g. Onnxruntime)
    • trait Session
    • trait RunBuilder
    • trait InputScalar (e.g. i64, f32)
  • trait Signature
    • trait Output (e.g. (Vec<f32>,))
    • enum SignatureKind { PredictDuration, PredictIntonation, Decode })
      • struct PredictDuration: Signature<Kind = SignatureKind>
      • struct PredictIntonation: Signature<Kind = SignatureKind>
      • struct Decode: Signature<Kind = SignatureKind>
  • struct SessionSet<K (= SignatureKind), R: InferenceRuntime>
    • struct SessionOptions

補足としては:

  • onnxruntime-rsを触る部分はまとめてcrate::infer::runtimes::onnxruntimeに隔離しました。
  • model_fileモジュール (復号部分), SessionOptions, SessionSet, InferenceModelsなどはinferモジュールに移しました。
    • status::SessionSetvoice_model::InferenceModelsenum-mapクレートを用いてEnumMap<SignatureKind, …>のような形で表現しています。
  • <R: InferenceRuntime>の型引数はSynthesisEngineのあたりで止めています。またSignatureKind (= PredicutDuration | …)もstatusモジュールに直接登場させています。
  • 将来の変更に対する耐性としては、次のように考えています。
    • ONNX Runtime以外のランタイム(e.g. TFLite)を導入するときは、crates::infer::runtimesに新しいランタイムを増設します。
      • featureを導入し、コンパイル時にONNX Runtimeと切り替えられるようにします。
      • ただVVMの仕様も含め、パブリックAPI部分の変更はそもそもどのみち避けられないかと思います。
    • モデルのシグネチャや数を変更するときは、crate::infer::signatureを変更します。
      • ([f32],)以外の出力にするときは、infer/runtimes/onnxruntime.rsのimpl Output<Onnxruntime> for (Vec<f32>,)の部分を拡張します。
      • predict部分のモデルとdecodeのモデルを別々に分けて読み込みたい、という需要が将来発生した場合、enum SignatureKindの存在を二つに分割してそれぞれについてEnumMapを管理します。
      • 3-モデルの組と4-モデルの組を同時に扱いたいとなったときもenum SignatureKindを複数作って抽象化します。

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

見渡しました!
input/outputの加工用関数の非対称性が気になりましたが、全体的に良い感じなのかなと思いました!

Copy link
Member

@sevenc-nanashi sevenc-nanashi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ヒホさんと同意見ですー。

@qryxip
Copy link
Member Author

qryxip commented Nov 8, 2023

色々再構成しました。
e0f29c6
cb1db34
c3e08dd
e4b91ab
8584d27
4795309
a5dbbdd
525f4b1

主な変更点として:

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ほぼLGTMです!!

コードの読み方がわかりました。onnxruntime.rsを読んで、signature.rsを読んでからinfer.rsを読むとわかりやすいですね!

ドキュメントを作っておかないと迷子になると思います。
と言っても大層なものは必要なくて、infer.rsのそれぞれのtraitやimplに1行ずつ目的を書いていくだけでだいぶ変わるかなと!

あと、実装レビューの前に設計レビューをすると良かったかもとか思いました。

今まではonnxruntime周りが煩雑だったがゆえに、変更が生じても適当に書き足せば良かったのですが、今回で理路整然となるので、追加の実装をしたいときにどこに足せば良いか分からなくなるだろうなと思いました。
project-sなどで関数を追加したり形を変えたりすることがちょっとありそうですが、その際は相談させていただけると・・・!!

crates/voicevox_core/src/infer.rs Outdated Show resolved Hide resolved
crates/voicevox_core/src/infer.rs Outdated Show resolved Hide resolved
crates/voicevox_core/src/infer.rs Outdated Show resolved Hide resolved
@qryxip
Copy link
Member Author

qryxip commented Nov 14, 2023

@qryxip
Copy link
Member Author

qryxip commented Nov 14, 2023

であれば、もう一旦マージして、階層構造を小さくすることに取り組むのが良いのかなと思いました。 実装していく上でまた新しい課題が見つかったりもする可能性も全然あると思いますし。

構造の変更はもうこのプルリクエスト内ではやめて、名称の変更やドキュメントの追加だけにして、次に進むというのはどうでしょう・・・? (1回のレビューに3時間かかっており。。。。)

はい。それがよいと思います。

階層構造ですが、今InferenceCoreでやっている「入出力のworkaround処理」をdomain.rs(旧signatures.rs)に移せれば、こんな感じにできるのではと思っています。

synthesizer.rs --+--> infer/status.rs -----> infer/runtimes/
                 +--> infer/domain.rs
                 |
                 +--> open_jtalk.rs

@Hiroshiba
Copy link
Member

こんな感じにできるのではと思っています。

なるほどです、良さそうに思いました!!

なんとなくの直感ですが、statusがかなり多くの責務を担いそうだなと思いました。statusという名称が曖昧なので便利屋さんみたいになりがちかも。将来なんか名前変えられると良さそう!
あとSynthesizerが何を見れるべきかを考えていくとアーキテクチャ作りやすいのかなとか思いました。RuntimeやSessionは見れるべきではない、など?

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ほぼLGTMです!!

Domainのとこだけ落としどころが見つかれば完成なのかなと思いました!!

crates/voicevox_core/src/infer.rs Outdated Show resolved Hide resolved
crates/voicevox_core/src/infer/domain.rs Outdated Show resolved Hide resolved
crates/voicevox_core/src/infer/status.rs Show resolved Hide resolved
crates/voicevox_core/src/infer/status.rs Outdated Show resolved Hide resolved
crates/voicevox_core/src/infer.rs Outdated Show resolved Hide resolved
@qryxip qryxip mentioned this pull request Nov 15, 2023
69 tasks
@qryxip
Copy link
Member Author

qryxip commented Nov 15, 2023

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!!!!!!

お疲れ様でした!!!!
良い切り分けができたのではないかなと思います!!!

Interfaceの設計をレビューするということに慣れておらず、右往左往してしまってすみませんでした 🙇
(コードがある場合は、先に実装を見て書き心地を把握し、ドメイン用語の認識をそろえて、設計方針の認識を揃えていくのが良さそうだと思いました!)

一気に多層構造も切り崩していきたいですね・・・!!!

@qryxip
Copy link
Member Author

qryxip commented Nov 15, 2023

@qryxip
Copy link
Member Author

qryxip commented Nov 16, 2023

@Hiroshiba
Copy link
Member

修正確認しました!!マージします!!!

@Hiroshiba Hiroshiba merged commit 68edcc9 into VOICEVOX:main Nov 16, 2023
44 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants