DECS 이미지는 GPU/driver 호환성을 관리하기 위해 CUDA variant별로 빌드한다. 공통 Dockerfile은 하나만 유지하고, 실제 CUDA/TensorFlow 조합은 image-variants.json에서 관리한다.
| Variant tag | CUDA | TensorFlow | Base image | 최소 NVIDIA driver | 상태 |
|---|---|---|---|---|---|
cuda11.8-tf2.13-ubuntu22.04-260705 |
11.8 | 2.13.0 | nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04 |
520.61.05 | stable |
cuda12.2-tf2.15-ubuntu22.04-260705 |
12.2 | 2.15.0 | nvidia/cuda:12.2.2-cudnn8-devel-ubuntu22.04 |
535.104.05 | stable |
cuda12.3-tf2.16-ubuntu22.04-260705 |
12.3 | 2.16.1 | nvidia/cuda:12.3.2-devel-ubuntu22.04 + tensorflow[and-cuda] |
545.23.08 | stable |
cuda12.5-tf2.20-ubuntu22.04-260705 |
12.5 | 2.20.0 | nvidia/cuda:12.5.1-cudnn-devel-ubuntu22.04 |
555.42.06 | stable |
cuda12.8-tf2.20-ubuntu22.04-260705 |
12.8 | 2.20.0 | nvidia/cuda:12.8.1-cudnn-devel-ubuntu22.04 |
570.124.06 | experimental |
Alias tags:
| Alias | Target |
|---|---|
latest, stable, cuda12.5-tf2.20 |
CUDA 12.5 / TensorFlow 2.20 |
legacy, cuda11.8-tf2.13 |
CUDA 11.8 / TensorFlow 2.13 |
cuda12.2-tf2.15 |
CUDA 12.2 / TensorFlow 2.15 |
cuda12.3-tf2.16 |
CUDA 12.3 / TensorFlow 2.16 |
cuda12.8-tf2.20, h200-experimental |
CUDA 12.8 / TensorFlow 2.20 |
TensorFlow 공식 빌드 구성 기준으로 TensorFlow 2.16.1은 CUDA 12.3/cuDNN 8.9 조합이고, TensorFlow 2.20.0은 CUDA 12.5/cuDNN 9.3 조합이다. CUDA 12.8 이미지는 H200/LAB10 검증 전까지 experimental로 둔다.
모든 variant는 다음을 포함한다.
- CUDA/cuDNN base image
- TensorFlow
- system packages: SSH, sudo, auditd, Kerberos client, Korean fonts/input, Chrome, Xfce, TigerVNC, noVNC
- Miniforge under
/opt/conda - micromamba
- JupyterLab / Notebook / ipywidgets
decs-chromewrapper for GUI Chrome sessions with profile/cache under/var/tmp/decs-chrome-*
entrypoint.sh는 시작 시 이미지 variant, CUDA/TensorFlow 버전, 요구 driver 버전, 실제 nvidia-smi 정보를 출력한다. STRICT_CUDA_COMPAT=true를 주면 host driver가 variant의 최소 driver보다 낮을 때 시작을 실패시킨다.
전체 variant dry-run:
python3 scripts/build_variants.py --dry-run특정 variant build:
python3 scripts/build_variants.py --variant cuda12.5-tf2.20-ubuntu22.04push까지 수행:
python3 scripts/build_variants.py --variant cuda12.5-tf2.20-ubuntu22.04 --pushGitHub Actions는 main 대상 PR이 merge되거나 workflow_dispatch로 실행될 때 image-variants.json을 읽어 matrix build/push를 수행한다.
UID Python CLI에서는 이미지 이름과 버전을 분리해서 전달한다.
cd ~/uid/script
uidctl create-container \
--image decs \
--version cuda12.5-tf2.20-ubuntu22.04-260705noVNC는 기존처럼 opt-in이다.
--enable-vnc true관련 환경변수:
| 환경변수 | 기본값 | 설명 |
|---|---|---|
USER_ID |
필수 | 컨테이너 안에 생성/검증할 사용자 이름 |
UID |
필수 | 컨테이너 사용자 UID. create-container가 DB/AD 기준으로 결정한 값을 전달한다. |
GID |
$UID |
컨테이너 사용자 primary GID. create-container가 DB/AD 기준으로 결정한 값을 전달한다. |
USER_GROUP |
$USER_ID |
컨테이너 primary group 이름 |
ENABLE_VNC |
false |
true이면 TigerVNC/noVNC를 시작한다. |
VNC_PASSWORD |
랜덤 8자리 | 지정하지 않으면 /home/$USER_ID/vnc_password.txt에 저장한다. |
VNC_RESOLUTION |
1920x1080 |
VNC 화면 해상도 |
VNC_DEPTH |
24 |
VNC 색상 깊이 |
VNC_DISPLAY |
1 |
VNC display 번호. 기본 VNC 포트는 5901 |
NOVNC_PORT |
6080 |
noVNC listen 포트 |
STRICT_CUDA_COMPAT |
false |
최소 NVIDIA driver 미만이면 startup 실패 |
KRB5CCNAME |
unset | Kerberos ccache path. 설정하면 사용자 shell/Jupyter/noVNC 환경에도 전달한다. |
DECS_KRB5CCNAME |
unset | KRB5CCNAME fallback. |
KRB5_REALM |
FARM.DECS.INTERNAL |
DECS_KRB5_PRINCIPAL 기본값을 만들 때 쓰는 realm. |
DECS_KRB5_PRINCIPAL |
$USER_ID@$KRB5_REALM |
이 컨테이너가 기대하는 Kerberos principal. |
DECS_KERBEROS_HOST_KEYTAB |
false |
true이면 사용자가 kinit하는 대신 host-side keytab refresh가 ccache를 만든다고 보고 대기한다. |
DECS_USER_SUDO_MODE |
restricted |
disabled, restricted, allowed 중 하나. 기본 restricted는 package install용 sudo는 허용하되 UID 전환, 권한 변경, mount, root shell, interpreter one-liner, root editor/pager, 보호 경로 overwrite를 차단한다. |
이미지는 TARGET_UID/TARGET_GID를 받지 않는다. 최종 identity는 UID/GID 하나만 사용하며, DB UID/GID와 AD uidNumber/gidNumber, FARM NFS returned UID/GID가 같은지는 create-container 쪽에서 보장한다.
Kerberized NFS 모드에서는 uidctl create-container --enable-kerberos가 host ccache directory를 컨테이너에 bind mount하고 KRB5CCNAME을 설정한다. host는 root-only keytab으로 kinit -kt를 수행해 ticket을 만들고, 컨테이너에는 keytab 없이 ccache만 공유한다. ticket 상태는 컨테이너 안에서 decs-kerberos-status로 확인할 수 있다. 기본 sudo mode는 restricted이며, 사용자가 container root로 다른 UID를 가장해 host의 다른 ccache를 쓰는 경로를 막는다.
Kerberos group sharing은 사용자가 직접 자기 홈 안의 디렉토리를 여는 방식이다. 관리자가 create script에서 AD group과 membership만 준비하면, 사용자는 컨테이너 안에서 다음처럼 공유 디렉토리를 만들 수 있다.
group-dir-share ~/sharing_dir groupA이 helper는 사용자 권한으로만 mkdir, chgrp, chmod 2770을 수행하고, setfacl이 있으면 shared group에 parent traverse ACL과 share/default ACL을 부여한다. sudo chgrp/chmod/chown은 restricted sudo에서 차단되지만, 일반 사용자 권한의 chgrp/chmod는 self-service 공유를 위해 허용된다.
GUI Chrome은 Kerberos NFS 홈 아래에 profile DB/cache를 만들지 않도록 래퍼로 실행한다.
decs-chromenoVNC 바탕화면에는 Chrome.desktop 바로가기가 생성된다. Chrome profile/cache/runtime은 컨테이너 로컬 /var/tmp/decs-chrome-* 아래에 저장되므로, 컨테이너를 새로 만들면 브라우저 설정과 프로필은 초기화될 수 있다.
이 저장소 내부의 테스트 파일만 사용한다. 외부 ~/uid와 ansible inventory는 호출 대상이다.
로컬 이미지 smoke test:
python3 scripts/test_image_variants.py --variant cuda12.5-tf2.20-ubuntu22.04
python3 scripts/test_image_variants.py --variant cuda12.5-tf2.20-ubuntu22.04 --gpu~/uid/legacy/script_test/create_container.sh dry-run 연동 테스트:
python3 scripts/test_uid_create_container.py --variant cuda12.5-tf2.20-ubuntu22.04LAB10 같은 실제 GPU host에서 ansible smoke test:
tar -czf /tmp/decs-build-context-260705.tgz Dockerfile entrypoint.sh decs-chrome .dockerignore
ansible-playbook \
-i /home/jy/ansible/inventory.ini \
tests/ansible/decs_image_build.yml \
-e target_hosts=lab10 \
-e image_tag=cuda12.8-tf2.20-ubuntu22.04-260705 \
-e base_image=nvidia/cuda:12.8.1-cudnn-devel-ubuntu22.04 \
-e decs_image_variant=cuda12.8-tf2.20-ubuntu22.04 \
-e cuda_version=12.8 \
-e tensorflow_version=2.20.0 \
-e tensorflow_package=tensorflow==2.20.0 \
-e min_nvidia_driver=570.124.06
ansible-playbook \
-i /home/jy/ansible/inventory.ini \
tests/ansible/decs_image_smoke.yml \
-e target_hosts=lab10 \
-e image_tag=cuda12.8-tf2.20-ubuntu22.04-260705VNC까지 확인:
ansible-playbook \
-i /home/jy/ansible/inventory.ini \
tests/ansible/decs_image_smoke.yml \
-e target_hosts=lab10 \
-e image_tag=cuda12.5-tf2.20-ubuntu22.04-260705 \
-e enable_vnc=true관리자용 노션 문서: https://www.notion.so/DECS-280c7692a263802ca40ff68b38f58dd1?source=copy_link