본문 바로가기
AI에서 살아남기(to. Android Developer)/나도 AI 개발자 되어보기?

사내 GPU 서버 AI 추론 환경 구성 및 운영

by 개발자 인민군 2026. 1. 26.

1. 배경 및 목적

AI 전략 사업팀으로 이동한 직후, 기술이사님으로부터 미션을 받았다.

"회사가 GPU 서버를 새로 샀다. 서버실에 연결해뒀으니, 오픈소스 AI 라이브러리를 올려서 돌려봐라."

문제는 나는 안드로이드 개발자였다는 것이다;; 리눅스, Docker, 인프라 이야기만 들어봤지 이쪽은 무지했다.

(참고로 안드로이드 개발자인 내가 왜 AI 전략사업팀에 간 일이 궁금하다면 여기를 들어가보자 (여기)

막막한 상태로 여러가지를 조사하고 사람들의 AI 활용 사례를 보며,
"일단 우리 회사는 미디어 회사니 미디어 관련 AI 를 할 수 있는 환경을 만들면 되지 않을까?" 란 막연한 생각이 떠올랐다.

해서 H200 NVL GPU 서버에 신사업 적용 AI 들을 실행 하고 누가 세팅해도 동일하게 재현 가능한 환경을 만들자 라고 생각했다.


2. 기술 선택 이유

왜 Docker인가

처음에는 서버에 직접 Python 환경을 설치하려 했다. 그런데 문제가 있었다.

  • 모델마다 요구하는 Python 버전, 라이브러리 버전이 달랐다
  • 하나를 설치하면 다른 것이 깨졌다
  • 서버를 재부팅하면 환경이 꼬였다

그래서 멍때리던 중 옆 동료에게 Docker를 쓰라는 조언을 받았고 현 문제를 해결하는데 아주 적합하다고 생각했다.

문제 Docker로 해결되는 방식
라이브러리 버전 충돌 컨테이너별 독립 환경
환경 재현 불가 docker-compose.yml 한 파일로 동일 환경 재현
서버 재부팅 후 재설정 restart: unless-stopped 자동 재시작
여러 서비스 동시 운영 컨테이너별 GPU 분리 할당

결국 내가 '코딩애플' 유튜브를 보며 이해한건 가상의 격리된 환경을 만들고, 그 안에서 각 서비스를 독립적으로 실행하는것은
안드로이드 에뮬레이터와 비슷한 개념이라고 이해했다. (정리한 내용 : Link)

이미지 / 영상 생성 영역

왜 ComfyUI인가

영상, 이미지 생성 AI를 다루는 데 있어 채팅 방식은 한계가 있다.

"루피가 나루토 자세로 달려줘" -> "아니 팔을 뒤로 뻗어줘" -> "천천히 다시 그려줘"

이걸 채팅으로 왔다갔다 계속 한다는건 진짜 말이 안된다.

ComfyUI는 노드 기반 워크플로우로 AI 파이프라인을 시각적으로 구성할 수 있다. 프롬프트 외에 모델, 샘플러, VAE, ControlNet 등을 조합해서 원하는 결과를 정밀하게 제어할 수 있고, 커뮤니티에서 만든 워크플로우를 그대로 가져와서 사용할 수도 있었다.

아마도 우리팀에서 뭘할지 모르고 이런걸 시킬 수도 있으니까 ComfyUI 공부도 해보자. 뭐라도 써먹겠지 뭐.(안되면 유튜버라도 하겠지.)

ComfyUI 공부 일대기가 궁금하면 여기를 가시라. (Link)


3. 전체 아키텍처

일단 우리 GPU 서버 스펙부터 확인해보자. 정보는 아래와 같다.

항목값  
OS RHEL/CentOS 9 기반
GPU NVIDIA H200 NVL × 2
GPU 메모리 143.7GB × 2 = 287.4GB
RAM 503GB
스토리지 11TB (루트) + 11TB (데이터)

ComfyUI는 앞으로 사내에서 많은 사람들이 사용하기 위해 시스템운영팀에게 포트를 열어서 내부 접속망에 접근이 가능하게 했다.


4. 구축 과정

GPU 서버 전체 구성도

아래에는 리눅스 기반으로 개발되어 다양한 프로젝트를 설치하고 docker-compose.yml 파일로 관리한다.

더보기

전체 구성도

 

```python
AI231 서버
│
├── 루트 시스템 (/root)                           Linux 운영체제 파일
├── 데이터 및 모델 (/data)
│   └── hf_cache                               Hugging Face LLM 모델 캐시
│       ├── hub/                               다운로드된 모델들
│       ├── version.txt
│       └── xet/
│
└──  사용자 홈 (/home)
    │
    ├── aiadmin
    │   │
    │   └── aiserver/
    │       │
    │       ├── ComfyUI/ (249GB)             이미지 생성 AI
    │       │   ├── config/                  
    │       │   ├── custom_nodes/            
    │       │   │   ├── ComfyUI-Easy-Use
    │       │   │   ├── ComfyUI-Impact-Pack
    │       │   │   ├── ComfyUI-Manager
    │       │   │   ├── ComfyUI-MultiGPU
    │       │   │   ├── qwen_image_layered (Qwen 커스텀)
    │       │   │   └── ... (20+ 더)
    │       │   ├── models/
    │       │   ├── input/                 입력 데이터
    │       │   └── output/                생성된 이미지
    │       ├── docker-compose.yml         Docker 구성 파일 (Docker 컨테이너들을 정의하고 관리하는 설정 파일)
    │       │
    │       ├── Dockerfile.comfyui         ComfyUI Docker 빌드
    │       │
    │       ├── enews_cover_maker/         뉴스 커버 생성기 AI
    │       │   ├── app/
    │       │   ├── Dockerfile
    │       │   └── requirements.txt
    │       │
    │       ├── open-webui/               LLM UI 데이터
    │       │   ├── uploads/                사용자 업로드
    │       │   ├── vector_db/              벡터 임베딩 DB
    │       │   └── webui.db                WebUI 데이터베이스
    │       │
    │       ├── open-webui-tools/         OpenWebUI 커스텀 도구
    │       │
    │       └── README.md                  프로젝트 설명서
    │
    │
    └──────────────────────────────────────────────
```

Docker Compose 구성

모든 서비스를 docker-compose.yml 한 파일로 관리했다. 서버 재부팅이나 재배포 시에도 docker compose up -d 한 줄로 동일한 환경을 재현할 수 있도록 했다.

더보기

주요 서비스 Compose

services:
  # ----------------------------------------------------
  # vLLM for Qwen/Qwen3-4B-Instruct (GPU 1)
  # ----------------------------------------------------
  vllm-qwen3i:
    image: vllm/vllm-openai:latest
    restart: unless-stopped
    volumes:
      - /data/hf_cache:/root/.cache/huggingface
    ports:
      - "${VLLM_QWEN3I_PORT}:80"
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              capabilities: [gpu]
              device_ids: ['${VLLM_QWEN3I_GPU_ID}']
    shm_size: "32gb"
    ipc: host
    environment:
      - HF_TOKEN=${HF_TOKEN}
      - HF_HOME=/root/.cache/huggingface
      - TRUST_REMOTE_CODE=true
    command: [
      "--model", "${VLLM_QWEN3I_MODEL_ID}",
      "--port", "80",
      "--gpu-memory-utilization", "0.45"
    ]

  # ----------------------------------------------------
  # ComfyUI
  # ----------------------------------------------------
  comfyui:
    build:
      context: .
      dockerfile: Dockerfile.comfyui
    container_name: comfyui
    restart: unless-stopped
    ports:
      - "8188:3000"
    environment:
      - OMP_NUM_THREADS=8
      - MKL_NUM_THREADS=8
      - CUDA_LAUNCH_BLOCKING=0
    volumes:
      - ./ComfyUI/input:/workspace/ComfyUI/input
      - ./ComfyUI/models:/workspace/ComfyUI/models
      - ./ComfyUI/output:/workspace/ComfyUI/output
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 2
              capabilities: [gpu]

.env 기반 설정 관리

포트, 모델 ID, GPU 바인딩을 코드에 하드코딩하지 않고 .env 파일로 일괄 관리했다

COMFYUI_PORT=8188
ENEWS_PORT=8000

이 구조 덕분에 모델 교체나 포트 변경이 필요할 때 .env 수정만으로 대응 가능했다.

ComfyUI Dockerfile 커스터마이징

공식 이미지를 그대로 쓰지 않고 직접 커스터마이징했다. 이유는 세 가지였다.

1. 권한 문제 해결 호스트와 컨테이너의 UID/GID가 달라서 볼륨 마운트 시 파일 권한 충돌이 발생했다. 컨테이너 내부에 호스트와 동일한 aiadmin 사용자를 생성해서 해결했다.

2. Python 환경 분리 ComfyUI와 custom_node들의 의존성이 충돌하는 문제가 있었다. 전용 가상환경(/workspace/venv)을 별도로 구성해서 충돌을 방지했다.

3. 런타임 보안 초기화는 root 권한으로, 실제 ComfyUI 실행은 aiadmin 사용자 권한으로 분리했다.

운영 중 겪은 문제들

모델 캐시 문제 컨테이너를 재시작할 때마다 모델을 다시 다운로드하는 문제가 있었다. 모델 파일을 호스트 /data/hf_cache에 저장하고 컨테이너간 공유하는 방식으로 해결했다.

GPU 메모리 관리 여러 모델이 동시에 GPU를 사용하면서 메모리 충돌이 발생했다. ComfyUI의 GPU 메모리 사용량을 모니터링하면서 워크플로우별 최적 설정값을 찾아나갔다.


5. 검증한 AI 모델 및 결과

영상 OutPainting (Wan2.1) (Link)

수정 전 9:6 비율 영상
수정 후 16:9 비율 영상



  • 아래 사례는 ComfyUI를 사용하여 9:6 비율의 영상을 16:9비율로 변경해보았다. (신기하긴 하다)
더보기

자료

 

Positive Prompt

Indoor office meeting scene, 1980s Korean drama aesthetic, warm and cool color graded, 
professional business meeting room with wooden table, fluorescent ceiling lights, 
large windows in background with grid pattern, shelves with books and office supplies, 
serious and tense conversation atmosphere, multiple businessmen in formal attire and blazers, 
vintage film grain, natural lighting from windows, realistic documentary-style cinematography, 
authentic period office setting, calm and composed dialogue scene, muted colors with green and blue tones, 
retro television broadcast quality

Nagative Prompt

bright colors, modern contemporary office, glossy finish, cartoon style, animation, 
3D rendered, overexposed lighting, vibrant saturated colors, artificial neon lights, 
moving camera, dynamic action, zoom, pan, crowded scene, outdoor setting, 
blurred or out of focus, low resolution, watermark, text overlay, 
fast paced movement, modern furniture, minimalist design, clean white walls, 
HD glossy quality, stylized comic effect, fantasy elements
워크 플로우 화면



video_wan_vace_outpainting_1.3B.json
0.04MB

 

EgoX 검증 (결과: 부적합 판정) (Link)

  • EgoX란? : 영상 하나만으로 1인칭(당사자 시점) 영상을 생성하는 기술
  • 목표: 병원 장면 영상을 3인칭 시점에서 1인칭 시점으로 변환
  • 결과: Depth map 생성 오류, GGA activation 문제로 안정적 출력 불가
  • 결론: 현재 기술 수준으로 프로덕션 적용 불가 — 기술이사님께 보고서 작성 및 제출

원본 영상
변경 후

 

자막 생성 AI

 

[나도 AI 개발자] 자막 추출 AI 개발해보기 (1)

또 우리 팀에 이사님이 아래의 사진과 같이 하나의 캡쳐사진을 웍스 단체 DM에 보내며 자막 추출 AI를 만들라 해본다...뭐 당연히 우리 팀에서는 나한테 시키면서 이번에도 해보라고 한다.솔직히

androidpangyo.tistory.com

 

 


6. 배운 점 / 인사이트

나는 안드로이드 개발자로서 시작하여 프론트 전반을 개발해보았지만 처음으로 인프라를 다루어 봤던 경험이 였다.

아직도 하나도 모르지만 클로드와 주변 도움을 통해 설계한건 나름의 뿌듯함을 주었다.