2화 2026-05-26

처음으로 AI 이미지 한 장 만들기까지

처음으로 AI 이미지 한 장 만들기까지, 단계별로

지난 편에서는 ATOM을 켜고 리눅스 환경에 적응하는 이야기를 했어요. 오늘은 본격적으로 여러분이 그대로 따라하실 수 있는 첫 AI 이미지 생성 과정을 단계별로 풀어볼게요.

이 글을 끝까지 따라하시면, ATOM에서 본인만의 AI 이미지를 생성하실 수 있습니다. 30~40분 정도 걸려요 (대부분은 모델 다운로드 시간이고, 실제 본인이 작업하는 시간은 10분 정도예요).

시작 전 준비물 확인

준비됐으면 시작해볼까요.

1단계: DGX Dashboard 열기

ATOM에 깔린, NVIDIA가 만든 관제 화면을 먼저 열어야 해요.

방법

  1. 키보드의 Super 키 (윈도우 키)를 한 번 누릅니다
  2. 검색창에 dgx 라고 입력합니다
  3. DGX Dashboard 아이콘이 뜨면 클릭합니다

또는, 그냥 파이어폭스를 열어서 주소창에 다음 주소를 입력해도 됩니다.

http://localhost:11000

화면이 뜨면 본인 ATOM 계정의 사용자명과 비밀번호로 로그인합니다 (ATOM 처음 켤 때 만들었던 그 계정).

로그인하면 메인 화면이 보이는데, 왼쪽에는 시스템 메모리/GPU 상태가, 오른쪽에는 JupyterLab 패널이 있을 거예요.

2단계: JupyterLab 시작하기

JupyterLab은 한마디로 “AI 작업용 실험실” 입니다. 코드를 한 줄씩 실행하면서 결과를 바로 확인할 수 있는 환경이에요.

오른쪽 JupyterLab 패널에서 “Start” 버튼을 클릭합니다. 그러면 상태가,

순서로 바뀌어요. 첫 실행은 5~10분 정도 걸립니다 (필요한 파이썬 패키지들을 자동으로 100여 개 설치하느라). 두 번째부터는 1~2분이면 끝나요.

Downloading pycparser-3.0-py3-none-any.whl (48 kB)
48.2/48.2 kB 4.7 MB/s eta 0:00:00

이런 식으로 패키지를 다운받는 메시지가 흐르면 잘 되고 있는 겁니다.

Running 상태가 되면 “브라우저에서 열기” (Open in Browser) 버튼이 활성화됩니다. 클릭하세요. 새 탭에 JupyterLab이 열립니다.

3단계: JupyterLab에서 새 노트북 만들기

JupyterLab 화면이 뜨면, 가운데에 “Launcher” 라는 시작 화면이 보입니다. 거기서,

새 탭이 열리면서 빈 노트북이 생성됩니다. 가운데에 [ ]: 라는 빈 칸이 보이는데, 이게 셀(cell) 이에요. 여기에 코드를 입력하고 실행합니다.

4단계: 첫 코드 - GPU가 잘 인식되는지 확인

본격 작업 전에, GPU가 잘 잡혔는지 4줄 코드로 확인합니다. 이게 안 되면 그다음이 다 안 되니까요.

빈 셀을 클릭하고 아래 코드를 그대로 복사해서 붙여넣으세요.

import torch
print("CUDA 사용 가능:", torch.cuda.is_available())
print("GPU 이름:", torch.cuda.get_device_name(0))
print("GPU 메모리:", torch.cuda.get_device_properties(0).total_memory / 1e9, "GB")

각 줄이 하는 일은 이래요.

실행 방법: 코드를 입력한 셀에 커서를 두고 Shift + Enter를 누릅니다.

몇 초 기다리면 셀 아래에 결과가 나옵니다.

CUDA 사용 가능: True
GPU 이름: NVIDIA GB10
GPU 메모리: 128.5183373376 GB

True 가 떴다면 성공입니다. 본인 ATOM이 일할 준비가 됐다는 뜻이에요.

