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

Windows用自動ビルド: ONNX版コアに対応 #251

Merged
merged 24 commits into from
Jan 1, 2022

Conversation

aoirint
Copy link
Member

@aoirint aoirint commented Dec 28, 2021

内容

Windows用自動ビルドをONNX版コア(0.10.preview.0)に対応させます。

  • 自動ビルド

fork先で自動ビルドされたバイナリでの動作を確認したらDraftを外します。

ノート

  • ONNX Runtimeを同梱します
  • CUDA/cuDNNのうち、必要なライブラリのみ同梱します

onnxruntime_providers_cuda.dll の依存ライブラリ

関連 Issue

スクリーンショット・動画など

その他

@coveralls
Copy link

coveralls commented Dec 28, 2021

Pull Request Test Coverage Report for Build 1636106990

  • 0 of 0 changed or added relevant lines in 0 files are covered.
  • No unchanged relevant lines lost coverage.
  • Overall coverage remained the same at 86.633%

Totals Coverage Status
Change from base Build 1628679916: 0.0%
Covered Lines: 687
Relevant Lines: 793

💛 - Coveralls

@github-actions
Copy link

github-actions bot commented Dec 28, 2021

Coverage Result

Resultを開く
Name Stmts Miss Cover
voicevox_engine/init.py 0 0 coverage-100%
voicevox_engine/acoustic_feature_extractor.py 85 0 coverage-100%
voicevox_engine/dev/synthesis_engine/init.py 2 0 coverage-100%
voicevox_engine/dev/synthesis_engine/mock.py 30 1 coverage-97%
voicevox_engine/full_context_label.py 162 3 coverage-98%
voicevox_engine/kana_parser.py 87 1 coverage-99%
voicevox_engine/model.py 70 7 coverage-90%
voicevox_engine/mora_list.py 4 0 coverage-100%
voicevox_engine/preset/Preset.py 12 0 coverage-100%
voicevox_engine/preset/PresetLoader.py 34 1 coverage-97%
voicevox_engine/preset/init.py 3 0 coverage-100%
voicevox_engine/synthesis_engine/init.py 5 0 coverage-100%
voicevox_engine/synthesis_engine/forwarder.py 76 66 coverage-13%
voicevox_engine/synthesis_engine/make_synthesis_engine.py 23 18 coverage-22%
voicevox_engine/synthesis_engine/synthesis_engine.py 108 0 coverage-100%
voicevox_engine/synthesis_engine/synthesis_engine_base.py 55 6 coverage-89%
voicevox_engine/utility/init.py 2 0 coverage-100%
voicevox_engine/utility/connect_base64_waves.py 35 3 coverage-91%
TOTAL 793 106 coverage-87%

@aoirint
Copy link
Member Author

aoirint commented Dec 29, 2021

core.dllについて、NuitkaがコアPythonモジュールの依存に従ってrun.dist/core.dllに配置しますが、コアPythonモジュールはrun.dist/core/_core.pydに配置するので、Windows用の__init__.pyの実装でrun.dist/core/lib/core.dllから読みだそうとして起動しないようです。

ビルド後にrun.dist/core.dllrun.dist/core/lib/core.dllに移動すれば動作するようにはなります。

Nuitkaのビルド時設定でPythonコアモジュールのpackage dataを含めるようにする方法もありそうで、run.dist/core/lib(core.dllとONNX Runtimeが入っている)が配置されますが、core.dllは別途run.dist/core.dllにもコピーされると思うので、二重になってしまいそうなのと、Linuxとビルド後の後処理が変わってしまいます。

onnxruntime.dllonnxruntime_providers_*.dllとの間にはdumpbinやobjdumpで見える依存関係がないので、Nuitkaはcore.dllが依存するonnxruntime.dllをコピーしますが、onnxruntime_providers_*.dllはコピーしません。(Pythonコード中でctypes.cdll.LoadLibraryした場合のように。Linuxでも同様)。
このため、後処理でonnxruntime_providers_*.dllをコピーして追加しています。
onnxruntime_providers_*.dllはCUDA/cuDNNに依存しているので、こちらも後処理で追加しています。

二重にコピーされず、Linuxとも共通化できれば、core.dllとONNX Runtimeはコアが意図しているrun.dist/core/libに配置するのがよさそうではあります。

@aoirint
Copy link
Member Author

aoirint commented Dec 29, 2021

run.dist/core/lib/にcore.dll、ONNX Runtime、CUDA/cuDNNをすべて配置すると、cuDNNの共有ライブラリが読み込めないようでした。

$ ./run.exe --use_gpu
Could not load library cudnn_ops_infer64_8.dll. Error code 126
Please make sure cudnn_ops_infer64_8.dll is in your library path!

core.dll、ONNX Runtimeをrun.dist/core/lib/に配置し、CUDA/cuDNNをrun.dist/に配置すると動作します。ONNX Runtimeはrun.dist/でも、run.dist/core/lib/でも動作します(onnxruntime.dllonnxruntime_providers_*.dllは同じディレクトリ)。

コアPythonパッケージの配置に合わせて、この構成にしてみます。

@aoirint
Copy link
Member Author

aoirint commented Dec 30, 2021

