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

VOICEVOX ENGINEのLinux用実行バイナリを作る #95

Closed
aoirint opened this issue Sep 15, 2021 · 7 comments
Closed

VOICEVOX ENGINEのLinux用実行バイナリを作る #95

aoirint opened this issue Sep 15, 2021 · 7 comments

Comments

@aoirint
Copy link
Member

aoirint commented Sep 15, 2021

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の場合)はあらかじめインストールしておく必要があると思います。

sudo apt install libsndfile1

VOICEVOXのLinux用実行バイナリのリリース方法によっては、これらの共有ライブラリも(Windows版と同様に)同梱するのが望ましいように思いますが、その際に環境を変えても動作するかよくわかりません。

実行例

# Ubuntu 20.04
# CUDA 11.4

$ echo "$LD_LIBRARY_PATH"
/usr/local/cuda/lib64:

$ sudo ldconfig
$ ldconfig -p | grep libtorch

$ chmod +x ./run

$ ./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)

リリース時の流れ

現在想定している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の種類/ディストリ/バージョン

  • Linux
@aoirint
Copy link
Member Author

aoirint commented Sep 15, 2021

検証

https://github.com/aoirint/voicevox_engine/actions/runs/1238234082

  • Ubuntu 20.04 (ubuntu:focal, glibc 2.31) でのビルド(glibc 2.29を要求)
    • ✔ Ubuntu 20.04(コンテナ内; glibc 2.31)
    • ❌ Ubuntu 18.04(コンテナ内; glibc 2.27)
    • ✔ Debian 11(コンテナ内; glibc 2.31)
    • ✔ Fedora 34(コンテナ内; glibc 2.33)
    • ❌ CentOS 8(コンテナ内; glibc 2.28)
    • ❌ CentOS Stream 8(コンテナ内; glibc 2.28)

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)
  • $LD_LIBRARY_PATH != ''のとき、コロンで区切られた空文字列のパス=カレントディレクトリ、として解釈されていそう

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.

@Hiroshiba
Copy link
Member

Hiroshiba commented Sep 15, 2021

issueありあとうございます!

Linuxはサーバとして以外は使ったことがなくて、配布方法等は僕もよく知らないんですよね・・・
助力になりそうなところをお答えしてみます。

再利用性からも、こちらのリポジトリでビルド済みバイナリを提供するほうがよいと思っています

同じ考えです。そうしておいて、VOICEVOXソフトウェアのビルド時にENGINEの成果物を同梱するのが良いと思います。

Releaseの作成によりGitHub Actionsをトリガし、

良いと思います!

成果物を手動でダウンロードし、Releaseにアップロードし直す

Github Releasesは1ファイル辺り2GBまでという容量制限があるので、難しそうです。
7zなどで分割してアップロードする方法もありそうですが、Artifactへのリンクを張ってごまかすという手もありかもしれません。

@aoirint
Copy link
Member Author

aoirint commented Sep 15, 2021

Github Releasesは1ファイル辺り2GBまでという容量制限があるので、難しそうです。

なるほどです。

Artifactへのリンクを張ってごまかすという手もありかもしれません。

一応、調べてみたところ、Artifactの方は最大で90日(デフォルト値)までの保持期間が決まっているようですね。
あまり古いバージョンを使う需要もない気がしますが、リリース間隔が90日を超える場合に問題になるかもしれません。
逆に、Artifactの合計容量に制限があれば、ビルドタイミングや保持期間に注意する必要があるかもです。

https://docs.github.com/ja/github/administering-a-repository/managing-repository-settings/configuring-the-retention-period-for-github-actions-artifacts-and-logs-in-your-repository

パブリックリポジトリの場合: この保持時間を1日から90日の間で変更できます。

@aoirint
Copy link
Member Author

aoirint commented Sep 15, 2021

手探りですが、現状の検証結果についてです(CPUのみ)。

いまのところ、Ubuntu、Debian、Fedora、CentOS/CentOS Streamでの互換動作を目指しています。

OS間でのVOICEVOX ENGINEバイナリの互換性は、ひとまず標準Cライブラリ実装のglibcのバージョンに依存しそうなことがわかっています。

Ubuntu 20.04(ubuntu:focal、サポート期限:2025年4月)のglibcはバージョン2.31で、
ubuntu:focal上でNuitkaビルドすると、実行時にglibc 2.29を要求するようです。

Ubuntu 20.04(glibc 2.31)上でNuitkaビルドしたバイナリは、Debian 11、Fedora 34上でも動作するようです。

一方、CentOS 8(サポート期限:2021年12月)・CentOS Stream 8(サポート期限:2024年5月)では、
glibc 2.28が入っていて、glibc 2.31でビルドしたバイナリは動作しないようです。

また、Ubuntu 18.04(サポート期限:2023年4月)では、glibc 2.27が入っていて、同様に動作しないようです。

このとき、バイナリ実行時に以下のようなエラーが表示されます(CentOS 8)。

# ./run
./run: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by ./run)

