AI IMAGE · UPSCALE

ComfyUI 업스케일 — 작은 그림을 크게 뽑는 두 가지 방법

junetapa 약 11분

ComfyUI로 그림을 뽑다 보면 마음에 드는 그림이 나왔는데 크기가 아쉬운 경우가 많다. 512 정사각형으로 뽑은 그림은 화면에서 보기엔 괜찮아도 배경 화면이나 인쇄에 쓰기엔 작다. 그렇다고 처음부터 큰 해상도로 뽑으면 모델이 배운 크기를 벗어나 사람이 둘로 겹치거나 구도가 흐트러지기 쉽다. 그래서 «작게 뽑고, 나중에 키운다»가 기본 순서가 된다. 이 글은 ComfyUI에서 그림을 키우는 두 갈래 — 업스케일 모델로 키우기와 키운 뒤 한 번 더 그리기 — 를 ComfyUI 공식 문서, 예제 페이지, 소스 코드로 확인해 정리한다. 노드 이름과 기본값은 글을 쓰며 소스 파일을 직접 열어 한 줄씩 대조했다.

이어 읽기

ComfyUI를 아직 깔지 않았다면 ComfyUI 입문 실전 가이드부터 본다. 첫 그림이 이상하게 나오는 원인은 첫 그림이 이상할 때에서, 그림 일부만 고치는 법은 ComfyUI 인페인팅에서 다뤘다. 이 글은 시리즈의 다음 단계 — 다 된 그림을 크게 만드는 법 — 을 맡는다.

키우는 방법은 두 갈래다

ComfyUI에서 그림을 키우는 방법은 크게 둘로 나뉜다. 하나는 그림을 키우는 일만 배운 별도의 모델(업스케일 모델)에 그림을 통째로 넣는 방법이고, 다른 하나는 작게 만든 그림을 늘린 뒤 샘플러로 한 번 더 그리게 하는 방법이다. ComfyUI 예제 페이지는 뒤의 방법을 «Hires fix» 또는 2단계 txt2img라고 부르고, 낮은 해상도로 만든 그림을 키운 다음 img2img로 다시 보내는 것이라고 설명한다.

갈래핵심 노드샘플러를 다시 돌리나어울리는 일
A. 업스케일 모델Load Upscale Model → Upscale Image (using Model)돌리지 않음이미 다 된 그림을 빠르게 키우기, 사진 · 외부 그림 키우기
B. 키운 뒤 다시 그리기Upscale Latent (By) 또는 A의 결과 → KSampler한 번 더 돌림큰 그림에 맞는 잔세부를 새로 만들기

두 갈래의 차이는 «그림 내용을 새로 만드느냐»다. A 갈래는 이미 있는 픽셀을 더 크고 선명하게 늘릴 뿐 그림에 없던 것을 그려 넣지 않는다. B 갈래는 늘린 그림을 샘플러가 다시 칠하므로 머리카락 결이나 옷감 무늬 같은 잔세부가 새로 생기지만, 그만큼 원래 그림과 조금씩 달라질 수 있다. 어느 쪽이 낫다기보다 쓰임이 다르다.

ComfyUI 업스케일 두 갈래 — Load Image와 Load Upscale Model을 Upscale Image (using Model)에 이어 바로 저장하는 A 갈래와, KSampler로 작게 만든 뒤 Upscale Latent By로 늘리고 두 번째 KSampler로 다시 그려 VAE Decode하는 B 갈래
A는 키우기만 하고, B는 키운 뒤 샘플러가 한 번 더 그린다.

업스케일 모델로 키우기 — 준비물

A 갈래부터 본다. 공식 문서가 안내하는 준비는 간단하다.

  1. 모델을 받는다. 문서는 업스케일 모델을 OpenModelDB에서 받으라고 안내하고, 예시로 4x-ESRGAN 모델을 쓴다.
  2. 폴더에 넣는다. 받은 .pth 파일을 ComfyUI/models/upscale_models 폴더에 넣는다. 예제 페이지도 같은 폴더를 가리킨다.
  3. 노드를 잇는다. Load Image로 그림을 올리고, Load Upscale Model에서 받은 파일 이름을 고른 뒤, 두 출력을 Upscale Image (using Model)에 잇는다.
  4. 실행한다. Ctrl(맥은 Cmd) + Enter로 대기열에 넣는다.

