[카테고리:] 미분류

  • Ubuntu에서 Stable Diffusion 모델 설정 및 자동 이미지 생성 구현하기

    AI 이미지 생성 기술은 최근 몇 년간 폭발적인 성장을 이루었습니다. 특히 Stable Diffusion과 같은 오픈소스 모델의 등장으로 누구나 고품질 이미지를 생성할 수 있게 되었습니다. 본 포스팅에서는 Windows 환경에서 개발된 자동 이미지 생성 스크립트를 Ubuntu 환경으로 이전하는 과정에서 발생할 수 있는 다양한 문제점과 그 해결책에 대해 심층적으로 다루고자 합니다.

    1. 환경 설정의 중요성

    AI 개발에 있어 환경 설정은 성공적인 구현의 기초가 됩니다. 운영체제에 따라 설정 방법이 상이하며, 특히 Linux 기반의 Ubuntu는 Windows와 다른 접근 방식이 필요합니다. 다음은 Ubuntu 환경에서 AI 이미지 생성 모델을 구축할 때 고려해야 할 핵심 요소들입니다.

    1.1 경로 표기법의 차이

    Windows와 Ubuntu의 가장 기본적인 차이점 중 하나는 파일 경로 표기법입니다. Windows에서는 백슬래시(\)를 사용하지만, Ubuntu에서는 정방향 슬래시(/)를 사용합니다. 또한 Windows의 드라이브 기반 경로(예: D:\folder)는 Ubuntu의 루트 기반 경로(예: /home/user/folder)로 변환되어야 합니다.

    # Windows 경로
    OUTPUT_DIR = r"d:\ex_shutterstock"
    
    # Ubuntu 경로로 변환
    OUTPUT_DIR = "/home/ubuntu/ex-image/001"
    

    1.2 디스크 공간 확인 방식

    디스크 공간을 확인하는 방식도 운영체제별로 다릅니다. Windows에서는 shutil.disk_usage()를 주로 사용하지만, Ubuntu에서는 os.statvfs()를 사용하는 것이 더 적합합니다.

    # Windows에서 디스크 공간 확인
    def get_disk_space():
        total, used, free = shutil.disk_usage(OUTPUT_DIR)
        return free
    
    # Ubuntu에서 디스크 공간 확인
    def get_disk_space():
        stat = os.statvfs(OUTPUT_DIR)
        # statvfs.f_frsize * statvfs.f_bavail = 사용 가능한 바이트
        return stat.f_frsize * stat.f_bavail
    

    2. Python 가상환경의 활용

    Ubuntu 최신 버전에서는 시스템 Python 환경이 패키지 관리자(apt)에 의해 관리되며, 이를 직접 수정하는 것을 제한합니다. 이를 “externally-managed-environment”라고 하며, 이 제한을 우회하기 위해서는 가상환경을 사용해야 합니다.

    2.1 가상환경 생성 및 활성화

    # 필요한 패키지 설치
    sudo apt update
    sudo apt install -y python3-venv python3-pip python3-full
    
    # 가상환경 생성
    python3 -m venv ~/pytorch-env
    
    # 가상환경 활성화
    source ~/pytorch-env/bin/activate
    

    2.2 필요 패키지 설치

    가상환경이 활성화된 상태에서 필요한 패키지를 설치합니다. GPU 가속을 위한 PyTorch와 Stable Diffusion을 위한 diffusers 등이 필요합니다.

    # PyTorch 설치 (CUDA 11.8 버전 기준)
    pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
    
    # 기타 필요 패키지 설치
    pip install diffusers accelerate protobuf sentencepiece Pillow
    

    3. 한글 지원 설정

    Ubuntu 환경에서 한글 출력을 위해서는 추가적인 설정이 필요합니다. 이는 코드 내부에서 설정하는 방법과 시스템 차원에서 설정하는 방법이 있습니다.

    3.1 코드 내 한글 지원 설정

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import locale
    import sys
    
    # 한글 출력을 위한 로케일 설정
    try:
        locale.setlocale(locale.LC_ALL, 'ko_KR.UTF-8')
        sys.stdout.reconfigure(encoding='utf-8')  # Python 3.7 이상
    except:
        print("로케일 설정에 문제가 있지만 계속 진행합니다.")
    

    3.2 시스템 차원의 한글 지원 설정

    # 한글 언어팩 설치
    sudo apt update
    sudo apt install -y language-pack-ko
    
    # 로케일 설정
    sudo locale-gen ko_KR.UTF-8
    sudo update-locale LANG=ko_KR.UTF-8 LC_ALL=ko_KR.UTF-8
    
    # 한글 폰트 설치
    sudo apt install -y fonts-nanum fonts-nanum-coding fonts-nanum-extra
    

    4. 모델 선택 및 접근 권한 문제

    Stable Diffusion 3.5와 같은 최신 모델은 Hugging Face와 같은 플랫폼에서 접근 제한이 걸려 있는 경우가 많습니다. 이런 모델에 접근하기 위해서는 계정 인증이 필요하거나 대안 모델을 사용해야 합니다.

    4.1 Hugging Face 인증 설정

    # Hugging Face CLI 설치
    pip install -U huggingface_hub
    
    # Hugging Face 로그인
    huggingface-cli login
    # 이후 프롬프트에 토큰 입력
    

    4.2 대안 모델 사용하기

    접근 제한이 있는 모델 대신 공개 모델을 사용하는 것도 효과적인 전략입니다. SDXL이나 SDXL Turbo와 같은 모델은 접근 제한 없이 사용할 수 있습니다.

    def main():
        print("공개 모델(SDXL Turbo 또는 SDXL)을 초기화 중...")
        
        try:
            # SDXL Turbo 로드 시도 (더 빠른 모델)
            pipe = DiffusionPipeline.from_pretrained(
                "stabilityai/sdxl-turbo", 
                torch_dtype=torch.float16, 
                variant="fp16"
            )
            model_id = "stabilityai/sdxl-turbo"
            print("SDXL Turbo 모델을 로드했습니다.")
        except Exception as e:
            print(f"SDXL Turbo 로드 실패: {e}")
            print("대신 SDXL 기본 모델을 로드합니다...")
            
            # SDXL 기본 모델 로드 시도
            pipe = StableDiffusionXLPipeline.from_pretrained(
                "stabilityai/stable-diffusion-xl-base-1.0", 
                torch_dtype=torch.float16,
                variant="fp16",
                use_safetensors=True
            )
            model_id = "stabilityai/stable-diffusion-xl-base-1.0"
            print("SDXL 모델을 로드했습니다.")
    

    5. 고품질 프롬프트 구성 전략

    AI 이미지 생성의 핵심은 효과적인 프롬프트 구성에 있습니다. 특히 사실적인 이미지를 생성하기 위해서는 다음과 같은 카테고리의 키워드를 포함시키는 것이 중요합니다.

    5.1 효과적인 프롬프트 구성 요소

    1. 주제(Subject)와 테마(Theme)
      • 주제: landscape, portrait, still life, macro 등
      • 테마: nature, technology, city life, abstract 등
    2. 스타일과 기술적 요소
      • 사실적 표현: photorealistic, ultra realistic, hyperrealistic
      • 촬영 기법: rule of thirds, depth of field, bokeh effect
      • 카메라 관련: shot on Canon EOS, 50mm lens, wide-angle
    3. 분위기와 감성
      • dramatic, moody, atmospheric, serene, peaceful 등

    5.2 다양한 변형으로 풍부한 프롬프트 생성

    def generate_random_prompt():
        # 랜덤으로 키워드 선택
        theme = random.choice(THEMES)
        subject = random.choice(SUBJECTS)
        style = random.choice(STYLES)
        technique = random.choice(PHOTOGRAPHY_TECHNIQUES)
        # ... 기타 키워드 선택 ...
        
        # 다양한 프롬프트 구조
        variations = [
            f"{mood} {subject} of {theme}, {style}, {enhancer}, {technique}, {camera}, {technical}",
            f"{subject} of {theme} with {technique}, {style}, {enhancer}, {camera}, {technical}, {mood}",
            # ... 기타 변형 ...
        ]
        
        prompt = random.choice(all_variations)
        return prompt
    

    6. 이미지 생성 및 저장 프로세스

    자동화된 이미지 생성 파이프라인에는 모델 초기화, 이미지 생성, 후처리, 저장 등의 단계가 포함됩니다.

    6.1 메모리 최적화

    # 메모리 최적화 설정
    pipe.enable_attention_slicing()  # 어텐션 슬라이싱 활성화
    pipe = pipe.to("cuda")  # GPU로 모델 이동
    

    6.2 최적의 모델 파라미터 설정

    모델에 따라 최적의 파라미터가 다릅니다. SDXL Turbo는 적은 스텝으로도 빠르게 결과를 생성하지만, 일반 SDXL은 더 많은 스텝이 필요합니다.

    # SDXL Turbo용 파라미터
    image = pipe(
        prompt,
        num_inference_steps=4,  # Turbo는 1-4 steps가 적절함
        guidance_scale=0.0,     # Turbo에 권장되는 설정
        width=1024,
        height=1024,
    ).images[0]
    
    # 일반 SDXL용 파라미터
    image = pipe(
        prompt,
        num_inference_steps=30,
        guidance_scale=7.5,
        width=1024,
        height=1024,
    ).images[0]
    

    6.3 4K 해상도로 업스케일링

    def resize_to_square_4k(image):
        # 4K 해상도의 총 픽셀 수
        total_pixels = 3840 * 2160
        
        # 정사각형 이미지의 한 변의 길이 계산
        side_length = int(math.sqrt(total_pixels))
        
        # 이미지 리사이징
        square_image = image.resize((side_length, side_length), Image.LANCZOS)
        
        return square_image
    

    7. 결론 및 실무 적용 팁

    Stable Diffusion 기반 이미지 생성 파이프라인을 Windows에서 Ubuntu로 이전하는 과정은 여러 기술적 문제를 해결해야 하는 도전적인 작업입니다. 그러나 적절한 환경 설정, 가상환경 활용, 모델 접근 전략, 그리고 효과적인 프롬프트 구성을 통해 성공적으로 구현할 수 있습니다.

    7.1 실무 적용을 위한 추가 고려사항

    1. 성능 모니터링: GPU 메모리 사용량과 CPU 사용률을 모니터링하여 시스템 최적화
    2. 배치 처리: 여러 이미지를 배치로 생성하여 효율성 향상
    3. 에러 처리와 로깅: 강건한 에러 처리와 상세한 로깅으로 문제 식별 용이성 확보
    4. 자동화 스크립트: 시작 및 종료를 자동화하는 쉘 스크립트 개발

    7.2 향후 발전 방향

    최신 Stable Diffusion 모델은 지속적으로 발전하고 있으며, 이에 맞춰 파이프라인을 업데이트하는 것이 중요합니다. 특히 ControlNet, LoRA와 같은 추가 기술을 도입하면 더욱 세밀한 이미지 제어가 가능해집니다.

    AI 이미지 생성은 더 이상 일부 전문가만의 영역이 아닙니다. 적절한 기술적 지식과 창의성을 바탕으로 누구나 고품질 이미지를 생성할 수 있는 시대가 되었습니다. 이 포스팅이 Ubuntu 환경에서 Stable Diffusion을 활용한 이미지 생성에 도전하는 모든 분들에게 도움이 되기를 바랍니다.