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

Pyinstallerにした影響で0.14から起動が遅くなっている? #721

Closed
Hiroshiba opened this issue Aug 11, 2023 · 7 comments
Closed

Comments

@Hiroshiba
Copy link
Member

Hiroshiba commented Aug 11, 2023

内容

「VOICEVOXはキャラクターが増えたから起動が遅くなった」というエゴサをよく見かけます。
実際キャラクターが増えても増えるのはイラストのロード時間くらいなはずで、そんなに遅くなっていないはずです。

調べてみた結果、どうやら0.14から遅くなっていることがわかりました。

windows用の検証コード。`~/Downloads/*/windows-directml/run.exe`を起動してます。taskkillのとことかも変えれば他のOSでも動くはず
rm -f result.txt
ls ~/Downloads/*/windows-directml/run.exe | while read -r file; do
  name=$(echo "$file" | sed -e 's/.*\/\(.*\)\/windows-directml\/run.exe/\1/')

  "$file" 2>&1 &
  pid=$!

  start_time=$(date +%s%N)

  # 成功するまでリトライする
  while true; do
    # audio_queryの場合
    # if curl -s \
    #   -X POST \
    #   "localhost:50021/audio_query?speaker=0" \
    #   --get --data-urlencode [email protected] \
    #   >query-$name.json; then
    #   break
    # fi
    if curl -s "localhost:50021/version" >/dev/null; then
      break
    fi
    sleep 0.1
  done

  end_time=$(date +%s%N)
  elapsed_time=$(((end_time - start_time) / 1000000))
  echo "$name: $elapsed_time" >>result.txt

  taskkill //im run.exe //f
done

結果(/version

0.12.4: 1071
0.13.3: 1069
0.14.5: 7261
0.15.0-checkshellbash.0: 6949

結果(/audio_query

0.12.4: 2263
0.13.3: 2237
0.14.5: 9202
0.15.0-checkshellbash.0: 8859

原因候補が2つあります。コアが変わったからか、Pyinstallerになったからかなと。
けど、普通にrun.pyを実行すると早いので、たぶんPyinstallerだと考えています。

原因がしっかりわかり、どういう方針にするか決まればこのissueはcloseだと思います。
(このまま解決までこのissueでやっても良いかも)

Pros 良くなる点

起動が早くなる

Cons 悪くなる点

Nuitikaに戻る場合、つらくなりそう

実現方法

Nuitikaに戻るか、Pyinstallerを頑張って早く動かすか。
Nuitikaはビルドも大変でドキュメントやプレイヤー人口も少ないので、可能ならPyinstallerで頑張りたい・・・。

その他

知見などあればなんでもコメントいただければ!

@Hiroshiba Hiroshiba added 機能向上 要議論 実行する前に議論が必要そうなもの 優先度:高 最優先 labels Aug 11, 2023
@Hiroshiba
Copy link
Member Author

Hiroshiba commented Aug 11, 2023

Discordでいろいろ話があった記録をしていきます

upx=Trueになっているからかも? (thx @takana-v !)

ローカルでupx=Falseにしてビルドしても変わらなかったです。
逆にupxが働くようにしてビルドしてみても変わらなかったっぽみ( thx @sevenc-nanashi ! )

modify_pyinstaller.bashが原因かも?( thx @qryxip !)

ローカルでビルドする場合このコード通らないけど、それでも起動遅かったのでこちらも違いそう。

@Hiroshiba
Copy link
Member Author

Hiroshiba commented Aug 11, 2023

DirectML版を使っていたのですが、--use_gpuをつけてrun.exeを起動したらなぜか起動がかなり早くなりました 😇

audio_queryの結果

0.12.4: 1086
0.13.3: 1603
0.14.5: 1612
0.15.0-checkshellbash.0: 1631

DirectMLが含まれないCPU版の0.14.5も試してみましたが、速度は変わりませんでした。。

0.12.4: 1070
0.13.3: 1094
0.14.5: 7247
0.14.5-cpu: 7206
0.15.0-checkshellbash.0: 7216

@Hiroshiba
Copy link
Member Author

今のところの事象をまとめるとこんな感じになっていそうです。

最新のmainでpython+run.pyで実行すると起動が早い
最新の0.15-previewのエンジン起動は遅い
→たぶんビルドが原因

0.13以前のDirectMLエンジンは起動が早い
0.14以降のDirectMLエンジンは起動が遅い
→たぶん0.14以降のビルドの差が原因

0.14以降でDirectMLエンジンを--use_gpuつけると起動が早い
→???

0.14以降でCPUエンジンは起動が遅い
→・・・?

@sevenc-nanashi
Copy link
Member

sevenc-nanashi commented Aug 11, 2023

自分の環境での実験結果を置いておきます:

用意したもの(とsha256sum)

  • 0.13.3 / DirectML版
    run.exe : 828e345fce012fcf415201aba3afdf8f02c65048ed46cd530a0f1d27cb03c21d
    core.dll : b1408f2cc7ec4cc18dada20cdc109b9ae336fe74f11da139a596c91519f8bcd5
    onnxruntime.dll : a603abf4fa0938da9acb475fcfdb7b79b39772e13f2995d34f0caa46f23a8bf9
  • 0.15.0-preview.upx.0 / DirectML版
    run.exe : b89155a3366a1a8ed35ca4774bda8a7697f2c9a521b0e05e59bdd8796702bbcd
    voicevox_core.dll : 87345b10b4f9f9b8c45a44e6f61f6be30653447619f9e66bbe067a87cbf4b7d6
    onnxruntime.dll : a603abf4fa0938da9acb475fcfdb7b79b39772e13f2995d34f0caa46f23a8bf9

計測方法

事前にポート50021をふさいでおき(npx serve -l tcp://127.0.0.1:50021など。何でも大丈夫なはずです。)、クラッシュまでの時間をhyperfineで計測する。

  • 0.13.3 / CPU : 1.327s ... 1.592s
  • 0.13.3 / GPU : 1.543s ... 1.688s
  • 0.15.0 / CPU : 2.072s ... 2.130s
  • 0.15.0 / GPU : 2.092s ... 2.494s
実行ログ
E:\voicevox-project\voicevox_engine-0.13.3 took 3s
❯ hyperfine run -i
Benchmark 1: run
  Time (mean ± σ):      1.427 s ±  0.082 s    [User: 0.951 s, System: 0.385 s]
  Range (min … max):    1.327 s …  1.592 s    10 runs

  Warning: Ignoring non-zero exit code.

E:\voicevox-project\voicevox_engine-0.13.3 took 16s
❯ hyperfine "run --use_gpu" -i
Benchmark 1: run --use_gpu
  Time (mean ± σ):      1.588 s ±  0.042 s    [User: 1.035 s, System: 0.493 s]
  Range (min … max):    1.543 s …  1.688 s    10 runs

  Warning: Ignoring non-zero exit code.

E:\voicevox-project\voicevox_engine-prod-upx took 3s
❯ hyperfine run -i
Benchmark 1: run
  Time (mean ± σ):      2.089 s ±  0.016 s    [User: 1.027 s, System: 0.958 s]
  Range (min … max):    2.072 s …  2.130 s    10 runs

  Warning: Ignoring non-zero exit code.

E:\voicevox-project\voicevox_engine-prod-upx took 22s
❯ hyperfine "run --use_gpu" -i
Benchmark 1: run --use_gpu
  Time (mean ± σ):      2.242 s ±  0.130 s    [User: 1.097 s, System: 0.952 s]
  Range (min … max):    2.092 s …  2.494 s    10 runs

  Warning: Ignoring non-zero exit code.

多少遅くはなっていますが、せいぜい0.5秒でした。

@Hiroshiba
Copy link
Member Author

0.13.3エンジンに0.14.5コアを入れてみたり、0.14.5コアに0.13.3コアを入れたりしてみました!
どうやらコアが原因ではなくエンジンが原因というのがわかりました。

0.13.3: 1097
0.13.3-with-0.14.5core: 1587
0.14.5: 7748
0.14.5-with-0.13.3core: 7175

@sevenc-nanashi さんと同じく、なんか0.14.5コアのほうが0.5秒遅いこともわかりました。

@Hiroshiba
Copy link
Member Author

原因がわかりました。結論から言うと、僕のパソコンにあった過去のコアをロードしているためでした。

0.14から過去のコアをロードする機能が入りました。
AppData\Local\アプリ名\voicevox-engine\core_librariesにおいてあるコアがロードされます。
このアプリ名は開発版だとvoicevox-engine-devで、ビルド結果だとvoicevox-engineです。
僕の環境ではvoicevox-engineの方に古いコアを入れていました・・・。
なので0.13以前は問題なく、0.14以降は問題が入るようになったっぽいです。

問題と原因の推察は以下の通りです。

python run.pyだと早い → 開発版は %appdata%/voicevox-engine-devを見る
0.14以降だと遅い → %appdata%/voicevox-engine/core_librariesに置いてた古いコアをロードしてたから
--use_gpuすると早い → たぶん古いコアをCPUとしてloadするときだけonnxの変換がされてた

ということでPyinstallerは原因ではありませんでした。お騒がせしました!!!

@Hiroshiba
Copy link
Member Author

過去のコアを消したときの計測結果をメモとして残しておこうと思います。

0.12.4: 1069
0.13.3: 1097
0.13.3-with-0.14.5core: 1616
0.14.5: 1583
0.14.5-cpu: 1613
0.14.5-with-0.13.3core: 1100
0.15.0-checkshellbash.0: 1595

@tarepan tarepan removed the 要議論 実行する前に議論が必要そうなもの label Mar 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants