DGX Spark 에 vLLM과 ComfyUI를 Docker Compose로 구성하기

DGX Spark 에 vLLM과 ComfyUI를 Docker Compose로 구성하기

NVIDIA DGX Spark(또는 유사한 고성능 GPU 환경)에서 vLLMComfyUI를 결합하여 GPU 메모리를 효율적으로 나눠 쓰고, 모델을 공유하며 사용하는 최적의 설정을 위한 구성입니다.

이 구성의 핵심은 다음과 같습니다.

  1. vLLM 백엔드: LLM(텍스트/코드 생성 및 OCR)을 로컬 메모리(RAM)와 GPU 메모리를 혼용하여 serving합니다. (때로는 뒤로 밀림 가능)
  2. ComfyUI 프론트엔드: vLLM이 관리하는 LLM API를 호출하거나, 시스템 RAM을 활용하여 이미지 생성(Stable Diffusion 등)에 집중합니다.
  3. 커스텀 노드 설치 자동화: ComfyUI와 모델을 연결해주는 필수 노드들을 컨테이너 구동 시 자동으로 설치합니다.

1. 디렉토리 구조 및 사전 준비

프로젝트 폴더를 생성하고 아래와 같은 구조를 잡습니다.

mkdir ai-dgx-project
cd ai-dgx-project
mkdir models # 모델이 저장될 폴더
mkdir vllm_cache # vLLM 캐시용
mkdir custom_nodes script

필수 사전 준비 (모델 다운로드)

models 폴더 안에 아래 모델들이 들어있어야 합니다. vllm이 자동으로 찾아서 불러오도록 구성했습니다.

  • glm-4.7-flash: THUDM/glm-4-flash (HF 훅/사이트에서 다운로드 필요)
  • qwen3-coder-next 80b: Qwen/Qwen2.5-72B-Instruct (가능하면 80B, 부족하면 72B 사용 권장). 이름에 맞게 폴더명 지정 권장.
    • 예: models/Qwen3_Coder_80B
  • glm-ocr: THUDM/glm-4v (HF 훅/사이트에서 다운로드 필요)
주의: 80B 모델은 VRAM 용량이 매우 큽니다. (일반적으로 4-bit 양자화 기준 최소 80GB 이상의 VRAM과 풍부한 RAM 필요). vLLM은 이를 시스템 RAM(시스템의 일반 RAM)으로 밸런싱합니다.

2. 자동 설치 스크립트 (script/install_custom_nodes.sh)

ComfyUI의 ComfyUI-Glm, ComfyUI-Qwen 등이 설치되어 있지 않으면 LLM이 작동하지 않습니다. 스크립트를 생성해 컨테이너 실행 시 자동으로 설치되게 합니다.

cat > script/install_custom_nodes.sh << 'EOF'
#!/bin/bash
echo "Installing ComfyUI Custom Nodes..."

# ComfyUI-Glm 설치 (GLM 모델 사용용)
if [ ! -f "ComfyUI-Glm/custom_nodes/GLM.py" ]; then
    git clone https://github.com/THUDM/ComfyUI-Glm /stable-diffusion/webui/comfyui/custom_nodes/ComfyUI-Glm
fi

# ComfyUI-Qwen 설치 (Qwen 모델 사용용)
if [ ! -d "ComfyUI-Qwen" ]; then
    git clone https://github.com/Comfy-Org/ComfyUI-Qwen /stable-diffusion/webui/comfyui/custom_nodes/ComfyUI-Qwen
fi

echo "Custom Nodes installation complete."
EOF

chmod +x script/install_custom_nodes.sh

3. Docker Compose 파일 (docker-compose.yml)

이 구성은 vLLM 컨테이너를 통해 모델을 serving하고, ComfyUI가 이를 자유롭게 호출하도록 설정했습니다.

version: '3.8'

