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

ランタイム多重ロードの意義はなにか #1148

Closed
tarepan opened this issue Mar 28, 2024 · 4 comments
Closed

ランタイム多重ロードの意義はなにか #1148

tarepan opened this issue Mar 28, 2024 · 4 comments

Comments

@tarepan
Copy link
Contributor

tarepan commented Mar 28, 2024

質問の内容

現在の VIOCEVOX ENGINE はランタイム多重ロードをサポートしている(README.md#音声ライブラリを直接指定する)。
一方、多重ロードした際の正常動作は「最新版のonnxruntime等が使われる」と定義されている(#1133)。
つまり、多重ロードしても使われるのは 1 つのランタイムのみ、という状態になっている。

このような背景から以下の質問があります:

Q: ランタイム多重ロードの意義はなにか

core_wrapper.py の履歴を遡りましたが、ヒントとなる情報はありませんでした(追記: core_wrapper.py initial commit の PR #254 にヒントがあるかも)。
実装上の考慮事項をかなり増やしている機能なので、その意義を知りたいと感じます。

VOICEVOXのバージョン

0.18.0

@tarepan tarepan added the 要議論 実行する前に議論が必要そうなもの label Mar 28, 2024
@Hiroshiba
Copy link
Member

少なくとも自分はissueを見て初めて課題を認識しました!
libtorch版・onnxruntime版それぞれ1つだけ読み込む実装のが良さそうに感じます!

@takana-v @PickledChair もし認識違いあればコメントいただけると…!

@takana-v
Copy link
Member

takana-v commented Apr 6, 2024

--runtime_dirが複数使用可能な理由については、libtorchとonnxruntimeで別のディレクトリを指定することを可能にするためだったと記憶しています。
(多重ロードについては、実装当初は考慮から漏れていたのではないかと思います。少なくとも自分は考慮から漏れていました。)

同名のライブラリを複数読み込んだ場合の挙動は、一番初めに読み込んだものを使うようになっているようです。
https://ikb.hatenablog.com/entry/20110830/1314684440
そのため、現在の挙動としては、
--runtime_dir--voicevox_dirもしくはengine_root
の順でディレクトリ内を検索し、先に見つかったものが使われるのではないかと思います。
(それでも見つからない場合は、ctypes.util.find_libraryの検索結果が使われる)

@PickledChair
Copy link
Member

PickledChair commented Apr 6, 2024

実のところ --runtime_dir を任意個指定可能である理由を自分はよくわかっていませんでした(@Hiroshiba ということで、むしろ自分の方が当時から認識違いを抱えていたと思います)。

#254 の作業が行われた際、これは複数コアの作業 VOICEVOX/voicevox_project#3 の文脈で行われていました。自分は VOICEVOX/voicevox_project#3 (comment) を読んで「1つのプロセスで同時に(libtorch 版、onnxruntime 版の区別なく)複数のコアをロードしたい」というモチベーションがあるのだという先入観を持ってレビューに参加していました。

この先入観から、--runtime_dir を任意個指定可能である理由は「任意個のコアそれぞれが依存している runtime を全て個別に(同じように任意個)指定してロードできるようにする」という機能を実現するためと思っていました(よく考えるとちょっと変な考えでしたが。 #254 (comment) のコメントを見ると、さらにコアやランタイムが遅延して読み込まれるという勘違いもしていたようです)。しかしその認識は当時の takana-v さんとのやり取りの中で思い違いであるとわかりました #254 (comment) 。このコメントの内容は takana-v さんが上で

--runtime_dirが複数使用可能な理由については、libtorchとonnxruntimeで別のディレクトリを指定することを可能にするためだったと記憶しています。

とおっしゃっていることと同じ趣旨であり、当時の自分もとりあえず同じような理解をしました。つまり基本的には libtorch と onnxruntime を任意個ではなくそれぞれ1個ずつ指定するためにこの機能が実装されたという理解です。

今これらを踏まえて思うのは、この仕様であれば --runtime_dir を複数指定できるようにするのではなく、--onnxruntime_dir--libtorch_dir といったオプションでオプション引数を1個ずつ指定できるようにする方が自然だったのかな、ということです。しかし当時は多くの機能追加が行われている最中であり、--runtime_dir を任意個指定可能にしたのは進行中の作業に関連する別の実装意図がまだあるのではと勝手に勘繰っていて、このことについては特に質問していませんでした(このようにして、tarepan さんが「ヒントとなる情報はありませんでした」とおっしゃっている通り、実装意図を明確に記した文章が残されないままになっていました。質問しておけば良かったですね……)。

(その後 VOICEVOX/voicevox_project#3 (comment) に書かれているとおり、複数コアのモチベーションの一部はコア側が複数モデルを持てるようにすることで実現されてきているため、複数コア周りの機能追加への欲求は下火になったと認識していました。)

現時点では Hiroshiba さんが

libtorch版・onnxruntime版それぞれ1つだけ読み込む実装のが良さそうに感じます!

とおっしゃっていることに同意です。

@tarepan
Copy link
Contributor Author

tarepan commented Apr 6, 2024

--runtime_dir 複数指定の設計意図に関しては

(takana-v)
--runtime_dirが複数使用可能な理由については、libtorchとonnxruntimeで別のディレクトリを指定することを可能にするため

(PickledChair)
基本的には libtorch と onnxruntime を任意個ではなくそれぞれ1個ずつ指定するためにこの機能が実装されたという理解

とのことなので、種別の異なるランタイムの並列読み込み(例: libtorch/ort)が設計意図と理解しました。


ランタイム多重ロードに関しては

(Hiroshiba)
初めて課題を認識

(takana-v)
多重ロードについては ... 自分は考慮から漏れ

(PickledChair)
「任意個のコアそれぞれが依存している runtime を全て個別に(同じように任意個)指定してロードできるようにする」という機能を実現するため ... しかしその認識は当時の takana-v さんとのやり取りの中で思い違いであるとわかりました

とのことなので、意図せず可能になった挙動だと理解しました。
ゆえに「Q: ランタイム多重ロードの意義はなにか」の回答は「意義以前に意図せず可能になった挙動」になりそうです。


意図せず可能になった挙動(多重ロード)の実動作に関しては

(takana-v)
--runtime_dir--voicevox_dirもしくはengine_root
の順でディレクトリ内を検索し、先に見つかったものが使われる

とのことなので、1 つのランタイムのみが利用される形と推定される、と理解しました。


理想的なランタイム読み込み設計・挙動に関しては

(Hiroshiba)
libtorch版・onnxruntime版それぞれ1つだけ読み込む実装のが良さそう

(takana-v)
--runtime_dirが複数使用可能な理由については、libtorchとonnxruntimeで別のディレクトリを指定することを可能にするため

(PickledChair)
現時点では Hiroshiba さんが

libtorch版・onnxruntime版それぞれ1つだけ読み込む実装のが良さそうに感じます!

とおっしゃっていることに同意

とのことなので、種別の異なるランタイムが各 1 つ指定可能・指定時は並列読み込み(例: libtorch/ort)、が理想的と理解しました。


当時の実装背景・レビュー進行等ふくめ、非常によく理解できました。
コア読み込み周りの仕様整理・リファクタリングへ大いに役立つ情報でした。

@Hiroshiba さん、@takana-v さん、@PickledChair さんありがとうございました!

@tarepan tarepan closed this as completed Apr 6, 2024
@tarepan tarepan removed the 要議論 実行する前に議論が必要そうなもの label Apr 6, 2024
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

No branches or pull requests

4 participants