콘텐츠로 이동

dongbeen 서버 적합도 검증 (2026-09-13)

대상: 공용 4×RTX 4090 서버 (Ubuntu 20.04.6, 커널 5.15, 드라이버 550.144, cgroup v1 hybrid). 다른 사용자의 GPU 잡 상주. 제약: 재부팅·드라이버·OS 변경 금지, 기존 서비스(nginx/MySQL/PostgreSQL 12/Redis) 불변.

결과

항목 결과
Docker CE + nvidia-container-toolkit 1.20.0 설치, GPU 패스스루 정상 (재부팅 불필요)
k3s v1.35.8+k3s1 (data-dir /mnt/sda1/rlflow/k3s, traefik/servicelb off) Ready. RSS 0.5GB
containerd nvidia 런타임 자동 탐지, RuntimeClass nvidia 정상
nvidia-device-plugin v0.19.3 (GPU 2·3 만 노출) allocatable nvidia.com/gpu=2, 스모크 파드가 GPU 2 에서 실행
PostgreSQL 16.15 (자체 차트) + 일일 pg_dump CronJob 정상, 첫 백업 완료
SeaweedFS 4.46 master/volume/filer(postgres2)/s3 + 버킷 6개 정상, filer 메타데이터 PostgreSQL 테이블 확인
MLflow 3.16.0 (backend PG, artifacts S3, serve-artifacts) /health 200
Argo Workflows v4.1.3 + S3 아티팩트 저장소 hello 워크플로 Succeeded, 아티팩트 S3 키 확인
kube-prometheus-stack 90.1.1 + pushgateway 3.8.0 전 파드 Running

발견 사항 (명령서와의 차이)

  1. cgroup v1: Kubernetes 1.35 kubelet 은 cgroup v1 호스트에서 기본 기동 거부. failCgroupV1: false kubelet 드롭인으로 우회 (infra/k3s/nodes/dongbeen.kubelet.conf). 향후 k8s 릴리스에서 v1 지원 제거 예정 → 24.04(cgroup v2) 재설치가 전제.
  2. GPU Operator 는 Ubuntu 20.04 미지원 (24.9 부터 제외). 이 호스트는 GPU_MODE=device-plugin 으로 호스트 toolkit + 정적 device plugin 매니페스트를 사용. Operator 경로는 24.04 노드에서 별도 검증 필요.
  3. 드라이버 550 = CUDA 12.4 상한. 명령서의 lab/base:cu128 이미지는 이 호스트에서 실행 불가(cuda>=12.8 요구 오류). 580 상향 전까지 베이스 이미지는 cu124 변형을 병행한다.
  4. MLflow 3.x Host 헤더 검증: 접근 호스트명을 MLFLOW_SERVER_ALLOWED_HOSTS 에 나열해야 함 (차트 allowedHosts).
  5. SeaweedFS 는 4.x 가 현재 안정선 (명령서 17.2 의 "3.x" 는 갱신 필요). Helm 저장소 게시 차트는 4.46.0.
  6. kubectl run --limits 는 최신 kubectl 에서 제거됨 → 검증 파드는 매니페스트로 생성.
  7. 노드 INTERNAL-IP 가 공개 IP(203.241.249.48) 로 잡힘. 2노드 운영에서는 --node-ip 로 10GbE 직결 주소 지정 필요.

접근 (tailnet 전용, ufw 로 tailscale0 에만 허용)

서비스 URL
MLflow http://100.104.103.77:30500
Grafana http://100.104.103.77:30300 (admin / kubectl -n monitoring get secret kube-prometheus-stack-grafana)
Argo http://100.104.103.77:32746

되돌리기

sudo k3s-uninstall.sh (클러스터·데이터 전부), sudo apt remove docker-ce nvidia-container-toolkit, sudo ufw delete (6443, 10.42/16, 10.43/16, 30300/30500/32746 규칙), /mnt/sda1/rlflow 삭제.

M1 세로 한 줄 (같은 날, 이어서)

단계 결과
lab/base:cu124-torch2.6-py311-20260913 (6.6GB) + lab/bare-gym:<sha> (17GB) 빌드, containerd import 정상 (import 5분)
Argo train: clone → resolve(계보 4값, 파드 imageID 자기 조회) → train(GPU 1, runtimeClass nvidia) → finalize(candidate v1) Succeeded
GPU 격리: 파드에 할당 GPU 1장만 보임 (GPU 3), gpus=0 파드는 GPU·nvidia-smi 없음 확인
Argo evaluate-promote on v1 (150k 스텝, 덜 학습) regression-check 실패: success_rate 0 < 0.6, ep_return 193 < 300 → 런 태그 gate_reasons
train overrides total_steps=600000 seed=1 → v2 Succeeded
evaluate-promote on v2 evaluate(성공률 1.0) → gate 통과 → export(ONNX 19KB, ORT 0.013ms < 20ms) → alias validated→v2

추가 발견: 8. MLflow 3.16 아티팩트 다운로드는 presigned S3 URL 을 쓴다. 서버의 MLFLOW_S3_ENDPOINT_URL 이 짧은 서비스명이면 다른 네임스페이스 클라이언트가 해석 못 해 무한 재시도. 서버는 FQDN, 파이프라인 파드는 MLFLOW_ENABLE_PROXY_MULTIPART_DOWNLOAD=false(서버 경유 스트리밍) 로 고정. 9. Argo podSpecPatch 는 Go 템플릿 조건문을 지원하지 않는다. GPU 수는 DAG 에서 {{= dry_run == 'true' ? '0' : gpus }} 식으로 계산해 입력 파라미터로 넘긴다. 10. 베이스 이미지에 NVIDIA_VISIBLE_DEVICES=all 을 두면 GPU 미할당 파드가 호스트 GPU 전부를 본다 → 제거. device plugin v0.19 는 env 대신 CDI 로 주입(NVIDIA_VISIBLE_DEVICES=void). 11. SeaweedFS 차트의 read 계정은 List 권한이 없어 dvc pull 실패 → 파이프라인은 admin 키 사용. 최소 권한 계정은 자체 s3 config secret 으로 후속. 12. git 토큰 파일 끝 개행이 git config 키를 깨뜨림. 토큰은 개행 없이 저장하고 스크립트에서도 제거. (첫 실패 워크플로 로그에 토큰이 찍혀 해당 로그 아티팩트를 S3 에서 삭제했다. 토큰 교체 권장.) 13. 프로젝트 이미지 17GB: 베이스의 uv 캐시(6GB)와 프로젝트 venv 복사본이 중복. 레지스트리 도입 시 캐시 없는 베이스 + 레이어 캐시로 전환 예정.