Skip to content

WindowsビルドをPyInstallerへ移行#443

Merged
y-chan merged 1 commit intoVOICEVOX:pyinstallerfrom
y-chan:feature/pyinstaller-windows
Aug 7, 2022
Merged

WindowsビルドをPyInstallerへ移行#443
y-chan merged 1 commit intoVOICEVOX:pyinstallerfrom
y-chan:feature/pyinstaller-windows

Conversation

@y-chan
Copy link
Copy Markdown
Member

@y-chan y-chan commented Aug 6, 2022

内容

題の通り
環境ごとにPyInstallerを試しているので、とりあえずWindowsのみのPRを作るためにPyInstallerブランチを切りました。

関連 Issue

ref #439

スクリーンショット・動画など

最新のものと比べて100MB程度サイズが小さくなっています。

PyInstaller Nuitka
Actions Result Actions Result
image image

また、ビルド時間がCPU/DirectMLでは3分から5分程度、CUDA版でも16分と、かなり減りました。
image

動作している様子
image

その他

Nuitkaを消し飛ばしたので他のビルドが全て落ちています。別PRにて修正します(各OSごとにレビューしてもらうほうが良いと考えたので、このような形をとりました)。

次はMac版に手を付けるつもりです。
Docker周りあまり詳しくないので、お任せできれば大変助かります...

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Aug 6, 2022

Coverage Result

Resultを開く
Name Stmts Miss Cover
voicevox_engine/init.py 1 0 coverage-100%
voicevox_engine/acoustic_feature_extractor.py 75 0 coverage-100%
voicevox_engine/dev/synthesis_engine/init.py 2 0 coverage-100%
voicevox_engine/dev/synthesis_engine/mock.py 36 2 coverage-94%
voicevox_engine/full_context_label.py 162 3 coverage-98%
voicevox_engine/kana_parser.py 86 1 coverage-99%
voicevox_engine/model.py 154 7 coverage-95%
voicevox_engine/mora_list.py 4 0 coverage-100%
voicevox_engine/part_of_speech_data.py 5 0 coverage-100%
voicevox_engine/preset/Preset.py 12 0 coverage-100%
voicevox_engine/preset/PresetLoader.py 34 1 coverage-97%
voicevox_engine/preset/init.py 3 0 coverage-100%
voicevox_engine/synthesis_engine/init.py 5 0 coverage-100%
voicevox_engine/synthesis_engine/core_wrapper.py 199 159 coverage-20%
voicevox_engine/synthesis_engine/make_synthesis_engines.py 48 39 coverage-19%
voicevox_engine/synthesis_engine/synthesis_engine.py 133 12 coverage-91%
voicevox_engine/synthesis_engine/synthesis_engine_base.py 66 9 coverage-86%
voicevox_engine/user_dict.py 131 10 coverage-92%
voicevox_engine/utility/init.py 3 0 coverage-100%
voicevox_engine/utility/connect_base64_waves.py 35 3 coverage-91%
voicevox_engine/utility/engine_root.py 9 2 coverage-78%
TOTAL 1203 248 coverage-79%

@y-chan y-chan force-pushed the feature/pyinstaller-windows branch from c02e055 to 66ab220 Compare August 6, 2022 10:21
@Hiroshiba
Copy link
Copy Markdown
Member

PRありがとうございます!!良いですね!!

docker周りに関わるのですが…
今確かlinux・mac・winでjobが完全に別れてますよね。
これを、コアやエディタと同じように1つのjobにしちゃうのはどうでしょう。

こうすれば、docker側はpyinstallerでビルドしたlinuxエンジンをダウンロードして使うだけにできるかなぁと。

@Hiroshiba
Copy link
Copy Markdown
Member

@PickledChair さん、 @aoirint さん、 @takana-v さん
もしよかったらレビューコメントいただけると心強いです…!!

