본문 바로가기

만들고 싶은거 만들기

광고 수익을 창출할 웹사이트 만들어보기 2-3 (Stable Diffusion 파고들기 With LoRA삽질)

 

 

이전에 만들어졌던 기괴한 이모지(?) 다.....

 

이렇게 만들어 진데는 일단 3가지 정도의 이유가 있다고 한다.


문제가 발생한 이유

  1. Stable Diffusion의 기본 모델 한계:
    • Stable Diffusion은 사실적인 이미지 생성에 특화되어 있으며, 이모지 같은 간단하고 추상적인 스타일에는 적합하지 않을 수 있습니다.
  2. 프롬프트 해석 문제:
    • "cute cat emoji, cartoon style, flat design"이라는 프롬프트가 원하는 대로 해석되지 않고, 패턴화된 결과물이 생성된 것으로 보입니다.
  3. 모델 Fine-tuning 부족:
    • 이모지 스타일 생성에 적합한 추가 학습(LoRA 또는 DreamBooth)이 필요할 수 있습니다.

일단 첫번째 스테이블 디퓨전은 사실적인 이미지 생성에 특화되어있다고 한다...!

 

두번째는 프롬프트의 문제라고 하는데 내가 만드려는 AI이미지 생성기는 프롬프트에 최대한 간단히 넣어놔도 원하는 이모티콘을 뽑아야 하기때문에 긴 프롬프트는 사용하지 않으려고 한다.

 

세번째 모델의 파인튜닝...? LoRA...? 

 

LoRA라는건 특정 스타일이나 주제(이모지, 픽셀 아트 등)를 추가 학습시킨 모델이라고 한다.

그러니까 내가 띄워논 스테이블디퓨전 서버에 이모지스타일이나 카툰스타일의 로라를 적용하면 

이러한 스타일의 결과값을 도출해낸다는 건데..........

 

재미있겠다. 바로 진행해보자.


Civitai에서 "Emoji Style" 또는 "Cartoon Style"과 관련된 LoRA 모델을 다운로드할수 있다고 한다.

 

적용방법은 어렵지 않다.

로라모델을 다운로드 후 Python 코드에서 스테이블 디퓨전 서버를 기동할때 다운로드받은 로라파일(?)의 경로를 넣어주면 된다는 것같은데 일단 civitai에 들어가봤다.

 

음....... 이모지 검색해보자.

 

...!! 이녀석 내맘에 들었다.

 

제목도 웃긴데 무려

첫눈에 상사가 당신과 소통하고 싶지 않게 만드는 이모티콘/아바타

이다.

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


일단 LoRA 모델을 다운로드 받아야 한다.

 

홈페이지의 다운로드 버튼을 클릭해서 다운로드 해준다.

D:\emoji-generator\model\lora 경로폴더를 생성해 다운로드 받은 safetensors 확장자의 파일을 넣어준다.

그 후 Flask 서버에서 LoRA 모델을 로드해줘야 한다.

pip install safetensors

일단 터미널에서 lora파일 처리에 필요한 라이브러리를 인스톨 해준 후 app.py 파일에 아래 코드를 추가한다.

 

from diffusers import StableDiffusionPipeline
from safetensors.torch import load_file

# Stable Diffusion 모델 로드
model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id)

# LoRA 모델 경로 설정
lora_path = "./model/lora/tt1.safetensors"

# LoRA 가중치 조정 (0.7으로 설정)
pipe.unet.load_attn_procs(load_file(lora_path))
pipe.unet.set_attn_processor_weights(scale=0.7)  # 가중치를 0.7로 설정

# GPU로 이동
pipe.to("cuda")

 

로라모델 처리에 필요한 라이브러리를 import해주고

다운로드받은 LoRA모델의 경로설정 과 가중치를 조정한다.

#가중치란 LoRA(Low-Rank Adaptation) 모델의 가중치는 기존 대형 모델의 가중치를 효율적으로 조정하기 위해 사용된다.
대형 모델의 전체 가중치를 바꾸는 대신, LoRA는 저차원 행렬(Low-Rank)을 추가해 학습 효율을 높이고 메모리 사용을 줄인다.
이 방식은 작은 데이터로도 모델을 빠르고 가볍게 튜닝할 수 있게 해준다.

 

라고하는데 ................ 넘어가자

 

