Ubuntu22.04DesktopでSeeSRをインストールした記録

AI・機械学習 コンピュータ
AI・機械学習

実行した環境

Windows11のWSL2でUbuntu22.04

CUDAのバージョンは11.8

 

githubからリポジトリをクローン

cd ~/git
git clone https://github.com/cswry/SeeSR.git
cd SeeSR

 

venvによるpipのインストール環境の構築

mkdir venv
python3 -m venv venv
source venv/bin/activate

 

requirements.txtの内容をテキストエディタで編集

torch==2.0.1 --index-url https://download.pytorch.org/whl/cu118
huggingface_hub==0.25.2
diffusers==0.21.0
pytorch_lightning==2.1.3
accelerate==0.25.0
transformers==4.25.0
xformers
loralib==0.1.2
fairscale==0.4.13
pydantic==1.10.11
gradio==3.24.0
opencv-python==4.9.0.80
chardet==5.2.0
einops==0.7.0
scipy==1.10.1
timm==0.9.12
gdown

torchはcudaのインストールバージョンに合わせる。

 

編集後インストール

pip install -r requirements.txt

 

model用ディレクトリ作成とStableDiffusionのインストールスクリプトを作成

import os
from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler
import torch

os.makedirs(os.path.join("preset", "models"), exist_ok=True)
model_id = "stabilityai/stable-diffusion-2-base"
scheduler = EulerDiscreteScheduler.from_pretrained(model_id, subfolder="scheduler")
pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler, torch_dtype=torch.float16)
save_directory = "preset/models/stable-diffusion-2-base"
pipe.save_pretrained(save_directory)
scheduler.save_pretrained(save_directory + "/scheduler")

適当なスクリプト名で作成し実行します。

preset/modelsというディレクトリが出来上がりそちらにmodelファイルを用意していきます。

 

Googleドライブで公開されているmodelファイルをダウンロードするスクリプトを作成

import os
import gdown

os.makedirs('preset/models/seesr', exist_ok=True)
os.makedirs('preset/models/seesr/unet', exist_ok=True)
os.makedirs('preset/models/seesr/controlnet', exist_ok=True)


# DAPE
gdown.download(
    'https://drive.google.com/uc?id=1KIV6VewwO2eDC9g4Gcvgm-a0LDI7Lmwm',
    'preset/models/DAPE.pth',
    quiet=False,
)

# SeeSR
gdown.download(
    'https://drive.google.com/uc?id=1sUU-noBhI9tGF9j6S8pIjO_AnmT99NDh',
    'preset/models/seesr/scaler.pt',
    quiet=False,
)
gdown.download(
    'https://drive.google.com/uc?id=1JxX_-MHZZ77Z0ElnEnoLhXi6MlTl7SqO',
    'preset/models/seesr/unet/config.json',
    quiet=False,
)
gdown.download(
    'https://drive.google.com/uc?id=10KEt-EYj565VhA8pJOF9Bxp_2Wdxo9lV',
    'preset/models/seesr/unet/diffusion_pytorch_model.safetensors',
    quiet=False,
)
gdown.download(
    'https://drive.google.com/uc?id=1hKNsEB9k2GC3lsBKJf1zA6Mi4b-tTY5Q',
    'preset/models/seesr/controlnet/config.json',
    quiet=False,
)
gdown.download(
    'https://drive.google.com/uc?id=1R_rWUdJ6oJXR6PhPlbGAvfEltajr1KbN',
    'preset/models/seesr/controlnet/diffusion_pytorch_model.safetensors',
    quiet=False,
)

こちらもスクリプトファイルを作成し実行します。

 

次にhuggingfaceで公開されているmodelファイルをwgetでダウンロードします。

wget https://huggingface.co/spaces/xinyu1205/recognize-anything/resolve/main/ram_swin_large_14m.pth -P preset/models

 

プリセット画像を拡大しています。

python3 test_seesr.py \
--pretrained_model_path preset/models/stable-diffusion-2-base \
--prompt '' \
--seesr_model_path preset/models/seesr \
--ram_ft_path preset/models/DAPE.pth \
--image_path preset/datasets/test_datasets \
--output_dir preset/datasets/output \
--start_point lr \
--num_inference_steps 50 \
--guidance_scale 5.5 \
--process_size 512

