-
Notifications
You must be signed in to change notification settings - Fork 200
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
add: --runtime_dir
指定されるランタイムの要件を明確化
#1173
Comments
原因調査
def load_runtime_lib(runtime_dirs: list[Path]) -> None:
"""
コアの実行に必要な依存 DLL をロードする。検索対象ディレクトリは引数 `runtime_dirs` およびシステム検索対象ディレクトリ。
Args:
runtime_dirs - 直下に DLL が存在するディレクトリの一覧
"""
# `lib_file_names`は「ENGINE が利用可能な DLL のファイル名一覧」である
# `lib_names` は「ENGINE が利用可能な DLL のライブラリ名一覧」である(ライブラリ名は `libtorch.so.1.0` の `torch` 部分)
if platform.system() == "Windows":
# DirectML.dllはonnxruntimeと互換性のないWindows標準搭載のものを優先して読み込むことがあるため、明示的に読み込む
# 参考 1. https://github.com/microsoft/onnxruntime/issues/3360
# 参考 2. https://tadaoyamaoka.hatenablog.com/entry/2020/06/07/113616
lib_file_names = [
"torch_cpu.dll",
"torch_cuda.dll",
"DirectML.dll",
"onnxruntime.dll",
]
lib_names = ["torch_cpu", "torch_cuda", "onnxruntime"]
elif platform.system() == "Linux":
lib_file_names = ["libtorch.so", "libonnxruntime.so"]
lib_names = ["torch", "onnxruntime"]
elif platform.system() == "Darwin":
lib_file_names = ["libonnxruntime.dylib"]
lib_names = ["onnxruntime"]
else:
raise RuntimeError("不明なOSです")
# 引数指定ディレクトリ直下の DLL をロードする
for runtime_dir in runtime_dirs:
for lib_file_name in lib_file_names:
try:
print(f"[a] path resolving...")
libpath = str((runtime_dir / lib_file_name).resolve(strict=True))
print(f"[a] path resolved: {libpath}")
CDLL(libpath)
print(f"[a] Runtime load successed!")
except OSError as err:
print(f"[a] Runtime load failed: {err}")
pass
# システム検索ディレクトリ直下の DLL をロードする
for lib_name in lib_names:
try:
print(f"[b] path resolving...")
libpath = find_library(lib_name)
print(f"[b] path resolved: {libpath}")
CDLL(libpath)
print(f"[b] Runtime load successed!")
except (OSError, TypeError) as err:
print(f"[b] Runtime load failed: {err}")
pass 実行結果:
|
あまり調べずに発言しますが、#300 (comment)も同じ理由(バージョン無しの.dylibしか対象にならないため、libonnxruntime.1.9.0.dylibが対象にならない)だったりしないかなと思いました。
これについては、LinuxとmacOSではrpathが効いているためだと思います。どちらかというと意図されている挙動なんじゃないかと。 |
👍️
情報ありがとうございます! 追記: ココ の話と一緒? @Hiroshiba |
バグじゃないという認識です! それっぽいファイルがあれば読み込むようにするのは、ちょっとだけ検討しても良い気がしました。 個人的には今のままでもまあ良いのではという気もします。 |
「製品版 CORE( |
どれがサポート対象かという意図はなく、 (わりと普通な仕様だと思っているのですが、認識おかしかったらご指摘ください 🙇 ) |
👍️
私もサッパリこの辺わからないので簡単に調査しました。 リネームを追加し、上記のクラッシュクラッシュ条件で実行した。 $ python -m pip install -r requirements.txt -r requirements-dev.txt -r requirements-test.txt
$ VERSION="0.15.2"; OS="linux"; ARCHITECTURE="x64"; PROCESSOR="cpu";
$ CORENAME="voicevox_core-${OS}-${ARCHITECTURE}-${PROCESSOR}-${VERSION}"
$ curl -L "https://github.com/VOICEVOX/voicevox_core/releases/download/${VERSION}/${CORENAME}.zip" -o "${CORENAME}.zip"
$ unzip "${CORENAME}.zip"
$ ls "${CORENAME}"
README.txt VERSION libonnxruntime.so.1.13.1 libvoicevox_core.so model voicevox_core.h
$ mkdir "${CORENAME}_mirror"
$ mv "${CORENAME}/libonnxruntime.so.1.13.1" "${CORENAME}_mirror"
$ ls "${CORENAME}"
README.txt VERSION libvoicevox_core.so model voicevox_core.h
$ mv "${CORENAME}_mirror/libonnxruntime.so.1.13.1" "${CORENAME}_mirror/libonnxruntime.so"
$ ls "${CORENAME}_mirror"
libonnxruntime.so
$ python run.py --voicelib_dir="${CORENAME}" --runtime_dir="${CORENAME}_mirror"
(中略)
INFO: Application startup complete.
INFO: Uvicorn running on http://localhost:50021 (Press CTRL+C to quit) クラッシュせず、正常読み込みに成功した。 結論として「現行の CORE に対して 前提知識不足が原因でした、@Hiroshiba さん @qryxip さんご協力ありがとうございました。
ENGINE 利用者の想定レベルで書くことが変わりそうな印象を受けました。
共有ライブラリの作法がわかるユーザー向けには「libtorchやonnxruntime(共有ライブラリ)」との注釈が有効そうです。 |
--runtime_dir
指定が機能せず ENGINE がクラッシュする--runtime_dir
指定されるランタイムの要件を明確化
どう案内すべきか難しいですね…。 「共有ライブラリ」は、説明の何処かで「動的ライブラリ」と読んでいる場合はそちらに合わせた方が良いかもです! わからない人向けには「runtime_dir」引数の詳しい説明を書く場所があればそこがよさそうですが、無いのでいったん無しでも良いかなぁと思いました。 |
|
↑ Linuxを使ってると「システムの共有ライブラリをアップデートしたら、システムのパッケージマネージャの管理外のバイナリ(例: Cargoで入れたやつ)がリンクエラーで動かなくなった」ということが頻繁に発生したりします… |
まあたしかに。 とりあえずバージョン情報のないもののみを読み込む仕様で良いのではと思いました! |
追記: #1173 (comment) にてバグでなく仕様と明確化。案内を明確化する方針
不具合の内容
概要: 現行の CORE に対して
--runtime_dir
が効かない現象・ログ
CORE 0.15.2 をダウンロードし、音声ライブラリ (
libvoicevox_core.so
) とランタイム (libonnxruntime.so.1.13.1
) を別のディレクトリに入れ、音声ライブラリを--voicelib_dir
・ランタイムを--runtime_dir
で指定すると以下のようにクラッシュする:再現手順
GitHub Codespaces, Linux Py3.11 CPU
別ディレクトリに配置するとクラッシュする:
ランタイムを移動しないと正常に起動する:
ランタイムを移動しない場合、
--runtime_dir
無しでも起動する(異常挙動):期待動作
正常にランタイムがロードされ ENGINE が起動する。
VOICEVOXのバージョン
ENGINE master 70d0d8d
CORE 0.15.2
OSの種類/ディストリ/バージョン
The text was updated successfully, but these errors were encountered: