Stable Diffusion은 Stability AI에서 오픈소스 라이선스로 배포한 text-to-image 인공지능 모델이다.
인공지능 모델을 사용하기 위해 GPU 없이는 사실상 Stable Diffusion은 사용이 불가하다.( 최소 스펙이 되야함 )
그러므로 Azure에서 GPU가 있는 가상머신을 빌리고, 그곳에서 Stable Diffusion을 구동시킬 것이다.
1. 리소스 그룹 만들기


리소스 그룹 -> "만들기" 클릭
- 구독 : 리소스가 함께 청구될 계정
- 리소스 그룹 : 그룹 이름( 식별 가능하게 생성 ) => 이름은 만들고 나서 수정 불가
- 영역 : 한국이면 "Korea Central"
2. Machine Learning Studio에서 컴퓨팅 생성
Azure에서 GPU가 있는 가상머신을 빌리기 위해 Machine Learning Studio에 들어가 컴퓨팅을 생성해야 한다.
우선 마켓플레이스에서 Machine Learning Studio를 생성


만들기 => "Azure 서비스만" 체크 => "machine learning" 검색후 "만들기" 클릭

- 이름 : 5b015-ml
- 지역 : Korea Central
- 스토리지 계정, 키 자격 증명, 앱 인사이트 : 이름 설정하면 자동으로 지정
- 네트워킹 : 공개
만들기 => 배포 완료


배포 완료되면 리소스로 이동후 "Studio 시작하기" 클릭

관리 - 컴퓨팅 으로 들어가서 컴퓨팅 생성

- 이름 : b015-sd-vm ( stable diffusion virtual machine이라는 뜻 )
- 가상 머신 유형 : GPU (반드시 GPU 선택해야함, CPU 선택하면 AI모델 돌릴때 엄청난 시간 소요)
- 가상 머신 선택 : Standard_NC4as_T4_v3 ( 4코어 짜리 )
- 일정 예약 : 사용하지 않으면 일정 시간 이후 자동 종료 설정 ( 60분 )
- 보안 : SSH 활성화 => Generate new key pair => 키 쌍 이름 설정 => 프라이빗 키 새로 생성

만들기 => 새 키 쌍 생성창이 나오면 반드시 프라이빗 키 다운로드
관리 - 컴퓨팅에서 "실행 중"이라고 나오면 컴퓨팅 생성 성공
이제 시간당 비용이 발생하므로 주의해야한다.

3. PowerShell에서 SSH를 통해 가상 머신 접속
Window PowerShell에서 다음 명령어로 가상 머신 접속
ssh -i <프라이빗 키 경로> 사용자ID@공용IP주소 -p 50000
( SSH를 통해 가상 머신에 접속 )
( -i : identity / -p : 포트 번호 )
[ Permission 에러 발생 시 ]
Power Shell (X) , CMD (O)
내 프라이빗 키가 있는 경로로 이동 후(cd 경로)
1. icacls <KEY>.pem /reset
2. icacls <KEY>.pem /grant:r %username%:(R)
3. icacls <KEY>.pem /inheritance:r
다시 Power Shell로 접속 후, ssh 접속 명령어 입력

왼쪽에 초록색으로 "관리자이름@컴퓨팅이름"의 환경이 뜨면 접속 성공
4. Stable Diffusion WebUI by Automatic1111 설치
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
( 깃허브에 올라와 있는 “스태블 디퓨전 웹 UI”를 현재 디렉토리로 복제함 )
( clone : Git에서 프로젝트를 복제할 때 사용 )
( 현재 디렉토리 위치 : /home/관리자이름 => pwd 명령어로 확인 가능 )
cd stable-diffusion-webui/models/Stable-diffusion
( 스태블 디퓨전 checkpoint 넣어야 할 곳으로 이동 )

지금까지 스태블 디퓨전 웹UI를 가져온것이고, 이제 저 폴더에다가 HuggingFace에서 가져올 수 있는
스태블 디퓨전 모델을 돌리는 "checkpoint파일"을 가져올 것이다.
checkpoint파일을 가져오기 위해서는 HuggingFace에서 발급한 Access Token이 필요하다.