0.7로 설정한 이유는 제작자분이 0.7이 적당하다고 해서 설정했다.

from flask import Flask, request, jsonify
from diffusers import StableDiffusionPipeline
import torch
from io import BytesIO
from flask import Flask, request, jsonify, send_file
from diffusers import StableDiffusionPipeline
from safetensors.torch import load_file


app = Flask(__name__)

# Stable Diffusion 모델 로드
model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id)

# LoRA 모델 경로 설정
lora_path = "./model/lora/tt1.safetensors"

# LoRA 가중치 조정 (0.7으로 설정)
pipe.unet.load_attn_procs(load_file(lora_path))
pipe.unet.set_attn_processor_weights(scale=0.7)  # 가중치를 0.7로 설정


pipe.to("cuda")  # GPU 사용

@app.route('/generate', methods=['POST'])
def generate_image():
    data = request.json
    prompt = data.get("prompt", "default emoji")

    # Stable Diffusion으로 이미지 생성
    image = pipe(prompt, height=256, width=256).images[0]

    # 이미지를 메모리에 저장
    img_io = BytesIO()
    image.save(img_io, format="PNG")
    img_io.seek(0)

    # 클라이언트에 이미지 반환
    return send_file(img_io, mimetype="image/png")

if __name__ == "__main__":
    app.run(debug=True)

현재까지의 로직은 위와 같다. 별건없고 /generate로 body에 json키값을 이용해 prompt에 내용을 넣어 POST API 요청을 하면 스테이블 디퓨전 서버가 이미지를 생성해주는 간단한 로직이다.


 

에러발생!

이 오류는 LoRA 가중치를 로드하려면 PEFT(Parameterized Efficient Fine-Tuning)

백엔드가 필요하다는 것을 의미한다고 한다.

diffusers 라이브러리의 기능을 사용하는 데 필수적인 모듈이 없다고 하는데

pip install peft

 

설치해버린다.

그래도 안된다 로라가 반환하는 값이 이상하다는데....

 

아까 civitai 사이트의 로라페이지에서 보니 베이스모델이 SDXL1.0 를 사용해야 한다고 한다.

 

나는 stable-diffusion-v1-5 를 쓰고있었는데 SDXL 1.0으로 바꿔줘야겠다.

from diffusers import StableDiffusionXLPipeline
from peft import LoraConfig

# Stable Diffusion XL 1.0 모델 로드
model_id = "stabilityai/stable-diffusion-xl-base-1.0"
pipe = StableDiffusionXLPipeline.from_pretrained(model_id, torch_dtype=torch.float16)

 

1.5버전 사용로직은 지우고 1.0XL로 바꿔준다.

두개의 차이는 아래와 같은데 더 크다고 하니까 더 잘 되겠지.... 라는 마음을 빌어본다.

SD 1.5

  • 간단한 구조로 메모리 요구가 적고 빠르게 실행 가능, 모델 크기는 약 860M.
  • 낮은 해상도에서 우수하며, 다양한 기존 LoRA와 호환 가능.

SDXL 1.0

  • 더 큰 모델(2.6B 파라미터)로 고해상도와 세밀한 디테일 생성 가능.
  • 고사양 GPU 필요, SDXL 전용 LoRA와 호환되며 더 현실적인 이미지 생성.

 

아까 오랜시간 설치했던 1.5를 버리고 1.0을 다시 기동하여 SDXL1.0을 긴 시간동안 설치해준다...........

잘보면 10.3GB가 보인다...... 잠 한숨 때려준다.....

 

바꿔주고 난뒤에도 계속해서 list index out of range  에러가 발생해서 로라가 손상된건지 로라를 빼고 기동해봤는데 기동이 안된다!

vs코드도 멈췄따!!!!!!!!!!!!!

재부팅해서 쓴 내용도 중간부터 날라갔다 ㅠㅠ

 

원인을 보아하니 SDXL 1.0의 경우 모델 로드 및 추론 시 약 12~16GB의 GPU 메모리와 20GB 이상의 시스템 메모리를 요구할 수 있다고 한다....

 

내 꾸져먹은 PC와 GPU로는 못 쓰는 것 같다.....

하는 수 없이 다시 SD1.5로 만족할 수 밖에 없나 하고 찾아보던 중 ......... 다음화에 계속