이미지·영상 생성

Pruna-Qwen-Image-2.1 로컬 실행: 5·8단계 어댑터와 품질 선택

도자기 머그잔 후보를 빠르게 고를 때는 5단계, 테두리와 손잡이까지 살필 때는 8단계로 비교합니다.

도자기 머그잔 후보를 고를 때는 5단계로 조명과 구도를 빠르게 살피고, 최종 후보는 8단계와 베이스 모델로 다시 확인하세요. Pruna-Qwen-Image-2.1은 독립된 소형 모델이 아니라 기존 Qwen-Image-2.1 위에 얹는 LoRA1 어댑터이며, v0.1 품질은 베이스 모델보다 낮습니다. 이 비교는 CUDA2 환경에서 진행합니다.

실행 조건과 핵심 내용
  • 5단계는 더 빠르지만 8단계보다 시각 품질이 눈에 띄게 낮습니다. 8단계를 품질 우선 기본값으로 권합니다.
  • 두 어댑터 파일은 각각 약 335.6MB이며, 전체 모델 메모리나 GPU 메모리 요구량을 뜻하지 않습니다.
  • 공식 최대 6.3배 수치는 H100 80GB의 특정 측정 조건에 대한 결과이며, 이미지 품질이 같거나 개인 GPU에서도 같은 배수라는 뜻은 아닙니다.

먼저 고를 것은 최종 이미지가 아니라 조명과 구도입니다

결론부터 말하면, 조명과 구도를 고를 때는 5단계로 후보를 빠르게 살피고, 테두리와 손잡이를 결정할 때는 8단계로 다시 확인하세요. 작은 탁자 위 도자기 머그잔을 두고 창가의 부드러운 빛과 어두운 스튜디오 조명을 비교하는 작업을 예로 들겠습니다. 배경과 카메라 각도도 바꿔야 한다면 처음부터 한 장을 오래 다듬기보다 빛 방향, 화면 여백, 전체 색감을 비교할 후보를 먼저 만드는 편이 효율적입니다.

Pruna-Qwen-Image-2.1은 원본 모델 위에 추가 가중치를 얹는 LoRA 어댑터입니다. 베이스 모델의 40단계를 단순히 8단계로 줄인 것이 아니라, 적은 단계로 이미지를 생성하도록 별도로 학습했습니다. 여기서 단계는 노이즈에서 출발한 이미지 표현을 반복해 갱신하는 과정이며, 이 어댑터는 5단계 또는 8단계를 사용합니다. 다만 제작자는 v0.1의 품질이 아직 베이스 모델보다 낮다고 밝힙니다. 따라서 후보를 고를 때의 속도와 최종 이미지를 결정할 품질은 따로 확인해야 합니다.

단계 수만 놓고 보면 40단계 베이스 모델 대비 8단계는 처리 반복을 5분의 1, 5단계는 8분의 1로 줄입니다. 하지만 이 나눗셈은 스텝 개수끼리 비교한 것이지 전체 생성 시간이 5배나 8배 줄었다는 뜻은 아닙니다. 각 단계의 계산량, 프롬프트 인코딩과 이미지 복원 시간도 전체 작업에 들어가고, GPU3마다 실제 처리 속도도 다릅니다. 그래서 빠른 후보 만들기는 가능성이 있는 장점으로 보되, 실제 절약 시간과 품질은 같은 컴퓨터에서 확인해야 합니다.

따뜻한 작업실 책상 위 모니터에 조명과 구도가 다른 도자기 머그잔 정물 후보가 여러 장 보입니다.
먼저 빛의 방향과 잔의 위치를 고르고, 세부 묘사는 선택한 뒤 살핍니다.

작은 체크포인트가 아니라 기존 모델 위에 얹는 어댑터입니다

이 이름에 ‘Pruna’가 붙어 있어도 Qwen-Image-2.1의 더 작은 독립 모델을 내려받는 것은 아닙니다. 원래 Qwen/Qwen-Image-2.1 체크포인트4를 불러오고 그 위에 LoRA 가중치를 적용합니다. 파이프라인5은 이미지 생성 과정을 연결하는 실행 구성이고, 텍스트 인코더는 프롬프트를 모델이 처리할 표현으로 바꾸며, VAE6는 내부 표현과 최종 픽셀 이미지 사이를 변환합니다. 이 세 구성은 베이스 모델 그대로 유지됩니다.

어댑터 파일 하나는 약 335.6MB입니다. 이 크기는 추가로 내려받는 파일을 가늠할 때 쓸 수 있지만, GPU가 이미지를 만들 때 보유해야 하는 전체 메모리와 같지 않습니다. 베이스 가중치, 텍스트 인코더, VAE, 해상도에 따라 달라지는 중간 계산 공간도 필요합니다. 그러므로 ‘어댑터가 336MB쯤이니 8GB 카드면 충분하겠지’라고 파일 크기만으로 판단하면 안 됩니다. 특히 실제 VRAM7 절감이나 더 작은 GPU에서의 실행 가능성을 이 모델 카드가 입증했다고 말할 근거는 없습니다.

실행 예제는 CUDA GPU를 사용하는 비상업 연구·평가를 전제로 합니다. 상업적 사용에는 별도 라이선스가 필요합니다. 먼저 원본 모델을 실행할 메모리와 CUDA 환경을 준비한 뒤 어댑터를 추가하는 순서입니다. 이 글의 삽화는 설명을 위한 것으로, Pruna가 생성한 샘플은 아닙니다.

그래픽카드가 장착된 데스크톱 옆에 책과 작은 확장 카드가 놓인 작업대
추가로 받는 어댑터가 작아도 원본 모델을 실행할 메모리는 필요합니다.

5단계와 8단계는 같은 장면을 다른 목적에 씁니다

먼저 같은 머그잔 프롬프트와 씨드로 두 버전을 나란히 비교하면 역할이 보입니다. 8단계 어댑터는 품질을 우선하는 기본 선택으로 권장되고, 5단계는 더 빠른 대신 눈으로 알아챌 정도로 품질이 낮아집니다. 그래서 배경색, 빛 방향, 잔 위치를 훑어 후보를 거르는 일에는 5단계를 시험할 수 있고, 가장자리의 타원 형태나 손잡이가 자연스러운지까지 결정해야 하는 후보는 8단계 또는 베이스 모델로 다시 확인하는 편이 맞습니다. ‘빠른 후보용’은 최종 결과에도 충분하다는 뜻이 아닙니다.

두 어댑터는 각자 맞는 시그마 스케줄8로 학습되었습니다. 시그마는 각 단계에서의 노이즈 수준이고, 스케줄은 그 값이 단계마다 어떻게 달라지는지 정한 목록입니다. 5단계 파일에는 5단계용 목록을, 8단계 파일에는 8단계용 목록을 맞춰야 합니다. 추가 어댑터를 동시에 얹지 말고 LoRA 강도는 1.0으로 둡니다. 기본 스케줄러의 동적 시프팅도 끄고 shift=1로 지정해야 시그마가 두 번 변형되지 않습니다. 마지막 0은 스케줄러가 자동으로 덧붙이므로 직접 넣지 않습니다. 프롬프트 조건을 따르는 정도를 조정하는 CFG9는 이 예제에서 true_cfg_scale=1.0으로 두며, 음수 프롬프트도 넣지 않습니다.

실행하려면 아래 Python 블록을 pruna_mug.py라는 파일로 저장하고, 패키지 설치를 마친 CUDA용 Python 환경에서 python pruna_mug.py를 실행합니다. 우선 8단계로 한 장을 생성해 설정을 확인하세요. 이후 5단계로 바꾸면 파일 이름과 시그마 목록이 함께 선택됩니다. 같은 씨드 42를 쓰면 두 실행의 시작 노이즈 조건을 맞출 수 있지만, 두 버전에서 구도까지 똑같이 나오도록 보장하지는 않습니다.

참조 이미지를 넣어 머그잔의 배경만 바꾸는 편집도 같은 파이프라인을 사용합니다. 학습에서 다룬 범위는 1K 해상도와 참조 이미지 최대 3장입니다. 처음에는 직접 준비한 이미지 한 장과 1024×1024 출력으로 시작하고, 잔의 형태를 유지하라는 요청이 실제로 지켜지는지 비교하세요. 참조 사진을 더 넣거나 해상도를 높이는 것은 이 기본 편집이 된 뒤 따로 시험할 조건입니다.

CUDA용 패키지와 고정 Diffusers 설치
pip install 'torch>=2.4.0' 'transformers>=5.17' accelerate peft pillow
pip install git+https://github.com/huggingface/diffusers@6256aa7666cedd47443adc8f82da9a10e110b09c
공식 예제는 CUDA GPU 구성을 전제로 합니다.
1024×1024 이미지 생성: pruna_mug.py
import torch
from diffusers import FlowMatchEulerDiscreteScheduler, QwenImage21Pipeline