Linux版でlibcore.soとONNX Runtimeをrun.dist/core/lib/に移動させてみましたが、起動しませんでした。
Windowsではcore.dllとONNX Runtimeをrun.dist/core/lib/に配置し、Linuxではrun.dist/に配置することになりそうです。

また、製品版でlibcore.soが読み込めないと、Mockコアのmetasの呼び出しでVERSION.txtの読み出しができず、起動に失敗することに気づきました。
pathlibを使うと、(ビルド後に)実際には存在しないパス(voicevox_engine/dev/core/)を扱えないのかもしれません。

version = (mock_dir / ".." / ".." / ".." / "VERSION.txt").read_text().strip()

$ ./run 
Traceback (most recent call last):
  File "/0.10.preview.0-aoirint-linux-2/linux-cpu/voicevox_engine/synthesis_engine/make_synthesis_engine.py", line 35, in make_synthesis_engine
  File "/0.10.preview.0-aoirint-linux-2/linux-cpu/core/__init__.py", line 130, in <module core>
ImportError: libcore.so: cannot open shared object file: No such file or directory
Notice: mock-library will be used. Try re-run with valid --voicevox_dir
Traceback (most recent call last):
  File "/0.10.preview.0-aoirint-linux-2/linux-cpu/run.py", line 517, in <module>
  File "/0.10.preview.0-aoirint-linux-2/linux-cpu/voicevox_engine/synthesis_engine/make_synthesis_engine.py", line 63, in make_synthesis_engine
  File "/0.10.preview.0-aoirint-linux-2/linux-cpu/voicevox_engine/dev/core/mock.py", line 72, in metas
  File "/0.10.preview.0-aoirint-linux-2/linux-cpu/pathlib.py", line 1236, in read_text
  File "/0.10.preview.0-aoirint-linux-2/linux-cpu/pathlib.py", line 1222, in open
  File "/0.10.preview.0-aoirint-linux-2/linux-cpu/pathlib.py", line 1078, in _opener
FileNotFoundError: [Errno 2] No such file or directory: '/0.10.preview.0-aoirint-linux-2/linux-cpu/voicevox_engine/dev/core/../../../VERSION.txt'

@aoirint aoirint marked this pull request as ready for review December 30, 2021 04:23
@Hiroshiba
Copy link
Member

なるほどです。

もしそちらの方が楽or綺麗になりそうだったら、今のcoreのsetup.pyを利用しないのも選択肢としてありかもと思いました。
core側に改変を入れる、engine側にcoreの導入スクリプトを書く、 #254 のようなラッパー?を使う、などの方法を思いつきました!

@aoirint
Copy link
Member Author

aoirint commented Dec 30, 2021

共有ライブラリの配置について、Workaround処理の場所としては以下の2箇所が関係します。

# Workaround: Move core.dll to run.dist/core/lib/
# Nuitka copies core.dll to run.dist/core.dll
# but core Python module will load core.dll from run.dist/core/lib/core.dll.
mkdir -p run.dist/core/lib
mv run.dist/core.dll run.dist/core/lib/
mv run.dist/onnxruntime.dll run.dist/core/lib/

# ONNX Runtime providers (Nuitka does not copy dynamic loaded libraries)
ln -sf "$(pwd)/download/onnxruntime/lib"/onnxruntime_*.dll artifact/core/lib/

もしcoreの共有ライブラリの読み込み挙動が元に戻ったときは、1つ目の処理を削除して、2つ目の処理の宛先をartifact/に変える形になります。

macOSのPR #257 では、NuitkaがコアPythonモジュールの直接依存するlibcore.dylibはrun.dist/にコピーしますが、孫依存にあたるONNX Runtimeをコピーしないという挙動になったので、いまのところ同じようにlibonnxruntime.dylibについてはこちらでrun.dist/にコピーするWorkaroundを実装しています(--include-data-fileでもcpでも単にコピーされるだけで、特別な処理はされない)。

--include-data-file=../download/onnxruntime/lib/libonnxruntime.*.dylib=./ \

LinuxのPR #249 では、Nuitkaがlibcore.soとlibonnxruntime.soをrun.dist/にコピーする(Windowsと同じ)という挙動になりました。

OS依存の処理にはなりますが、OS間の挙動の違いを把握できていればこのままでいいかなと思っています。

もし共通してコアの依存する共有ライブラリをcore/libに配置できれば、run.exeと同じディレクトリにたくさんファイルが展開されていて見通しが悪いのを軽減できそうではあります。

#251 (comment)

ctypes実装 #254 がマージされて、最新のコアもctypes実装で扱うことができれば、コアをPythonモジュールとしてインストールする必要がなくなって、解消されるのかなと思っています。

@Hiroshiba
Copy link
Member

なるほどです、詳細にありがとうございます。
ちょっとまだ完全に理解はできていないのですが、とりあえずOS依存で処理を変える方向でお願いします・・・!

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!!!!

ログを見てみましたが、ディスク容量はかなり余裕がありそうですね!!
かなり身軽になれたことが実感できました。

Copy link
Contributor

@Yosshi999 Yosshi999 left a comment

Choose a reason for hiding this comment

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

LGTM!

@Hiroshiba Hiroshiba merged commit 2b83b43 into VOICEVOX:master Jan 1, 2022
@aoirint aoirint deleted the patch-onnx-autobuild-windows branch October 9, 2023 02:58
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.

4 participants