아래쪽에 분홍색 경고 메시지가 같이 뜰 수 있는데, “CUDA Capability 12.1이 발견됐다” 는 안내일 뿐이에요. 무해한 알림입니다. 무시하세요.

참고로 12.1이라는 숫자는 Blackwell 아키텍처의 신호예요. RTX 30 시리즈가 8.x, H100이 9.x, 그리고 12.x는 최신 Blackwell. 본인 책상 위에 그게 있다는 뜻입니다.

5단계: 본 게임 - Stable Diffusion XL로 이미지 생성

이제 진짜 이미지를 만들어볼 차례예요. 새 셀을 추가합니다.

새 셀 추가 방법

코드가 좀 길어요. 그래서 6개 부분으로 나눠서 설명드릴게요. 각 부분이 무엇을 하는지 이해하면서 차례로 셀에 추가하시거나, 또는 마지막의 통합 코드를 한 번에 복사해도 됩니다.

5-1) 부수적인 설정 (경고 차단 + 진행률 바)

먼저 화면을 깔끔하게 만드는 두 가지 설정입니다.

import warnings
warnings.filterwarnings('ignore', message='.*cuda capability.*')

import tqdm.auto
tqdm.auto.tqdm = tqdm.std.tqdm

위 코드가 하는 일은 두 가지예요.

본질적인 동작은 아니에요. 그냥 화면을 정돈하는 거예요.

5-2) AI 라이브러리 가져오기

이제 진짜 필요한 도구들을 불러옵니다.

from diffusers import DiffusionPipeline
import torch
from PIL import Image
from IPython.display import display

각 도구가 하는 일은 이래요.

비유하자면 요리 시작 전에 냄비, 칼, 도마를 꺼내는 단계예요.

5-3) AI 모델 준비

이제 사용할 모델을 다운로드 받고 메모리에 올립니다. 여기가 가장 시간이 오래 걸리는 부분이에요.

MODEL_ID = "stabilityai/stable-diffusion-xl-base-1.0"
dtype = torch.float16 if torch.cuda.is_available() else torch.float32

pipe = DiffusionPipeline.from_pretrained(
    MODEL_ID,
    torch_dtype=dtype,
    variant="fp16" if dtype==torch.float16 else None,
)
pipe = pipe.to("cuda" if torch.cuda.is_available() else "cpu")

순서대로 설명드리면,

여기서 float16 부분이 좀 의외예요. “우리 ATOM은 GPU가 좋잖아? 그럼 더 정확한 float32를 쓰는 게 맞지 않아?” 라는 직관과 정반대 결과가 나오거든요. 이 이야기는 다음 편(3편)에서 자세히 풀어드릴게요.

5-4) 그릴 그림 묘사 (프롬프트)

이제 AI에게 어떤 그림을 그릴지 설명해줍니다.

prompt = "a cozy modern reading nook with a big window, soft natural light, photorealistic"
negative_prompt = "low quality, blurry, distorted, text, watermark"

각 항목의 의미는 이래요.

영어로 입력하는 이유는 SDXL이 영어 데이터로 학습됐기 때문이에요. 한국어로 넣어도 동작은 하는데, 결과가 별로 나옵니다. (저도 직접 시도해봤는데, 호러 영화가 됐네요. 이 이야기는 다음다음 편에서…)

5-5) 생성 설정과 실행

그림 크기와 품질을 정한 후, 실제로 그림을 생성합니다.

height = 1024
width = 1024
steps = 30
guidance = 7.0

result = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=steps,
    guidance_scale=guidance,
    height=height,
    width=width,
)

각 설정의 의미는 다음과 같습니다.

마지막의 result = pipe(...) 줄에서 GPU가 본격적으로 일합니다. ATOM의 경우 약 11초 걸려요.

5-6) 결과 화면 표시와 파일 저장

마지막으로 그림을 화면에 보여주고 파일로 저장합니다.

