-
Notifications
You must be signed in to change notification settings - Fork 198
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
アーキテクチャを考慮した共有ライブラリのロードをする #324
Comments
個人的に、ライブラリのロードに際してアーキテクチャを考慮する必要はないと思っています。 あくまで個人的な意見ですし、私の見識が狭いだけかもしれないですが... その他のonnxruntimeを利用する際のコードは単純にミスな気がします... P.S. 私自身アーキテクチャを分ける目的がいまいち見えていない気がしたのですが、aarch64などでは現状書かれているlibtorchやonnxruntimeのライブラリ以外に何か必要ということでしょうか....?(だとしたら話は変わってくると思います) |
確かに、そちらのほうが良さそうです。
わかりました。
このIssueで取り上げている問題は、VOICEVOX Coreのファイル名が
ですので、この他にライブラリが必要というわけではありません。 |
ご質問ありがとうございます。私は実装者ではないのですが、この部分の変更が行われた PR のレビューに参加していたので、このコードの意図がある程度わかっているつもりで解答させていただきます(もしかしたら考え違いがあるかもしれないので、その場合はコードの正しい意図をどなたかご教示いただけると幸いです)。
不自然なコードに見えるのは、おそらくこの部分のコードが「GPU を使用するかどうか」を切り替えるものではなく、「GPU 対応の core を使用するかどうか」を決定するコードであることに起因していると思われます(GPU 対応の core でも CPU モードを使うことができるので、GPU を使用するかどうかと GPU 対応の core を使用するかどうかは異なった問題になります)。また、
の両方を利用可能にしていることも、このコードの意図の分かりにくさの一因となっているように思います。
|
build-windows: | |
strategy: | |
matrix: | |
include: | |
# Windows CPU | |
- os: windows-2019 | |
python_architecture: 'x64' | |
voicevox_core_dll_name: core_cpu_x64.dll | |
onnxruntime_url: https://github.com/microsoft/onnxruntime/releases/download/v1.10.0/onnxruntime-win-x64-1.10.0.zip | |
ccache_url: https://github.com/ccache/ccache/releases/download/v4.4.1/ccache-4.4.1-windows-64.zip | |
artifact_name: windows-cpu | |
nuitka_cache_path: nuitka_cache | |
pip_cache_path: ~\AppData\Local\pip\Cache | |
# Windows NVIDIA GPU | |
- os: windows-2019 | |
python_architecture: 'x64' | |
voicevox_core_dll_name: core_gpu_x64_nvidia.dll | |
onnxruntime_url: https://github.com/microsoft/onnxruntime/releases/download/v1.10.0/onnxruntime-win-x64-gpu-1.10.0.zip | |
cuda_version: '11.4.2' | |
cudnn_url: https://developer.download.nvidia.com/compute/redist/cudnn/v8.2.4/cudnn-11.4-windows-x64-v8.2.4.15.zip | |
ccache_url: https://github.com/ccache/ccache/releases/download/v4.4.1/ccache-4.4.1-windows-64.zip | |
artifact_name: windows-nvidia | |
nuitka_cache_path: nuitka_cache | |
pip_cache_path: ~\AppData\Local\pip\Cache |
voicevox_engine/.github/workflows/build.yml
Line 657 in c7cda72
--include-data-file="download/core/${{ matrix.voicevox_core_dll_name }}=./" \ |
このことから、use_gpu
フラグを用いなくても core のファイル名からその core が GPU 対応版であるかどうかが判別できます。core_gpu_x64_nvidia.dll
の読み込みが失敗すれば、代わりに CPU 版の core が存在すると仮定して core_cpu_x64.dll
を読み込もうとします。その後、以下の self.core.initialize(".", use_gpu, cpu_num_threads)
の実行で GPU を使用するかどうかを core に伝えています(CPU 版のコア使用時に use_gpu
が True
だった場合は False
が返ると思いますが):
if not self.core.initialize(".", use_gpu, cpu_num_threads): |
https://github.com/VOICEVOX/voicevox_core/releases で配布されている core を使用する場合でも、core の名前が ENGINE 内蔵版と同じであるため、必要な処理は共通になります。
libtorch
版の core を読み込む場合
libtorch
版の場合は少し複雑で、--voicelib_dir
オプションに渡すパスが VOIEVOX ENGINE のパスであるか、あるいは https://github.com/VOICEVOX/voicevox_core/releases で配布されている core のパスであるかで、core の名前が違うということに注意しなければなりません。
#254 がマージされる以前は、以下に示すように、VOICEVOX ENGINE に同梱される core は GPU 版・CPU 版ともに core.dll
にリネームされるようになっていました。:
voicevox_engine/.github/workflows/build.yml
Lines 399 to 422 in cc6836a
build-windows: | |
strategy: | |
matrix: | |
include: | |
# Windows CPU | |
- os: windows-2019 | |
python_architecture: 'x64' | |
voicevox_core_dll_name: core_cpu_x64.dll | |
onnxruntime_url: https://github.com/microsoft/onnxruntime/releases/download/v1.10.0/onnxruntime-win-x64-1.10.0.zip | |
ccache_url: https://github.com/ccache/ccache/releases/download/v4.4.1/ccache-4.4.1-windows-64.zip | |
artifact_name: windows-cpu | |
nuitka_cache_path: nuitka_cache | |
pip_cache_path: ~\AppData\Local\pip\Cache | |
# Windows NVIDIA GPU | |
- os: windows-2019 | |
python_architecture: 'x64' | |
voicevox_core_dll_name: core_gpu_x64_nvidia.dll | |
onnxruntime_url: https://github.com/microsoft/onnxruntime/releases/download/v1.10.0/onnxruntime-win-x64-gpu-1.10.0.zip | |
cuda_version: '11.4.2' | |
cudnn_url: https://developer.download.nvidia.com/compute/redist/cudnn/v8.2.4/cudnn-11.4-windows-x64-v8.2.4.15.zip | |
ccache_url: https://github.com/ccache/ccache/releases/download/v4.4.1/ccache-4.4.1-windows-64.zip | |
artifact_name: windows-nvidia | |
nuitka_cache_path: nuitka_cache | |
pip_cache_path: ~\AppData\Local\pip\Cache |
voicevox_engine/.github/workflows/build.yml
Line 673 in cc6836a
cp download/core/${{ matrix.voicevox_core_dll_name }} download/voicevox_core_source/example/python/core.dll |
つまり、ENGINE 同梱の core を読み込む場合は use_gpu
フラグを使用する必要はなく、一律に core.dll
を読み込むようにすれば良いということになります。逆に言えば、ENGINE 同梱の core は initialize するまではそれが GPU 対応版であるかどうかを判断することが不可能です。
一方、https://github.com/VOICEVOX/voicevox_core/releases で配布されている core はリネーム前であるため、GPU 版の core は core.dll
、CPU 版の core は core_cpu.dll
という名前になっています。ここで、ENGINE 同梱の core を読み込む時のように一律に core.dll
をまず読み込む、ということにすると、CPU 版の core である core_cpu.dll
を使用する手段がなくなってしまいます。そこで、use_gpu
フラグが False
であるときは、優先的に core_cpu.dll
を読み込むようにする、ということにして、これを通して CPU 版の core を使用できるようにしていると考えられます。その上で、実際に GPU を使用するかどうかは onnxruntime
版 core を使用するときと同様に self.core.initialize(".", use_gpu)
で指定します。
改善の余地がありそうな点
以下の2点が考えられます:
libtorch
版 core を読み込む処理で、use_gpu
がFalse
である時にcore_cpu.dll
をまず読み込むようにする、という意図がコードから伝わりづらいload_core
関数のuse_gpu
という引数の名称・役割が紛らわしい
1点目について
直観的には use_gpu
フラグが True
である時に core.dll
を読み込む、という処理が強調されているように見えます。繰り返しになってしまいますが、おそらくこの部分のコードの本来の意図は use_gpu
が False
である時にまず core_cpu.dll
を読み込むことによって、https://github.com/VOICEVOX/voicevox_core/releases で配布されている core の CPU 版の方を利用可能にする、ということだと思われます。したがって、そちらの処理の方が強調されるべきだと思われました。
2点目について
load_core
関数は GPU を使用するかどうかに関わっていません。GPU 対応版 core を使用するかどうかを担っています。したがって、use_gpu
という引数名は紛らわしいものであり、役割も「優先的に core_cpu.dll
を読み込むかどうか判断する」という、名前からは想像しづらいものです。use_cpu_core
などという引数に変えると同時に、「優先的に core_cpu.dll
を読み込むかどうか判断する」という処理は load_core
関数の外部に出してしまった方が意図が分かりやすくなるかも、と感じました(改善策についてはもっと良い案があるかもしれません)。
すみません、自分の文章を読み返して気づいたのですが、 一方、 |
あー、なるほど...! ただ、コードの煩雑さ的にこれを実装するのはやはり保守性の問題を避けられないと思うので、どこか妥協点を探したいところです(個人的にはハードコードされるのは ただ、現状の汎用コアロード実装のモチベーションとして、releasesやVOICEVOXディレクトリをそのまま使用したいという点があるのかなと思います。 最初に提案されている通り、エンジン自体をアーキテクチャを考慮した形に変更するのが一番楽なんですかね...(私にもわかりません...) |
@HyodaKazuaki @y-chan これまでの意見や提案をまとめると、考慮すべき事項が大きく分けて3つありそうでした:
このうち最初の2つをどう整理・実現するかはっきりさせることが重要そうです。3つ目の使い勝手も最終的に外してはならない要素ですが、最初の2つの整理なしには議論できなさそうな気がします。 個人的には、アーキテクチャ・GPU依存/非依存をユーザーが明示的に指定して起動できる仕組みを最初に作り、その後に、明示的指定がない場合に暗黙的にロードすべきコアを選択する仕組みを作る方法が一番堅実だと感じます(後者が「使い勝手」を担う部分です)。 条件を明示的に指定して起動する仕組みを実装するにあたっては、 |
なるほどです!
たしか
仮にエディタでエンジンを起動しようとすると結局platformで自動判別が必要になるので、ここを明示的に指定としても全体的な複雑性は変わらないかもです。
なので、こちらが良いのかなと思いました。 結構ややこしい課題だなぁと感じました。 「明示的に指定」「platformで自動判定」の他にも、「コア配布パッケージを良い感じにする」手もあると思います。 明示的に指定はエンジン的には綺麗ですが、結局エディタ側に複雑性が移るだけなるかもと思いました。 となると自動判定か配布パッケージの改善ですが、正直保守を考えると自動判定が一番楽なのかなと感じました。 |
コアの複雑さをフロントエンドまで持ち込む必要はないので、エンジンあたりで処理してしまうのがいいかと思います。 ところで1つ疑問なのですが、GPUでも利用可能なコア(ここではGPUコアと呼びます)をロードし、失敗した場合にCPUで利用可能なコア(ここではCPUコアと呼びます)をロードする仕様はなぜ存在しているのでしょうか? ("たられば"で申し訳ないのですが)コアを |
core.zipを解凍したものを |
OSやアーキテクチャごとにzipを分けるのは賛成なのですが、過去のReleaseをどう扱うかは微妙に困ってたりします。 |
なるほど、回答ありがとうございます。 おそらくこのあたりはかなり複雑で、後方互換性を必ず維持するという体制を取り続けるのであれば簡単に決められることではなさそうです。 |
まあ、いつか考えないといけないことを今考えてただけなので・・・! |
内容
#322 (comment) にあるように、VOICEVOXエンジンはアーキテクチャを考慮して共有ライブラリをロードする機構がありません。
このIssueでは、この機能を実装することを提案します。
Pros 良くなる点
x86_64以外のアーキテクチャ(aarch64など)で共有ライブラリをロードすることができるようになる。
Cons 悪くなる点
実現方法に記載するように、アーキテクチャの情報は
platform
ライブラリを使って取得します。しかし、これで得られる値はコンピュータによって様々です。
例えば、64bitのIntel/AMD CPUでは、
x86_64
/x64
/AMD64
などの値が返ってきます。そのため、これらを網羅しなければならないのですが、
platform
ライブラリのドキュメントには記載がありません。https://docs.python.org/ja/3/library/platform.html#platform.machine
これにより、対応しているアーキテクチャを持ったコンピュータが弾かれてしまい、利用できない可能性があります。
実現方法
Pythonの
platform
ライブラリを利用します。以下の各関数で行われているOS判定に加えて、アーキテクチャの判定を行います。
voicevox_engine/voicevox_engine/synthesis_engine/core_wrapper.py
Lines 11 to 33 in c7cda72
voicevox_engine/voicevox_engine/synthesis_engine/core_wrapper.py
Lines 36 to 56 in c7cda72
voicevox_engine/voicevox_engine/synthesis_engine/core_wrapper.py
Lines 59 to 109 in c7cda72
その他
#322 を実現するために必要なIssueです。
私(@HyodaKazuaki )が担当します。
コードを確認していた所、
onnxruntime
をバックエンドに利用する場合にGPUフラグが動作していないように思えました。voicevox_engine/voicevox_engine/synthesis_engine/core_wrapper.py
Lines 65 to 80 in c7cda72
これは正常な仕様でしょうか?
The text was updated successfully, but these errors were encountered: