Stable Diffusionのデスクトップアプリを作る
シンギュラリティ・ソサエティのAI Innovators Hubに参加しています。
はじめに
PythonでAIツールを作り他の人に使ってもらおうとすると、Webサービス化する、もしくはPythonのソースを共有しパソコンやGoogle colabで動かしてもらう必要があります。
Webサービス化するのは、AI系の処理は時間がかかる事とサーバのコスト問題で、現状ではあまり良い方法ではありません。Pythonのコードを使う場合は、使う側にある程度の知識が要求されます。
そこで、Pythonで書いたツールをアプリ化し、インストールするだけで使えるようにしたいと思います。
アプリ化には
- OSのnaviteのUIから使えるようにする
- パッケージ化して配布する
が必要となります。
UIツール
MacでPythonを使ってUIを作るために、いくつからライブラリーがあります。
- Tkinter
- Tcl/TkのPythonパッケージ。古いので非推奨
- PyQt5
- Qtのライブラリ。GPL
- PySide2
- Qtのライブラリ。LGPL。
PyQt5とPySide2はほぼ同じAPIで互換性があるようです。今回は情報が多いのでPyQt5を使うことにします。
パッケージ化
pyinstallerやpy2appといったツールでPythonのスクリプトを、実行環境込みで配布できるアプリ化できます。
両方を検証したところpy2appは今回のケースではパッケージ化に失敗したのでpyinstallerを使います。
作り方
ByteDanceのSDXL-Lightningを使って、テキストから画像を生成するアプリを作ります。
完成品はこちら。
QTでUIを作り、入力されたテキストをStableDiffusionに渡して画像生成、その画像を/tmp以下に保存しつつpreviewとして表示させます。
必要に応じてパッケージを追加します。
pip install pyinstaller PyQt5 diffusers
python ui2.py
で起動させ、動作確認をします。問題なければ
pyinstaller ui.py --noconsole
でパッケージ化します
--onefile
オプションをつけるとファイルがまとめられる&パッケージが小さくなるのですが起動に時間がかかるので外しています。
今回のスクリプトだとファイルサイズは300M/1Gと、かなり大きな違いがあります。
dist以下にアプリが作成されます。Macから見るとアプリなのですが、uploadしようとするとfolderであることがわかります。zipで圧縮して人に渡すとよいです。
普通にPythonスクリプトのように作ってパッケージ化すると
- 起動が遅い
- 多重起動する
の問題がありました。
起動が遅い問題に関しては
- 起動時にtransformarの初期化処理は走らせない
- (Pythonの問題ではないですが) pyinstallerでパッケージ化するときにonefileをつけない
多重起動の問題については
- lockファイルを作って多重起動を防止する
として回避しています。
配布されたアプリを実行したイメージはこちらです。
pyinstallerでbuildされたアプリをzipでまとめることにより、他の人に使ってもらうことが容易になりました。
人工知能を活用したアプリケーションやサービスを活用し、内発的動機付けで行動するエンジニア、起業家、社会起業家をサポートするコミュニティーです。 singularitysociety.org
Discussion