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 |
발견 사항 (명령서와의 차이)¶
- cgroup v1: Kubernetes 1.35 kubelet 은 cgroup v1 호스트에서 기본 기동 거부.
failCgroupV1: falsekubelet 드롭인으로 우회 (infra/k3s/nodes/dongbeen.kubelet.conf). 향후 k8s 릴리스에서 v1 지원 제거 예정 → 24.04(cgroup v2) 재설치가 전제. - GPU Operator 는 Ubuntu 20.04 미지원 (24.9 부터 제외). 이 호스트는
GPU_MODE=device-plugin으로 호스트 toolkit + 정적 device plugin 매니페스트를 사용. Operator 경로는 24.04 노드에서 별도 검증 필요. - 드라이버 550 = CUDA 12.4 상한. 명령서의
lab/base:cu128이미지는 이 호스트에서 실행 불가(cuda>=12.8요구 오류). 580 상향 전까지 베이스 이미지는 cu124 변형을 병행한다. - MLflow 3.x Host 헤더 검증: 접근 호스트명을
MLFLOW_SERVER_ALLOWED_HOSTS에 나열해야 함 (차트allowedHosts). - SeaweedFS 는 4.x 가 현재 안정선 (명령서 17.2 의 "3.x" 는 갱신 필요). Helm 저장소 게시 차트는 4.46.0.
kubectl run --limits는 최신 kubectl 에서 제거됨 → 검증 파드는 매니페스트로 생성.- 노드 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 복사본이 중복. 레지스트리 도입 시 캐시 없는 베이스 + 레이어 캐시로 전환 예정.