diff --git a/README.md b/README.md index 2145621..fe95213 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,169 @@ -# gpu-srv-ml-settings-script -GPU서버 Ubuntu Server OS 기준 세팅 스크립트 +# GPU 학습용 Ubuntu 22.04 Docker 서버 세팅 + + +## 📋 개요 + +Ubuntu 22.04 서버에서 GPU 딥러닝 학습을 위한 Docker 환경을 자동으로 구성하는 스크립트입니다. NVIDIA GPU 드라이버, Docker, NVIDIA Container Toolkit을 포함한 완전한 GPU 학습 환경을 원클릭으로 설치합니다. + +## ✨ 주요 기능 + +### 🚀 자동 설치 +- **NVIDIA GPU 드라이버** 자동 설치 (최신 stable 버전) +- **Docker** 설치 (공식 get.docker.com 스크립트 사용) +- **NVIDIA Container Toolkit** 설치 및 설정 +- **Docker Compose** 포함 + +### 🔧 환경 구성 +- GPU 지원 Docker 런타임 자동 설정 +- 사용자 권한 설정 (docker 그룹 추가) +- 검증 스크립트 자동 생성 +- GPU 학습용 Docker Compose 예제 제공 + + +## 🛠️ 시스템 요구사항 + +- **OS**: Ubuntu 22.04 LTS +- **GPU**: NVIDIA GPU (CUDA 지원) +- **권한**: sudo 권한 필요 +- **네트워크**: 인터넷 연결 필요 + +## 📥 설치 방법 + +### 1. 스크립트 다운로드 +```bash +git clone https://git.promedius.dev/techsupport/gpu-srv-setting-script.git +chmod +x Ubuntu22.04_gpu_docker_setup.sh +``` + +### 2. 설치 실행 +```bash +sudo bash Ubuntu22.04_gpu_docker_setup.sh +``` + +### 3. 시스템 재부팅 +```bash +sudo reboot +``` + +### 4. 설치 검증 +```bash +# 재부팅 후 실행 +./verify_gpu_setup.sh +``` + +## 🧪 검증 결과 예시 + +설치가 완료되면 다음과 같은 검증 결과를 확인할 수 있습니다: + +```bash +=== GPU 및 Docker 설정 검증 === + +1. NVIDIA 드라이버 확인: ++-----------------------------------------------------------------------------+ +| NVIDIA-SMI 535.xx.xx Driver Version: 535.xx.xx CUDA Version: 12.2 | ++-------------------------------+----------------------+----------------------+ + +2. Docker 버전 확인: +Docker version 24.x.x + +3. Docker Compose 확인: +Docker Compose version v2.x.x + +4. NVIDIA Container Toolkit 테스트: +[GPU 정보 출력] + +5. 간단한 GPU 테스트 (PyTorch): +PyTorch version: 2.x.x +CUDA available: True +CUDA version: 12.2 +GPU device count: 1 +GPU device name: NVIDIA GeForce RTX xxxx +GPU 연산 테스트 성공! +``` + +## 🐳 Docker Compose 예제 + +설치 후 제공되는 `docker-compose-gpu-example.yml`을 사용하여 즉시 GPU 학습 환경을 시작할 수 있습니다: + +### Jupyter Lab with GPU +```bash +docker compose -f docker-compose-gpu-example.yml up -d jupyter-gpu +``` +- **접속**: http://localhost:8888 +- **포함 라이브러리**: TensorFlow, PyTorch, CUDA +- **토큰 확인**: `docker logs ` + +### PyTorch GPU 테스트 +```bash +docker compose -f docker-compose-gpu-example.yml run pytorch-gpu +``` + +# GPU 테스트 +docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi +``` + +## 📊 모니터링 + +### GPU 사용량 모니터링 +```bash +# 실시간 GPU 모니터링 +watch -n 1 nvidia-smi + +# Docker 컨테이너 GPU 사용량 +docker stats +``` + +### Docker 로그 확인 +```bash +# 특정 컨테이너 로그 +docker logs + +# Docker 데몬 로그 +journalctl -u docker.service -f +``` + +## 🔧 고급 설정 + +### 사용자 정의 Docker 이미지 빌드 +```dockerfile +FROM nvidia/cuda:11.8.0-devel-ubuntu22.04 + +# 필요한 패키지 설치 +RUN apt-get update && apt-get install -y \ + python3 \ + python3-pip \ + git + +# Python 패키지 설치 +RUN pip3 install torch torchvision torchaudio + +WORKDIR /workspace +``` + +### 멀티 GPU 사용 +```yaml +services: + multi-gpu-training: + image: pytorch/pytorch:latest + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] +``` + +## 📈 버전 히스토리 + +- **v1.0.0**: 초기 릴리스 + - Ubuntu 22.04 지원 + - NVIDIA 드라이버 자동 설치 + - Docker 및 NVIDIA Container Toolkit 설정 + - GPU 학습 환경 예제 + +--- + + +**⭐ 유용하다면 Star를 눌러주세요! ⭐** + diff --git a/Ubuntu22.04_gpu_docker_setup.sh b/Ubuntu22.04_gpu_docker_setup.sh new file mode 100644 index 0000000..1eed91a --- /dev/null +++ b/Ubuntu22.04_gpu_docker_setup.sh @@ -0,0 +1,422 @@ +#!/bin/bash + +# GPU 학습용 Ubuntu 22.04 Docker 서버 세팅 스크립트 +# 실행 방법: sudo bash setup_gpu_docker.sh + +set -e + +# 색상 설정 +PURPLE='\033[0;35m' +NC='\033[0m' # No Color + + +echo "=== GPU 학습용 Ubuntu 22.04 Docker 서버 세팅 시작 ===" + +# 시스템 업데이트 +echo "시스템 업데이트 중..." +apt update && apt upgrade -y + +# 기본 패키지 설치 +echo "기본 패키지 설치 중..." +apt install -y \ + curl \ + wget \ + vim \ + git \ + htop \ + tree \ + unzip \ + software-properties-common \ + apt-transport-https \ + ca-certificates \ + gnupg \ + lsb-release + +# NVIDIA 드라이버 설치 +echo "NVIDIA 드라이버 설치 중..." +# 기존 NVIDIA 드라이버 제거 +apt remove --purge -y nvidia* + +# NVIDIA 드라이버 저장소 추가 +add-apt-repository ppa:graphics-drivers/ppa -y +apt update + +# 권장 드라이버 설치 (자동으로 최신 stable 버전 설치) +ubuntu-drivers autoinstall + +# Docker 설치 +echo "Docker 설치 중..." +# 기존 Docker 제거 +apt remove -y docker docker-engine docker.io containerd runc + +# Docker 공식 설치 스크립트 사용 +wget -O get-docker.sh https://get.docker.com +sh ./get-docker.sh + +# Docker 서비스 시작 및 부팅시 자동 시작 설정 +systemctl start docker +systemctl enable docker + +# 현재 사용자를 docker 그룹에 추가 +if [ "$SUDO_USER" ]; then + usermod -aG docker $SUDO_USER + echo "사용자 $SUDO_USER를 docker 그룹에 추가했습니다." +else + echo "경고: SUDO_USER가 설정되지 않음. 수동으로 사용자를 docker 그룹에 추가하세요: sudo usermod -aG docker \$USER" +fi + +# NVIDIA Container Toolkit 설치 +echo "NVIDIA Container Toolkit 설치 중..." +# NVIDIA Container Toolkit 저장소 설정 +distribution=$(. /etc/os-release;echo $ID$VERSION_ID) +curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg +curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ + sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ + tee /etc/apt/sources.list.d/nvidia-container-toolkit.list + +# NVIDIA Container Toolkit 설치 +apt update +apt install -y nvidia-container-toolkit + +# Docker에 NVIDIA 런타임 설정 +echo "Docker에 NVIDIA 런타임 설정 중..." +nvidia-ctk runtime configure --runtime=docker + +# Docker 데몬 재시작 +systemctl restart docker + +# 시스템 재부팅 후 실행할 검증 스크립트 생성 +cat > /home/$SUDO_USER/verify_gpu_setup.sh << 'EOF' +#!/bin/bash + +echo "=== GPU 및 Docker 설정 검증 ===" + +echo "1. NVIDIA 드라이버 확인:" +nvidia-smi + +echo -e "\n2. Docker 버전 확인:" +docker --version + +echo -e "\n3. Docker Compose 확인:" +docker compose version + +echo -e "\n4. NVIDIA Container Toolkit 테스트:" +docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi + +echo -e "\n5. 간단한 GPU 테스트 (PyTorch):" +docker run --rm --gpus all pytorch/pytorch:latest python -c " +import torch +print(f'PyTorch version: {torch.__version__}') +print(f'CUDA available: {torch.cuda.is_available()}') +if torch.cuda.is_available(): + print(f'CUDA version: {torch.version.cuda}') + print(f'GPU device count: {torch.cuda.device_count()}') + print(f'GPU device name: {torch.cuda.get_device_name(0)}') + # 간단한 GPU 연산 테스트 + x = torch.rand(1000, 1000).cuda() + y = torch.rand(1000, 1000).cuda() + z = torch.mm(x, y) + print('GPU 연산 테스트 성공!') +else: + print('GPU를 사용할 수 없습니다.') +" + +echo -e "\n=== 검증 완료 ===" +EOF + +chmod +x /home/$SUDO_USER/verify_gpu_setup.sh +chown $SUDO_USER:$SUDO_USER /home/$SUDO_USER/verify_gpu_setup.sh + +# 유용한 Docker Compose 예제 생성 +cat > /home/$SUDO_USER/docker-compose-gpu-example.yml << 'EOF' +version: '3.8' + +services: + jupyter-gpu: + image: tensorflow/tensorflow:latest-gpu-jupyter + ports: + - "8888:8888" + volumes: + - ./notebooks:/tf/notebooks + - ./data:/tf/data + environment: + - JUPYTER_ENABLE_LAB=yes + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + command: > + bash -c " + pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 && + jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --notebook-dir=/tf + " + + pytorch-gpu: + image: pytorch/pytorch:latest + volumes: + - ./workspace:/workspace + working_dir: /workspace + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + command: python -c "import torch; print('PyTorch GPU available:', torch.cuda.is_available())" +EOF + +chown $SUDO_USER:$SUDO_USER /home/$SUDO_USER/docker-compose-gpu-example.yml + +# 디렉토리 생성 +mkdir -p /home/$SUDO_USER/notebooks +mkdir -p /home/$SUDO_USER/data +mkdir -p /home/$SUDO_USER/workspace +chown -R $SUDO_USER:$SUDO_USER /home/$SUDO_USER/notebooks +chown -R $SUDO_USER:$SUDO_USER /home/$SUDO_USER/data +chown -R $SUDO_USER:$SUDO_USER /home/$SUDO_USER/workspace + +echo "=== 설치 완료 ===" +echo "" +echo "다음 단계를 진행하세요:" +echo "1. 시스템을 재부팅하세요: sudo reboot" +echo "2. 재부팅 후 검증 스크립트를 실행하세요: ./verify_gpu_setup.sh" +echo "3. Docker Compose 예제를 사용하여 GPU 학습 환경을 시작하세요:" +echo " cd ~ && docker compose -f docker-compose-gpu-example.yml up -d jupyter-gpu" +echo "" +echo "백업 및 복구 기능:" +echo "4. 현재 환경 전체 백업: ./backup_gpu_environment.sh" +echo "5. 빠른 백업 (설정만): ./quick_backup.sh" +echo "6. 다른 서버에 복구: sudo bash restore_gpu_environment.sh" +echo "" +echo "주의사항:" +echo "- 재부팅 후 새로운 터미널에서 docker 명령어를 사용하세요" +echo "- GPU 메모리 사용량을 모니터링하려면 'watch -n 1 nvidia-smi' 명령어를 사용하세요" +echo "- Jupyter Lab 접속: http://localhost:8888 (토큰은 docker logs로 확인)" +echo "- 백업은 정기적으로 실행하여 환경을 보존하세요" + +# 백업 및 복구 스크립트 생성 +cat > /home/$SUDO_USER/backup_gpu_environment.sh << 'EOF' +#!/bin/bash + +# GPU 서버 환경 백업 스크립트 +# 실행 방법: ./backup_gpu_environment.sh + +set -e + +BACKUP_DIR="gpu_server_backup_$(date +%Y%m%d_%H%M%S)" +BACKUP_PATH="$HOME/$BACKUP_DIR" + +echo "=== GPU 서버 환경 백업 시작 ===" +echo "백업 경로: $BACKUP_PATH" + +mkdir -p "$BACKUP_PATH" + +# 시스템 정보 백업 +echo "1. 시스템 정보 백업 중..." +lsb_release -a > "$BACKUP_PATH/system_info.txt" +uname -a >> "$BACKUP_PATH/system_info.txt" +nvidia-smi > "$BACKUP_PATH/nvidia_info.txt" +docker --version > "$BACKUP_PATH/docker_info.txt" + +# 설치된 패키지 목록 백업 +echo "2. 설치된 패키지 목록 백업 중..." +dpkg -l > "$BACKUP_PATH/installed_packages.txt" +apt list --installed > "$BACKUP_PATH/apt_packages.txt" + +# Docker 이미지 및 컨테이너 백업 +echo "3. Docker 이미지 목록 백업 중..." +docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.Size}}" > "$BACKUP_PATH/docker_images.txt" +docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" > "$BACKUP_PATH/docker_containers.txt" + +# Docker 이미지 실제 백업 (선택사항) +echo "4. 주요 Docker 이미지 백업 중..." +mkdir -p "$BACKUP_PATH/docker_images" +for image in $(docker images --format "{{.Repository}}:{{.Tag}}" | grep -E "(pytorch|tensorflow|jupyter|cuda)" | head -10); do + echo " 백업 중: $image" + safe_name=$(echo "$image" | sed 's/[^a-zA-Z0-9._-]/_/g') + docker save "$image" | gzip > "$BACKUP_PATH/docker_images/${safe_name}.tar.gz" +done + +# Python 환경 백업 +echo "5. Python 환경 백업 중..." +if command -v python3 &> /dev/null; then + python3 -m pip list > "$BACKUP_PATH/pip_packages.txt" +fi + +if command -v conda &> /dev/null; then + conda env list > "$BACKUP_PATH/conda_envs.txt" + conda list > "$BACKUP_PATH/conda_packages.txt" +fi + +# 설정 파일 백업 +echo "6. 설정 파일 백업 중..." +mkdir -p "$BACKUP_PATH/configs" +cp -r ~/.bashrc "$BACKUP_PATH/configs/" 2>/dev/null || true +cp -r ~/.profile "$BACKUP_PATH/configs/" 2>/dev/null || true +cp -r ~/.ssh "$BACKUP_PATH/configs/" 2>/dev/null || true +cp -r ~/.gitconfig "$BACKUP_PATH/configs/" 2>/dev/null || true +cp -r /etc/docker/daemon.json "$BACKUP_PATH/configs/" 2>/dev/null || true + +# 중요한 디렉토리 백업 +echo "7. 중요한 디렉토리 백업 중..." +mkdir -p "$BACKUP_PATH/user_data" +cp -r ~/notebooks "$BACKUP_PATH/user_data/" 2>/dev/null || true +cp -r ~/workspace "$BACKUP_PATH/user_data/" 2>/dev/null || true +cp -r ~/data "$BACKUP_PATH/user_data/" 2>/dev/null || true +cp -r ~/scripts "$BACKUP_PATH/user_data/" 2>/dev/null || true + +# 복구 스크립트 생성 +cat > "$BACKUP_PATH/restore_gpu_environment.sh" << 'RESTORE_EOF' +#!/bin/bash + +# GPU 서버 환경 복구 스크립트 +# 실행 방법: sudo bash restore_gpu_environment.sh + +set -e + +BACKUP_DIR="$(dirname "$0")" +echo "=== GPU 서버 환경 복구 시작 ===" +echo "복구 소스: $BACKUP_DIR" + +# 패키지 복구 +echo "1. 패키지 복구 중..." +if [ -f "$BACKUP_DIR/apt_packages.txt" ]; then + # 기본 패키지 설치 + apt update + grep -E "^ii" "$BACKUP_DIR/installed_packages.txt" | awk '{print $2}' | xargs apt install -y --ignore-missing +fi + +# Docker 이미지 복구 +echo "2. Docker 이미지 복구 중..." +if [ -d "$BACKUP_DIR/docker_images" ]; then + for image_file in "$BACKUP_DIR/docker_images"/*.tar.gz; do + if [ -f "$image_file" ]; then + echo " 복구 중: $image_file" + gunzip -c "$image_file" | docker load + fi + done +fi + +# Python 패키지 복구 +echo "3. Python 패키지 복구 중..." +if [ -f "$BACKUP_DIR/pip_packages.txt" ]; then + pip3 install -r <(grep -v "^#" "$BACKUP_DIR/pip_packages.txt" | awk '{print $1}') --ignore-installed +fi + +# 설정 파일 복구 +echo "4. 설정 파일 복구 중..." +if [ -d "$BACKUP_DIR/configs" ]; then + cp -r "$BACKUP_DIR/configs/.bashrc" ~/ 2>/dev/null || true + cp -r "$BACKUP_DIR/configs/.profile" ~/ 2>/dev/null || true + cp -r "$BACKUP_DIR/configs/.gitconfig" ~/ 2>/dev/null || true + cp -r "$BACKUP_DIR/configs/daemon.json" /etc/docker/ 2>/dev/null || true +fi + +# 사용자 데이터 복구 +echo "5. 사용자 데이터 복구 중..." +if [ -d "$BACKUP_DIR/user_data" ]; then + cp -r "$BACKUP_DIR/user_data"/* ~/ 2>/dev/null || true +fi + +# 권한 수정 +chown -R $SUDO_USER:$SUDO_USER /home/$SUDO_USER/ + +echo "=== 복구 완료 ===" +echo "Docker 재시작 중..." +systemctl restart docker + +echo "복구가 완료되었습니다!" +echo "시스템을 재부팅하는 것을 권장합니다: sudo reboot" +RESTORE_EOF + +chmod +x "$BACKUP_PATH/restore_gpu_environment.sh" + +# 백업 정보 파일 생성 +cat > "$BACKUP_PATH/backup_info.txt" << 'INFO_EOF' +=== GPU 서버 백업 정보 === + +백업 날짜: $(date) +백업 경로: $BACKUP_PATH +백업 내용: +- 시스템 정보 (system_info.txt, nvidia_info.txt, docker_info.txt) +- 설치된 패키지 목록 (installed_packages.txt, apt_packages.txt) +- Docker 이미지 및 컨테이너 정보 +- 주요 Docker 이미지 파일 (docker_images/) +- Python 패키지 목록 (pip_packages.txt) +- 설정 파일 (configs/) +- 사용자 데이터 (user_data/) + +복구 방법: +1. 백업 폴더를 새 서버로 복사 +2. sudo bash restore_gpu_environment.sh 실행 +3. 시스템 재부팅 + +주의사항: +- 복구 전 새 서버에 기본 GPU 드라이버와 Docker가 설치되어 있어야 함 +- 복구 과정에서 기존 설정이 덮어쓰여질 수 있음 +- 중요한 데이터는 별도 백업 권장 +INFO_EOF + +echo "백업 완료!" +echo "백업 위치: $BACKUP_PATH" +echo "복구 방법: sudo bash $BACKUP_PATH/restore_gpu_environment.sh" + +# 백업 압축 옵션 +read -p "백업을 압축하시겠습니까? (y/n): " compress +if [[ $compress == "y" || $compress == "Y" ]]; then + echo "백업 압축 중..." + tar -czf "${BACKUP_PATH}.tar.gz" -C "$HOME" "$BACKUP_DIR" + rm -rf "$BACKUP_PATH" + echo "압축 완료: ${BACKUP_PATH}.tar.gz" +fi +EOF + +chmod +x /home/$SUDO_USER/backup_gpu_environment.sh +chown $SUDO_USER:$SUDO_USER /home/$SUDO_USER/backup_gpu_environment.sh + +# 빠른 백업 스크립트 생성 (Docker 이미지 제외) +cat > /home/$SUDO_USER/quick_backup.sh << 'EOF' +#!/bin/bash + +# 빠른 백업 스크립트 (Docker 이미지 제외) +# 실행 방법: ./quick_backup.sh + +set -e + +BACKUP_DIR="quick_backup_$(date +%Y%m%d_%H%M%S)" +BACKUP_PATH="$HOME/$BACKUP_DIR" + +echo "=== 빠른 백업 시작 ===" +mkdir -p "$BACKUP_PATH" + +# 시스템 정보 및 패키지 목록만 백업 +lsb_release -a > "$BACKUP_PATH/system_info.txt" +nvidia-smi > "$BACKUP_PATH/nvidia_info.txt" +docker --version > "$BACKUP_PATH/docker_info.txt" +dpkg -l > "$BACKUP_PATH/installed_packages.txt" +docker images --format "table {{.Repository}}\t{{.Tag}}" > "$BACKUP_PATH/docker_images_list.txt" + +if command -v python3 &> /dev/null; then + python3 -m pip list > "$BACKUP_PATH/pip_packages.txt" +fi + +# 설정 파일 백업 +mkdir -p "$BACKUP_PATH/configs" +cp ~/.bashrc "$BACKUP_PATH/configs/" 2>/dev/null || true +cp ~/.profile "$BACKUP_PATH/configs/" 2>/dev/null || true + +# 압축 +tar -czf "${BACKUP_PATH}.tar.gz" -C "$HOME" "$BACKUP_DIR" +rm -rf "$BACKUP_PATH" + +echo "빠른 백업 완료: ${BACKUP_PATH}.tar.gz" +EOF + +chmod +x /home/$SUDO_USER/quick_backup.sh +chown $SUDO_USER:$SUDO_USER /home/$SUDO_USER/quick_backup.sh + +echo "설정이 완료되었습니다!" \ No newline at end of file