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対応WindowsPythonモジュールのAOT形式版を作成、公開したため、Windowsネイティブ環境でも待ち時間が少なくなりました。インストール手順も見直され簡単になりました

なお動作速度は低解像度ではWSL/Linux環境より割ほど遅いようです

またドライバ4885 や 4887では動かないことがあるため、それ以前のVer.ドライバを使用してください

 

だいたい下記の翻訳です

github.com

 

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ネイティブ対応になるか試してみました

モジュールはこちらです

github.com

・ドライバ、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のブログ

で紹介している

www.technopat.net

の手順です

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ネイティブ版の更新がありました。こちらを参照ください

tomokz.hateblo.jp

 

Stable Diffusion Webui/Automatic1111のfork版 Vladmandic/automaticは以前からIntel ARC(oneAPI)対応でしたがWindowsではWSLでしか動いてませんでした。最近WSL無しで動くようになったので手順をメモします


WSL版の記事はこちら

読まなくても大丈夫です

tomokz.hateblo.jp

 

おことわり

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を使います

github.com

 


Windows版についてはこの辺で話題になっています。

 

Steps to run SD.Next on native windows with Intel Arc GPU · vladmandic/automatic · Discussion #2023 · GitHub

 

今回の記事はここに書いてある手順を訳したようなものです

インストール手順

こんな順番です

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のダウンロードリンクがあります

www.intel.com

 

上記のページを開いて、

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を使う

github.com

 

oneAPIはLinux版開発が先行しており、記事を書いた時点ではSD.nexはLinux OSまたはWSLでしか動かなかった。

今回はWSLで動かした。昔WSL1とか2とか言ってたけど今はWSLと言えばWSL2みたい

 

インストール手順

最初にPCのBIOSUEFI)でCPUの仮想化機能を有効にした後は

以下の記事に従ってWSLを入れてUbuntu22.04を入れてIntel開発環境を入れると動いた。修正するところは殆ど無い。ここでやってることを箇条書きしておくと

www.technopat.net

・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学習に対応した↓

tomokz.hateblo.jp

まとめ

A750買ったからAIお絵描きで遊んでみるか、という方はそこそこの速度で遊べる

ただWSLで動かすのでひと手間だったり、学習含めた周辺環境はやはりNvidia有利

最初からお絵描きAI用入門としてグラボ買うならRTX3060/12GBが王道で、A750との比較ならRTX3050/8GBでもいいかもしれない。RT16xx系よりはマシかな…

ubuntu20.04上のEPGStationでNicojCatchを使う

NicojCatchはEDCBの予約からNicoJK用のログを取得するソフトです。EPGStationの予約更新に合わせてEDCBの予約ファイルを作るスクリプトを作りました。

NicojCatchの動作用にwineを使います。スクリプト用にPython3,nkfを使います

 

 

続きを読む

A10N-8800E(ver.6.1)を購入、ファン交換とM.2にpcie変換ライザー追加

年末にBIOSTARのオンボードCPUマザーボードが安かったので購入しました

ファン交換とM.2からPCI express 変換ライザーカード追加時のメモです

 

続きを読む

CZUR-Auraで漫画のスキャンはつらい

小説系のスキャン

小説はだいたい手順が決まってきていて、フローはこんな感じです

・見た目の破綻がないようスキャン。モードは白黒かスタンプ

・ざっくり裁ち切り部分をクリッピングする

・etiltranで傾き補正、ページ番号位置合わせで補正

・ページの影が気になるときはトリミング

トリミングは今はRalpha使ってますが左奇数ページのトリミングを右側起点にしたいため一旦上下回転してからやってます。もう少しスマートにやりたいところ

漫画雑誌を試してみた

小説はこんな感じで流せるようになったので、漫画雑誌をページ分割モードでスキャンしてみましたがきつい。断ち切り黒のページはほとんどの失敗するし、カラーの何気ないページが分割されたり

断ち切り黒のページはわずかにサイズの大きな白い紙を挟んでおくと成功する場合がありますが、カラーページで失敗するときは原因がわからない

こんなページは歪み補正無しで保存するしかありません

ページが歪もうがフラットベッドスキャナーでざくざくスキャンする方が精神衛生上いいかも(製品コンセプト全否定)