키우는 방법은 두 갈래다
ComfyUI에서 그림을 키우는 방법은 크게 둘로 나뉜다. 하나는 그림을 키우는 일만 배운 별도의 모델(업스케일 모델)에 그림을 통째로 넣는 방법이고, 다른 하나는 작게 만든 그림을 늘린 뒤 샘플러로 한 번 더 그리게 하는 방법이다. ComfyUI 예제 페이지는 뒤의 방법을 «Hires fix» 또는 2단계 txt2img라고 부르고, 낮은 해상도로 만든 그림을 키운 다음 img2img로 다시 보내는 것이라고 설명한다.
| 갈래 | 핵심 노드 | 샘플러를 다시 돌리나 | 어울리는 일 |
|---|---|---|---|
| A. 업스케일 모델 | Load Upscale Model → Upscale Image (using Model) | 돌리지 않음 | 이미 다 된 그림을 빠르게 키우기, 사진 · 외부 그림 키우기 |
| B. 키운 뒤 다시 그리기 | Upscale Latent (By) 또는 A의 결과 → KSampler | 한 번 더 돌림 | 큰 그림에 맞는 잔세부를 새로 만들기 |
두 갈래의 차이는 «그림 내용을 새로 만드느냐»다. A 갈래는 이미 있는 픽셀을 더 크고 선명하게 늘릴 뿐 그림에 없던 것을 그려 넣지 않는다. B 갈래는 늘린 그림을 샘플러가 다시 칠하므로 머리카락 결이나 옷감 무늬 같은 잔세부가 새로 생기지만, 그만큼 원래 그림과 조금씩 달라질 수 있다. 어느 쪽이 낫다기보다 쓰임이 다르다.
업스케일 모델로 키우기 — 준비물
A 갈래부터 본다. 공식 문서가 안내하는 준비는 간단하다.
- 모델을 받는다. 문서는 업스케일 모델을 OpenModelDB에서 받으라고 안내하고, 예시로 4x-ESRGAN 모델을 쓴다.
- 폴더에 넣는다. 받은
.pth파일을ComfyUI/models/upscale_models폴더에 넣는다. 예제 페이지도 같은 폴더를 가리킨다. - 노드를 잇는다. Load Image로 그림을 올리고, Load Upscale Model에서 받은 파일 이름을 고른 뒤, 두 출력을 Upscale Image (using Model)에 잇는다.
- 실행한다. 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에서 이 노드가 «느리지만 끝까지 해내는» 경우가 많은 이유가 이것이다.
소스에서 확인되는 것이 두 가지 더 있다.
- 결과 값은 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 같은 업스케일 모델로 키우는 방법이다. 둘째 방법은 업스케일 모델이 픽셀 공간에서 일하므로 그림을 픽셀로 풀었다가 키운 뒤 다시 잠재 공간으로 바꾸는 단계가 필요하다고 예제 페이지는 적는다.
잠재 공간에서 늘리는 모양
- 첫 번째 KSampler로 평소처럼 작은 크기의 그림을 만든다. 이때는 빈 잠재 이미지에서 시작하므로 denoise를 최대로 둔다. 예제 페이지도 txt2img는 빈 이미지를 최대 denoise로 샘플러에 넣는 것이라고 설명한다.
- 그 LATENT 출력을 Upscale Latent By에 넣는다. 기본 배율은 1.5다.
- 늘린 LATENT를 두 번째 KSampler의 latent_image에 잇고, 모델과 프롬프트는 첫 번째와 같은 것을 쓴다.
- 두 번째 KSampler의 denoise는 1.0보다 낮게 둔다. KSampler의 denoise는 0.0부터 1.0까지 고를 수 있고 기본은 1.0이다.
- VAE Decode → Save Image로 저장한다.
4번이 이 갈래의 핵심이다. denoise를 1.0으로 두면 두 번째 샘플러가 늘린 그림을 무시하고 처음부터 새로 그리므로 첫 그림의 구도가 사라진다. 반대로 너무 낮추면 늘리면서 흐려진 부분이 거의 그대로 남는다. 잠재 공간에서 늘리는 것은 학습된 모델이 아니라 보간이라 그 자체로는 세부를 만들지 못하고, 세부는 두 번째 샘플러가 채운다. 값은 정답이 있는 것이 아니므로 같은 시드에서 몇 단계씩 바꿔 가며 비교하는 것이 가장 빠르다.
업스케일 모델을 끼우는 모양
잠재 공간 보간 대신 업스케일 모델로 키우고 싶다면 순서가 조금 길어진다.
- 첫 번째 KSampler 결과를 VAE Decode로 그림으로 푼다.
- Upscale Image (using Model)로 키운다. 필요하면 Upscale Image By로 원하는 크기로 줄인다.
- VAE Encode로 다시 잠재 공간에 넣는다.
- 두 번째 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가 원래 그림을 얼마나 남길지를 정하는 손잡이 노릇을 한다.
결과가 이상할 때 볼 순서
- 업스케일 모델 노드에서 메모리 오류가 난다 — 노드가 조각을 128까지 줄여도 안 된 경우다. 입력 크기를 줄이거나 배율이 낮은 모델로 바꾼다.
- 결과가 생각보다 너무 크다 — 모델 배율이 그대로 적용된 것이다. 뒤에 Upscale Image By를 붙여 줄인다.
- 2단계 결과의 구도가 첫 그림과 딴판이다 — 두 번째 KSampler의 denoise가 너무 높다. 낮춰서 같은 시드로 비교한다.
- 2단계 결과가 흐릿하다 — denoise가 너무 낮거나, 잠재 공간 보간으로 늘린 바탕이 흐린 경우다. denoise를 조금 올리거나 업스케일 모델을 끼우는 모양으로 바꾼다.
- 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 같은 수학적 보간으로 픽셀을 늘립니다. 업스케일 모델은 그림을 키우는 일을 학습한 신경망이라 경계와 질감을 더 선명하게 살립니다. 크기를 정확히 맞추거나 줄일 때는 보간 노드가, 크게 키울 때는 업스케일 모델이 어울립니다.
참고 자료
- ComfyUI 공식 문서. Upscale 튜토리얼 — Load Upscale Model · Upscale Image (using Model) 노드, .pth 모델을 models/upscale_models 에 넣는 것, OpenModelDB에서 받는 것, 모델 종류별 설명. docs.comfy.org
- ComfyUI Examples. Upscale Model examples — ESRGAN 같은 업스케일 모델, UpscaleModelLoader · ImageUpscaleWithModel 노드, models/upscale_models 폴더. comfyanonymous.github.io
- ComfyUI Examples. 2 Pass Txt2Img (Hires fix) examples — 낮은 해상도로 만든 뒤 키워서 img2img로 다시 보내는 방식, 잠재 공간 업스케일과 ESRGAN 업스케일 두 예. comfyanonymous.github.io
- ComfyUI 소스 코드 nodes.py — Upscale Latent · Upscale Latent By · Upscale Image · Upscale Image By 의 입력 기본값 · 범위 · 보간 방식 목록, KSampler denoise 범위, MAX_RESOLUTION. github.com
- ComfyUI 소스 코드 nodes_upscale_model.py — 조각 512 · 겹침 32, 메모리 부족 때 조각을 반으로 줄여 다시 하는 부분, 배율 = 모델 배율, 투명도 채널 처리, 노드 표시 이름. github.com
- OpenModelDB — 공식 문서가 업스케일 모델을 받는 곳으로 안내하는 모델 목록. openmodeldb.info