Comment on lines +653 to +663
pyinstaller \
--noconfirm \
--collect-data pyopenjtalk \
--add-data "licenses.json;." \
--add-data "presets.yaml;." \
--add-data "default.csv;." \
--add-data "engine_manifest.json;." \
--add-data "speaker_info;speaker_info" \
--add-data "engine_manifest_assets;engine_manifest_assets" \
--add-binary "download/onnxruntime/lib/onnxruntime.dll;." \
--add-binary "download/core/core.dll;." \
Copy link
Copy Markdown
Member

@PickledChair PickledChair Aug 6, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(pyinstaller を使っていたことがあるのですが、だいぶ以前なので記憶が錆び付いています……。間違った情報を提供していたらすみません)

こちらのオプションは spec ファイルにまとめると、CI だけでなく手元でビルドする時も便利だと思いました(spec ファイルについては https://pyinstaller.org/en/stable/spec-files.html を参照)。spec ファイルは実際には Pythonのソースファイルなので、OS ごとに設定を記述するということもできる気がします。また、もしかしたら全てのオプションを spec ファイルに書けないかもしれないですが、その場合でも pyinstaller コマンド実行時に追加のオプションを指定できたと思います。

ここのオプションが問題ないかどうかはまだ確認できていないです。何かわかったらまたコメントしたいと思います。

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

specを記述すると、手元でビルドする際に、各人にspecを書き換えてもらう必要が出るなと思ったので、オプションにしました。
specの方が利便性が高いとは思うのですが、実際どうなんでしょうか...

Copy link
Copy Markdown
Member

@Hiroshiba Hiroshiba Aug 6, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

複雑な動的処理がある場合はspecファイルのほうが便利かもです。
現状はファイル指定だけなのでどちらでも良いかなと感じました。
どちらかというと、actionsの特性上specファイルとbuild.ymlのファイルパスが非常に離れるので、一箇所に書ける今のほうが見通しが良いかもしれません。

とりあえずwin版だけの今はこの状態にしておいて、mac版やlinux版を作ったり、より複雑な操作が必要になったときに再考するのはどうでしょう。

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

specファイルを使えば、必要のないディレクトリ・ファイルの削除などが一括で出来るのですが、download/onnxruntime/lib/onnxruntime.dll;などのオプションはOSごとに変わってくるため、OSごとにspecファイルを書かなければならず、面倒であるので今回はパスしました。
まあ、こういった動作は別にcpコマンドに分けるようにしてしまってもいいかもしれません。

一旦はこのままにして、後で考え直すようにしようかなと思います

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

specファイル(pythonファイル)の中でOSで判定してロジックを切り替える、という手もあると思います。
・・・が、ダウンロードしたdllのパスの切り替えは、spec内ではなくactions内でやったほうが絶対良さそう。。

一旦このまま、賛成です!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

spec ファイルの件、了解いたしました! CI を書く上での利便性やわかりやすさ等は確かに spec ファイルではなく明示的なオプション指定の方がよさそうですね(そこまでオプションの数も多くないので)。いったんこのままということで納得しました……!

@y-chan
Copy link
Copy Markdown
Member Author

y-chan commented Aug 7, 2022

今確かlinux・mac・winでjobが完全に別れてますよね。
これを、コアやエディタと同じように1つのjobにしちゃうのはどうでしょう。

返信し忘れていましたが、良いと思います!
このPRがマージされてから試してみますね...!

Copy link
Copy Markdown
Member

@PickledChair PickledChair left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

自分が見た限りでは問題なさそうでした。LGTM!(手元でビルドも試してみましたがうまく行きました……!)

@y-chan
Copy link
Copy Markdown
Member Author

y-chan commented Aug 7, 2022

1つapprove頂いたので、とりあえずこのPRはpyinstallerブランチに向けてのもので、問題があってもまだ修正可能だと思うのと、別のOS向けのも進めたいので、セルフマージしちゃいます...!

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.

3 participants