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ほどでした