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

Linux用実行バイナリ(AppImage)の自動ビルド (#218) #270

Merged
merged 83 commits into from
Oct 3, 2021

Conversation

aoirint
Copy link
Member

@aoirint aoirint commented Sep 26, 2021

内容

Linux用実行バイナリの自動ビルドを追加します。

インストーラ(シェルスクリプト)は #283 で追加します。

AppImage分割7zのRelease Assetsへのアップロード

  1. Artifactからzipダウンロード、展開(*.7z.txt*.7z.###が展開される)
  2. gh release upload VERSION *.7z.* -R Hiroshiba/voicevox

アプリケーション終了時にENGINEのプロセスが終了されない問題

# https://github.com/pkrumins/node-tree-kill/blob/cb478381547107f5c53362668533f634beff7e6e/index.js#L117
# ps: ChildProcess
ps.on('close', onClose);

onCloseが呼び出されていない。ps.on('exit', onClose) でも同様。

似ていそうなIssue: nodejs/node#4500 (comment)

  • stdoutをon('data')で読み出しているから?
    • close だけでなく exit も呼ばれないので違いそう
  • ローカルコールバック関数onCloseが破棄されている?
  • onCloseが呼ばれる前に親プロセスが終了している?
    • おそらくこれが原因

TreeKill内で spawn のコールバックを使って実装されているのが要因と思っている。spawnSync を使えば同期処理にはなるが正しくプロセスキルできる。

Windowsでは、プロセスツリーのkillを taskkill が行うので動作していそうだが、killすべきプロセスリストの取得にコールバックを使っているLinuxとmacOSでは動かなさそう。

GPU→CPUにエンジン切替時にエンジン起動中のモーダルが消えない問題もあるが、#282 で直ると思う。

ENGINE側で共有ライブラリの読み込みに失敗する問題

このPRで追加するWorkflowによって生成された
VOICEVOXソフトウェアからGPUで音声合成しようとすると、1回目は成功しますが、必ず2回目で
共有ライブラリの読み込みに失敗し、音声合成に失敗する問題がありそうです(調査中)。

未確認ですが、 https://github.com/Hiroshiba/voicevox_engine/issues/121#issuecomment-927200777 が関連するかもしれません。

以下は、VOICEVOXソフトウェア側のログから run のログが確認できないため、別途ENGINEを実行したときの失敗ログです。

$ ./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)
INFO:     127.0.0.1:48260 - "GET /version HTTP/1.1" 200 OK
INFO:     127.0.0.1:48260 - "POST /audio_query?text=&speaker=0 HTTP/1.1" 200 OK
INFO:     127.0.0.1:48274 - "POST /accent_phrases?text=1%E5%9B%9E%E7%9B%AE&speaker=0 HTTP/1.1" 200 OK
INFO:     127.0.0.1:48274 - "OPTIONS /synthesis?speaker=0 HTTP/1.1" 200 OK
[W BinaryOps.cpp:467] Warning: floor_divide is deprecated, and will be removed in a future version of pytorch. It currently rounds toward 0 (like the 'trunc' function NOT 'floor'). This results in incorrect rounding for negative values.
To keep the current behavior, use torch.div(a, b, rounding_mode='trunc'), or for actual floor division, use torch.div(a, b, rounding_mode='floor'). (function operator())
INFO:     127.0.0.1:48274 - "POST /synthesis?speaker=0 HTTP/1.1" 200 OK
INFO:     127.0.0.1:48274 - "POST /accent_phrases?text=2%E5%9B%9E%E7%9B%AE&speaker=0 HTTP/1.1" 200 OK
INFO:     127.0.0.1:48274 - "POST /synthesis?speaker=0 HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "/***/linux-nvidia-prepackage/uvicorn/protocols/http/h11_impl.py", line 373, in run_asgi
  File "/***/linux-nvidia-prepackage/uvicorn/middleware/proxy_headers.py", line 75, in __call__
  File "/***/linux-nvidia-prepackage/fastapi/applications.py", line 208, in __call__
  File "/***/linux-nvidia-prepackage/starlette/applications.py", line 112, in __call__
  File "/***/linux-nvidia-prepackage/starlette/middleware/errors.py", line 181, in __call__
Exception: nvrtc: error: failed to open libnvrtc-builtins.so.11.1.
  Make sure that libnvrtc-builtins.so.11.1 i...

以下のように、ファイル名にハッシュ値?が付いているのが原因かもしれません。

$ ls | grep libnv
libnvrtc-3a20f2b6.so.11.1
libnvrtc-builtins-07fb3db5.so.11.1
libnvToolsExt-24de1d56.so.1
libnvToolsExt.so.1

RESTART_ENGINEがプロセスキル成功後にエラーを出力する問題

undefined
Error occurred in handler for 'RESTART_ENGINE': undefined
*** › TypeError: Cannot read property 'toString' of undefined
    at Object.on.e._throw (electron/js2c/browser_init.js:161:9904)
    at electron/js2c/browser_init.js:201:602
    at processTicksAndRejections (internal/process/task_queues.js:93:5)

外部からKillされたENGINEの再起動が終了しない問題

関連 Issue

ref https://github.com/Hiroshiba/voicevox_engine/issues/121#issuecomment-927200777
close #218

@aoirint
Copy link
Member Author

aoirint commented Sep 29, 2021

#282 がマージされれば問題は解決するので、readyにします。

AppImageは、7z分割された状態でArtifactに1つのzipにまとめてアップロードされます(*-appimage-release)。
zipを解凍して、中身をそれぞれReleaseのAssetに追加する必要があります。

インストール用スクリプトについては、 https://gist.github.com/aoirint/5b8e4e5a1a2f6d6bf04d6a463365c41d をベースにしたPRを作成するつもりです。

@Hiroshiba
Copy link
Member

Hiroshiba commented Oct 2, 2021

インストールの案内をどうしようかをちょっと迷っています。

ちなみにwindows版はwebサイトのダウンロードボタンを押したあとに「インストール版」をクリックすることでインストーラー.exeが振ってきます。
同じようにスクリプトが振ってくる形にするか、別の形にするかなどを考えています。

@aoirint
Copy link
Member Author

aoirint commented Oct 2, 2021

VERSION=X.X.X curl -fsSL https://raw.githubusercontent.com/Hiroshiba/voicevox/main/installer_linux.sh | bash

VERSION=X.X.X curl -fsSL https://raw.githubusercontent.com/Hiroshiba/voicevox/X.X.X/installer_linux.sh | bash

上のようなコマンドと、実行内容を見てから実行したい人向けのインストールスクリプトのダウンロードリンク、をおいておく形を考えていました。コマンドを使わないユーザの視点がほしいです...。

Ubuntu 20.04で、ブラウザでダウンロードしたシェルスクリプトを実行するには、GUI上だけでは完結しない気がしました。
chmod +xはGUI操作で代替できますが、実行にはターミナルを開く必要があるように思いました。

bash installer.sh
# Or
chmod +x installer_linux.sh
./installer.sh

調査

シェルスクリプトを使ったAppImageのインストーラという形式は、文書系ソフトウェアのJoplinを参考にしています。
こちらはAppImageのダウンロードリンクと、インストーラ・アップデータ機能のあるシェルスクリプトの実行コマンドがおかれています。

画像処理ソフトウェアのGIMPは、バイナリをflatpakというパッケージマネージャ向けに配布していて、flatpakrefというインストール情報が記述されたテキストファイルのダウンロードリンクをおいています。

しかし、Ubuntu 20.04の標準GUIパッケージ管理ソフト(GNOME Software Center)では、Failed to install file: not supportedのように表示され、実行できませんでした(コマンドからインストールする必要がある)。

また、flatpakは別途インストールされていることが前提になっています(Ubuntu 20.04時点ではデフォルトで入っていません)。

gimp

GUIで完結させるには、deb/rpmかtar.gzを使う方法がとられているのかなと思いました。

debの場合、deb内部に必要なファイルが同梱されているか、パッケージを配布するサーバ(リポジトリ)が用意されている(CUDA deb (network))ように思いました。

Discordは、tar.gz形式でElectronのビルド成果物(linux-unpacked = linux-nvidia-prepackage/linux-cpu-prepackage)を合わせて配布していました。

CUDAのrunfileは、Makeselfというプログラムで作られたオフラインインストーラのようでした(コマンドで実行)。

slack

FFmpegに依存するOBS Studioは、コマンドだけ用意されていました。

Discordは、Electronのビルド成果物を、debに加えてtar.gz形式でも配布していました。

VOICEVOXでも、Windows用のzip版に相当する形で、DiscordのようにLinux用のtar.gz版を用意してもよさそうに思いました。
tarは実行権限を保持するため、chmod +xの操作をする必要もありません。

配布物は、linux-nvidia-prepackage/linux-cpu-prepackageでよさそうですが、
現在のWorkflowではzipでArtifactにアップロードするため、VOICEVOX voicevox とENGINE run に実行権限が付与されません。
tar.gz版用に、tarに固めてからArtifactにアップロードするStepを追加してもよさそうに思いました(おそらくtar.gzがzipの中に入ることになりますが)。

@aoirint
Copy link
Member Author

aoirint commented Oct 2, 2021

  • tar.gzのArtifact追加
  • 分割 AppImage.7z.* のsize, hashの計算・listへの出力

を追加で実装してみました

ただ、tar.gzから展開した voicevox をダブルクリックで実行することはできなかったので、desktopファイルのインストーラ(もしくはインストール処理)は必要そうに思いました。

@Hiroshiba
Copy link
Member

tar.gzから展開した voicevox をダブルクリックで実行することはできなかった

あ、ライブラリが見つからないためですよね・・・。
この問題も--set-rpathで解決したりするのでしょうか。
ぱっと検索してみた感じ、実行バイナリも変更できそうかもです。
https://stackoverflow.com/questions/13769141/can-i-change-rpath-in-an-already-compiled-binary

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.

コメント追加のお願いの点だけがRequest changesで、それ以外はコメントレベルです。

.github/workflows/build.yml Outdated Show resolved Hide resolved
.github/workflows/build.yml Show resolved Hide resolved
.github/workflows/build.yml Show resolved Hide resolved
.github/workflows/build.yml Show resolved Hide resolved
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! また1回チェックでビルドを回してみたいと思います!

@Hiroshiba Hiroshiba merged commit e2856b1 into VOICEVOX:main Oct 3, 2021
@aoirint aoirint deleted the patch-linux-build branch February 28, 2022 00:57
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.

VOICEVOXのLinux用実行バイナリを作る
3 participants