STEPS = 8  # 8: quality-first default; 5: faster candidate selection
SIGMAS = {
    5: [1.0, 0.94, 6 / 7, 2 / 3, 0.4],
    8: [1.0, 14 / 15, 6 / 7, 10 / 13, 2 / 3, 6 / 11, 0.4, 2 / 9],
}[STEPS]

pipe = QwenImage21Pipeline.from_pretrained(
    "Qwen/Qwen-Image-2.1", torch_dtype=torch.bfloat16
).to("cuda")
pipe.load_lora_weights(
    "PrunaAI/Pruna-Qwen-Image-2.1",
    weight_name=f"p_qwen_image_2.1_{STEPS}step_v0.1.safetensors",
)
pipe.scheduler = FlowMatchEulerDiscreteScheduler.from_config(
    pipe.scheduler.config, use_dynamic_shifting=False, shift=1.0, shift_terminal=None
)

image = pipe(
    prompt=(
        "A ceramic mug on a small table, soft window light from the left, "
        "warm neutral background, three-quarter view, realistic still life"
    ),
    width=1024, height=1024,
    generator=torch.Generator("cuda").manual_seed(42),
    num_inference_steps=STEPS, sigmas=SIGMAS,
    true_cfg_scale=1.0, use_kv_cache=True,
).images[0]
image.save(f"mug-{STEPS}-step.png")
8단계가 기본 비교 출발점입니다. 5로 바꾸면 파일과 시그마가 함께 바뀝니다.
같은 파이프라인으로 입력 이미지를 편집하는 예
from PIL import Image

source = Image.open("mug-reference.png").convert("RGB")
edited = pipe(
    prompt="Keep the ceramic mug shape; change the background to a warm gray studio.",
    image=source,
    width=1024, height=1024,
    generator=torch.Generator("cuda").manual_seed(42),
    num_inference_steps=STEPS, sigmas=SIGMAS,
    true_cfg_scale=1.0, use_kv_cache=True,
).images[0]
edited.save("mug-edited.png")
선택 사항입니다. 앞 코드 아래에 이어 붙이고 같은 폴더에 mug-reference.png를 준비합니다. 위의 pipe와 STEPS 설정을 그대로 사용합니다.

공식 6.3배는 측정한 장비와 작업을 함께 봐야 합니다

모델 카드에는 최대 6.3배 빠르다는 결과가 있지만, 이는 H100 80GB 한 장에서 BF1610, 배치 1로 시험해 보고한 최대 배수입니다. Qwen 모델 카드의 예제 프롬프트를 사용했고, 워밍업 1회 뒤 생성 3회의 중앙값을 냈습니다. 프롬프트 인코딩·노이즈 제거·디코딩을 포함하고 PNG 저장·모델 로딩·워밍업은 제외한 시간입니다. 따라서 컴퓨터에서 실행을 시작해 파일을 저장할 때까지의 총 대기와는 다릅니다. 이 수치만으로 개인 장비에서 걸릴 초 단위 시간을 계산할 수 없습니다.

차트의 베이스 Qwen-Image-2.1은 40단계와 KV cache11 켬, Pruna 5·8단계는 KV cache 끔으로 비교했습니다. KV cache는 일부 계산 결과를 저장해 재사용하는 기능입니다. 차트에서는 LoRA를 병합하지 않았고 CFG·컴파일·CPU12 오프로딩13을 적용하지 않았습니다. 반면 공식 빠른 시작 코드는 Pruna 추론에서 use_kv_cache=True를 사용하므로, 앞의 예제를 실행해도 공개 차트 조건이 그대로 재현되지는 않습니다.

내 컴퓨터에서 비교하려면 먼저 같은 프롬프트, 해상도, 씨드, 실행기와 저장 방식을 유지하고 두 어댑터의 후보를 눈으로 검토하세요. 완료 시간을 재려면 초기 모델 적재와 첫 워밍업을 반복 생성 시간과 분리하고, 같은 조건으로 여러 번 돌린 뒤 중앙값을 비교해야 합니다. CUDA 작업이 끝나기 전에 CPU 타이머를 멈추면 실제 GPU 실행보다 짧게 기록될 수 있으므로 동기화하지 않은 시간 재기는 피합니다. 이렇게 얻은 값도 그 GPU와 소프트웨어 구성에 대한 결과이지 다른 장비에 옮겨 쓸 보장값은 아닙니다.

