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

coreのctypes実装を追加&古いコアを利用できるようにする #254

Merged
merged 50 commits into from
Jan 24, 2022

Conversation

takana-v
Copy link
Member

内容

ctypesモジュールを利用してコアを読み込むモジュールを追加します。
また、このモジュールを利用して古いコアを利用できる機能を追加します。

関連 Issue

その他

Dockerやビルド周りに調整が必要そうなのでDraftです。

@coveralls
Copy link

coveralls commented Dec 29, 2021

Pull Request Test Coverage Report for Build 1739640316

  • 28 of 197 (14.21%) changed or added relevant lines in 3 files are covered.
  • No unchanged relevant lines lost coverage.
  • Overall coverage decreased (-16.01%) to 78.146%

Changes Missing Coverage Covered Lines Changed/Added Lines %
voicevox_engine/synthesis_engine/make_synthesis_engines.py 8 47 17.02%
voicevox_engine/synthesis_engine/core_wrapper.py 18 148 12.16%
Totals Coverage Status
Change from base Build 1730159048: -16.01%
Covered Lines: 683
Relevant Lines: 874

💛 - Coveralls

@github-actions
Copy link

github-actions bot commented Dec 29, 2021

Coverage Result

Resultを開く
Name Stmts Miss Cover
voicevox_engine/init.py 1 0 coverage-100%
voicevox_engine/acoustic_feature_extractor.py 75 0 coverage-100%
voicevox_engine/dev/synthesis_engine/init.py 2 0 coverage-100%
voicevox_engine/dev/synthesis_engine/mock.py 29 0 coverage-100%
voicevox_engine/full_context_label.py 167 5 coverage-97%
voicevox_engine/kana_parser.py 89 1 coverage-99%
voicevox_engine/model.py 71 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/core_wrapper.py 148 130 coverage-12%
voicevox_engine/synthesis_engine/make_synthesis_engines.py 47 39 coverage-17%
voicevox_engine/synthesis_engine/synthesis_engine.py 101 0 coverage-100%
voicevox_engine/synthesis_engine/synthesis_engine_base.py 49 5 coverage-90%
voicevox_engine/utility/init.py 2 0 coverage-100%
voicevox_engine/utility/connect_base64_waves.py 35 3 coverage-91%
TOTAL 874 191 coverage-78%

@takana-v
Copy link
Member Author

@takana-v takana-v force-pushed the use-ctypes branch 3 times, most recently from 1cd12ac to 8fcc7f2 Compare January 4, 2022 18:12
@takana-v
Copy link
Member Author

takana-v commented Jan 5, 2022

現時点での動作確認
https://github.com/takana-v/voicevox_engine/releases/tag/ctypes-test

--old_voicelib_dirで過去コアのフォルダ、--old_model_lib_dirでlibtorchもしくはonnxruntimeのフォルダ、
--old_model_typeでどちらの種類のコアか libtorch or onnxruntime(default)
以上の引数を設定することで過去コアを動かすことが可能
/docsとかから動作確認できます(過去コアはuse_old_core=trueで使用できます)

  • Windows CPU
  • Windows GPU
  • Linux CPU
  • Linux GPU
  • Mac CPU
  • Docker CPU
  • Docker GPU

一旦ドラフト外してレビュー&動作確認をしたいと思います。

Memo: GPU版はfinalizeしてないので終了時にcuda周りでエラーが出る

@takana-v takana-v marked this pull request as ready for review January 5, 2022 15:25
@takana-v
Copy link
Member Author

takana-v commented Jan 8, 2022

linuxのGPU版で過去コアを指定するとセグフォしたので一旦ドラフトにして原因を調査したいと思います。
(CPU版だとセグフォしないのでCUDA周り?もしかしたらWSL2でやってるのが原因かも)

~/tmp/linux-nvidia$ ./run --use_gpu --old_voicelib_dir=/home/takana/tmp/core
Segmentation fault

@takana-v takana-v marked this pull request as draft January 8, 2022 09:04
@takana-v takana-v marked this pull request as ready for review January 8, 2022 09:25
@takana-v
Copy link
Member Author

takana-v commented Jan 8, 2022

colabでGPU版の動作を試してみました。
--old_voicelib_dirを設定した場合でも問題なく動作したので恐らくセグフォはWSL2に固有の問題かと思います。

Macは持ってないのでどなたかテストしていただけるとありがたいです。
多分↓を実行するとテストできるかと思います。

wget https://github.com/takana-v/voicevox_engine/releases/download/ctypes-test/macos-x64.7z.001
wget https://github.com/VOICEVOX/voicevox_core/releases/download/0.10.preview.0/core.zip
7z x macos-x64.7z.001
7z x core.zip
chmod 755 macos-x64/run
cd macos-x64 && ./run --old_voicelib_dir=../core

@aoirint
Copy link
Member

aoirint commented Jan 9, 2022

macOS Big Sur 11.6.1で #254 (comment) を試してみました。

ONNX版コア0.10.preview.0は、音声合成まで動作しました。

LibTorch版コア0.7.4は、起動時に共有ライブラリの読み込みエラーになりました(LibTorch 1.9.1)。依存ツリーと読み込み順が関係していそうなので、順序を変えるのを試したいですね...(それでうまくいくかわからないので、ソースコードで試した方がよさそう)。

libtorch.dyliblibtorch_cpu.dylibに依存しているので、libtorch_cpu.dyliblibtorch.dylibより先に読み込む必要がありそうだと思いました。

$ ./run --old_voicelib_dir=../core --old_model_type=libtorch --old_model_lib_dir=/path/to/libtorch/lib
Traceback (most recent call last):
  File "/path/to/macos-x64/./voicevox_engine/synthesis_engine/make_synthesis_engine.py", line 51, in make_synthesis_engine
  File "/path/to/macos-x64/./voicevox_engine/synthesis_engine/core_wrapper.py", line 56, in __init__
  File "/path/to/macos-x64/./voicevox_engine/synthesis_engine/core_wrapper.py", line 45, in load_model_lib
  File "/path/to/macos-x64/./ctypes/__init__.py", line 373, in __init__
OSError: dlopen(/path/to/libtorch/lib/libtorch.dylib, 6): Library not loaded: @rpath/libtorch_cpu.dylib
  Referenced from: /path/to/libtorch/lib/libtorch.dylib
  Reason: image not found
Notice: Failed to make synthesis engine. This error will be ignored.
Traceback (most recent call last):
  File "/path/to/macos-x64/./run.py", line 552, in <module>
  File "/path/to/macos-x64/./voicevox_engine/synthesis_engine/make_synthesis_engine.py", line 83, in make_synthesis_engine
  File "/path/to/macos-x64/./voicevox_engine/dev/core/mock.py", line 72, in metas
  File "/path/to/macos-x64/./pathlib.py", line 1236, in read_text
  File "/path/to/macos-x64/./pathlib.py", line 1222, in open
  File "/path/to/macos-x64/./pathlib.py", line 1078, in _opener
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/macos-x64/voicevox_engine/dev/core/../../../VERSION.txt'

(バイナリ版でmock coreが動作しないのは別の問題 #251 (comment) ですね)

LibTorchの依存関係

$ otool -L libc10.dylib
libc10.dylib:
	@rpath/libc10.dylib (compatibility version 0.0.0, current version 0.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 902.1.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)

$ otool -L libtorch.dylib
libtorch.dylib:
	@rpath/libtorch.dylib (compatibility version 0.0.0, current version 0.0.0)
	@rpath/libtorch_cpu.dylib (compatibility version 0.0.0, current version 0.0.0)
	@rpath/libc10.dylib (compatibility version 0.0.0, current version 0.0.0)
	@rpath/libiomp5.dylib (compatibility version 5.0.0, current version 5.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 902.1.0)

$ otool -L libtorch_cpu.dylib
libtorch_cpu.dylib:
	@rpath/libtorch_cpu.dylib (compatibility version 0.0.0, current version 0.0.0)
	@rpath/libiomp5.dylib (compatibility version 5.0.0, current version 5.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)
	/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1677.104.0)
	/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
	@rpath/libc10.dylib (compatibility version 0.0.0, current version 0.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 902.1.0)