HuggingFace 사이트 이동 => Settings => Access Tokens => +Create new token =>
token type : Read / token name : 이름 지정 => 토큰 발급후 key 내용 어딘가에 기록
이제 우리는 모델들을 비교하기 위해 3가지의 모델들을 가져올 것이다.
curl -H "Authorization: Bearer <토큰 키>" https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt --location --output v1-5pruned-emaonly.ckpt
curl -H "Authorization: Bearer <토큰 키>" https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors --location --output sd_xl_base_1.0.safetensors
curl -H "Authorization: Bearer <토큰 키>" https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0.safetensors --location --output sd_xl_refiner_1.0.safetensors
( curl : 데이터를 전송하는 도구, 주로 HTTP/HTTPS 요청을 통해 데이터를 다운로드하거나 API와 상호작용할 때 사용 )
( -H "Authorization: Bearer <토큰>" : HTTP 요청할때 API 요청 헤더에 인증 토큰을 추가 ,
Hugging Face API를 사용하기 위해 인증 토큰을 Bearer 방식으로 전송 )
( https:// … url부분 : 이 URL에서 .safetensors 형식/ .ckpt 형식으로 된 모델을 다운로드 (.ckpt가 체크포인트) )
( --location : HTTP 요청이 리다이렉션될 경우 그 리다이렉션을 자동으로 따라가도록 합니다. )
( --output v1-5pruned-emaonly.ckpt : 다운로드된 파일의 이름을 지정 )
Bearer 토큰은 OAuth 2.0 인증 체계에서 사용되는 액세스 토큰의 한 유형
요청 시 토큰을 헤더에 포함시켜 서버에 전달하며, 서버는 토큰을 확인한 후 권한이 있는지 판단하여 요청을 처리함
5. Conda 가상환경 설치
인공지능 모델을 돌리기 위해서는 torchvision, pytorch 등 여러 패키지들을 다운 받아야 한다.
그래서 서드파티 채널에서도 패키지들을 다운 받을 수 있는 conda 환경을 사용할 것이다.
- 가상머신(VM) : 컴퓨터 하나 빌려온 것
- 가상환경(conda) : 방을 나눠주는 것
우리는 Azure에서 GPU가 있는 가상 머신을 하나 빌려서, 그 위에 가상환경을 띄워 방을 나눠준 것이다.
가상환경으로 conda를 사용했는데 conda는 200명 이상 직원이 있는 회사에서는 라이센스가 필요하다.(유료)

하지만, 약관을 살펴보면 Anaconda의 저장소를 사용하는 것이 문제이기 때문에,
miniconda + conda-forge 조합으로 사용하면 해결되는 문제라고 한다.
conda create --name sdwebui python=3.10.6 -y
( “sdwebui”라는 이름의 가상환경을 파이썬 3.10.6으로 새로 설치 )
( --name == -n 같음 )

Stable Diffusion WebUI by Automatic1111가 있는 깃허브의 Read me를 확인하면,
파이썬 새로운 버전은 torch를 지원하지 않는다고 한다.
그러므로 호환성을 위해 Python 3.10.6 버전이 권장된다.
6. 가상환경에서 Stable Diffusion에 필요한 패키지들 설치
conda activate sdwebui
( "sdwebui" 가상환경 실행 )
( 맨왼쪽에 가상환경 이름 바뀌는거 확인 )
cd ../..
( /stable-diffusion-webui 여기로 이동 )

이 디렉토리에 필요한 패키지들의 버전이 명시된 " requirements_versions.txt"라는 텍스트 파일이 있다.
pip install -r requirements_versions.txt
( requirements.txt에 정의된 패키지들을 해당 버전으로 전부설치 )
( 파이썬 관련 라이브러리를 설치하기 위해 pip 사용함 )
( requirements_versions.txt는 Python 프로젝트를 배포할 때, 필요한 패키지와 버전을 관리하기 위해 흔히 사용됌.)
conda install pytorch torchvision torchaudio pytorch-cuda=12.4 -c pytorch -c nvidia
( pytorch 패키지, cuda 관련 패키지들 설치 )
( pytorch-cuda=12.4 : GPU가속 관련 패키지 )
( -c pytorch : PyTorch 패키지를 공식 PyTorch 채널에서 설치 )
( -c nvidia : CUDA 관련 패키지를 NVIDIA 채널에서 설치 )
git config --global --add safe.directory '*'
( git에 이 디렉토리와 하위들은 안전한 디렉토리라고 해주는 것 )
( git config : Git의 설정을 변경 )
( --global : 변경 사항이 모든 Git 프로젝트에 적용 )
( --add safe.directory : 기존의 safe.directory 설정에 새 값을 추가 )
(safe.directory : Git에서 안전한 디렉토리로 간주하는 디렉토리를 설정 )
( '*' : 모든 디렉토리를 의미하는 와일드카드 문자 )
conda install xformers -c xformers/label/dev -y
( conda 사용하여 xformers 패키지 설치 )
( -c xformers/label/dev : 패키지를 설치할 때 사용할 채널(저장소)을 지정 )
xformers는 메모리 효율적인 변환기(transformer) 아키텍처를 구현하는 라이브러리이다.( 메모리 덜 쓰고, 속도 빠르게 )
주로 PyTorch 기반의 모델 최적화에 사용된다.
pip install civitdl
( CivitAI와 관련된 Python 패키지 설치 )
( Stable Diffusion 모델이나 관련 리소스(LoRA)를 CivitAI에서 다운로드하기 위해 설치 )
7. Stable Diffussion WebUI를 실행
accelerate launch --mixed_precision=bf16 --num_cpu_threads_per_process=6 launch.py --share --enable-insecure-extension-access --xformers --no-half-vae --gradio-auth <username>:<password>
( Accelerate 라이브러리를 통해 Stable Diffusion WebUI를 실행 )
( accelerate launch : Hugging Face의 Accelerate 라이브러리를 사용하여 Python 스크립트를 실행 )
( Accelerate 라이브러리 => 분산 학습이나 GPU 최적화를 지원 )
( --mixed_precision=bf16 : BF16(BFloat16) 혼합 정밀도를 사용하여 메모리 효율성을 높임 )
( --num_cpu_threads_per_process=6 : 각 프로세스에 사용할 CPU 스레드 수(6개)를 지정 )
( launch.py : 실행할 Python 스크립트, 이걸 통해 Stable Diffusion WebUI를 실행 )
( --share : Gradio 인터페이스를 외부 네트워크에서 접근할 수 있도록 공유 링크를 생성 => https:// ~ )
( --enable-insecure-extension-access : 확장 기능에 대한 안전하지 않은 접근을 허용 )
( --xformers : xformers 라이브러리 사용해 모델 실행 속도와 메모리 효율성을 최적화 )
( --no-half-vae : VAE(Variational AutoEncoder)를 FP16 대신 FP32로 실행, VAE의 정밀도를 높임 )
( --gradio-auth : Gradio 인터페이스에 인증을 추가 )
만약 오류가 발생하면,
conda update --all
conda install pytorch torchvision torchaudio pytorch-cuda=12.4 -c pytorch -c nvidia
다시 설치하고 accelerate 재실행
실행이 정상적으로 된다면 아래와 같이 URL이 나온다.

URL로 접속후 전에 입력했던 <username>, <password>로 로그인

아래와 같이 화면이 나온다면 Stable Diffussion WebUI 접속 성공!

테스트를 위해 text를 입력해 이미지를 생성해보자.
Prompt : an office worker who sits on a chair and eats doughnuts and coffee ( 의자에 앉아 도넛과 커피를 먹는 직장인 )
Sampling method : Euler a
Schedule type : Karras

위와 같이 이미지가 프롬프트에 맞게 아주 잘 생성되는 것을 확인할 수 있다.
8. LoRA를 사용해 Civit.ai의 이미지와 비슷한 이미지 생성하기
Civitai는 Stable Diffusion 학습 모델을 공유하는 오픈 소스 웹사이트이다.
Civitai에서 civitdl 번호를 통해 LoRA를 가져오고 싶으면 Civitai의 API key를 발급 받아야 한다.
civitai 접속 => 계정 => Account settings => API Keys => Add API key => key 이름 입력후 어딘가에 key 저장

이제 원하는 이미지 모델을 찾아야 한다.
Models => filter에서 "LORA" 클릭 => 원하는 이미지 클릭후 모델ID 확인( 706978 )

다시 Power Shell로 이동해서 sdwebui 가상환경에서 작업
cd models/Lora
( /stable-diffusion-webui/models/Lora 위치로 이동 )
civitdl 모델ID . -k <api키>
( civitai에서 해당 디렉터리에 입력한 ID의 모델을 가져옴 )
cd ../..
( 다시 /stable-diffusion-webui 로 돌아감 )
이제 다시 accerlate 실행후 웹 접속 ( 다시 실행 할때마다 public URL이 계속 바뀌므로 주의! )

이렇게 Lora부분에 우리가 원하는 모델이 추가되었다. 저 모델을 클릭하면 Prompt에 Lora를 추가시킬수 있다.
Pose 관련 모델이니까 포즈를 하고 있는 실제 사람 사진이 나와야 한다.

얼굴은 좀 이상하지만 성공적으로 이미지가 생성되었다.
9. 결과물 다운로드 받기
cd outputs/txt2img-images/2024-09-29
( 이미지 저장위치로 이동 (날짜는 바뀔수있음) )
zip -r output.zip .
( "output.zip"이라는 이름으로 압축하기 )
( . 은 현재 디렉토리의 파일들 압축 )
scp -i <프라이빗키> -P 50000 <관리자이름>@공용IP주소:/home/azureuser/stable-diffusion-webui/outputs/txt2img-images/2024-09-29/output.zip .
( 원격 서버에서 로컬 컴퓨터로 파일을 복사 )
( . 이니까 로컬의 현재 디렉토리로 복사 )
현재 디렉토리에서 output.zip 압축파일 나오면 성공!

'클라우드' 카테고리의 다른 글
| Azure Machine Learning을 통한 야구 선수 능력 측정 모델 구현(군집) (3) | 2024.10.14 |
|---|---|
| Azure Machine Learning을 통한 자전거 렌탈 수요 예측 모델 구현(회귀) (1) | 2024.10.13 |
| Azure Machine Learning을 통한 로켓 발사 여부 예측 모델 구현(분류) (0) | 2024.10.13 |
| Microsoft Azure VM에 블로그 만들기 (10) | 2024.09.29 |