최종 머그잔 후보는 작은 결함을 따로 살펴봅니다

5단계로 배경과 조명 후보를 좁힌 뒤에는 선택한 장면을 8단계로 다시 생성해 봅니다. 특히 컵 입구의 타원, 손잡이와 몸체가 이어지는 부분, 유약 표면의 하이라이트가 자연스러운지 확대해 보세요. 생성 이미지의 결함은 작게 볼 때는 지나가지만, 실제 크기로 쓰거나 잘라 쓰면 더 잘 드러날 수 있습니다. 프롬프트에 ‘부드러운 창가 빛’처럼 조건을 구체적으로 쓰는 것도 유용합니다. 모델 카드 역시 자세한 프롬프트가 나은 결과에 도움이 된다고 안내합니다.

8단계가 베이스 품질에 도달했다는 뜻은 아닙니다. v0.1 안내에는 전체 품질이 아직 베이스 모델보다 낮다고 적혀 있으며, 5단계의 품질 저하는 더 눈에 띕니다. 마지막 결과의 세부 묘사가 중요하다면 같은 장면을 원래 40단계 베이스 모델과도 비교해야 합니다. 이 경우 처리 시간이 길어질 수 있지만, 어느 버전이 목적에 맞는지 직접 판단할 기준이 생깁니다. 공개된 2K 측정 차트도 속도만 보여 주며 2K 품질을 검증한 자료는 아닙니다. 학습은 1K 해상도에서 진행됐으므로 첫 비교는 1024 정사각형으로 시작하는 것이 범위에 맞습니다.

탁자에 놓인 머그잔 정물 출력물 세 장을 둥근 확대경으로 살펴보며 가장자리와 손잡이를 비교합니다.
후보를 고른 뒤에는 컵 입구의 타원과 손잡이 연결부를 확대해 확인합니다.

CUDA 예제와 Mac 실행 경로는 구분해야 합니다

공식 빠른 시작은 CUDA GPU를 요구하고, 위 코드는 .to("cuda")와 CUDA 난수 생성기를 사용합니다. 따라서 이 레시피는 CUDA 환경용입니다. 이 어댑터 카드에서는 Mac Metal14, MLX15, GGUF16 통합을 확인할 수 없지만, 별도 구현이나 변환 경로가 불가능하다는 뜻은 아닙니다. 다른 실행기를 고려한다면 해당 프로젝트에서 Pruna 어댑터와 버전을 지원하는지 확인해야 합니다.

사이트의 /generate 화면은 Pruna 어댑터가 아니라 기본 Qwen-Image의 장비별 생성 예상 시간을 보여 줍니다. 여러 빛과 배경을 바꾸며 후보를 고르는 평가라면 어댑터의 적은 단계 수가 유용할 수 있습니다. 후보 장면이 적고 기다릴 여유가 있다면 기본 모델을 바로 써도 됩니다. 어느 경로를 택하든 선택한 한두 장은 8단계와 40단계 베이스 모델의 결과를 살펴보고, 최종 세부 품질이 필요한 작업인지 확인하세요.

가중치 조건은 평가 목적과 별도로 확인합니다

Pruna 어댑터는 Qwen-Image-2.1의 파생물이며, 모델 카드와 동봉 라이선스는 Qwen Research License를 가리킵니다. 제1조는 비상업을 연구 또는 평가 목적으로 정의하며, 제2조는 허용된 이용을 그 비상업적 목적으로 한정합니다. 상업적 목적으로 쓰려면 별도의 상업 라이선스를 받아야 한다고 명시합니다. 글의 저작권이나 사이트 콘텐츠의 라이선스와 모델 가중치의 이용 조건은 서로 다른 항목이므로, 글이 공개돼 있다는 사실만으로 가중치 사용 범위가 넓어지지는 않습니다.

따라서 탁자 위 머그잔 장면을 비교하는 비상업 평가와, 판매할 제품 이미지를 제작하는 일은 같은 목적으로 취급할 수 없습니다. 여기서는 법률 자문을 대신하지 않고 라이선스 문구에 적힌 구분만 전달합니다. 모델 파일을 받거나 결과물을 다른 곳에 배포하기 전에 해당 라이선스 전문과 최신 공식 카드, 필요한 별도 허가를 직접 확인하세요. 이미지 생성이 잘 된다는 기술적 판단과 그 결과를 어떤 목적으로 쓸 수 있는지는 서로 다른 질문입니다.

