ComfyUI 기본 동작 원리 feat.워크플로우(Workflow)

ComfyUI 기본 동작 원리는 Stable Diffusion으로 WebUI와 동일하지만, 매우 낯선 UI 덕분에 아무런 배경지식 없이 처음 접했을 때 당황스러울 수 있습니다. 프롬프트를 입력하고 Generate 버튼을 누르면 그림이 생성되는 직관적인 UI를 갖춘 WebUI와 달리 어쩌면 매우 불친절한 UI를 가진 ComfyUI지만 사실 기본 원리만 깨우치면, 나중에는 되려 WebUI에서는 할 수 없는 무한한 확장성을 발견할 수 있습니다. 본 글에서는 ComfyUI 기본 동작 원리를 알아보고, ComfyUI가 그림을 생성해내는 일련의 과정을 일컫는 워크플로우에 대해 조금 더 자세히 살펴보도록 하겠습니다.

ComfyUI 첫 그림 생성 해보기

앞선 포스팅을 따라 ComfyUI 및 ComfyUI Manager 설치를 마치신 분들은 곧바로 첫 그림을 생성해볼 수 있습니다. 아래는 ComfyUI를 실행하면 기본적으로 나타나는 화면입니다.

ComfyUI 기본 동작 원리 첫화면 설명

이 화면에서 그림 중앙에서 살짝 왼쪽의 상하단 박스에 각각 긍정(Positive)/부정(Negative) 프롬프트를 입력한 뒤 기본 메뉴창의 Queue Prompt 버튼을 누르면 그림을 생성하기 시작합니다.

위 그림은 기본 상태 그대로 생성한 그림입니다. 이로써 ComfyUI를 사용해 매우 쉽게 간단한 첫 그림을 생성해볼 수 있었습니다. 아래에서는 앞으로 ComfyUI를 사용해나가기 위해 알아야한 기초적인 ComfyUI 기본 동작 원리에 대해 살펴보도록 하겠습니다.

ComfyUI 기본 동작 원리

ComfyUI는 스테이블 디퓨전으로 그림을 생성하는 과정에서 사용하는 도구라고 볼 수 있습니다. 예를 들어 인터넷을 하기 위해 사용하는 브라우저에는 크롬, 엣지, 파이어폭스, 웨일 등이 있고 사람마다 취향대로 각자 다른 브라우저를 사용할 수 있는 것처럼, ComfyUI 또한 스테이블 디퓨전으로 그림을 만들어내기 위한 인터페이스 입니다.

따라서 이론적인 그림 생성 원리는 스테이블 디퓨젼 자체의 그림 생성 원리에 대한 글에서 자세히 살펴보는 것으로 하고, 여기서는 실제 ComfyUI를 활용해 그림을 만들기 위해 알아야 하는 ComfyUI 기본 동작 원리에 대해 알아보겠습니다.

프롬프트(Prompt)

ComfyUI 기본 동작 원리의 가장 첫 단추는 바로 프롬프트입니다. ComfyUI를 설치한 뒤 처음 실행하신 분들은 아마도 긍정/부정 프롬프트(CLIP Text Encode)에 아래와 같이 입력되어 있을 것입니다.

📌 CLIP Text Encode (Prompt) – positive

beautiful scenery nature glass bottle landscape, , purple galaxy bottle,

📌 CLIP Text Encode (Prompt) – negative

text, watermark

프롬프트는 우리가 인공지능(AI)에게 명령을 내리는 지시문입니다. 스테이블디퓨젼 뿐만아니라, ChatGPT, 미드저니, 등 대부분의 인공지능 서비스의 시작은 이 프롬프트 작성에 있습니다. 따라서 ComfyUI에서 생성하는 첫 그림을 원하는 그림으로 만들고 싶으신 분들께서는 Queue Prompt 버튼을 누르기 전에 이 긍정/부정 프롬프트에 자신이 표현하고 싶은 키워드들을 작성하면 됩니다.

긍정 프롬프트란에는 그림에 반영이 되었으면 하는 것들을, 부정 프롬프트에는 그림에 제외되기를 희망하는 키워드를 작성합니다. 스테이블 디퓨전 프롬프트는 단어형태의 키워드 뿐만아니라 문장형으로 작성하는 것도 가능하며, 단순 단어 및 문장 이외의 문법들을 활용해 더욱 세밀하게 AI에게 지시문을 전달할 수 있습니다. 이를 프롬프트 엔지니어링이라고 하는데요, 프롬프트 문법 및 더욱 세부적인 내용은 프롬프트 관련 포스팅에서 따로 구체적으로 살펴보겠습니다.

워크플로우(Workflow)