노드 이름은 문서와 소스가 조금 다르게 적는다. 소스 코드에서 불러오는 노드의 화면 이름은 «Load Upscale Model», 키우는 노드는 «Upscale Image (using Model)»이고, 메뉴 위치는 각각 model/loaders와 image/upscaling이다. 예제 페이지는 내부 이름인 UpscaleModelLoader와 ImageUpscaleWithModel로 부른다. 노드 검색 창에서는 어느 이름으로 찾아도 된다.

어떤 모델을 고르나

공식 문서는 모델 계열마다 성격을 짧게 적어 두었다. RealESRGAN은 두루 쓰는 범용, BSRGAN은 글자와 날카로운 경계에 강하고, SwinIR은 자연스러운 질감을 살려 풍경에 어울린다는 설명이다. 같은 문서는 OpenModelDB 목록에서 각 모델의 배율이 카드 오른쪽 위에 표시된다고 알려 준다. 모델을 고를 때는 그림 성격(사진 · 애니메이션 · 글자)과 이 배율 두 가지를 먼저 본다.

배율은 모델이 정한다

소스 코드에서 Upscale Image (using Model)는 키우는 배율을 사용자 입력으로 받지 않고 모델이 가진 배율을 그대로 쓴다. 4x 모델을 고르면 가로세로가 모두 네 배가 된다. 배율을 낮추고 싶으면 배율이 낮은 모델을 고르거나, 뒤에서 볼 Upscale Image By로 결과를 다시 줄인다.

소스 코드로 본 Upscale Image (using Model)

이 노드가 큰 그림에서 메모리를 어떻게 다루는지는 소스 코드에 그대로 드러난다. 노드는 그림을 한 번에 모델에 넣지 않고 조각(타일)으로 나눠 하나씩 키운 뒤 다시 잇는다. 기본 조각 크기는 512, 조각끼리 겹치는 폭은 32로 적혀 있다. 겹치는 띠를 두는 이유는 조각 경계에 이음매가 보이지 않게 하려는 것이다.

더 눈여겨볼 부분은 실패했을 때다. 소스를 보면 키우는 도중 오류가 나면 메모리 부족 오류인지 먼저 가리고, 메모리 부족이면 조각 크기를 반으로 줄여 다시 시도한다. 512에서 실패하면 256, 다시 실패하면 128로 내려가고, 128보다 작아지면 그때 오류를 그대로 낸다. 그래픽카드 메모리가 넉넉하지 않은 PC에서 이 노드가 «느리지만 끝까지 해내는» 경우가 많은 이유가 이것이다.

Upscale Image (using Model)의 조각 처리 — 그림을 기본 512 조각으로 나누고 32 폭으로 겹쳐 잇는 모습과, 메모리가 모자라면 조각을 256, 128로 반씩 줄여 다시 시도하고 128보다 작아지면 오류로 멈추는 순서
조각을 나눠 키우고, 메모리가 모자라면 조각을 반으로 줄여 다시 한다.

소스에서 확인되는 것이 두 가지 더 있다.

  • 결과 값은 0과 1 사이로 자른다. 모델이 낸 값이 범위를 넘으면 잘라 내어 색이 튀지 않게 한다.
  • 투명도 채널은 따로 키운다. 입력 그림에 투명도(알파) 채널이 있으면 색 채널만 모델에 넣고, 투명도는 일반 보간(bilinear)으로 같은 크기로 늘려 다시 붙인다. 배경을 지운 그림을 키울 때 가장자리 투명도가 모델 결과와 미세하게 다를 수 있는 이유다.
끝내 메모리 오류가 날 때

조각을 128까지 줄여도 안 된다면 입력 그림 자체가 너무 크거나 모델이 무거운 경우다. 입력을 먼저 줄이거나, 배율이 낮은 모델로 바꾸거나, 두 번에 나눠 키우는 방법을 시험한다. 모델별로 필요한 메모리는 모델별 VRAM 정리를 함께 본다.

단순 크기 조절 노드 — Upscale Image와 Upscale Image By