成功するとpreset/datasets/output/sample00/179.pngに画像ファイルが出来上がります。

メキシコサラマンダーの画像が128×128が512×512へ4倍に拡大されました。

 

modelsディレクトリの構造

preset/models
├── DAPE.pth
├── ram_swin_large_14m.pth
├── seesr
│   ├── controlnet
│   │   ├── config.json
│   │   └── diffusion_pytorch_model.safetensors
│   ├── scaler.pt
│   └── unet
│       ├── config.json
│       └── diffusion_pytorch_model.safetensors
└── stable-diffusion-2-base
    ├── feature_extractor
    │   └── preprocessor_config.json
    ├── model_index.json
    ├── scheduler
    │   └── scheduler_config.json
    ├── text_encoder
    │   ├── config.json
    │   └── model.safetensors
    ├── tokenizer
    │   ├── merges.txt
    │   ├── special_tokens_map.json
    │   ├── tokenizer_config.json
    │   └── vocab.json
    ├── unet
    │   ├── config.json
    │   └── diffusion_pytorch_model.safetensors
    └── vae
        ├── config.json
        └── diffusion_pytorch_model.safetensors

10 directories, 20 files

 

入力・出力ディレクトリを固定してバッチ処理を行うスクリプト

#!/bin/bash
cd ~
venvFile=`pwd`'/git/SeeSR/venv/bin/activate'
dataRoot='/mnt/f' # 環境に合わせて修正(Windowsのfドライブ)
inputDir=$dataRoot'/input' # 環境に合わせて修正(入力画像)
outputDir=$dataRoot'/output' # 環境に合わせて修正(出力画像)
logfile=$dataRoot'/logs/SeeSR.log' # 環境に合わせて修正(ログのパス)

cd $outputDir
if [ `ls -U1 | wc -l` -ne 0 ]; then
    rm *
fi;
cd $inputDir
if [ `ls -U1 | wc -l` -eq 0 ]; then
    echo 'Not File';
    exit 1
fi;
cd ~/git/SeeSR
source $venvFile
echo '*** SeeSR Start ***' >> $logfile
date >> $logfile
python3 test_seesr.py \
    --pretrained_model_path preset/models/stable-diffusion-2-base \
    --prompt '' \
    --seesr_model_path preset/models/seesr \
    --ram_ft_path preset/models/DAPE.pth \
    --image_path $inputDir \
    --output_dir $outputDir \
    --start_point lr \
    --num_inference_steps 50 \
    --guidance_scale 5.5 \
    --upscale 4 \
    --process_size 512
date >> $logfile
echo '*** SeeSR End ***' >> $logfile
deactivate
cd $inputDir
if [ `ls -U1 | wc -l` -ne 0 ]; then
    rm *
fi;

プリセット画像が128×128を4倍にする程度であれば、それほど時間がかかるわけではないですが、1100×1600の画像を拡大しようとすると数十分ほど時間がかかります。

PCはRyzen7-5700X MEM:64GB RTX4070といった構成です。

また、完走せずにkillされることが結構の頻度で発生して安定しない感じです。

実行中はVRAMで使用率が高まり、共有メモリとしてメインメモリーも使われて、さらにCドライブへのアクセスが増大しますので、かなりメモリを消費しています。

内部でStableDiffusion使われていることから、画像の内容を認識し、文字としてプロンプトにセットして画像を生成しているようです。そちらが超解像とどのような使われ方をしているのでしょうか?詳細のクオリティが高い部分があり、オリジナルには存在していないので、生成しているような感じがします。

 

SeeSRに限らずですが、実行環境の構築が難しく、そのため、このような記事で手順を残していますが、パッケージ、ドライバ、ツールキットなどがバージョンアップする関係上、再現性についてはよろしくない感じです。一度作成した実行環境を維持する仮想環境が必須だと思います。

pipパッケージレベル…venv

python(バージョン)…Anacondaなど

コンテナ(アプリケーション+実行環境)…docker

OSレベル…KVMなど

 

 

コメント