mirror of
https://github.com/nad4-su/gpu-srv-ml-settings-script.git
synced 2026-08-12 14:43:25 +09:00
422 lines
13 KiB
Bash
422 lines
13 KiB
Bash
#!/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 "설정이 완료되었습니다!" |