services:
  # ---------------------------------------------------------
  # Service 1: vLLM Backend (LLM Serving)
  # ---------------------------------------------------------
  vllm-backend:
    image: vllm/vllm-openai:latest
    container_name: vllm_service
    runtime: nvidia
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1 # DGX Spark의 한 대의 GPU를 vLLM에 할당
              capabilities: [gpu]
    command: >
      --model-path /models \
      --served-model-name glm-4-flash,qwen3-coder-next-80b,glm-ocr \
      --trust-remote-code \
      --disable-log-requests \
      --port 8000 \
      --mm-sampling-method greedy \
      --gpu-memory-utilization 0.9 \
      --enforce-eager
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    volumes:
      - ./models:/models
      - ./vllm_cache:/root/.cache
    ports:
      - "8000:8000"
    stdin_open: true
    tty: true
    restart: unless-stopped

  # ---------------------------------------------------------
  # Service 2: ComfyUI Frontend (Image Gen + Analysis)
  # ---------------------------------------------------------
  comfyui-backend:
    image: comfyui/automatic:latest # 최신 공식 이미지
    container_name: comfyui_frontend
    runtime: nvidia
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    environment:
      - COMFYUI_DIR=/stable-diffusion/webui
      # ComfyUI 사용 옵션 (xformers 메모리 최적화, Prefetch 등)
      - CLI_ARGS=--listen 0.0.0.0 --port 8188 --enable-inprogress-prefetch-offload --disable-custom nodes --disable-xformers
    volumes:
      # 공유 폴더: 모델, 노드, 결과물
      - ./models:/stable-diffusion/webui/models
      - ./outputs:/stable-diffusion/webui/outputs
      - ./custom_nodes:/stable-diffusion/webui/comfyui/custom_nodes
      - ./vllm_cache:/root/.cache
      # vLLM 경로를 ComfyUI도 읽을 수 있도록 (로컬 노드 필요 시)
      - ./script:/script
    ports:
      - "8188:8188"
    command: >
      bash -c "
      /script/install_custom_nodes.sh &&
      python main.py $${CLI_ARGS} --api-base http://vllm-service:8000/v1
      "
    restart: unless-stopped
    depends_on:
      - vllm-backend

4. 사용 방법

1) 컨테이너 실행

터미널에서 프로젝트 폴더로 이동 후 실행합니다.

docker-compose up -d

2) ComfyUI 접속

브라우저에서 열면 됩니다:

  • URL: http://localhost:8188

이미지 생성 노드(예: Stable Diffusion 등)를 배치하고 실행합니다.

  • GLM 모델 사용 예시: "GLM-4 Talk" 또는 "GLM OCR" 노드를 사용하여 프롬프트를 vLLM 서버에 전송합니다.
  • Qwen 모델 사용 예시: "Qwen API" 또는 해당 커스텀 노드를 사용하여 로컬 코드 생성이나 분석을 수행합니다.

주의: ComfyUI가 vLLM API를 연동하여 사용하려면 ComfyUI-Glm과 같은 커스텀 노드가 제대로 설치되어야 합니다. (위 스크립트가 자동 처리하므로 첫 실행 시 다운로드가 완료될 때까지 다소 시간이 소요됩니다.)

3) API 테스트 (vLLM 직접 호출)

vLLM 서버는 OpenAI 호환 API 형태를 지원합니다. 테스트에는 curl이나 Python 등을 사용할 수 있습니다.

curl http://localhost:8000/v1/chat/completions \
     -H "Content-Type: application/json" \
     -d '{
       "model": "glm-4-flash",
       "messages": [{"role": "user", "content": "Hello 80B!"}]
     }'

적용 팁

  1. 메모리 관리: vLLM 컨테이너에서 --gpu-memory-utilization 0.9을 설정하여 GPU의 90%를 사용하고 10%를 ComfyUI 이미지 생성(또는 다른 작업)을 위해 남겼습니다.
  2. 80B 모델 최적화: qwen3-coder-next 80b 모델은 시스템 RAM이 상당히 필요합니다. vLLM은 기본적으로 가중치(model weights)를 GPU VRAM에 올리고, 컨텍스트가 길어지면 CPU RAM으로 오프로딩합니다. RAM이 충분히 크다면 빠르게, 작다면 약간 느릴 수 있습니다.
  3. GLM Flash: flash 모델은 무겁지 않으므로 거의 대부분 GPU VRAM에 상주하여 매우 빠릅니다.
개인정보보호링크