古いバージョンのglibcでビルドしたバイナリは、新しいglibcでも動作する=後方互換性; backward compatibilityがあるようなので、
Linux用実行バイナリをすこし古いglibc(2.26や2.27?)を使ってビルドすることで、
ある程度の互換性がとれると思われます。

いまのところ、Ubuntu 18.04(ubuntu:bionicglibc 2.27)を使ってビルドするつもりでいます。

関連するPull Requestをいくつか(と細かな修正のPRを)送ろうと思います。

  1. Dockerfile (Linux): 各ステージのベースイメージを変更できるようにする #97
  2. Ubuntu 18.04ベースのDockerイメージ自動ビルドを追加 #98
  3. Dockerfile (Linux): インデントの修正・entrypointにshebangを追加・entrypointの処理順交換 #99

@aoirint
Copy link
Member Author

aoirint commented Sep 18, 2021

実験メモです。

CPU版・GPU版を作成しています。
#101 によって共有ライブラリの構成が変わっている形です(同梱する共有ライブラリが異なるだけで、run自体は同一と思います)。

使用したバイナリ

バイナリは、 ef99716 をローカルのDockerを使って、CPU版としてビルドした成果物を使っています。
GPU版の実験は、LibTorch、libcoreの共有ライブラリを入れ替えて行いました(LibTorch CPU・GPUそれぞれの共有ライブラリリストから削除&コピー、libcoreは置き換え)。

CPU版の実験では、*.soではなく、*.so.*という名前の共有ライブラリ(CPU版LibTorchではlibgomp-75eea7e8.so.1のみ)のNuitkaによるコピーができていなかったため、手動で追加しています。GPU版でも同様に対応しています。

ひとまず、共有ライブラリのリンクに注意しながら、ネイティブ環境で確認しています。

以下のWorkflowは、共有ライブラリのコピーの問題を修正したものです。また、CPU版・GPU版は別々にビルドしています(ビルドプロセスが複雑になるので)。
Workflowが完了すれば、同じ結果が得られると思います。

結果

結果として、共有ライブラリを単にコピーしただけでは実行ができず、
LD_LIBRARY_PATHで実行バイナリのパスを明示しなければ、
libcore.soがリンクしている、LibTorchの共有ライブラリをみつけられないという現象が起きました。
明示すれば動作します。

なお、以前のログでも同様の結果になっています。
このままでは不便に思います。

これは、

  • Windows: カレントディレクトリのDLLを検索する
  • Linux: カレントディレクトリのSOを検索しない

の違いが原因であるように思います。

この違いについて、VOICEVOX CORE(libcore.so)の側で吸収するべき(吸収可能な)事柄なのかはわからないです。
わたしとしては、
VOICEVOX CORE(libcore.so)は、システム(LD_LIBRARY_PATH または ldconfig )にLibTorchがインストールされていることを想定して、
VOICEVOX ENGINE(run)は 、run と同じディレクトリにLibTorchがあることを想定するのがいいのかな、とは思っています。
つまり、いまのところ、 #101 と同様に、patchelf を使って、実行バイナリ同梱用に libcore.so からLibTorchへのリンクを相対パスに書き換えるのがいいのかなと思っています。

ただし、LibTorchのso側も書き換える必要があった場合、大変かもしれません(libcore.soの変更だけでは対応できなかった場合)。
→ LibTorch側を書き換えなくても、問題なく動作しました

パッケージマネージャを使ってインストールさせるようにすると解決するのかもしれませんが、知見がありません。

ちなみに、CUDAについて。
Windows版では、CUDA/cuDNNが run.exe と同じディレクトリにあることを想定しています。
Linux版では、共有ライブラリのリンクの問題をなるべく減らすため、いまのところ、CUDA/cuDNNを同梱していません。
同梱しても、LibTorchと同様に、問題は起きないかもしれませんが、まだ調査していません。
CUDA/cuDNNは、VOICEVOX ソフトウェア(フロントエンド)のLinux用実行バイナリを配布するときに、同梱するか、同梱しないか、が問題になると思っています。
VOICEVOX ENGINEとしては、ひとまず同梱しなくてもいいかなと思っています(LibTorch/libcoreは同梱、CUDA/cuDNNは同梱しない)。

ログ

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)

@Hiroshiba
Copy link
Member

patchelfを使って相対パスにするの、良いですね!

この違いについて、VOICEVOX CORE(libcore.so)の側で吸収するべき(吸収可能な)事柄なのかはわからないです。

coreはユーザーによってlibtorchの扱いが異なると思うので、coreビルド時に相対パスにするよりも、engineビルド時に相対パスにするほうが良いかなと思いました。

Hiroshiba pushed a commit that referenced this issue Sep 19, 2021
* 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.
@aoirint
Copy link
Member Author

aoirint commented Sep 19, 2021

#96 によりLinux用実行バイナリは自動ビルドされるようになったため、Closeします。

動作報告や検証を、 #106 にくださるとうれしいです。

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

2 participants