それから、引数から受け取ったパス中の~がホームディレクトリのパスになるようにexpand_userの処理があるとよさそうでした。

@PickledChair
Copy link
Member

PickledChair commented Jan 9, 2022

同じく、Mac (macOS Monterey 12.1) でテストしてみました。 @aoirint さんと同様、0.10.preview.0 のコアを用いた場合、成功しました。

ただし、0.10.preview.1 を使うと失敗します。libcore_cpu_x64.dylib がなくなり、代わりに libcore_cpu.dylib が同梱されているためのようです。

Traceback (most recent call last):
  File "/Users/suitcase/Downloads/macos-x64/voicevox_engine/synthesis_engine/make_synthesis_engine.py", line 51, in make_synthesis_engine
  File "/Users/suitcase/Downloads/macos-x64/voicevox_engine/synthesis_engine/core_wrapper.py", line 126, in __init__
  File "/Users/suitcase/Downloads/macos-x64/pathlib.py", line 1181, in resolve
  File "/Users/suitcase/Downloads/macos-x64/pathlib.py", line 363, in resolve
  File "/Users/suitcase/Downloads/macos-x64/pathlib.py", line 347, in _resolve
  File "/Users/suitcase/Downloads/macos-x64/pathlib.py", line 452, in readlink
FileNotFoundError: [Errno 2] No such file or directory: '/Users/suitcase/Downloads/core/libcore_cpu_x64.dylib'
Notice: Failed to make synthesis engine. This error will be ignored.
...

CPU アーキテクチャ名が名前から省かれたのは、 VOICEVOX/voicevox_core#60 を受けて Universal バイナリにしたからなのかと予想したのですが、以下のように確認してみると、Universal バイナリにはなっていないようです(x64 のまま)。何かの手違いかもしれないのでコア側に Issue を立てたいと思います。 そもそも Universal バイナリにしたわけではなさそうです……。早とちりでした。

$ cd core
$ lipo -archs libcore_cpu.dylib
x86_64
$ lipo -info libcore_cpu.dylib
Non-fat file: libcore_cpu.dylib is architecture: x86_64

(この PR では基本的に 0.10.preview.0 のコアまでを扱う、という感じでしょうか? 余計な情報でしたらすみません。一応参考情報として報告しました。)

@takana-v
Copy link
Member Author

とりあえず修正終わりました。
cancellableに関してはかなりめんどくさそうなので後回しです。
(本音を言うと機能ごと削除したいです。正直リターンが労力に見合わないので...)

Copy link
Member

@aoirint aoirint left a comment

Choose a reason for hiding this comment

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

よさそうでした! 対応ありがとうございます!
1点だけコメントを追加しました。

voicevox_engine/cancellable_engine.py Show resolved Hide resolved
@takana-v takana-v requested a review from aoirint January 24, 2022 11:49
Copy link
Member

@aoirint aoirint 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
Copy link
Member

Hiroshiba commented Jan 24, 2022

(本音を言うと機能ごと削除したいです。正直リターンが労力に見合わないので...)

相談感謝です!!
最終的には総合的に判断して機能消去でもOKです。
今回は一旦非活性化ということでお願いします…!

Copy link
Member

@PickledChair PickledChair left a comment

Choose a reason for hiding this comment

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

LGTM!!(お疲れ様でした。グッジョブです!👍)

@PickledChair
Copy link
Member

#254 (review)

cancelableが一旦なくなる点ですが、このPRをrelease-0.10に一旦含めないようにし、release-0.11までの復活を目指そうかなと考えています。

とありましたが、普通にマージしても良い感じですか……?

@Hiroshiba
Copy link
Member

普通にマージしても良い感じですか……?

適宜releaseブランチにマージしていくだけだったので、大丈夫でした!
(気にしていただいてありがとうございます!)

とりあえずマージしちゃいます!
お疲れさまです、ありがとうございました・・・・!!!!!

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.

5 participants