diffusers-rsを試す
概要
リポジトリ
できること
rust上でStableDiffusion2.xを動かせる
作業環境
- Windows 11 Pro
- rust, cargo を実行
- Ubuntu on wsl2
- python3, pip, wget を実行
環境構築
Pythonインストール
pythonでxの変換があるので、python環境を準備
sudo apt-get update && sudo apt install python3-pip
pytorch インストール
sudo pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116
データ準備
以下の作業は基本的にWSL上で実施した。(rust作業はWindowsで)
bpe_simple_vocab_16e6.txt.gz を取得
mkdir -p data && cd data
wget https://github.com/openai/CLIP/raw/main/clip/bpe_simple_vocab_16e6.txt.gz
gunzip bpe_simple_vocab_16e6.txt.gz
以降、基本的にdataフォルダでコマンド実行する。
pytorch_model.bin
を取得
重みwget https://huggingface.co/openai/clip-vit-large-patch14/resolve/main/pytorch_model.bin
pytorch_model.npz
へ
変換:pythonを起動して
python3
以下を実行
import numpy as np
import torch
model = torch.load("./pytorch_model.bin")
np.savez("./pytorch_model.npz", **{k: v.numpy() for k, v in model.items() if "text_model" in k})
pytorch_model.ot
へ
変換:Windowsのプロジェクトルートフォルダで実行
cargo run --release --example tensor-tools cp ./data/pytorch_model.npz ./data/pytorch_model.ot
VAEとUNETの重みを取得してリネーム
1.ダウンロード
VAE https://huggingface.co/runwayml/stable-diffusion-v1-5/blob/main/vae/diffusion_pytorch_model.bin
UNET https://huggingface.co/runwayml/stable-diffusion-v1-5/blob/main/unet/diffusion_pytorch_model.bin
2.リネーム
vae/diffusion_pytorch_model.bin -> vae.bin
unet/diffusion_pytorch_model.bin -> unet.bin
3.(root)/data
フォルダへ配置
vae.npz, unet.npz
へ
変換:pythonを起動して
python3
以下を実行
import numpy as np
import torch
model = torch.load("./vae.bin")
np.savez("./vae.npz", **{k: v.numpy() for k, v in model.items()})
model = torch.load("./unet.bin")
np.savez("./unet.npz", **{k: v.numpy() for k, v in model.items()})
vae.ot, unet.ot
へ
変換:Windowsのプロジェクトルートフォルダで実行
cargo run --release --example tensor-tools cp ./data/vae.npz ./data/vae.ot
cargo run --release --example tensor-tools cp ./data/unet.npz ./data/unet.ot
画像生成実行(SD 1.5)
READMEのコマンドそのままでは動かず、オプションがいる --sd-version v1-5
cargo run --example stable-diffusion --features clap -- --prompt "A rusty robot holding a fire torch." --sd-version v1-5
GPU付きPCで実行したが、cudaが認識されずCPUで実行される。
30 Timestep, 実行時間3分くらい?
生成画像
sd_final.png
シードはランダムみたい。リポジトリトップページと同じ画像は生成されなかった。
wasm-pack 試す
wasm-pack作業 参考 https://developer.mozilla.org/ja/docs/WebAssembly/Rust_to_wasm
cargo install wasm-pack
エラー
error occurred: Failed to find tool. Is `clang` installed?
clangはC言語などのコンパイラフロントエンド。
linux用ツールみたい。以降はwslで作業。
対応)clangをインストール
sudo apt-get install clang
成功
rustインストール
参考 https://zenn.dev/dozo/articles/56a3fa90dbfb50
sudo apt install build-essential
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source .bashrc
# ~/.cargo/binは自動でパスが通った
rustup --version
# -> rustup 1.25.1 (bb60b1e89 2022-07-12)
cargo --version
# -> cargo 1.66.1 (ad779e08b 2023-01-10)
rustup target add wasm32-unknown-unknown
rustup component add rustfmt rust-analysis rust-src
cargo install wasm-pack
wslでビルドしてみる
wasm-pack build --target web
エラー:llvm-config
cargo:warning=could not execute `llvm-config` one or more times, if the LLVM_CONFIG_PATH environment variable is set to a full path to valid `llvm-config` executable
対応
参考 https://kyamashiro.hateblo.jp/entry/2020/02/26/220802
sudo apt install llvm
sudo apt install libclang-dev
エラー:clang-sysをコンパイルできない
約300か所のエラー
Compiling cc v1.0.78
error[E0432]: unresolved import `libc::c_int`
--> /home/lilacs/.cargo/registry/src/github.com-1ecc6299db9ec823/clang-sys-1.4.0/src/support.rs:11:5
|
11 | use libc::c_int;
| ^^^^^^^^^^^ no `c_int` in the root
(略)
Some errors have detailed explanations: E0412, E0432.
For more information about an error, try `rustc --explain E0412`.
error: could not compile `clang-sys` due to 318 previous errors
解決はできるはず
https://zenn.dev/newgyu/articles/8bff73505c7b35
現行のClang/LLVMはEmscriptenに頼らずともwasmへのコンパイルが可能
ターゲットを変えてビルドしてみる
発想元
https://github.com/rust-ndarray/ndarray-linalg/issues/121#issuecomment-439097887
sfackler/rust-openssl#1016には、これと非常によく似た問題についての議論があります。libcクレートは/ / / for WASM を定義していないc_charc_doublec_floatc_intようで、議論は WASM における Rust/C/Fortran 間の相互運用性がまだ成熟していないことを示しています。 (2018年のコメント)
https://github.com/sfackler/rust-openssl/issues/1016#issuecomment-901561115
"cargo build --target=wasm32-unknown-emscripten"
wasm32-unknown-unknown と wasm32-unknown-emscriptenの違い
- wasm32-unknown-unknown- 単一の*.wasmバイナリの生成に重点を置いている。ただし、ターゲットの「unknown」部分が 何も想定できないことを意味するため、wasmtimeのような一般的な便利機能は機能しない。
- wasm32-unknown-emscripten- Web ブラウザで動作することを意図しており、.wasmファイルと結合した.jsファイルを生成します
ビルド試す
ターゲットのインストール
rustup target add wasm32-unknown-emscripten
ビルド実行
cargo build --target=wasm32-unknown-emscripten
clangなどは成功、次のエラーへ
Compiling clang v2.0.0
error: failed to run custom build command for `bzip2-sys v0.1.11+1.0.8`
Caused by:
process didn't exit successfully: `/.../prac_diffusers/target/debug/build/bzip2-sys-dfc5d9a191368dd2/build-script-build` (exit status: 1)
--- stdout
cargo:rerun-if-env-changed=BZIP2_NO_PKG_CONFIG
wasm32-wasi の場合
ターゲットのインストール
rustup target add wasm32-wasi
ビルド実行
cargo build --target=wasm32-wasi
エラー
Compiling rand_core v0.6.4
The following warnings were emitted during compilation:
warning: In file included from bzip2-1.0.8/blocksort.c:22:
warning: bzip2-1.0.8/bzlib_private.h:25:10: fatal error: 'stdlib.h' file not found
warning: #include <stdlib.h>
warning: ^~~~~~~~~~
warning: 1 error generated.
warning: In file included from bzip2-1.0.8/huffman.c:22:
warning: bzip2-1.0.8/bzlib_private.h:25:10: fatal error: 'stdlib.h' file not found
warning: #include <stdlib.h>
warning: ^~~~~~~~~~
warning: 1 error generated.
error: failed to run custom build command for `bzip2-sys v0.1.11+1.0.8`
Caused by:
process didn't exit successfully: `/mnt/c/.../prac_diffusers/target/debug/build/bzip2-sys-dfc5d9a191368dd2/build-script-build` (exit status: 1)
--- stdout
cargo:rerun-if-env-changed=BZIP2_NO_PKG_CONFIG
[sccache] error: failed to run custom build command for
openssl-sys v0.9.75
でビルドがエラー終了する
Ubuntu では libssl-dev を、Fedora では openssl-devel をインストールしてから再実行する🤔
sudo apt-get install libssl-dev
rustup target add wasm32-unknown-unknown
次のエラー
error: failed to run custom build command for `bzip2-sys v0.1.11+1.0.8`
https://github.com/zip-rs/zip/issues/113#issuecomment-570370164
これをあなたのCargo.toml仕事に入れます:[dependencies.zip]
default-features = false
zip = "0.5.0"
詳しくはこちらをご覧ください。
クレートの依存ツリー
cargo tree
でモジュールの依存関係が見れる
├── diffusers v0.2.0
│ ├── anyhow v1.0.68
│ ├── regex v1.7.1
│ │ ├── aho-corasick v0.7.20
│ │ │ └── memchr v2.5.0
│ │ ├── memchr v2.5.0
│ │ └── regex-syntax v0.6.28
│ ├── tch v0.9.0
│ │ ├── half v1.8.2
│ │ ├── lazy_static v1.4.0
│ │ ├── libc v0.2.139
│ │ ├── ndarray v0.15.6
│ │ │ ├── matrixmultiply v0.3.2
│ │ │ │ └── rawpointer v0.2.1
│ │ │ ├── num-complex v0.4.2
│ │ │ │ └── num-traits v0.2.15
│ │ │ │ [build-dependencies]
│ │ │ │ └── autocfg v1.1.0
│ │ │ ├── num-integer v0.1.45
│ │ │ │ └── num-traits v0.2.15 (*)
│ │ │ │ [build-dependencies]
│ │ │ │ └── autocfg v1.1.0
│ │ │ ├── num-traits v0.2.15 (*)
│ │ │ └── rawpointer v0.2.1
│ │ ├── rand v0.8.5
│ │ │ ├── libc v0.2.139
│ │ │ ├── rand_chacha v0.3.1
│ │ │ │ ├── ppv-lite86 v0.2.17
│ │ │ │ └── rand_core v0.6.4
│ │ │ │ └── getrandom v0.2.8
│ │ │ │ ├── cfg-if v1.0.0
│ │ │ │ └── libc v0.2.139
│ │ │ └── rand_core v0.6.4 (*)
│ │ ├── thiserror v1.0.38
│ │ │ └── thiserror-impl v1.0.38 (proc-macro)
│ │ │ ├── proc-macro2 v1.0.50
│ │ │ │ └── unicode-ident v1.0.6
│ │ │ ├── quote v1.0.23
│ │ │ │ └── proc-macro2 v1.0.50 (*)
│ │ │ └── syn v1.0.107
│ │ │ ├── proc-macro2 v1.0.50 (*)
│ │ │ ├── quote v1.0.23 (*)
│ │ │ └── unicode-ident v1.0.6
│ │ ├── torch-sys v0.9.0
│ │ │ └── libc v0.2.139
│ │ │ [build-dependencies]
│ │ │ ├── anyhow v1.0.68
│ │ │ ├── cc v1.0.78
│ │ │ │ └── jobserver v0.1.25
│ │ │ │ └── libc v0.2.139
│ │ │ ├── curl v0.4.44
│ │ │ │ ├── curl-sys v0.4.59+curl-7.86.0
│ │ │ │ │ ├── libc v0.2.139
│ │ │ │ │ ├── libz-sys v1.1.8
│ │ │ │ │ │ └── libc v0.2.139
│ │ │ │ │ │ [build-dependencies]
│ │ │ │ │ │ ├── cc v1.0.78 (*)
│ │ │ │ │ │ └── pkg-config v0.3.26
│ │ │ │ │ └── openssl-sys v0.9.80
│ │ │ │ │ └── libc v0.2.139
│ │ │ │ │ [build-dependencies]
│ │ │ │ │ ├── autocfg v1.1.0
│ │ │ │ │ ├── cc v1.0.78 (*)
│ │ │ │ │ └── pkg-config v0.3.26
│ │ │ │ │ [build-dependencies]
│ │ │ │ │ ├── cc v1.0.78 (*)
│ │ │ │ │ └── pkg-config v0.3.26
│ │ │ │ ├── libc v0.2.139
│ │ │ │ ├── openssl-probe v0.1.5
│ │ │ │ ├── openssl-sys v0.9.80 (*)
│ │ │ │ └── socket2 v0.4.7
│ │ │ │ └── libc v0.2.139
│ │ │ └── zip v0.6.3
│ │ │ ├── aes v0.7.5
│ │ │ │ ├── cfg-if v1.0.0
│ │ │ │ ├── cipher v0.3.0
│ │ │ │ │ └── generic-array v0.14.6
│ │ │ │ │ └── typenum v1.16.0
│ │ │ │ │ [build-dependencies]
│ │ │ │ │ └── version_check v0.9.4
│ │ │ │ ├── cpufeatures v0.2.5
│ │ │ │ └── opaque-debug v0.3.0
│ │ │ ├── byteorder v1.4.3
│ │ │ ├── bzip2 v0.4.4
│ │ │ │ ├── bzip2-sys v0.1.11+1.0.8
│ │ │ │ │ └── libc v0.2.139
│ │ │ │ │ [build-dependencies]
│ │ │ │ │ ├── cc v1.0.78 (*)
│ │ │ │ │ └── pkg-config v0.3.26
│ │ │ │ └── libc v0.2.139
│ │ │ ├── constant_time_eq v0.1.5
│ │ │ ├── crc32fast v1.3.2
│ │ │ │ └── cfg-if v1.0.0
│ │ │ ├── flate2 v1.0.25
│ │ │ │ ├── crc32fast v1.3.2 (*)
│ │ │ │ └── miniz_oxide v0.6.2
│ │ │ │ └── adler v1.0.2
│ │ │ ├── hmac v0.12.1
│ │ │ │ └── digest v0.10.6
│ │ │ │ ├── block-buffer v0.10.3
│ │ │ │ │ └── generic-array v0.14.6 (*)
│ │ │ │ ├── crypto-common v0.1.6
│ │ │ │ │ ├── generic-array v0.14.6 (*)
│ │ │ │ │ └── typenum v1.16.0
│ │ │ │ └── subtle v2.4.1
│ │ │ ├── pbkdf2 v0.11.0
│ │ │ │ ├── digest v0.10.6 (*)
│ │ │ │ ├── hmac v0.12.1 (*)
│ │ │ │ ├── password-hash v0.4.2
│ │ │ │ │ ├── base64ct v1.5.3
│ │ │ │ │ ├── rand_core v0.6.4
│ │ │ │ │ └── subtle v2.4.1
│ │ │ │ └── sha2 v0.10.6
│ │ │ │ ├── cfg-if v1.0.0
│ │ │ │ ├── cpufeatures v0.2.5
│ │ │ │ └── digest v0.10.6 (*)
│ │ │ ├── sha1 v0.10.5
│ │ │ │ ├── cfg-if v1.0.0
│ │ │ │ ├── cpufeatures v0.2.5
│ │ │ │ └── digest v0.10.6 (*)
│ │ │ ├── time v0.3.17
│ │ │ │ ├── itoa v1.0.5
│ │ │ │ ├── time-core v0.1.0
│ │ │ │ └── time-macros v0.2.6 (proc-macro)
│ │ │ │ └── time-core v0.1.0
│ │ │ └── zstd v0.11.2+zstd.1.5.2
│ │ │ └── zstd-safe v5.0.2+zstd.1.5.2
│ │ │ ├── libc v0.2.139
│ │ │ └── zstd-sys v2.0.5+zstd.1.5.2
│ │ │ └── libc v0.2.139
│ │ │ [build-dependencies]
│ │ │ ├── cc v1.0.78 (*)
│ │ │ └── pkg-config v0.3.26
│ │ └── zip v0.6.3 (*)
│ └── thiserror v1.0.38 (*)