
GPU 6대를 하나의 풀로 쓰기 — 준비 안 된 엔진은 고르지 못하게
영상 생성 작업을 여러 GPU에 분산하는 대시보드를 만들었다. 모델 파일 확인, 공유 GPU 제외, 모델명 하드코딩을 없앤 이야기.
이미지 한 장과 짧은 설명으로 영상을 만드는 대시보드를 만들었다. 로컬 GPU에서 ComfyUI를 돌리고, 여러 영상 생성 엔진을 골라 쓸 수 있게 했다.
GPU가 여러 장이라 자연스럽게 분산 문제가 생겼고, 여기서 배운 게 몇 가지 있다.
GPU를 풀로 묶기
ComfyUI 인스턴스를 GPU마다 하나씩 띄운다. 포트를 다르게 해서 여섯 대를 올렸다.
http://<내부주소>:PORT+0 GPU 2
http://<내부주소>:PORT+1 GPU 3
http://<내부주소>:PORT+2 GPU 4
http://<내부주소>:PORT+3 GPU 5
http://<내부주소>:PORT+4 GPU 6
http://<내부주소>:PORT+5 GPU 7 ← 오디오 생성과 공유
대시보드는 이 여섯을 하나의 풀로 본다. 작업이 들어오면 비어 있는 인스턴스에 보낸다.
여기서 예외가 하나 생겼다. GPU 7은 다른 서비스(오디오 생성)와 공유한다. 짧은 작업은 같이 써도 되지만, 15초 이상 긴 영상이나 고화질 작업을 여기에 보내면 VRAM이 부족해진다.
그래서 조건부로 제외했다. 긴 작업이나 고화질 작업일 때만 GPU 7을 후보에서 뺀다. 아예 빼버리면 짧은 작업에서 놀리게 되고, 그냥 두면 긴 작업이 실패한다.
“이 자원은 조건에 따라 쓸 수 있다”를 표현할 수 있어야 한다는 게 여기서 얻은 교훈이다. 자원 풀을 만들 때 가용/불가용 두 상태만 두면 이런 경우를 다룰 수 없다.
엔진 준비 상태를 직접 확인하기
영상 생성 엔진마다 필요한 파일이 다르다. 체크포인트, VAE, 텍스트 인코더, 업스케일러… 하나라도 없으면 생성이 실패한다.
처음에는 사용자가 엔진을 고르고 생성을 눌렀을 때 실패하게 뒀다. 나쁜 경험이었다. 몇 분 기다린 뒤에 “파일 없음” 에러를 본다.
그래서 대시보드가 엔진별 필수 파일을 독립적으로 확인하고, 준비된 엔진만 선택할 수 있게 했다. 준비 안 된 엔진은 아예 고를 수 없다.
이게 생각보다 중요했던 이유가 있다. 모델 파일은 몇십 GB씩 되고, 다운로드하다 중단되거나 경로를 잘못 두는 일이 흔하다. “왜 안 되지”를 생성 시점이 아니라 선택 시점에 알려주는 것만으로 디버깅 시간이 크게 줄었다.
모델명을 하드코딩하지 않기
프롬프트를 다듬는 데 별도 LLM 서버를 쓴다. 처음에는 모델 이름을 설정에 박아뒀다.
이게 계속 깨졌다. 로컬 LLM 서버의 모델을 바꾸거나 업그레이드하면 이름이 달라진다. 그럼 대시보드가 없는 모델을 호출하고 실패한다. 설정 파일을 고치러 가야 한다는 걸 기억해야 한다.
그래서 매 요청 직전에 모델 목록을 조회하도록 바꿨다.
GET <LLM서버>/v1/models → 사용 가능한 모델 목록
여기서 자동으로 고르거나, 사용자가 목록에서 명시적으로 선택한 모델을 쓴다. 서버 쪽 모델이 바뀌어도 대시보드는 그대로 동작한다.
외부 시스템의 상태를 설정 파일에 복사해두면 반드시 어긋난다. 물어볼 수 있으면 물어보는 게 낫다. 조회 비용이 크지 않다면.
생성 결과를 다시 검증하기
이미지에서 영상을 만들 때, LLM이 이미지를 보고 프롬프트 초안을 만든다. 그런데 이 초안이 실제 이미지와 안 맞을 때가 있다. 사람이 없는 사진인데 “인물이 걸어간다”는 식이다.
그래서 초안을 만든 뒤 다른 로컬 모델이 실제 이미지와 다시 대조한다. 두 엔진 모두 이 검증을 거친다.
같은 모델에게 “다시 확인해봐”라고 하는 것보다, 다른 모델에게 대조를 시키는 편이 낫다. 자기가 쓴 걸 자기가 검토하면 대체로 통과시킨다.
파일 정리 기능이 필요했던 이유
영상 파일은 크다. 작업을 많이 돌리면 디스크가 금방 찬다.
그런데 삭제가 단순하지 않았다. ComfyUI에는 파일 삭제 API가 없다. 그래서 같은 장비의 파일시스템으로 직접 지운다. 경로는 환경변수로 바꿀 수 있게 뒀다.
여기서 신경 쓴 부분이 몇 가지 있다.
- 진행 중인 작업은 건너뛴다. 생성 중인 파일을 지우면 작업이 깨진다
- 몇 개를 지우고 몇 개를 건너뛰었는지 표시한다. 조용히 일부만 지우면 사용자가 다 지워진 줄 안다
- 기록 없이 파일만 남은 것을 따로 찾는다. 개수와 용량을 먼저 보여주고 확인을 받는다
- 올린 이미지와 중간 산출물은 남긴다. 결과 영상만 지운다
삭제 기능은 되돌릴 수 없어서, 뭘 지울지 먼저 보여주고 확인받는 절차가 필요했다. 이건 자동화 도구 전반에 해당하는 것 같다.
정리
- 자원 풀에 “조건부로 쓸 수 있음” 상태가 필요할 때가 있다. 가용/불가용 두 상태로는 부족하다
- 실패는 실행 시점이 아니라 선택 시점에 알린다. 몇 분 기다린 뒤 에러를 보는 건 최악이다
- 외부 시스템의 상태(모델 목록 등)를 설정에 복사하지 말고 물어본다
- 자기 출력은 자기가 검토하면 통과시킨다. 다른 모델에게 대조를 시킨다
- 삭제 기능은 뭘 지울지 먼저 보여주고, 몇 개를 건너뛰었는지도 알려준다