용어 각주

  1. LoRA — 기본 모델의 동작을 조정하는 작은 추가 가중치를 학습·적용하는 방식입니다. 어댑터 파일만으로 실행하는 독립 모델은 아니며, 용도에 따라 스타일 조정이나 적은 단계의 생성 등에 쓰입니다.

    본문으로 돌아가기
  2. CUDA — NVIDIA GPU에서 범용 계산을 실행하기 위한 소프트웨어 플랫폼입니다. CUDA용으로 만든 프로그램은 다른 GPU에서 그대로 동작한다고 보장되지 않습니다.

    본문으로 돌아가기
  3. GPU — 많은 계산을 병렬로 처리하는 프로세서입니다. AI 모델 실행에서는 모델 계산을 맡습니다.

    본문으로 돌아가기
  4. 체크포인트 — 학습된 모델의 가중치 등을 저장한 파일입니다. 같은 모델 계열도 버전이나 용도에 따라 다른 체크포인트를 쓸 수 있습니다.

    본문으로 돌아가기
  5. 파이프라인 — 입력부터 결과까지 이어지는 처리 단계의 묶음입니다. 각 단계에서 서로 다른 모델이나 도구를 사용할 수 있습니다.

    본문으로 돌아가기
  6. VAE — Variational Autoencoder의 약자입니다. 입력을 압축된 잠재 표현으로 바꾸거나, 그 표현에서 결과를 복원하는 데 쓰입니다.

    본문으로 돌아가기
  7. VRAM — 그래픽카드의 GPU가 사용하는 메모리입니다. 모델 가중치와 계산 중간값을 저장하며 시스템 RAM과 구분됩니다.

    본문으로 돌아가기
  8. 시그마 스케줄 — 생성 과정의 각 단계에서 사용할 노이즈 수준을 정한 순서입니다. 같은 단계 수라도 값과 배치가 달라질 수 있으며, 전용으로 학습한 어댑터는 지정된 스케줄을 따라야 합니다.

    본문으로 돌아가기
  9. CFG — 조건이 있는 예측과 없는 예측의 차이를 이용해 생성 결과가 입력 조건을 따르도록 조절하는 기법입니다. 증류 모델에서는 이를 별도로 켜지 않도록 요구하기도 하며, 권장값은 모델마다 다릅니다.

    본문으로 돌아가기
  10. BF16 — 모델의 수를 저장하고 계산하는 16비트 부동소수점 형식입니다. 사용 가능 여부는 하드웨어와 실행 프로그램에 달려 있습니다.

    본문으로 돌아가기
  11. KV 캐시 — 어텐션에서 이전 토큰의 키·값을 저장해 다음 토큰 생성 때 재사용하는 메모리입니다. 문맥 길이와 배치 크기에 따라 용량이 달라집니다.

    본문으로 돌아가기
  12. CPU — 컴퓨터에서 일반적인 프로그램 명령을 실행하는 중앙 처리 장치입니다. AI 작업에서는 GPU 등 다른 프로세서와 역할을 나누기도 합니다.

    본문으로 돌아가기
  13. 오프로딩 — 메모리가 부족할 때 모델 데이터 일부를 GPU 메모리에서 시스템 RAM이나 저장장치로 옮겨 처리하는 방식입니다. 데이터 이동이 추가됩니다.

    본문으로 돌아가기
  14. Metal — Apple 기기에서 그래픽과 GPU 병렬 계산을 실행하는 저수준 기술입니다. 모델을 골라 대화하는 앱 자체와는 다릅니다.

    본문으로 돌아가기
  15. MLX — Apple이 개발하는 머신러닝 프레임워크입니다. Apple silicon에서는 통합 메모리와 Metal을 활용하며, 별도로 Linux 실행 경로도 제공합니다. 지원 모델과 기능은 MLX 기반 도구마다 다릅니다.

    본문으로 돌아가기
  16. GGUF — 모델 정보를 담는 파일 형식으로 llama.cpp 계열 도구에서 널리 사용됩니다. 파일 형식만으로 특정 하드웨어 호환성이나 속도가 보장되지는 않습니다.

    본문으로 돌아가기