Intel ARC oneAPI Stable Diffusionとsd-scriptsのWindowsネイティブ対応
Stable Diffusion Webui/Automatic1111のfork版 Vladmandic/automatic、通称SD.nextはWindowsネイティブ環境で動かす場合に初期化に相当の時間を必要としていました。最近そのような制約がなくなったので手順をメモします
はじめに
IntelはCUDAを使ったpythonモジュールのARC対応版をリリースしています。Linux版とWindows版では別々のモジュールが必要です。Window版モジュールは動作させて初めて使うときに動的コンパイルが発生するため待ち時間を必要とします。Linux用はAOT(事前コンパイル)形式の待ち時間が起きない形式なので、SD.nextを使う際は環境構築やOS切り替えの手間を考えてもWSLやLinuxで動かした方が快適でした
'23年9月にNuullllという方がIntel ARC対応Windows版PythonモジュールのAOT形式版を作成、公開したため、Windowsネイティブ環境でも待ち時間が少なくなりました。インストール手順も見直され簡単になりました
なお動作速度は低解像度ではWSL/Linux環境より割ほど遅いようです
またドライバ4885 や 4887では動かないことがあるため、それ以前のVer.ドライバを使用してください
だいたい下記の翻訳です
10/13のdev版からより簡単な手順になったので本当にメモだけ
・Intel ARCドライバをインストールする
・Git for Windowsをインストールする
・Python3.10.xをインストールする
git clone https://github.com/vladmandic/automatic.git -b dev
cd automatic
.\webui.bat --use-ipex
sd-scriptsも試す
これだけでは何なので今回リリースされたWindows AOT対応版モジュールでsd-scriptsもWindowネイティブ対応になるか試してみました
モジュールはこちらです
・ドライバ、git、pythonをインストール
git clone https://github.com/kohya-ss/sd-scripts.git
cd sd-scripts
python -m venv venv
.\venv\Scripts\activate
・oneAPI用モジュールをインストール
pip install https://github.com/Nuullll/intel-extension-for-pytorch/releases/download/v2.0.110%2Bxpu-master%2Bdll-bundle/torch-2.0.0a0+gite9ebda2-cp310-cp310-win_amd64.whl
pip install https://github.com/Nuullll/intel-extension-for-pytorch/releases/download/v2.0.110%2Bxpu-master%2Bdll-bundle/torchvision-0.15.2a0+fa99a53-cp310-cp310-win_amd64.whl
pip install https://github.com/Nuullll/intel-extension-for-pytorch/releases/download/v2.0.110%2Bxpu-master%2Bdll-bundle/intel_extension_for_pytorch-2.0.110+gitc6ea20b-cp310-cp310-win_amd64.whl
pip install --upgrade -r requirements.txt
・accelerate設定
accelerate config
- This machine
- No distributed training
- NO
- yes
- NO
- all
- bf16
kohyaさんのカエルLoraを試しましたが動いてはいるようです。なお
・xformers,bitsandbytesはインストール不要で不可
・8bit系オプティマイザは使用不可
・--gradient_checkpointingを設定すると動作停止
・--persistent_data_loader_workersは設定可能
でした。いろいろ制約はありそう…
※以下数日前の設定です
インストール手順
こんな順番です
・Intel ARCドライバをインストールする
・Git for Windowsをインストールする
・Python3.10.8をインストールする
・Miniconda for Windowsをインストールする
・SD.nextことvladmandic/automaticの動くpython環境を作り、インストールする
Intel ARCドライバをインストールする
今動いてるドライバで大丈夫です
Git for Windowsをインストールする
略
Python3.10.8をインストールする
略。インストール時「PATHの拡張を有効にする」にチェックを入れて下さい
Miniconda for Windowsをインストールする
通常SD.nexはPythonのvenv形式Python環境を使いますが、Intel ARC Windowsネイティブ版ではanacond形式のPython環境を使うようです
SD.next用のPython環境を作る
minicondaコンソールを開く
Windowsメニューからminiconda プロンプト(PowrShellじゃない方)を選択し、開きます
>conda create -n sdnext python=3.10
sdnext用環境に切り替え、不足モジュールをインストールする
>conda activate sdnext
>conda install -c conda-forge libuv=1.39
IntelのサイトよりoneAPI用ランタイムをインストールする
>conda install -c intel dpcpp-cpp-rt mkl-dpcpp
SD.nextフォルダーを作る
git clone https://github.com/vladmandic/automatic.git
cd automatic
Windows用AOT対応モジュールをコピーする
automatic直下に有志の作成したAOT対応版pythonモジュールをコピーします
ここからダウンロードできます
ipex-windows-wheels - Google ドライブ
dir *.whl
2023/09/19 13:13 289,085,958 intel_extension_for_pytorch-2.0.110+git0f2597b-cp310-cp310-win_amd64.whl
2023/09/19 10:58 195,693,642 torch-2.0.0a0+gite9ebda2-cp310-cp310-win_amd64.whl
2023/09/19 10:58 767,270 torchvision-0.15.2a0+fa99a53-cp310-cp310-win_amd64.whl
SD.nextをlaunch.pyの直接呼出しにより起動します
先ほどコピーしたAOT版モジュールを使用するように環境変数を修正します
>set TORCH_COMMAND=intel_extension_for_pytorch-2.0.110+git0f2597b-cp310-cp310-win_amd64.whl torch-2.0.0a0+gite9ebda2-cp310-cp310-win_amd64.whl torchvision-0.15.2a0+fa99a53-cp310-cp310-win_amd64.whl
>python launch.py --use-ipex
次回からの起動手順
minicondaプロンプトを開く→sdnext仮想環境を有効にする→launch.py --use-ipexを直接起動する
バッチでまとめるとこんな感じ
call C:\Users\username\miniconda3\Scripts\activate.bat C:\Users\username\miniconda3
call activate sdnext
cd /D X:\dir\automatic
python launch.py --use-ipex --listen
Intel ARC oneAPI対応のkohya_ss sd-scriptsでLoraを作る
Stable Diffusion用Loraファイルの作成にはkohyaさんの作ったsd-scriptsが広く使われています。SDXLブランチがIntel ARC対応になったので使ってみました
動作環境
玄人志向のIntel ARC A750+Ryzen9 5900X,32GBメモリ,システムSSD SATAの500GB, work SSD 2TB,表示用グラボGT750tiで動かしました。システムにWSLがインストールされてるのでスワップが起こったときとても遅い…
インストール手順
WSLで動かします。初期設定はSD.nextを動かす場合と同じです
Intel ARC A750でStable Diffusionを動かす(WSL編) - tomokzのブログ
で紹介している
の手順です
・UEFIで仮想化有効にする
・Windowの「仮想マシン プラットフォーム」と「Windows サブシステム for Linux」をONにする
・WSLカーネルをアップデートする
wsl --update
・Windows ストアから Ubuntu 22.04 をダウンロードしてセットアップする
ここからWSLでの作業
・Intel OneAPI BaseKit に必要なパッケージ リストを追加
sudo apt-get install -y gpg-agent wget
wget -qO - https://repositories.intel.com/graphics/intel-graphics.key | \
sudo gpg --dearmor --output /usr/share/keyrings/intel-graphics.gpg
echo 'deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/graphics/ubuntu jammy arc' | \
sudo tee /etc/apt/sources.list.d/intel.gpu.jammy.list
wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
| gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list
sudo apt update && sudo apt upgrade -y
・Intel OneAPIパッケージをインストール
sudo apt-get install intel-opencl-icd intel-level-zero-gpu level-zero intel-media-va-driver-non-free libmfx1 libgl-dev intel-oneapi-compiler-dpcpp-cpp intel-oneapi-mkl python3-pip python3-venv git unzip libjemalloc-dev
・リポジトリのダウンロード
git clone -b sdxl https://github.com/kohya-ss/sd-scripts.git
cd sd-scripts
・python仮想環境を有効にしてIntel ARC用モジュールをインストールする
python -m venv venv
source ./venv/bin/activate
pip install torch==2.0.1a0+cxx11.abi torchvision==0.15.2a0+cxx11.abi intel_extension_for_pytorch==2.0.110+xpu -f https://developer.intel.com/ipex-whl-stable-xpu
pip install tensorboard==2.12.3 tensorflow==2.12.0 intel-extension-for-tensorflow[gpu]
pip install --upgrade -r requirements.txt
※requirements.txt中のtensorboardのバージョンを上記と同じにしておきました
・accelerateの設定
accelerate config
- This machine
- No distributed training
- NO
- yes
- NO
- all
- bf16
動作確認
kohyaさんの配布しているカエルデータで学習してみました
xformersは使えないのでmem_eff_attn、VRAM消費を減らすためcache_latentsを設定してます。8bit系オプティマイザは使えないのでAdamWにしてます。バッチサイズは2です
こんな感じのシェルスクリプトにしてます
#!/usr/bin/env bash
date > log.txt
accelerate launch --num_cpu_threads_per_process=4 --num_processes=1 --num_machines=1 --mixed_precision=bf16 "./train_network.py" --pretrained_model_name_or_path="/mnt/d/models/Stable-diffusion/sd-v1-5-pruned-noema-fp16.safetensors" --train_data_dir="/home/usr/lora/frog_bench/train" --reg_data_dir="/home/usr/lora/frog_bench/reg" --prior_loss_weight=1.0 --resolution="512,512" --output_dir="/home/usr/lora/frog_bench/output" --output_name="cjgg_frogB2" --train_batch_size=2 --learning_rate=1e-4 --max_train_epochs=4 --optimizer_type="AdamW" --mem_eff_attn --cache_latents --mixed_precision=bf16 --save_precision=fp16 --seed=42 --save_model_as=safetensors --max_data_loader_n_workers=1 --network_module=networks.lora --network_dim=4 --training_comment="activate by usu frog"
date >> log.txt
この設定でA750 8GBでの学習に37分、最大使用VRAM6.7GB、WSL最大使用メモリ14GBほどでした
Intel ARC A750でStable Diffusionを動かす (Windowsネイティブ編)
この記事以降にSD.next Windowsネイティブ版の更新がありました。こちらを参照ください
Stable Diffusion Webui/Automatic1111のfork版 Vladmandic/automaticは以前からIntel ARC(oneAPI)対応でしたがWindowsではWSLでしか動いてませんでした。最近WSL無しで動くようになったので手順をメモします
WSL版の記事はこちら
読まなくても大丈夫です
おことわり
Windows版でもWSL版同様、A750でRTX3060よりちょい遅い程度とそこそこの速度をだしますが、データの内部形式変換のため起動時や各モジュールの初回動作時に相当の待ち時間が発生します
・起動からUI表示まで2〜3分
・初回のモデル読み込みで2〜3分
・txt2img初回のプロンプト入力から出画まで12分〜
・初回顔補正 で2〜3分
・初回Adetailer(顔補正add on)で2〜3分
Linux/WSL版だと起動時の2〜3分以外はこれほどの時間はかかりません
この待ち時間は耐えられないな、という方はWSL版を検討してみてください
動作環境
玄人志向 Intel ARC A750, Ryzen9 5900, Mem32GB, SSD 2TB, 電源750W
ソフト
前回同様Intel ARC対応のAUTOMATIC1111/stable-diffusion-webuiをフォークした vladmandic/automatic、通称SD.nextを使います
Windows版についてはこの辺で話題になっています。
今回の記事はここに書いてある手順を訳したようなものです
インストール手順
こんな順番です
・Intel ARCドライバをインストールする
・Git for Windowsをインストールする
・Python3.10.8をインストールする
・Visual Stoudio2022をインストールする
・Intel OneAPI Basekitをインストールする
・Miniconda for Windowsをインストールする
・SD.nextことvladmandic/automaticの動く環境を作り、インストールする
Intel ARCドライバをインストールする
今動いてるドライバで大丈夫です
Git for Windowsをインストールする
略
Python3.10.8をインストールする
略。インストール時「PATHの拡張を有効にする」にチェックを入れて下さい
Visual Studio2022をインストールする
略。python開発、C++ CLI開発あたりをインストールするチェックを入れました
Intel OneAPI Basekitをインストールする
こちらのページ
Installation Guide (Windows) — intel_extension_for_pytorch 2.0.110+xpu documentation
中程のリンクにIntel® oneAPI Base Toolkit 2023.2.0のダウンロードリンクがあります
上記のページを開いて、
OS:Windows
Offline Installer
Ver.:2023.2.0
を選択するとDownloadリンクが現れます
お知らせメール登録用にEmail Address, Country/Regionの入力欄がありますが、登録したくない人はSign Up& Downloadのボタンの下のContinue without signing up (download starts immediately) →
からダウンロードしてください
Miniconda for Windowsをインストールする
通常SD.nexはPythonのvenv形式Python環境を使いますが、Intel ARC Windowsネイティブ版ではanacond形式のPython環境を使うようです
SD.next用のPython環境を作る
minicondaコンソールを開く
Windowsメニューからminiconda プロンプト(PowrShellじゃない方)を選択し、開きます
>conda create -n sdnext python=3.10
sdnext用環境に切り替え、不足モジュールをインストールする
>conda activate sdnext
>conda install libuv
SD.nextことvladmandic/automaticをインストールする
引き続き上記のminicondaプロンプトをそのまま使います
oneAPIツールへのpathを通す
oneAPIツールへのpathを通すバッチファイルを呼び出します
「Intel OneAPI Basekitをインストールする」で、"C:\Program Files (x86)\Intel\oneAPI\setvars.bat"がインストールされています(場所はインストール手順で変わる可能性あり)
> call "C:\Program Files (x86)\Intel\oneAPI\setvars.bat"
でコンソールに次の文字が表示されます
:: initializing oneAPI environment...
Initializing Visual Studio command-line environment...
Visual Studio version 17.6.5 environment configured.
"C:\Program Files\Microsoft Visual Studio\2022\Community\"
Visual Studio command-line environment initialized for: 'x64'
: compiler -- latest
: debugger -- latest
: dev-utilities -- latest
: mkl -- latest
: tbb -- latest
:: oneAPI environment initialized ::
コンソールからoneAPI関係コマンドが動くのを確認します
>sycl-ls
出力に
[opencl:gpu:2] Intel(R) OpenCL Graphics, Intel(R) Arc(TM) A770 Graphics 3.0 [31.0.101.4577]
といったGPU名、ドライババージョンがあればOKです
SD.nextをダウンロードし、インストールします
適当な場所X:\dir\でgit cloneします
>cd /D X:\dir
>git clone https://github.com/vladmandic/automatic.git
>cd automatic
SD.nextを初回起動します
>python launch.py --use-ipex
次回からの起動手順
miniconda プロンプト(PowrShellじゃない方)を選択し開く
>conda activate sdnext
> call "C:\Program Files (x86)\Intel\oneAPI\setvars.bat"
>cd /D X:\dir\automatic
>python launch.py --use-ipex
バッチでまとめておくと便利です
call C:\Users\username\miniconda3\Scripts\activate.bat C:\Users\username\miniconda3
call activate sdnext
call "C:\Program Files (x86)\Intel\oneAPI\setvars.bat"
cd /D X:\dir\automatic
python launch.py --use-ipex --listen
こんな感じ
Intel ARC A750でStable Diffusionを動かす(WSL編)
動作環境
Intel Core i5-12400,Mem32GB, SSD 1TB程。本来録画ファイルエンコード用PC。これに650W電源を載せた
ソフト
現在AIお絵描きに良く使われているAUTOMATIC1111/stable-diffusion-webuiは主にNvidia CUDA向け環境なのでoneAPI環境のIntel ARCではそのまま動かない
DirectML版はすんなり動くが10倍遅いので、今回はIntel ARC対応のAUTOMATIC1111/stable-diffusion-webuiをフォークした vladmandic/automatic、通称SD.nextを使う
oneAPIはLinux版開発が先行しており、記事を書いた時点ではSD.nexはLinux OSまたはWSLでしか動かなかった。
今回はWSLで動かした。昔WSL1とか2とか言ってたけど今はWSLと言えばWSL2みたい
インストール手順
最初にPCのBIOS(UEFI)でCPUの仮想化機能を有効にした後は
以下の記事に従ってWSLを入れてUbuntu22.04を入れてIntel開発環境を入れると動いた。修正するところは殆ど無い。ここでやってることを箇条書きしておくと
・Windowの「仮想マシン プラットフォーム」と「Windows サブシステム for Linux」をONにする
・WSLカーネルをアップデートする
・Windows ストアから Ubuntu 22.04 をダウンロードしてセットアップする
※このあたりで「WSLにWindowsのPATHを引き継がない」をやった
ここまでWindowsOSでの作業。ここからWSLに入っての作業
・Intel OneAPI BaseKit に必要なパッケージ リストを追加
・Intel OneAPI パッケージをインストール
・Github から Stable Diffusion WebUI SD.Next をインストールしてIntel向けオプション付きで起動
> ./webui.sh --use-ipex
modelやLoraはWindows側のフォルダをシンボリックリンクで参照するようにした
ネットワークドライブはマウントが必要になる
Windows 10の「WSL」でネットワークドライブなどをマウントする:Tech TIPS - @IT
速度など
512x512の絵を10枚描く時間を測るハローアスカベンチマークを試した
RTX3000,4000台は同じ絵になるがA750では多少違う絵になる
計測時間は55.8秒。モデルやLora後一枚目の出画が遅いので2回め以降で計測すると44.7秒。NvidiaだとRTX3060が38.9〜57.78秒、RTX3050が65.21〜74.69ぐらいなので3060よりの中間の速度
機能
SD.next(Stable Diffusion)は本来CUDA用アプリの集合体なのでIntel ARCのoneAPIでは動かないところが出てきたり、CPUに切り替わって遅くなったりする
機能でいうと
Lora使用:OK
ControlNet:一部OK...poseやdepth,reference only など試した。ip-adapterはNG。他にもNGな機能があるかもしれない
Aditailer:OK..インストール時不調だったが更新したら直った
Hires resize:OK..インストール時不調だったが更新したら直った
Tile:NG.機能としては動くがHiresで可能なサイズぐらいまでしか拡大できない
安定性
モデル入れ替えや動作でNGを踏んだとき、メモリ不足後の安定性が低い。WSLごと再起動が無難
再起動はWSLから抜けてPoweShellまたはコマンドプロンプトから
> wsl --shutdown
とする
バージョンなど
最初に動作確認したときのバージョン
Windows Driver.31.0.101.4575
Intel® oneAPI Base Toolkit 2023.1
torch==1.13.0a0+git6c9b55e torchvision==0.14.1a0 intel_extension_for_pytorch==1.13.120+xpu
SD.next: commit 2a259a8455579556ed3affa028c111f5d24afd50/ python3.10.6/torch=1.13.0/
Lora学習は駄目だった
調子に乗ってLora学習環境kohya-ss/sd-scriptsを入れてみたらCPUでしか動かなくて使えない。tensorflowやbitsandbytesのoneAPI対応待ちかな
Lora学習に対応した↓
まとめ
A750買ったからAIお絵描きで遊んでみるか、という方はそこそこの速度で遊べる
ただWSLで動かすのでひと手間だったり、学習含めた周辺環境はやはりNvidia有利
最初からお絵描きAI用入門としてグラボ買うならRTX3060/12GBが王道で、A750との比較ならRTX3050/8GBでもいいかもしれない。RT16xx系よりはマシかな…
CZUR-Auraで漫画のスキャンはつらい
小説系のスキャン
小説はだいたい手順が決まってきていて、フローはこんな感じです
・見た目の破綻がないようスキャン。モードは白黒かスタンプ
・ざっくり裁ち切り部分をクリッピングする
・etiltranで傾き補正、ページ番号位置合わせで補正
・ページの影が気になるときはトリミング
トリミングは今はRalpha使ってますが左奇数ページのトリミングを右側起点にしたいため一旦上下回転してからやってます。もう少しスマートにやりたいところ
漫画雑誌を試してみた
小説はこんな感じで流せるようになったので、漫画雑誌をページ分割モードでスキャンしてみましたがきつい。断ち切り黒のページはほとんどの失敗するし、カラーの何気ないページが分割されたり
断ち切り黒のページはわずかにサイズの大きな白い紙を挟んでおくと成功する場合がありますが、カラーページで失敗するときは原因がわからない
こんなページは歪み補正無しで保存するしかありません
ページが歪もうがフラットベッドスキャナーでざくざくスキャンする方が精神衛生上いいかも(製品コンセプト全否定)