Ubuntu22.04でLaMaのリポジトリを導入しトレーニングを試す。

コンピュータ
画像をインペインティングするモデルの一つでLaMaと言うのがあります。
インペインティング機能を使う分にはIOPaintというアプリで使えます。
IOPaint
Image Inpainting Tool Powered SOTA AI Model

環境

Windows11(WSL2)+Ubuntu22.04
CUDA 11.08
RTX4070(VRAM12GB)

Python3.8導入

sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:deadsnakes/ppa
sudo apt update
sudo apt install -y python3.8 python3.8-venv python3.8-distutils python3.8-dev git build-essential curl

リポジトリのクローン

git clone https://github.com/advimman/lama.git
cd lama

venv環境を構築

python3.8 -m venv venv
source venv/bin/activate
python -m pip install --upgrade pip setuptools wheel

pipでパッケージインストール

pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html

pip install -r requirements.txt

・requirements.txtの内容

cat requirements.txt
pyyaml
tqdm
numpy<1.20
easydict==1.9.0
scikit-image==0.17.2
scikit-learn==0.24.2
opencv-python
tensorflow
joblib
matplotlib
pandas
albumentations==0.5.2
hydra-core==1.1.0
pytorch-lightning==1.2.9
tabulate
kornia==0.5.0
webdataset
packaging
scikit-learn==0.24.2
wldhx.yadisk-direct

試行錯誤することになります。numpyなどを古いバージョンに置き換えたりしたと思います。

トーレーニングデータ準備

・基本的にリポジトリのREADMEの通りファイルをダウンロード

~/git/lama$ ls
LICENSE                          big-lama           hub                      tb_logs
LaMa_inpainting.ipynb            big-lama.zip       models                   test_large.tar
LaMa_models                      bin                output                   train_large_places365standard.tar
LaMa_models.zip                  celeba-hq-dataset  outputs                  val_large.tar
LaMa_perceptual_loss_models.zip  conda_env.yml      paper_data.zip           venv
LaMa_test_images                 configs            places_standard_dataset  wget-log
LaMa_test_images.zip             docker             requirements.txt
README.md                        experiments        requirements.txt.org
ade20k                           fetch_data         saicinpainting

・環境に合わせて調整したスクリプト

ファイル名:fetch_data/places_standard_test_val_gen_masks.sh

mkdir -p places_standard_dataset/val/
mkdir -p places_standard_dataset/visual_test/

# Places の元画像は jpg 想定なので --ext jpg を付ける
python3 bin/gen_mask_dataset.py \
  "$(pwd)"/configs/data_gen/random_thick_512.yaml \
  places_standard_dataset/val_hires/ \
  places_standard_dataset/val/ \
  --ext jpg

python3 bin/gen_mask_dataset.py \
  "$(pwd)"/configs/data_gen/random_thick_512.yaml \
  places_standard_dataset/visual_test_hires/ \
  places_standard_dataset/visual_test/ \
  --ext jpg

ファイル名:fetch_data/places_standard_test_val_prepare.sh

mkdir -p places_standard_dataset/original/test/
tar -xvf test_large.tar --strip-components=1 -C places_standard_dataset/original/test/

mkdir -p places_standard_dataset/original/val/
tar -xvf val_large.tar --strip-components=1 -C places_standard_dataset/original/val/

ファイル名:fetch_data/places_standard_test_val_sample.sh

mkdir -p places_standard_dataset/val_hires/
mkdir -p places_standard_dataset/visual_test_hires/

# randomly sample images for test and vis(リストを作る)
OUT=$(python3 fetch_data/sampler.py)
echo "${OUT}"

# test のサンプルを val_hires へコピー
while IFS= read -r i; do
  cp "$i" places_standard_dataset/val_hires/
done < places_standard_dataset/original/test_random_files.txt

# val のサンプルを visual_test_hires へコピー
while IFS= read -r i; do
  cp "$i" places_standard_dataset/visual_test_hires/
done < places_standard_dataset/original/val_random_files.txt

トレーニングコマンド