업스케일 모델 없이 크기만 바꾸는 노드도 기본으로 들어 있다. 이 노드들은 학습된 모델이 아니라 수학적 보간으로 픽셀을 늘리거나 줄인다. 그래서 키우는 용도로는 업스케일 모델보다 흐릿하지만, 크기를 정확히 맞추거나 줄일 때는 오히려 쓸모가 크다.

노드(화면 이름)정하는 것기본값 · 범위보간 방식
Upscale Image가로 · 세로 크기기본 512, 최대 16384, 1씩nearest-exact · bilinear · area · bicubic · lanczos
Upscale Image By배율기본 1.0, 0.01~8.0위와 같음
Upscale Latent잠재 공간 가로 · 세로기본 512, 최대 16384, 8씩nearest-exact · bilinear · area · bicubic · bislerp
Upscale Latent By잠재 공간 배율기본 1.5, 0.01~8.0위와 같음

표에서 두 가지가 보인다. 첫째, 그림(픽셀)용 노드에는 lanczos가 있고, 잠재 공간용 노드에는 lanczos 대신 bislerp가 있다. 둘째, Upscale Latent의 크기는 8씩만 바뀐다. 잠재 공간은 그림을 가로세로 일정 배율로 줄여 담은 곳이라, 그 배율에 맞아떨어지는 크기만 받기 때문이다.

이 노드들이 A 갈래와 만나는 자리는 «4x 모델로 키운 뒤 원하는 크기로 줄이기»다. 4x 모델로 키운 결과를 Upscale Image By에 넣고 배율을 0.5로 두면 원래 그림 대비 가로세로 두 배 크기가 된다. 업스케일 모델이 만든 선명함을 살리면서 크기는 원하는 만큼만 쓰는 방법이다.

키운 뒤 다시 그리기 — 2단계 워크플로

이제 B 갈래다. ComfyUI 예제 페이지는 2단계 txt2img를 두 가지 모양으로 보여 준다. 첫째는 잠재 공간에서 바로 늘리는 방법이고, 둘째는 ESRGAN 같은 업스케일 모델로 키우는 방법이다. 둘째 방법은 업스케일 모델이 픽셀 공간에서 일하므로 그림을 픽셀로 풀었다가 키운 뒤 다시 잠재 공간으로 바꾸는 단계가 필요하다고 예제 페이지는 적는다.

잠재 공간에서 늘리는 모양

  1. 첫 번째 KSampler로 평소처럼 작은 크기의 그림을 만든다. 이때는 빈 잠재 이미지에서 시작하므로 denoise를 최대로 둔다. 예제 페이지도 txt2img는 빈 이미지를 최대 denoise로 샘플러에 넣는 것이라고 설명한다.
  2. 그 LATENT 출력을 Upscale Latent By에 넣는다. 기본 배율은 1.5다.
  3. 늘린 LATENT를 두 번째 KSampler의 latent_image에 잇고, 모델과 프롬프트는 첫 번째와 같은 것을 쓴다.
  4. 두 번째 KSampler의 denoise는 1.0보다 낮게 둔다. KSampler의 denoise는 0.0부터 1.0까지 고를 수 있고 기본은 1.0이다.
  5. VAE Decode → Save Image로 저장한다.

4번이 이 갈래의 핵심이다. denoise를 1.0으로 두면 두 번째 샘플러가 늘린 그림을 무시하고 처음부터 새로 그리므로 첫 그림의 구도가 사라진다. 반대로 너무 낮추면 늘리면서 흐려진 부분이 거의 그대로 남는다. 잠재 공간에서 늘리는 것은 학습된 모델이 아니라 보간이라 그 자체로는 세부를 만들지 못하고, 세부는 두 번째 샘플러가 채운다. 값은 정답이 있는 것이 아니므로 같은 시드에서 몇 단계씩 바꿔 가며 비교하는 것이 가장 빠르다.

업스케일 모델을 끼우는 모양

잠재 공간 보간 대신 업스케일 모델로 키우고 싶다면 순서가 조금 길어진다.

  1. 첫 번째 KSampler 결과를 VAE Decode로 그림으로 푼다.
  2. Upscale Image (using Model)로 키운다. 필요하면 Upscale Image By로 원하는 크기로 줄인다.
  3. VAE Encode로 다시 잠재 공간에 넣는다.
  4. 두 번째 KSampler에 잇고 denoise를 1.0보다 낮게 둔다.

