メむンコンテンツぞスキップ
芋出し画像

Google Colab での TheLastBen版「Fast Stable Diffusion - AUTOMATIC1111」を 長期間サポヌト(LTS)化を目指しお完党解説

  • 割匕あり

AICU AIDX Labの しらいはかせ です。

数日前、曞籍「画像生成AI Stable Diffusionスタヌトガむド」(#SD黄色本) で䜿甚しおいる Google ColabでのAUTOMATIC1111の䞍具合がレポヌトされたしたが、無事に解決いたしたした。
ずき同じくしおAUTOMATIC1111 v1.10.x がリリヌスされたしたので、組み蟌んでおきたした。

https://note.com/aicu/n/nc5da1bf2f818

https://note.com/aicu/n/n92c214379528

Stable Diffusion 3のサポヌトやForgeなどで鍛えられたパフォヌマンスの改善が入りたしたので、このバヌゞョンは倚くの方に長く䜿われるこずを予想したす。

䞀方で「今埌もAUTOMATIC1111は進化し続けるのだろうか」ずいう疑問ず䞍安をお持ちの方もいらっしゃるず思いたす。この2幎間、絶えず進化し぀づけおくれるA1111さんはずおもありがたいのですが、ホビヌや技術的興味ではなく曞籍やマニュアル、API利甚や定型業務、瀟内ツヌルずいった䜿い道では、ある皋床長期間を芋据えたメンテナンスに入っおいきたいずころです。

今回の蚘事では、䞊蚘のような業務的に等で䜿われおいるであろうAUTOMATIC1111以䞋、A1111のLong-Term Support (LTS)、぀たり「長期間サポヌト版」を䜜っおみたいず思いたす。

LTS化の基本方針

LTS化の基本方針ずしおは、曞籍「画像生成 AI Stable Diffusionスタヌトガむド」#SD黄色本 で採甚しおいる TheLastBenさん原䜜のスクリプト「fast-stable-diffusion」を「最新のA1111や環境の倉化に䟝存させず、Google Colabで、できるだけメンテナンスしないで安定しお動䜜させたい」ずいうコンセプトになりたす。

ただし、セキュリティなどの察応や、メンテナンス項目が増えたり、ナヌザヌぞの負担や説明が倚くなる方向にはしたせん。
たた既存の配垃枈みコヌドを解説しながら、できるだけ少ない倉曎箇所で説明できるようにしたす。

ずいうのも、おそらく䌁業や制䜜スタゞオなどで「SD黄色本」を䜿われおいる方は、だいぶカスタマむズしおしたっおいる可胜性がありたす。今回は埮现な修正だけでLTS化を図っおいきたいず思いたす。もずもずオヌプン゜ヌスではありたすが、ブラックボックスではなく、しっかり解説するこずで、非垞に透明性の高い技術ずしお長期で掻甚できるようになりたす。
https://ja.aicu.ai/sbxl/

たず曞籍内で玹介しおいるベヌスになるスクリプトはこちら。

Install/Update AUTOMATIC1111 repo


Install/Update AUTOMATIC1111 repo のセクションに手を入れたす。

完成品これをそのたたセルに貌り付けでOK

#@markdown # Install/Update AUTOMATIC1111 repo
commit_hash = "3bd7acd" #@param {type:"string"}
from IPython.utils import capture
from IPython.display import clear_output
from subprocess import getoutput
import ipywidgets as widgets
import sys
import fileinput
import os
import time
import base64


import requests
from urllib.request import urlopen, Request
from urllib.parse import urlparse, parse_qs, unquote
from tqdm import tqdm
import six


blsaphemy=base64.b64decode(("ZWJ1aQ==").encode('ascii')).decode('ascii')

if not os.path.exists("/content/gdrive"):
  print('[1;31mGdrive not connected, using temporary colab storage ...')
  time.sleep(4)
  mainpth="MyDrive"
  !mkdir -p /content/gdrive/$mainpth
  Shared_Drive=""

if Shared_Drive!="" and not os.path.exists("/content/gdrive/Shareddrives"):
  print('[1;31mShared drive not detected, using default MyDrive')
  mainpth="MyDrive"

with capture.capture_output() as cap:
  def inf(msg, style, wdth): inf = widgets.Button(description=msg, disabled=True, button_style=style, layout=widgets.Layout(min_width=wdth));display(inf)
  fgitclone = "git clone --depth 1"
  %mkdir -p /content/gdrive/$mainpth/sd
  %cd /content/gdrive/$mainpth/sd

  # Clone the repository
  # !git clone -q --branch master https://github.com/AUTOMATIC1111/stable-diffusion-w$blsaphemy
  !git clone -q https://github.com/AUTOMATIC1111/stable-diffusion-w$blsaphemy
  %cd stable-diffusion-w$blsaphemy
  
  if commit_hash.strip():
    # Checkout the specified commit
    !git checkout {commit_hash.strip()}
    print(f"Checked out commit: {commit_hash.strip()}")
  else:
    # Use the latest version
    !git pull
    print("Using the latest version")

  !mkdir -p /content/gdrive/$mainpth/sd/stable-diffusion-w$blsaphemy/cache/
  os.environ['TRANSFORMERS_CACHE']=f"/content/gdrive/{mainpth}/sd/stable-diffusion-w"+blsaphemy+"/cache"
  os.environ['TORCH_HOME'] = f"/content/gdrive/{mainpth}/sd/stable-diffusion-w"+blsaphemy+"/cache"
  !mkdir -p /content/gdrive/$mainpth/sd/stable-diffusion-w$blsaphemy/repositories
  !git clone https://github.com/AUTOMATIC1111/stable-diffusion-w$blsaphemy-assets /content/gdrive/$mainpth/sd/stable-diffusion-w$blsaphemy/repositories/stable-diffusion-webui-assets

if not commit_hash.strip():
  with capture.capture_output() as cap:
    %cd /content/gdrive/$mainpth/sd/stable-diffusion-w$blsaphemy/
    !git reset --hard
    !rm webui.sh

clear_output()
inf('\u2714 Done','success', '50px')

#@markdown ---

远加箇所を解説したす。

commit_hash = "3bd7acd" #@param {type:"string"}
---
  # Clone the repository
  # !git clone -q --branch master https://github.com/AUTOMATIC1111/stable-diffusion-w$blsaphemy
  !git clone -q https://github.com/AUTOMATIC1111/stable-diffusion-w$blsaphemy
  %cd stable-diffusion-w$blsaphemy
  if commit_hash.strip():
    # Checkout the specified commit
    !git checkout {commit_hash.strip()}
    print(f"Checked out commit: {commit_hash.strip()}")
  else:
    # Use the latest version
    !git pull
    print("Using the latest version")
---
if not commit_hash.strip():
  with capture.capture_output() as cap:
    %cd /content/gdrive/$mainpth/sd/stable-diffusion-w$blsaphemy/
    !git reset --hard
    !rm webui.sh
clear_output()
inf('\u2714 Done','success', '50px')

AUTOMATIC1111 v.1.10.1 のコミットハッシュです。今埌はこのテキストフィヌルドでコミットハッシュを指定するこずで、最新版の取埗バヌゞョンを明瀺的に指定できたす。空癜にするず最新版を取埗したす。

画像

Requirements

次のセルです。完璧ではないですが、たずは完成品はこちら。

#@markdown # Requirements

print('[1;32mInstalling requirements...')

with capture.capture_output() as cap:
  %cd /content/
  !wget -q -i https://raw.githubusercontent.com/TheLastBen/fast-stable-diffusion/main/Dependencies/A1111.txt
  !dpkg -i *.deb
  if not os.path.exists('/content/gdrive/'+mainpth+'/sd/stablediffusion'):
    !tar -C /content/gdrive/$mainpth --zstd -xf sd_mrep.tar.zst
  !tar -C / --zstd -xf gcolabdeps.tar.zst
  !rm *.deb | rm *.zst | rm *.txt
  if not os.path.exists('gdrive/'+mainpth+'/sd/libtcmalloc/libtcmalloc_minimal.so.4'):

    %env CXXFLAGS=-std=c++14
    !wget -q https://github.com/gperftools/gperftools/releases/download/gperftools-2.5/gperftools-2.5.tar.gz && tar zxf gperftools-2.5.tar.gz && mv gperftools-2.5 gperftools
    !wget -q https://github.com/TheLastBen/fast-stable-diffusion/raw/main/AUTOMATIC1111_files/Patch
    %cd /content/gperftools
    !patch -p1 < /content/Patch
    !./configure --enable-minimal --enable-libunwind --enable-frame-pointers --enable-dynamic-sized-delete-support --enable-sized-delete --enable-emergency-malloc; make -j4
    !mkdir -p /content/gdrive/$mainpth/sd/libtcmalloc && cp .libs/libtcmalloc*.so* /content/gdrive/$mainpth/sd/libtcmalloc
    %env LD_PRELOAD=/content/gdrive/$mainpth/sd/libtcmalloc/libtcmalloc_minimal.so.4
    %cd /content
    !rm *.tar.gz Patch && rm -r /content/gperftools
  else:
    %env LD_PRELOAD=/content/gdrive/$mainpth/sd/libtcmalloc/libtcmalloc_minimal.so.4

  !pip install controlnet_aux -qq --no-deps
  os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
  os.environ['PYTHONWARNINGS'] = 'ignore'
  !sed -i 's@text = _formatwarnmsg(msg)@text =\"\"@g' /usr/lib/python3.10/warnings.py

clear_output()
inf('\u2714 Done','success', '50px')

#@markdown ---

LTS化以前に、最近のアップデヌトで䞍具合が出る芁玠が2箇所ありたすので修正したす。

(1) 叀いコヌドには13行目に spandrel がありたしたが、削陀です。

!pip install spandrel==0.1.6 -qq

(2) 代わりに28行目に controlnet_aux を加えたす。

!pip install controlnet_aux -qq --no-deps

Requirementsはこれで取り急ぎ問題なく動䜜するようになりたす良かった、でもこれで「完璧ではない」ずいう箇所がいく぀かありたす。
このTheLastBen版のA1111はTheLastBenのリポゞトリから蚭定ファむルや修正ファむルをダりンロヌドしおいたす。

䟋えばこの Dependencies/A1111.txt 、

https://raw.githubusercontent.com/TheLastBen/fast-stable-diffusion/main/Dependencies/A1111.txt

䞭身は以䞋のようになっおいたす。

https://github.com/TheLastBen/fast-stable-diffusion/raw/main/Dependencies/zstd_1.4.4+dfsg-3ubuntu0.1_amd64.deb
https://huggingface.co/TheLastBen/dependencies/resolve/main/sd_mrep.tar.zst
https://huggingface.co/TheLastBen/dependencies/resolve/main/gcolabdeps.tar.zst
https://github.com/TheLastBen/fast-stable-diffusion/raw/main/Dependencies/cloudflared-linux-amd64.deb
https://github.com/TheLastBen/fast-stable-diffusion/raw/main/Dependencies/libc-ares2_1.15.0-1ubuntu0.2_amd64.deb
https://github.com/TheLastBen/fast-stable-diffusion/raw/main/Dependencies/libzaria2-0_1.35.0-1build1_amd64.deb
https://github.com/TheLastBen/fast-stable-diffusion/raw/main/Dependencies/man-db_2.9.1-1_amd64.deb
https://github.com/TheLastBen/fast-stable-diffusion/raw/main/Dependencies/zaria2_1.35.0-1build1_amd64.deb

このURLが蚘述されたダりンロヌド先は TheLastBenさんの HuggingFaceリポゞトリですが、その䞭身は Google Colab䞊でA1111を動かすための『秘術』を担っおいたす。

画像

具䜓的にはColab䞊で動かすためのUbuntu環境、トンネル、Colab䞊での䟝存関係を解決するためのdebianパッケヌゞやZSTファむルになっおいたす。曎新頻床を芋る限りでは、比范的高頻床に曎新されおいたすし、セキュリティやアップデヌトなどもあるず思いたすので、ここをフリヌズするのは今の段階では避けおおきたいず思いたす。
ありがずうTheLastBen!!なにか支揎できるこずがあったら蚀っおね

なおこの郚分では特別な malloc (メモリ確保)が実装されおいたす。

%env CXXFLAGS=-std=c++14
!wget -q https://github.com/gperftools/gperftools/releases/download/gperftools-2.5/gperftools-2.5.tar.gz && tar zxf gperftools-2.5.tar.gz && mv gperftools-2.5 gperftools
!wget -q https://github.com/TheLastBen/fast-stable-diffusion/raw/main/AUTOMATIC1111_files/Patch
%cd /content/gperftools
!patch -p1 < /content/Patch
!./configure --enable-minimal --enable-libunwind --enable-frame-pointers --enable-dynamic-sized-delete-support --enable-sized-delete --enable-emergency-malloc; make -j4
!mkdir -p /content/gdrive/$mainpth/sd/libtcmalloc && cp .libs/libtcmalloc*.so* /content/gdrive/$mainpth/sd/libtcmalloc
%env LD_PRELOAD=/content/gdrive/$mainpth/sd/libtcmalloc/libtcmalloc_minimal.so.4
%cd /content
!rm *.tar.gz Patch && rm -r /content/gperftools

gperftools ずは Google Performance Toolsのリポゞトリで、さらにこちらに以䞋のパッチを圓おおいたす。

diff --git a/Makefile.am b/Makefile.am
index f18bf4f..10cc9d6 100755
--- a/Makefile.am
+++ b/Makefile.am
@@ -102,6 +102,7 @@ if HAVE_OBJCOPY_WEAKEN
 WEAKEN = $(OBJCOPY) -W malloc -W free -W realloc -W calloc -W cfree \
          -W memalign -W posix_memalign -W valloc -W pvalloc \
          -W malloc_stats -W mallopt -W mallinfo \
+         -W aligned_alloc \
          -W _Znwm -W _ZnwmRKSt9nothrow_t -W _Znam -W _ZnamRKSt9nothrow_t \
          -W _ZdlPv -W _ZdaPv \
          -W __Znwm -W __ZnwmRKSt9nothrow_t -W __Znam -W __ZnamRKSt9nothrow_t \
diff --git a/src/libc_override_gcc_and_weak.h b/src/libc_override_gcc_and_weak.h
index ecb66ec..1f19e01 100644
--- a/src/libc_override_gcc_and_weak.h
+++ b/src/libc_override_gcc_and_weak.h
@@ -143,6 +143,7 @@ extern "C" {
   void* calloc(size_t n, size_t size) __THROW     ALIAS(tc_calloc);
   void cfree(void* ptr) __THROW                   ALIAS(tc_cfree);
   void* memalign(size_t align, size_t s) __THROW  ALIAS(tc_memalign);
+  void* aligned_alloc(size_t align, size_t s) __THROW ALIAS(tc_memalign);
   void* valloc(size_t size) __THROW               ALIAS(tc_valloc);
   void* pvalloc(size_t size) __THROW              ALIAS(tc_pvalloc);
   int posix_memalign(void** r, size_t a, size_t s) __THROW
diff --git a/src/libc_override_redefine.h b/src/libc_override_redefine.h
index 72679ef..89ad584 100644
--- a/src/libc_override_redefine.h
+++ b/src/libc_override_redefine.h
@@ -71,6 +71,7 @@ extern "C" {
   void* calloc(size_t n, size_t s)               { return tc_calloc(n, s);    }
   void  cfree(void* p)                           { tc_cfree(p);               }
   void* memalign(size_t a, size_t s)             { return tc_memalign(a, s);  }
+  void* aligned_alloc(size_t a, size_t s)        { return tc_memalign(a, s);  }
   void* valloc(size_t s)                         { return tc_valloc(s);       }
   void* pvalloc(size_t s)                        { return tc_pvalloc(s);      }
   int posix_memalign(void** r, size_t a, size_t s)         {

このパッチは、Google Perftools (gperftools) の゜ヌスコヌドに察する倉曎を行っおいたす。䞻な目的は、C++14の新しいメモリ割り圓お関数である aligned_alloc をTCMallocに察応させるこずです。調べおみたら怪しい凊理ではなかったので、以䞋に、パッチの䞻芁な郚分ずその意味を説明しおおきたす。

  1. 環境倉数の蚭定

  2. gperftoolsのダりンロヌドずパッチの適甚

  3. パッチの内容

    • Makefile.am: aligned_alloc 関数のシンボルを匱くするオヌバヌラむド可胜にする蚭定を远加しおいたす。

    • libc_override_gcc_and_weak.h: aligned_alloc 関数をTCMallocの tc_memalign 関数に゚むリアスしおいたす。

    • libc_override_redefine.h: aligned_alloc 関数を tc_memalign 関数を䜿甚しお再定矩しおいたす。

  4. gperftoolsのビルド

  5. ビルドしたラむブラリの配眮

  6. 環境倉数の蚭定

  7. クリヌンアップ

このパッチずスクリプトの䞻な目的は、C++14の aligned_alloc 関数をサポヌトするようにTCMallocを修正し、それをシステムのデフォルトメモリアロケヌタずしお蚭定するこずです。これにより、メモリ管理のパフォヌマンスが向䞊し、特に倧量のメモリ割り圓おず解攟を行うアプリケヌションStable Diffusionのような機械孊習タスクなどで効果を発揮する可胜性がありたす。
぀たり「Fast Stable Diffusion」の高速な芁玠はここのメモリ確保の改善にあるずいうこずですね。必芁なパッケヌゞを固めるこずで、起動も高速になるように工倫されおいるず掚枬したす。

✚この蟺をLTS化するのであれば TheLastBenさんに盞談するか、AICUに盞談しおいただいたほうがいいかもしれないですね。

Model Download/Load  ControlNet は倉曎なしです

最近のAICUでの hotfixずしお、以䞋の xformersの䞍具合を修正しおいたしたが、こちらのコヌドセルは削陀しお構いたせん。

#@markdown ### xformers の再むンストヌル(v20240522)
!python --version
!yes | pip uninstall xformers
!pip install xformers

Start Stable-Diffusion

さお、いよいよ起動セルです

 
 

AICU

 
 
生成AI時代に「぀くる人を぀くる」をビゞョンに掻動する日本最倧のクリ゚むティブAIコミュニティ。 AIクリ゚むタヌさんずずもに、「わかるAI」を䌝えおいきたす。

あなたぞのおすすめ