export TORCH_HOME=$(pwd); export PYTHONPATH=$(pwd)
CUDA_VISIBLE_DEVICES=0 \
python3 bin/train.py -cn lama-fourier \
  location=places_standard \
  trainer.kwargs.gpus=1 trainer.kwargs.accelerator=null

現在実行中、10時間ぐらいかかるようです。
1Epochが9時間みたいです。何Epochあるんだろう?

40Epochとのこと、40×9時間で360時間ということは現在のPCでは15日間ぐらいかかる計算に成ります。そのような日数、メインPCを占有されてると厳しいのでサブPCで環境を構築して仕切り直ししたいと思います。

1Epochトレーニング

CUDA_VISIBLE_DEVICES=0 python3 bin/train.py -cn lama-fourier   \
location=places_standard   \
trainer.kwargs.gpus=1 trainer.kwargs.accelerator=null \
trainer.kwargs.max_epochs=1

vhdxの縮小

サブPCで環境構築していたところ、学習用の画像のデータセットを展開したら、WSLのイメージファイルのvhdxが肥大化し、ストレージをパンクさせました。以前もストレージをパンクさせているので、まったく学習していないですね。近年ストレージの空き容量を気にしながら作業をすることが無くなってきたのもありますが、512GB~1TBぐらいの容量SSDでは、すぐに容量不足になるのは厳しいですね。

対策として、WSLからOSのイメージをエクスポートし、容量の大きなストレージでインポートして再構築という手順が使えます。
ただ、この方法エクスポートに書き出される容量と同程度の空き容量がストレージに必要なため、パンクしたストレージでは実施不可です。

イメージファイルを縮小する方法を試してみます。

ディストリビューションを開始できませんでした。エラー コード: 6、エラーステップ: 2
エラー コード: Wsl/Service/CreateInstance/E_FAIL

diskpartで圧縮

select vdisk file="D:\wsl\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

小さくならない。

NTFS圧縮⇒小さくなった⇒WSLでOSが起動する。⇒大きなファイルを削除し作業再開⇒再び限界まで使ってしまいOSが起動不可

また、パンクさせてしまいました。まったく、学習していませんね。

機械学習

学習と推論があり、推論はそこそのスペックのPCでも実行できますが、学習(トレーニング)は出来る限りハイスペックのPCが欲しい。場合によってはVRAMの不足で学習プログラムが実行出来なかったり、極端に遅かったりします。
また、学習(トレーニング)をする場合、学習用のデータが必要となり、ストレージの容量が必要となります。それと、学習結果のモデルファイルも数GBクラスの巨大なファイルになる場合もあり、ステップごとに記録するとストレージをパンクさせる恐れがあります。

追記:20250910
LaMaのトレーニングですが、
メインRTX4070からサブRTX3060にPCを変えて学習再開⇒ストレージをパンクさせる⇒復旧⇒再開し1Epoch完了。
本来40Epochの所1Epochですので、結果は期待できないですが、モデルは出来上がっているようなので、あとで試してみたいと思います。
ちなみに1Epochの処理時間がRTX4070(VRAM12G)で9時間でRTX3060(VRAM12G)で12時間といった感じです。

もし40Epochを実行する場合、中断と再開する方法を確立するか、ホストOSのWindows11をスリープで運用を確認する必要がありそう。
最終的に学習データを自前で用意して、自分がよく使う画像に特化したモデルを作成することが目標となります。

機械学習には夢がありますね。

学習したモデルで推論(インペイント)

1Epoch学習したモデルの作成が完了したので、試してみました。

コマンド

 python3 bin/predict.py model.path=$(pwd)/experiments/ユーザー名_日時_train_lama-fourier_/ indir=$(pwd)/places_standard_dataset/evaluation/random_thick_512/ outdir=$(pwd)/inference/random_thick_512 model.checkpoint=last.ckpt

・元画像

・マスク(白い部分がインペイントの対象)

・インペイント後

モデルが機能している感じします。

学習用データセットのパスの設定

以下のファイルにパスが設定されている。
configs/training/location/places_standard.yaml

データセットのディレクトリ(data_root_dir)は、places_standard_datasetが設定されていました。

トレーニング用の画像は、places_standard_dataset/train以下にjpgファイルをセットすれば良いみたいです。

コメント