Stable Diffusion WebUI on GCP 101
2022년, ‘Midjourney’와 ‘Stable Diffusion’의 출현은 AI Art 분야의 새로운 패러다임을 제시했습니다. 수년 전까지 GAN(Generative Adversarial Network) 기반의 모델들이 이 분야의 State-of-the-art로 인정받았습니다. 그러나 GAN의 훈련 복잡성, 이미지 품질과 다양성 간의 균형 문제, 그리고 컴퓨팅 자원의 상당한 필요로 인한 한계가 두드러지게 되었습니다.
이 한계를 극복하기 위한 새로운 접근법인 ‘Latent Diffusion’ 모델이 등장하였습니다. 특히 StableAI社가 선보인 ‘Stable Diffusion’은 기술적 혁신성으로 주목받고 있습니다.
이 글을 통해 Google Cloud Platform(GCP) 환경에서 ‘Stable Diffusion’의 설치부터 설정, 그리고 이미지 생성까지 쉽게 따라할 수 있는 가이드를 제공하겠습니다.
설치에 앞서서
StableAI社가 공개한 학습 모델을 바탕으로 다양한 이미지 생성 툴들이 출시되었습니다. 그 중에서도 비교적 용이한 설치와 운용 방법, 그리고 다양한 Third-party Extension 생태계를 갖춘 AUTOMATIC1111의 Stable Diffusion WebUI를 소개합니다.
본 글에서는 이 툴을 GCP에서 설치하고 활용하는 방법을 중점적으로 다룰 예정입니다. 물론 GCP 외에도 Local PC 환경이나 Google Colab에서도 설치 및 실행이 가능하나, 여기서는 GCP의 초당 과금제와 NVIDIA T4의 빠른 추론 성능을 최대한 활용하는 방법을 초점에 두겠습니다.
Google Cloud Platform 무료 크레딧은 사용 불가…
Google은 신규 고객들에게 $300의 무료 크레딧을 제공하며, Compute Engine 같은 일부 서비스에는 Free-tier 등급도 존재합니다. 그러나 주의해야 할 점은 Free-tier 또는 $300 무료 크레딧으로 VM 인스턴스에 GPU를 할당하는 것이 불가능하다는 것입니다. 이 부분을 미리 알고 계시기 바랍니다.
만약 새로운 Local PC를 새로 구성하려고 한다면, RTX 4080–16GB 기준으로 약 400만원 이상의 비용이 발생할 것입니다. 이미 NVIDIA GPU가 장착된 시스템을 보유하고 있거나, 이런 시스템을 장기간 활용 또는 게임 등 다른 활용 목적이 있다면 문제는 없겠지만, 생성형 AI를 짧게 경험해보고자 하는 경우 또는 가끔 사용할 목적이라면 여전히 GCP를 활용하는 것이 비용 효율적일 것입니다.
또 다른 선택지는 Google Colab이 있습니다. 약간의 이용 제약과 설치의 불편함은 감수해야 하지만, 무료라는 아주 커다란 장점을 가지고 있는 툴 입니다.하지만 이번 글에서는 GCP를 이용하는 것으로 하고, Google Colab에 관련한 팁은 다른 글로 공유하도록 하겠습니다.
Step 1. Compute Engine을 이용한 VM 생성
GCP에는 여러 서비스를 통해 VM을 생성할 수 있지만, 저렴하게 설치형 환경을 제공하는 Compute Engine을 사용하도록 하겠습니다.
이 과정을 시작하기 전에 GCP 계정이 필요합니다. https://cloud.google.com/
또 GCP에 대한 기본 지식을 가진 분들을 대상으로 작성되었기 때문에 몇몇 기본적인 설명은 생략하고 핵심적인 절차에 집중하였습니다.
Compute Engine VM 생성하기
- New Project 생성하기
VM을 생성할 새로운 프로젝트를 만든 후 선택합니다.
- Compute Engine VM 생성 시작하기
새로 생성한 프로젝트를 선택하면 위와 같이 Shortcut Menu 가 나타납니다. “Create a VM”을 선택하거나, 메뉴가 보이지 않는다면 상단 햄버거 버튼을 이용하여 VM 생성 화면으로 이동할 수 있습니다.
- VM 생성 옵션 및 예상 요금 파악하기
Stable Diffusion 모델을 CPU 환경에서 실행하기에는 우리의 인내심이 부족합니다. 따라서 GPU 인스턴스를 할당 할 수 있는 Region 과 Zone을 확인하여 VM을 생성해야 합니다.
VM에 GPU 인스턴스를 할당하면 추가 비용이 발생하는데, 지역에 따라 비용이 다르기에 가장 저렴한 지역을 선택하시길 추천드립니다. 이번 글에서 주목하는 개인적인 생성형 AI 사용의 경우, 지역 간의 네트워크 지연 시간은 크게 문제가 되지 않을 것입니다.
- VM 생성 따라하기
이 글에서는 VM 생성에 관련한 옵션 설정을 아래와 같이 하였습니다.
- Name : sd-webui
- Region : us-central1 (Iowa)
- Zone : us-central1-f
- Machine configuration : GPUs
- GPU type: NVIDIA T4
- Number of GPUs : 1
- Machine type : n1-highcpu-8 (8 vCPU, 4 core, 7.2 GB memory)
- Boot disk
— Operating system : Deep Learning on Linux
— Version : Deep Learning VM for PyTorch 2.0 with CUDA 11.8 M110
— Size : 100GB
잠깐! 혹시 에러가 발생했나요?
- Compute Engine VM을 처음 생성하는 경우
이 경우 Compute Engine API를 Enable하여 사용할 수 있도록 하면 됩니다.
- “A n1-highcpu-4 VM instance is currently unavailable in the us-west1-b zone.” 메시지가 표시되는 경우
해당 Region의 하위 Zone에 생성하려고 하는 VM Machine type의 유휴자원이 부족하여 발생하는 에러라고 합니다. Region 또는 Zone을 변경하면 해결할 수 있습니다.
- “The GPUS-ALL-REGIONS-per-project quota maximum has been exceeded.” 메시지가 표시되는 경우
대부분의 경우, 이 메시지를 만나셨을겁니다. GPU 리소스는 상대적으로 CPU보다 비싸며 유휴자원이 적습니다. 그런 이유로 GCP 에서는 GPU 리소스 할당에 대한 제한을 기본값 0 으로 설정해 두었습니다. 실수로 GPU를 할당했다가 요금 폭탄이라고 맞으면 안되니까요.
아래와 같은 메시지를 만났다면, GPU Quota 증가를 요청하시면 됩니다. 2 business day가 소요된다는 자동 메일이 오지만, 참고로 저의 경우 1분 만에 증가가 수락되었다는 메일을 받았습니다. 대부분의 경우도 수분 내에 처리되었다고 합니다.
GPU를 할당한 VM 인스턴스 생성에 성공했습니다.
Step 2. VM 인스턴스에 원격 접속하기
이제 생성한 VM에 SSH로 접속하여 Stable Diffusion WebUI를 설치하거나, Stable Diffusion WebUI를 웹브라우저를 통해 접속하기 위한 설정이 필요합니다.
- VM Firewall 설정
기본 Firewall rule로는 SSH Default port 로의 접근만 허용하고 있습니다. 따라서, SSH 접속은 문제 없겠지만 Stable Diffusion WebUI를 웹브라우저를 통해 접속할 수 없습니다. Stable Diffusion WebUI의 기본 포트인 7860번을 허용해보겠습니다.
- SSH Key를 이용한 원격 연결
VM에 SSH로 원격 연결하는 방법은 Cloud Shell, gcloud CLI, 웹 브라우저 기반의 SSH 기능 등 다양합니다. 그러나 이번 글에서는 로컬 환경의 SSH 클라이언트 프로그램을 사용하여 연결하는 방법을 소개하겠습니다.
먼저 아래 링크를 따라서 SSH Key 를 생성합니다.
https://cloud.google.com/compute/docs/connect/create-ssh-keys?hl=ko
그 다음 VM 인스턴스에 생성한 SSH Key의 “공개키”를 등록합니다.
https://cloud.google.com/compute/docs/connect/add-ssh-keys?hl=ko
— 만료 시간이 없는 키 형식:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDx6V4ZFyEHmnmj9reoeE8Mh+3wUd1rZIqIt5L9WSqMQ jphan32@gmail.com
— 만료 시간이 있는 키 형식:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDx6V4ZFyEHmnmj9reoeE8Mh+3wUd1rZIqIt5L9WSqMQ google-ssh {"userName":"jphan32@gmail.com","expireOn":"2023-10-18T08:49:18+0000"}
- SSH 접속 확인
여기까지 설정을 마치셨다면 iTerm, Warp, Windows Terminal 등으로 VM에 접속할 수 있습니다.
VM 인스턴스에는 Internal IP와 External IP가 부여되는데, 원격 접속은 당연히 External IP를 통해 접근해야 합니다. 다만, External IP의 경우 VM 인스턴스를 중지하면 자동으로 반환되고, 이후 재시작을 할 때 새로 IP를 부여받기 때문에 매 번 IP가 변경되므로 주의해야 합니다. 이를 방지하려면 “유료”의 Static IP를 할당받은 후 Externel IP로 영구 사용하는 방법도 있습니다.
$ ssh username@server_ip
- GCP Deep Learning on Linux 이미지의 장점
VM 인스턴스를 생성할 때 일반적으로 많이 사용하는 Ubuntu, Debian 이미지와 다르게, GCP 에서 제공하고 있는 Deep Learning on Linux 이미지의 경우는 NVIDIA GPU Driver 설치, CUDA Toolkit 및 cuDNN, Python, PyTorch 등이 Pre-install 되어 제공됩니다. 초기 설치를 보다 쉽게 끝낼 수 있습니다.
Stable Diffusion WebUI는 2023년 8월 현재 기준으로 Python 3.10 이상 + CUDA 11.8 이상 환경에서 설치하시길 권장드립니다.
Step 3. VM 인스턴스 관리하기
- VM 인스턴스 상태 관리
이 글에서는 개인적 목적으로 VM 인스턴스를 운용할 예정이니 모니터링이나 고가용성, 확장성은 고려하고 있지 않습니다.
하지만, VM 인스턴스의 실행 상태를 관리해야 하는 것은 아주 중요합니다. GCP의 Compute Engine의 과금 정책은 VM 인스턴스가 가동되는 시간에 따라 초단위로 과금하기 때문에, 사용하지 않을때는 VM 인스턴스를 “중지”하여 과금이 되지 않도록 하는것이 중요합니다. 다만, VM 인스턴스를 중지하더라도 Persistent disk의 저장 비용 (또, 만약 Static IP를 할당하였다면 이 비용도 포함하여)은 VM 인스턴스의 실행 여부와 관계없이 청구되니 더 이상 VM 인스턴스가 필요없어 영구히 삭제할 경우와 더불어 장기적으로 사용할 일이 없는 경우에도 불필요한 비용이 발생하지 않도록 주의가 필요합니다.
- Google Cloud Console 또는 모바일 앱을 이용한 VM 인스턴스 관리
— 이 방법은 GCP 콘솔에서 VM 인스턴스를 “START” / “STOP” 으로 간단히 실행할 수 있는 방법이기에 자세한 설명은 생략하도록 하겠습니다.
- gcloud CLI 를 이용한 VM 인스턴스 관리
— gcloud CLI의 설치 및 로그인은 아래 링크를 참고 바랍니다.
(https://cloud.google.com/sdk/docs/authorizing?hl=ko)
— gcloud 명령을 이용하여 VM 인스턴스의 목록 보기, 시작, 중지를 할 수 있고, VM 인스턴스의 Externel IP를 확인할 수 있습니다.
$ gcloud config set project PROJECT_NAME # 기본 Project 설정
$ gcloud compute instances list # VM 인스턴스 목록 / Externel IP 확인
$ gcloud compute instances start VM_NAME # VM 인스턴스 시작
$ gcloud compute instances stop VM_NAME # VM 인스턴스 중지
Step 4. Stable Diffusion WebUI 설치
- TCMalloc 설치
VM 인스턴스의 OS로 Deep Learning on Linux 를 선택했다면, 대부분의 의존성 패키지 및 라이브러리는 이미 잘 설치되어 있는 상태입니다. 하지만 몇 가지 패키지 별도의 설치가 필요한 데 그 중 하나가 Google에서 개발한 메모리 할당 라이브러리인 TCMalloc 입니다.
설치 방법은 아래와 같습니다.
$ sudo apt install google-perftools
- Stable Diffusion WebUI 내려받기
이 글에서는 Stable Diffusion WebUI 를 Github 에서 clone 하고 Install 하는 방법을 소개하겠습니다.
(https://github.com/AUTOMATIC1111/stable-diffusion-webui)
$ git clone --branch v1.5.1 https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
- Stable Diffusion WebUI 설치하기
Stable Diffusion WebUI는 실행 파일인 webui.sh 파일이 설치 파일이기도 합니다. 실행환경 체크를 통해 Python 가상환경 생성과 의존성 패키지를 하나씩 자동으로 설치하게끔 되어있습니다.
즉, webui.sh 를 실행만 하면 모든 설치가 알아서 진행됩니다.
$ cd stable-diffusion-webui
$ ./webui.sh
혹시 벌써 웹브라우저로 WebUI에 접속해보신 것은 아니시죠?
- Stable Diffusion WebUI 실행 옵션 알아보기
급하게 웹브라우저로 접속부터 해보셨다면 잠시 당황하셨을지 모르겠습니다. 아직 웹브라우저에서는 응답이 없이 접속되지 않습니다.
Stable Diffusion WebUI 실행 화면을 주의 깊게 살펴보시면 local URL: http://127.0.0.1:7860 으로 Localhost에서의 접근만 받고 있습니다. 따라서 이 글에서처럼 원격지인 GCP의 VM 인스턴스로 접근할 경우 Listen하지 못하는 문제가 발생한 것입니다.
그 외에도 유용한 몇가지 Parameters를 소개하겠습니다.
- Parameters
--listen : 0.0.0.0/0 으로의 접근을 허용할 수 있습니다.
--port PORT : listen port를 변경할 수 있습니다. (Default : 7860)
--xformers : 이미지 생성을 가속화하는데 도움을 주는 라이브러리인 xFormers 를 사용하도록 하는 옵션으로, NVIDIA GPU에 대한 최적화를 통해 이미지 생성을 개선하고 VRAM 사용을 줄입니다.
--gradio-auth USERNAME:PASSWORD : Stable Diffusion WebUI에 로그인 기능을 활성화 할 수 있습니다.
--enable-insecure-extension-access : 다양한 Third-party Extension을 설치하기 위해서는 이 옵션을 활성화 해야 합니다.
--api : 몇몇 Third-party Extension은 Stable Diffusion WebUI와 API를 통해 Integration 되어 있습니다. 이 옵션으로 더욱 확장된 기능을 사용할 수 있습니다.
Step 5. Stable Diffusion WebUI systemd 서비스 등록
위의 Step 4 까지만 해도 사실 Stable Diffusion WebUI를 사용하는데 문제는 없습니다만,
One more thing…
Linux의 systemd를 활용하여 Stable Diffusion WebUI를 간편하게 실행할 수 있게 하며, VM 인스턴스 재시작 할때마다 SSH로 접속하여 webui.sh를 수동으로 실행하지 않아도 자동으로 실행되도록 서비스를 설정하고 등록하는 방법을 소개하겠습니다.
- sd-webui.service 파일 작성
vi editor 또는 그 밖의 편집기를 이용하여 아래 내용의 파일을 작성합니다. username과 Stable Diffusion WebUI 를 clone한 디렉토리 경로는 올바르게 수정하여야 합니다. gradio-auth를 적용할 경우는 로그인을 위한 Username과 Password를 실행문에 넣어야 합니다.
~/stable-diffusion-webui/sd-webui.service
[Unit]
Description=Stable Diffusion WebUI Daemon Service
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=USERNAME
WorkingDirectory=/home/USERNAME/stable-diffusion-webui
ExecStart=/bin/bash -c "./webui.sh --listen --xformers --gradio-auth LoginUsername:Password --enable-insecure-extension-access --api"
[Install]
WantedBy=multi-user.target
- systemd 서비스 등록
다음 명령을 실행하여 서비스 데몬을 등록하고 시스템 기동 시 자동으로 시작하도록 설정할 수 있습니다.
$ sudo ln -s ~/stable-diffusion-webui/sd-webui.service /etc/systemd/system/sd-webui.service
$ sudo systemctl enable sd-webui
- systemd 서비스 실행
아래 명령어로 서비스 실행/중지와 상태 확인을 할 수 있습니다.
이제 VM 인스턴스를 재시작하여도 자동으로 Stable Diffusion WebUI가 실행됩니다.
$ sudo service sd-webui status # Stable Diffusion WebUI 상태 확인
$ sudo service sd-webui start # Stable Diffusion WebUI 실행
$ sudo service sd-webui stop # Stable Diffusion WebUI 중지
이제 모든 단계가 마무리 되었습니다.
하지만 Stable Diffusion WebUI는 이제 시작입니다.
풍부한 Third-party Extension들과 Checkpoint, LoRA 등이 활발히 공유되고 있습니다.
즐겁게 체험해보시길 바랍니다!