이 모양은 업스케일 모델이 만든 선명한 바탕 위에서 두 번째 샘플러가 일하므로, 보간으로 늘린 흐릿한 바탕에서 시작하는 첫째 모양보다 원래 그림을 덜 흔들고도 세부를 얻기 쉽다. 대신 VAE를 한 번 더 오가는 만큼 시간이 더 든다. 예제 페이지가 두 모양을 모두 실어 둔 것도 이런 선택지 때문이다.

어느 갈래를 고를까

상황권하는 갈래이유
남이 준 그림 · 사진을 키움A원래 프롬프트 · 모델이 없어 다시 그리기가 어렵다
뽑은 그림을 빨리 크게 보고 싶음A샘플러를 다시 돌리지 않아 빠르다
큰 그림에서 잔세부가 뭉개져 보임B두 번째 샘플러가 세부를 새로 그린다
처음부터 큰 그림을 목표로 워크플로를 짬B(업스케일 모델 모양)작게 구도를 잡고 크게 다듬는 순서가 안정적이다

처음이라면 한 워크플로 안에 두 갈래를 나란히 만들어 두고 비교해 보는 방법을 권한다. 첫 번째 KSampler의 LATENT 출력에서 선을 두 갈래로 뽑아, 한쪽은 VAE Decode 뒤 Upscale Image (using Model)로 바로 저장하고, 다른 쪽은 Upscale Latent By와 두 번째 KSampler를 거쳐 저장하게 잇는다. 시드를 고정해 두면 같은 첫 그림에서 출발한 두 결과를 나란히 놓고 볼 수 있다. 저장 노드의 파일 이름 앞부분을 서로 다르게 적어 두면 출력 폴더에서도 바로 구별된다.

비교할 때는 그림 전체보다 가까이 확대한 일부를 본다. 얼굴의 눈매, 머리카락 끝, 옷의 주름처럼 잔세부가 몰린 자리에서 두 갈래의 차이가 가장 크게 드러난다. A 갈래 결과는 원래 그림의 선이 그대로 굵고 또렷해진 모습이고, B 갈래 결과는 그 자리에 새로 그린 결이 들어가 있다. 어느 쪽이 마음에 드는지는 그림의 쓰임과 취향에 달린 문제라, 직접 두 결과를 견주어 고르는 것이 가장 확실하다.

정리하면 A는 «그림은 그대로, 크기만», B는 «크기를 키우면서 세부도 다시»다. 인페인팅 글에서 본 두 갈래(새로 그리기와 원래 그림 살리기)와 비슷하게, 여기서도 denoise가 원래 그림을 얼마나 남길지를 정하는 손잡이 노릇을 한다.

결과가 이상할 때 볼 순서

  1. 업스케일 모델 노드에서 메모리 오류가 난다 — 노드가 조각을 128까지 줄여도 안 된 경우다. 입력 크기를 줄이거나 배율이 낮은 모델로 바꾼다.
  2. 결과가 생각보다 너무 크다 — 모델 배율이 그대로 적용된 것이다. 뒤에 Upscale Image By를 붙여 줄인다.
  3. 2단계 결과의 구도가 첫 그림과 딴판이다 — 두 번째 KSampler의 denoise가 너무 높다. 낮춰서 같은 시드로 비교한다.
  4. 2단계 결과가 흐릿하다 — denoise가 너무 낮거나, 잠재 공간 보간으로 늘린 바탕이 흐린 경우다. denoise를 조금 올리거나 업스케일 모델을 끼우는 모양으로 바꾼다.
  5. Upscale Latent에 원하는 크기가 안 들어간다 — 8씩만 바뀌는 입력이다. 가장 가까운 8의 배수로 맞춘다.

자주 묻는 것

업스케일 모델은 어디에 넣나요?

받은 .pth 파일을 ComfyUI/models/upscale_models 폴더에 넣습니다. 공식 문서와 예제 페이지가 모두 이 폴더를 안내하고, 문서는 모델을 OpenModelDB에서 받으라고 권합니다.

4x 모델인데 두 배만 키우고 싶어요.