image = result.images[0]
display(image)
image.save("my_first_image.png")
print("저장 완료: my_first_image.png")

순서대로 살펴보면,

6개 부분을 합친 전체 코드

위 6개 조각을 차례로 셀에 입력하는 것이 부담스러우시면, 아래 통합 코드를 한 번에 복사해서 한 셀에 붙여넣으셔도 됩니다. 둘 다 동작은 똑같아요.

import warnings
warnings.filterwarnings('ignore', message='.*cuda capability.*')
import tqdm.auto
tqdm.auto.tqdm = tqdm.std.tqdm

from diffusers import DiffusionPipeline
import torch
from PIL import Image
from IPython.display import display

MODEL_ID = "stabilityai/stable-diffusion-xl-base-1.0"
dtype = torch.float16 if torch.cuda.is_available() else torch.float32
pipe = DiffusionPipeline.from_pretrained(
    MODEL_ID,
    torch_dtype=dtype,
    variant="fp16" if dtype==torch.float16 else None,
)
pipe = pipe.to("cuda" if torch.cuda.is_available() else "cpu")

prompt = "a cozy modern reading nook with a big window, soft natural light, photorealistic"
negative_prompt = "low quality, blurry, distorted, text, watermark"

height = 1024
width = 1024
steps = 30
guidance = 7.0

result = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=steps,
    guidance_scale=guidance,
    height=height,
    width=width,
)

image = result.images[0]
display(image)
image.save("my_first_image.png")
print("저장 완료: my_first_image.png")

준비되셨으면 Shift + Enter로 실행하세요.

처음 실행 시 시간이 오래 걸려요

약 15~30분 정도 걸립니다. 이유는 두 단계로 일이 진행되기 때문이에요.

1단계 - 모델 다운로드 (15~25분, 처음 한 번만)

Stable Diffusion XL 모델 파일 약 7GB를 인터넷에서 받아옵니다. 진행 상황이 화면에 표시돼요. 다음번부터는 이 단계가 없어요. 한 번 받은 모델은 디스크에 저장되거든요.

2단계 - 이미지 생성 (11초!)

30/30 [00:11<00:00, 2.72it/s]

이런 식으로 진행률 바가 뜨면서, 30번 반복을 통해 이미지가 완성됩니다. 단 11초. 일반 RTX 3060 GPU 같으면 1~2분 걸리는 작업이에요.

결과 화면

코드 실행이 끝나면 셀 아래에 AI가 그린 이미지가 표시됩니다. 그리고 동시에 my_first_image.png 라는 파일이 저장돼요. 왼쪽 사이드바의 파일 목록에 새 파일이 생긴 게 보이실 거예요.

제 경우엔 정말 멋진 그림이 나왔어요. 큰 아치형 창문 두 개로 자연광이 들어오고, 책장에 책이 가득 꽂혀 있고, 나무 의자 옆에 화분과 커피잔이 놓인 공간. 인테리어 잡지 사진 같은 퀄리티였습니다.

스크린샷 2026-05-09 22-12-37.png

6단계: 본인만의 프롬프트로 다시 만들어보기

이제 진짜 재미는 여기서 시작이에요. 위 코드에서 prompt = "..." 줄만 바꿔서 다시 실행하면 다른 그림이 나옵니다.

예시 프롬프트를 몇 개 드릴게요. (각 프롬프트의 한국어 의미는 코드 아래에 적어뒀어요)

prompt = "a cute orange cat sleeping on a sunny windowsill, photorealistic"

→ 햇살 비치는 창가에서 자는 귀여운 주황색 고양이

prompt = "mountains at sunset, dramatic clouds, photorealistic, cinematic"

→ 노을 지는 산, 드라마틱한 구름, 영화 같은 분위기

prompt = "a peaceful japanese garden in autumn, koi pond, maple trees, photorealistic"

→ 가을의 평화로운 일본 정원, 잉어 연못, 단풍나무