이후 Queue Prompt를 누르면 ComfyUI가 아래와 같이 좌에서 우로 나열된 상자들을 훑으며 단계별 작업을 처리합니다.

버튼 클릭과 함께 ComfyUI가 그림생성 작업을 시작하면 위의 그림처럼 현재 작업중인 단계의 상자가 녹색 테두리로 하이라이팅 되는 것을 볼 수 있습니다. 그리고 그림 생성이 완료되면 가장 우측 Save-Image 상자에 최종 그림이 표시됩니다.

위 예시에서는 초기 프롬프트를 건들지 않고 그대로 그림을 생성했기 때문에 보라색 은하수가 담긴 물병이 생성된 것을 볼 수 있습니다. ComfyUI에서는 이렇게 이미지 생성을 위해 각 상자의 기능들을 단계별로 구성해놓은 형태를 워크플로우라고 부르고 있습니다. 예시는 가장 기본적인 상자들로만 구성되어 있지만 추후 추가적인 기능을 구현하기 위해 여러 상자들을 추가하고, 단계를 늘리게 되면 더욱 복잡한 워크플로우를 구성할 수 밖에 없습니다.

워크플로우 저장 및 공유 방법

이렇게 구성한 워크플로우는 당연히 그 워프클로우 자체를 저장할 수 있습니다. 심지어 저장한 워크플로우를 타인과 공유하는 것도 가능합니다.

이미지로 저장 및 공유하기

가장 간단한 워크플로우 저장 및 공유 방법은 바로 생성된 이미지를 그대로 전달하는 것입니다. ComfyUI에서 생성한 그림은 생성단계의 정보를 모두 포함하고 있습니다. 따라서 해당 이미지를 단순히 ComfyUI 위에 드래그 앤 드롭으로 올려놓기만 하면 그 이미지가 생성될 때 거친 워크플로우가 그대로 불러와지게 됩니다.

JSON 파일로 저장 및 공유하기

이미지 자체로 저장하는 것을 선호하지 않는다면 현재 구성되어 있는 워크플로우 상태를 그대로 JSON파일로 저장할 수 있습니다.

방법은 매우 간단합니다. 위 그림처럼 기본 메뉴창에서 Save 버튼을 누르면 사용중인 브라우저에 팝업창이 나타나는데요, 여기서 이름을 작성하고 확인을 누르면 브라우저의 기본 다운로드 폴더에 해당 워크플로우가 JSON파일로 저장됩니다.

다른 사람의 워크플로우 활용하기

ComfyUI를 자주 다루다보면 각 노드에 대한 감이 생기면서 다른 사람의 큰 도움 없이 스스로 복잡한 워크플로우를 구성해 자신만의 맞춤형 생성 스텝을 완성해나갈 수 있습니다. 하지만 ComfyUI가 익숙하지 않은 초보라면 다른 사람이 이미 사용중인 워크플로우를 다운받아 활용하는 것도 좋은 방법입니다.

스테이블디퓨전 관련 커뮤니티, 포럼, 게시판 등을 통해 다른 사람의 ComfyUI 워크플로우를 다운받고, 이를 활용해 그림을 만들다보면 그 과정 속에서 워크플로우 구성 방법을 배우고 매우 빠르게 ComfyUI를 다루는 실력을 키워나갈 수 있습니다.

노드(Nodes)

앞서 살펴본 그림 생성 과정에서 각 상자가 각각의 기능을 지니고 있다고 말씀드렸습니다. 이때 각 기능상자들을 바로 노드(Nodes)라고 부르는데요, 각 노드들을 유심히 살펴보면 항상 왼쪽과 오른쪽에 컬러풀한 여러개의 점과 그 점에 대한 간략한 설명(라벨)이 붙어있는 것을 알 수 있습니다. 이 점들이 바로 해당 노드의 입력값(왼쪽 점들)과 출력값(오른쪽 점들)을 의미합니다. 즉, 어떤 노드의 출력값이 또다른 노드의 입력값으로 연결되어 있으면 해당 노드는 자신의 기능을 마무리한 뒤 정보를 다음 노드에게 넘겨준다는 것을 의미합니다.

노드는 꼭 1:1 대응이 아니어도 됩니다. 따라서 하나의 노드에서 다수의 노드로 출력값을 뿌리기도 하며, 다수 노드의 출력값을 하나의 노드가 받아오기도 합니다.

앞서 ComfyUI Manager 설치 단계에서 ComfyUI에 특정 기능을 추가하기 위해 커스텀 노드(Custom Nodes)를 설치한다는 것을 살펴보았는데요, 결국 커스텀 노드를 설치한다는 것은 ComfyUI에서 기본 제공하고 있는 기능상자(노드) 외에 개인화된(커스텀) 기능상자(노드)를 추가로 설치하는 것입니다.