Upscale Image (using Model)는 모델의 배율을 그대로 쓰기 때문에 4x 모델은 네 배로 키웁니다. 결과 뒤에 Upscale Image By 노드를 붙여 배율을 0.5로 두면 원래 대비 두 배 크기가 됩니다. 처음부터 배율이 낮은 모델을 골라도 됩니다.

Hires fix는 ComfyUI에서 어떻게 하나요?

작은 크기로 만든 잠재 이미지를 Upscale Latent By로 늘린 뒤, 두 번째 KSampler에 넣어 denoise를 1.0보다 낮게 두고 한 번 더 그리게 합니다. ComfyUI 예제 페이지는 이것을 2단계 txt2img로 소개하고, 업스케일 모델로 키우는 모양도 함께 보여 줍니다.

그래픽카드 메모리가 적어도 업스케일 모델을 쓸 수 있나요?

소스 코드상 이 노드는 그림을 조각으로 나눠 키우고, 메모리가 모자라면 조각 크기를 반으로 줄여 다시 시도합니다. 그래서 느려지더라도 끝까지 되는 경우가 많습니다. 조각이 128보다 작아져도 안 되면 오류가 나므로, 그때는 입력 크기를 줄이거나 가벼운 모델을 고릅니다.

단순히 크기만 바꾸는 노드와 업스케일 모델은 무엇이 다른가요?

Upscale Image와 Upscale Image By는 bicubic · lanczos 같은 수학적 보간으로 픽셀을 늘립니다. 업스케일 모델은 그림을 키우는 일을 학습한 신경망이라 경계와 질감을 더 선명하게 살립니다. 크기를 정확히 맞추거나 줄일 때는 보간 노드가, 크게 키울 때는 업스케일 모델이 어울립니다.

참고 자료

  1. ComfyUI 공식 문서. Upscale 튜토리얼 — Load Upscale Model · Upscale Image (using Model) 노드, .pth 모델을 models/upscale_models 에 넣는 것, OpenModelDB에서 받는 것, 모델 종류별 설명. docs.comfy.org
  2. ComfyUI Examples. Upscale Model examples — ESRGAN 같은 업스케일 모델, UpscaleModelLoader · ImageUpscaleWithModel 노드, models/upscale_models 폴더. comfyanonymous.github.io
  3. ComfyUI Examples. 2 Pass Txt2Img (Hires fix) examples — 낮은 해상도로 만든 뒤 키워서 img2img로 다시 보내는 방식, 잠재 공간 업스케일과 ESRGAN 업스케일 두 예. comfyanonymous.github.io
  4. ComfyUI 소스 코드 nodes.py — Upscale Latent · Upscale Latent By · Upscale Image · Upscale Image By 의 입력 기본값 · 범위 · 보간 방식 목록, KSampler denoise 범위, MAX_RESOLUTION. github.com
  5. ComfyUI 소스 코드 nodes_upscale_model.py — 조각 512 · 겹침 32, 메모리 부족 때 조각을 반으로 줄여 다시 하는 부분, 배율 = 모델 배율, 투명도 채널 처리, 노드 표시 이름. github.com
  6. OpenModelDB — 공식 문서가 업스케일 모델을 받는 곳으로 안내하는 모델 목록. openmodeldb.info
이 글의 노드 이름 · 기본값 · 범위 · 동작은 2026년 10월 4일에 연 ComfyUI 공식 문서(Upscale 튜토리얼), ComfyUI 예제 페이지(Upscale Model · 2 Pass Txt2Img), ComfyUI 저장소의 nodes.py와 comfy_extras/nodes_upscale_model.py 소스 코드를 따랐다. ComfyUI는 자주 갱신되므로 노드 이름과 기본값은 쓰는 판에서 다시 확인한다. 업스케일 결과의 품질은 모델 · 입력 그림 · 설정에 따라 달라지며, 이 글은 특정 결과를 보장하지 않는다. 내려받는 업스케일 모델마다 사용 조건이 다를 수 있으니 모델 페이지의 라이선스를 확인한다.
ComfyUI업스케일ESRGANHiresFix스테이블디퓨전AI이미지
junetapa
junetapa
AI 도구를 직접 굴려 보고 남은 기록을 정리한다.
Twitter Facebook URL 복사