프롬프트만 바꾸고 다시 Shift + Enter. 이번엔 모델이 이미 메모리에 있으니까 11초만에 새 그림이 나와요. 처음처럼 30분 안 기다려도 됩니다.

한 가지 주의 - 파일명 바꾸기

위 코드 그대로 두면 매번 같은 이름(my_first_image.png)으로 저장돼서 이전 그림이 덮어쓰여요. 다른 그림 만들 때는 파일명도 같이 바꾸세요.

image.save("my_cat.png")

또는,

image.save("my_mountains.png")

참고: SDXL 너머의 세계

오늘 사용한 SDXL은 좋은 모델이지만 한계도 있어요. 사람 손가락이 이상하게 나오거나, 한국어 프롬프트가 잘 안 통하거나, 특정 스타일을 잘 못 그리거나 합니다. 이런 한계를 넘어서는 두 가지 방법이 있어요.

1. 더 무거운 최신 모델 쓰기

SDXL은 2023년에 나온 모델이에요. 그 이후로 더 좋은 모델들이 계속 등장하고 있어요. 대표적인 게 FLUX.1 같은 최신 모델인데, 손가락도 정확히 5개로 그리고 텍스트도 또렷하게 씁니다. 다만 메모리를 24GB 정도 잡아먹어요. 일반 GPU에선 빠듯하지만, ATOM의 128GB 메모리에는 거뜬히 올라가요. ATOM의 진가가 여기서 발휘되는 거죠.

2. LoRA(로라) 붙이기

LoRA는 한마디로 “기존 모델에게 특정 분야를 더 잘하게 가르치는 작은 추가 파일” 이에요. 예를 들면 기본 모델에 한복 LoRA를 붙이면 한복 디테일이 풍부한 그림이, 픽사 스타일 LoRA를 붙이면 픽사 애니메이션 느낌의 그림이 나옵니다. 변호사로 치면 민법 전공 변호사가 이혼 사건도 잘하게 단기 특강 듣는 느낌이에요.

이 두 가지, 더 무거운 모델과 LoRA는 시리즈 후반에 본격적으로 다뤄볼게요. 일단 오늘은 SDXL로 가벼운 첫 발을 디딘 것에 만족하시면 돼요. 🙂

작업 마무리하기

작업 끝나셨으면 깔끔하게 정리하시는 게 좋아요.

  1. 노트북 저장: Ctrl + S
  2. DGX Dashboard 탭으로 돌아가기
  3. JupyterLab 패널에서 “중지(Stop)” 버튼 클릭
  4. 상태가 Stopped 로 바뀌는지 확인

JupyterLab을 끄면 메모리에 있던 모델은 사라지지만, 그동안 만든 노트북과 이미지 파일은 그대로 보존됩니다. 다음에 다시 켤 때는 1~2분이면 돼요 (모델 다운로드는 다시 안 함).

마무리 - 그리고 다음 편 예고

여기까지 따라하셨으면 본인 ATOM으로 첫 AI 이미지를 만드신 거예요. 축하드립니다. 🎉

오늘 한 작업이 별것 아닌 것 같지만, 사실 의미가 큽니다.

이런 퀄리티의 이미지가 만들어졌어요. 매번 비용 내며 외부 서비스 쓰는 것과는 다른 차원이에요.

그런데 코드를 한 줄씩 읽다 보면 의문이 생겨요. 특히 이 한 줄.

dtype = torch.float16 if torch.cuda.is_available() else torch.float32

“GPU가 있으면 float16, 없으면 float32를 쓰겠다”는 뜻입니다. 그런데 GPU가 좋을수록 더 정확한 float32를 쓰는 게 맞지 않을까요? 직관과 정반대 결과가 나오는 이 코드, 다음 편에서 자세히 풀어볼게요. AI 세계의 의외의 규칙들에 대한 이야기입니다.

읽어주셔서 감사합니다. 🙂


다음 편: “코드 한 줄의 비밀 - GPU가 좋을수록 왜 덜 정확하게 쓸까?”

#환경구축#이미지생성