-
Notifications
You must be signed in to change notification settings - Fork 203
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
VOICEVOX ENGINEのLinux用実行バイナリを作る #95
Comments
検証https://github.com/aoirint/voicevox_engine/actions/runs/1238234082
Ubuntu 20.04# docker pull ubuntu:focal
focal: Pulling from library/ubuntu
Digest: sha256:9d6a8699fb5c9c39cf08a0871bd6219f0400981c570894cd8cbea30d3424a31f
...
# docker run --rm -it -v "$(pwd):/work" -w /work ubuntu:focal
# ./run
Traceback (most recent call last):
File "/work/run.py", line 9, in <module>
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "/work/soundfile.py", line 142, in <module soundfile>
OSError: sndfile library not found
# apt update
# apt install libsndfile1
# ./run
Traceback (most recent call last):
File "/work/run.py", line 57, in make_synthesis_engine
ImportError: libc10.so: cannot open shared object file: No such file or directory
Notice: mock-library will be used. Try re-run with valid --voicevox_dir
INFO: Started server process [***]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
...
# LD_LIBRARY_PATH="$(pwd):${LD_LIBRARY_PATH}" ./run
INFO: Started server process [***]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
# /lib/x86_64-linux-gnu/libc.so.6
GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.2) stable release version 2.31. Ubuntu 20.04 ネイティブ$ sudo apt install libsndfile1
$ echo "$LD_LIBRARY_PATH"
/usr/local/cuda/lib64:
$ sudo ldconfig
$ ldconfig -p | grep libtorch
$ ./run
INFO: Started server process [***]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
$ /lib/x86_64-linux-gnu/libc.so.6
GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.2) stable release version 2.31. strace (shared object)$ strace ./run 2>&1 | grep openat | grep libtorch.so
openat(AT_FDCWD, "/usr/local/cuda/lib64/libtorch.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "tls/haswell/x86_64/libtorch.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "tls/haswell/libtorch.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "tls/x86_64/libtorch.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "tls/libtorch.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "haswell/x86_64/libtorch.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "haswell/libtorch.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "x86_64/libtorch.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "libtorch.so", O_RDONLY|O_CLOEXEC) = 3 LD_LIBRARY_PATH$ LD_LIBRARY_PATH= ./run
Traceback (most recent call last):
File "***/run.py", line 57, in make_synthesis_engine
ImportError: libc10.so: cannot open shared object file: No such file or directory
Notice: mock-library will be used. Try re-run with valid --voicevox_dir
$ LD_LIBRARY_PATH=/usr/local/cuda/lib64 ./run
Traceback (most recent call last):
File "***/run.py", line 57, in make_synthesis_engine
ImportError: libc10.so: cannot open shared object file: No such file or directory
Notice: mock-library will be used. Try re-run with valid --voicevox_dir
$ LD_LIBRARY_PATH=/usr/local/cuda/lib64: ./run
INFO: Started server process [***]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
$ LD_LIBRARY_PATH=: ./run
INFO: Started server process [***]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
Ubuntu 18.04# docker pull ubuntu:bionic
bionic: Pulling from library/ubuntu
Digest: sha256:9bc830af2bef73276515a29aa896eedfa7bdf4bdbc5c1063b4c457a4bbb8cd79
...
# docker run --rm -it -v "$(pwd):/work" -w /work ubuntu:bionic
# ./run
./run: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found (required by ./run)
./run: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by ./run)
# /lib/x86_64-linux-gnu/libc.so.6
GNU C Library (Ubuntu GLIBC 2.27-3ubuntu1.4) stable release version 2.27. Debian 11# docker pull debian:stable-20210902
stable-20210902: Pulling from library/debian
Digest: sha256:a9cb4a9ddf9f28bc17fc390baba42ac7eb067ae54d20b55720ed9ff3323b1d87
...
# docker run --rm -it -v "$(pwd):/work" -w /work debian:stable-20210902
# ./run
Traceback (most recent call last):
File "/work/run.py", line 9, in <module>
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "/work/soundfile.py", line 142, in <module soundfile>
OSError: sndfile library not found
# apt update
# apt install libsndfile1
# LD_LIBRARY_PATH="$(pwd):${LD_LIBRARY_PATH}" ./run
INFO: Started server process [***]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
# /lib/x86_64-linux-gnu/libc.so.6
GNU C Library (Debian GLIBC 2.31-13) stable release version 2.31. Fedora 34# docker pull fedora:34
34: Pulling from library/fedora
Digest: sha256:d18bc88f640bc3e88bbfacaff698c3e1e83cae649019657a3880881f2549a1d0
...
# docker run --rm -it -v "$(pwd):/work" -w /work fedora:34
# ./run
Traceback (most recent call last):
File "/work/run.py", line 9, in <module>
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "/work/soundfile.py", line 142, in <module soundfile>
OSError: sndfile library not found
# yum install libsndfile
# LD_LIBRARY_PATH="$(pwd):${LD_LIBRARY_PATH}" ./run
INFO: Started server process [***]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
# /lib64/libc.so.6
GNU C Library (GNU libc) release release version 2.33. CentOS 8# docker pull centos:centos8
centos8: Pulling from library/centos
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
...
# docker run --rm -it -v "$(pwd):/work" -w /work centos:centos8
# ./run
./run: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by ./run)
# /lib64/libc.so.6
GNU C Library (GNU libc) stable release version 2.28.
CentOS Stream 8# docker pull centos:centos8
centos8: Pulling from library/centos
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
...
# docker run --rm -it -v "$(pwd):/work" -w /work centos:centos8
# dnf install centos-release-stream
# dnf swap centos-{linux,stream}-repos
# dnf distro-sync
# cat /etc/centos-release
CentOS Stream release 8
# ./run
./run: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by ./run)
# /lib64/libc.so.6
GNU C Library (GNU libc) stable release version 2.28. |
issueありあとうございます! Linuxはサーバとして以外は使ったことがなくて、配布方法等は僕もよく知らないんですよね・・・
同じ考えです。そうしておいて、VOICEVOXソフトウェアのビルド時にENGINEの成果物を同梱するのが良いと思います。
良いと思います!
Github Releasesは1ファイル辺り2GBまでという容量制限があるので、難しそうです。 |
なるほどです。
一応、調べてみたところ、Artifactの方は最大で90日(デフォルト値)までの保持期間が決まっているようですね。
|
手探りですが、現状の検証結果についてです(CPUのみ)。 いまのところ、Ubuntu、Debian、Fedora、CentOS/CentOS Streamでの互換動作を目指しています。 OS間でのVOICEVOX ENGINEバイナリの互換性は、ひとまず標準Cライブラリ実装の Ubuntu 20.04( Ubuntu 20.04( 一方、CentOS 8(サポート期限:2021年12月)・CentOS Stream 8(サポート期限:2024年5月)では、 また、Ubuntu 18.04(サポート期限:2023年4月)では、 このとき、バイナリ実行時に以下のようなエラーが表示されます(CentOS 8)。 # ./run
./run: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by ./run)
古いバージョンのglibcでビルドしたバイナリは、新しいglibcでも動作する=後方互換性; backward compatibilityがあるようなので、 いまのところ、Ubuntu 18.04( 関連するPull Requestをいくつか(と細かな修正のPRを)送ろうと思います。 |
実験メモです。 CPU版・GPU版を作成しています。 使用したバイナリバイナリは、 ef99716 をローカルのDockerを使って、CPU版としてビルドした成果物を使っています。 CPU版の実験では、 ひとまず、共有ライブラリのリンクに注意しながら、ネイティブ環境で確認しています。 以下のWorkflowは、共有ライブラリのコピーの問題を修正したものです。また、CPU版・GPU版は別々にビルドしています(ビルドプロセスが複雑になるので)。 結果結果として、共有ライブラリを単にコピーしただけでは実行ができず、 なお、以前のログでも同様の結果になっています。 これは、
の違いが原因であるように思います。 この違いについて、VOICEVOX CORE( ただし、LibTorchのso側も書き換える必要があった場合、大変かもしれません( パッケージマネージャを使ってインストールさせるようにすると解決するのかもしれませんが、知見がありません。 ちなみに、CUDAについて。
ログCPU版# libsndfileがインストールされていることを確認
$ ldconfig -p | grep libsndfile
libsndfile.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libsndfile.so.1
# libtorchがインストールされていないことを確認
$ ldconfig -p | grep libtorch
# libcore(VOICEVOX CORE)がインストールされていないことを確認
$ ldconfig -p | grep libcore
# LD_LIBRARY_PATHを設定せずに実行
$ LD_LIBRARY_PATH= ./run
Traceback (most recent call last):
File "***/run.py", line 56, in make_synthesis_engine
ImportError: libc10.so: cannot open shared object file: No such file or directory
Notice: mock-library will be used. Try re-run with valid --voicevox_dir
INFO: Started server process [***]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
# LD_LIBRARY_PATHにカレントディレクトリを指定して実行
$ LD_LIBRARY_PATH=. ./run
INFO: Started server process [***]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
# LD_LIBRARY_PATHに空のディレクトリを指定して実行
$ LD_LIBRARY_PATH=/empty ./run
Traceback (most recent call last):
File "***/run.py", line 56, in make_synthesis_engine
ImportError: libc10.so: cannot open shared object file: No such file or directory
Notice: mock-library will be used. Try re-run with valid --voicevox_dir
INFO: Started server process [***]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
# LibTorchに同梱されている共有ライブラリ libc10.so がカレントディレクトリに存在することを確認
$ ls | grep libc10
libc10.so
# libcoreからのリンクを確認
$ ldd libcore.so
linux-vdso.so.1 (0x00007ffd3f9af000)
libc10.so (0x00007f3594750000)
libtorch_cpu.so (0x00007f35818dd000)
libtorch.so (0x00007f35818da000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f35816cc000)
libgcc_s.so.1 (0x00007f35816b1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f35814bd000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f358136e000)
libgomp-75eea7e8.so.1 (0x00007f3581149000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f3581126000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3594847000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f358111b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f3581113000) GPU版# libsndfileがインストールされていることを確認
$ ldconfig -p | grep libsndfile
libsndfile.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libsndfile.so.1
# CUDAがインストールされていることを確認
$ ldconfig -p | grep libcuda.so
libcuda.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcuda.so.1
libcuda.so.1 (libc6) => /usr/lib/i386-linux-gnu/libcuda.so.1
libcuda.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcuda.so
libcuda.so (libc6) => /usr/lib/i386-linux-gnu/libcuda.so
# libtorchがインストールされていないことを確認
$ ldconfig -p | grep libtorch
# libcore(VOICEVOX CORE)がインストールされていないことを確認
$ ldconfig -p | grep libcore
# LD_LIBRARY_PATHを設定せずに実行
$ LD_LIBRARY_PATH= ./run --use_gpu
Traceback (most recent call last):
File "***/run.py", line 56, in make_synthesis_engine
ImportError: libc10.so: cannot open shared object file: No such file or directory
Notice: mock-library will be used. Try re-run with valid --voicevox_dir
INFO: Started server process [***]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit)
# LD_LIBRARY_PATHにカレントディレクトリを指定して実行
$ LD_LIBRARY_PATH=. ./run --use_gpu
INFO: Started server process [***]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:50021 (Press CTRL+C to quit) |
coreはユーザーによってlibtorchの扱いが異なると思うので、coreビルド時に相対パスにするよりも、engineビルド時に相対パスにするほうが良いかなと思いました。 |
* linux build workflow * add note about GitHub Actions disk capacity * fix typo (misreplace) * Nuitka cache working * run build-linux on push master * follow upstream (added build args) * rm speakers.json form build script in docker * nvidia build * Makefile: fix target name for nvidia build in docker * fix gpu build: copy libtorch "*.so.*" instead "*.so" * add commit id to dist archive * copy libtorch *.so and *.so.* * replace link path: libcore.so to libtorch * install patchelf in build env * fix libcore.so path to patchelf * add exec perm to run * versioned artifact name for release * fix artifact name; variable * Makefile: compile-python-env base image arg * artifact name as matrix * artifact name: linux-cpu and linux-nvidia * add comment about artifact name.
ref: Hiroshiba/voicevox#218
ref: #85
内容
VOICEVOXのLinux用実行バイナリを作る( Hiroshiba/voicevox#218 )にあたり、
VOICEVOX ENGINEのLinux用実行バイナリが必要です。
VOICEVOXのビルド時に合わせてビルドしてもよいですが、
せっかく分離されていますし、再利用性からも、こちらのリポジトリでビルド済みバイナリを提供するほうがよいと思っています。
すでにUbuntu 20.04(ネイティブ環境、NVIDIA GPU)上のローカルビルドおよび、GitHub Actions上のDockerでのビルドを行い、ローカル環境で動作するバイナリの作成には成功しています。
しかし、異なる環境・ディストリビューション(Linuxカーネル?)で動作するのか、実行用バイナリの配布方法、など不明な点がさまざまあり、知見をいただけるとうれしいです。
実現方法
現在の自分のアプローチは、 #88 のDockerfileを拡張し、GitHub Actions上で自動ビルドするものです。
Dockerfileの拡張では、Nuitkaなどのビルド環境を構築した、マルチステージビルドの新しいターゲットを作成します。
GitHub Actions上の新しい自動ビルド(Workflow)は、このターゲットをDockerイメージとしてビルドし、そのまま同一Jobで実行用バイナリをビルド(
docker run --rm -v ...
)し、成果物をArtifact(ActionのSummary下部)としてアップロードします。例: https://github.com/aoirint/voicevox_engine/actions/runs/1238234082
上の例は、Ubuntu 20.04で動かすことを想定したものです。一応、手元のネイティブ環境で動作を確認しています。
libtorchは同梱していますが、
libsndfile( https://github.com/bastibe/python-soundfile の依存. https://github.com/libsndfile/libsndfile )、
およびCUDA/cuDNN(GPUの場合)はあらかじめインストールしておく必要があると思います。
VOICEVOXのLinux用実行バイナリのリリース方法によっては、これらの共有ライブラリも(Windows版と同様に)同梱するのが望ましいように思いますが、その際に環境を変えても動作するかよくわかりません。
実行例
リリース時の流れ
現在想定しているVOICEVOX ENGINEリリース時の流れについて(#85 の内容な気もしますが)。
まずGitHub Releaseを作成(バージョン付け)します。
Releaseの作成によりGitHub Actionsをトリガし、Nuitkaビルドを走らせ、その成果物(実行用バイナリ・共有ライブラリなどを含む圧縮ファイル)をArtifactとして自動アップロードさせます(おそらくRelease作成後、1.5時間くらいかかります)。
その後、成果物を手動でダウンロードし、Releaseにアップロードし直す、という流れを想定しています。
しかし、成果物の容量が大きい(おそらく圧縮時で3GBくらい、上の例で表示される
Size
は圧縮前のサイズのようです)ので、あまりいい方法ではないかもしれません。GitHub Releaseをgit tagのpushなどでトリガして自動作成することもできそうですが、
複数のWorkflow/Jobをトリガする場合にうまく動かせるかよくわからないです。
他のOSSなどがどうしているかも気になります。
OSの種類/ディストリ/バージョン
The text was updated successfully, but these errors were encountered: