Open8

diffusers-rsを試す

lilacs2039lilacs2039

概要

リポジトリ
https://github.com/LaurentMazare/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 インストール

参考 https://pytorch.org/

sudo pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116
lilacs2039lilacs2039

データ準備

以下の作業は基本的に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
lilacs2039lilacs2039

画像生成実行(SD 1.5)

READMEのコマンドそのままでは動かず、オプションがいる --sd-version v1-5
https://github.com/LaurentMazare/diffusers-rs/issues/28

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

シードはランダムみたい。リポジトリトップページと同じ画像は生成されなかった。

lilacs2039lilacs2039

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へのコンパイルが可能

lilacs2039lilacs2039

ターゲットを変えてビルドしてみる

発想元

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の違い

https://docs.wasmtime.dev/wasm-rust.html

  • 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
lilacs2039lilacs2039

[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"
詳しくはこちらをご覧ください。

lilacs2039lilacs2039

クレートの依存ツリー

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 (*)