| #!/usr/bin/env bash |
| set -euo pipefail |
|
|
| |
|
|
| install_nvidia_smi_if_missing() { |
| if command -v nvidia-smi &>/dev/null; then |
| return |
| fi |
|
|
| echo "β οΈ nvidia-smi not found. Installing nvidia-utilsβ¦" |
| if [ "$EUID" -ne 0 ]; then |
| SUDO='sudo' |
| else |
| SUDO='' |
| fi |
|
|
| $SUDO apt-get update |
| $SUDO apt-get install -y nvidia-utils-535 || $SUDO apt-get install -y nvidia-utils |
|
|
| if ! command -v nvidia-smi &>/dev/null; then |
| echo "β Failed to install nvidia-smi. Cannot detect GPU architecture." |
| exit 1 |
| fi |
| echo "β
nvidia-smi installed successfully." |
| } |
|
|
| detect_gpu_name() { |
| install_nvidia_smi_if_missing |
| nvidia-smi --query-gpu=name --format=csv,noheader,nounits | head -1 |
| } |
|
|
| map_gpu_to_arch() { |
| local name="$1" |
| case "$name" in |
| *"RTX 50"* | *"5090"* | *"5080"* | *"5070"*) echo "12.0" ;; |
| *"H100"* | *"H800"*) echo "9.0" ;; |
| *"RTX 40"* | *"4090"* | *"4080"* | *"4070"* | *"4060"*) echo "8.9" ;; |
| *"RTX 30"* | *"3090"* | *"3080"* | *"3070"* | *"3060"*) echo "8.6" ;; |
| *"A100"* | *"A800"* | *"A40"*) echo "8.0" ;; |
| *"Tesla V100"*) echo "7.0" ;; |
| *"RTX 20"* | *"2080"* | *"2070"* | *"2060"* | *"Titan RTX"*) echo "7.5" ;; |
| *"GTX 16"* | *"1660"* | *"1650"*) echo "7.5" ;; |
| *"GTX 10"* | *"1080"* | *"1070"* | *"1060"* | *"Tesla P100"*) echo "6.1" ;; |
| *"Tesla K80"* | *"Tesla K40"*) echo "3.7" ;; |
| *) |
| echo "β Unknown GPU model: $name" |
| echo "Please update the map_gpu_to_arch function for this model." |
| exit 1 |
| ;; |
| esac |
| } |
|
|
| get_gpu_vram() { |
| install_nvidia_smi_if_missing |
| |
| local vram_mb=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits | head -1) |
| echo $((vram_mb / 1024)) |
| } |
|
|
| map_gpu_to_profile() { |
| local name="$1" |
| local vram_gb="$2" |
|
|
| |
| |
| |
| |
| |
| |
|
|
| case "$name" in |
| |
| *"RTX 50"* | *"5090"* | *"A100"* | *"A800"* | *"H100"* | *"H800"*) |
| if [ "$vram_gb" -ge 24 ]; then |
| echo "1" |
| else |
| echo "2" |
| fi |
| ;; |
| |
| *"RTX 40"* | *"4090"* | *"RTX 30"* | *"3090"*) |
| if [ "$vram_gb" -ge 24 ]; then |
| echo "3" |
| else |
| echo "2" |
| fi |
| ;; |
| |
| *"4080"* | *"4070"* | *"3080"* | *"3070"* | *"RTX 20"* | *"2080"* | *"2070"*) |
| if [ "$vram_gb" -ge 12 ]; then |
| echo "2" |
| else |
| echo "4" |
| fi |
| ;; |
| |
| *"4060"* | *"3060"* | *"2060"* | *"GTX 16"* | *"1660"* | *"1650"*) |
| if [ "$vram_gb" -ge 10 ]; then |
| echo "4" |
| else |
| echo "5" |
| fi |
| ;; |
| |
| *"GTX 10"* | *"1080"* | *"1070"* | *"1060"* | *"Tesla"*) |
| echo "5" |
| ;; |
| *) |
| echo "4" |
| ;; |
| esac |
| } |
|
|
| |
|
|
| echo "π§ NVIDIA CUDA Setup Check:" |
|
|
| |
| if command -v nvidia-smi &>/dev/null; then |
| DRIVER_VERSION=$(nvidia-smi --query-gpu=driver_version --format=csv,noheader,nounits | head -1) |
| echo "β
NVIDIA Driver: $DRIVER_VERSION" |
| |
| |
| if [[ "$DRIVER_VERSION" =~ ^([0-9]+) ]]; then |
| MAJOR=${BASH_REMATCH[1]} |
| if [ "$MAJOR" -lt 520 ]; then |
| echo "β οΈ Driver $DRIVER_VERSION may not support CUDA 12.4 (need 520+)" |
| fi |
| fi |
| else |
| echo "β nvidia-smi not found - no NVIDIA drivers" |
| exit 1 |
| fi |
|
|
| GPU_NAME=$(detect_gpu_name) |
| echo "π Detected GPU: $GPU_NAME" |
|
|
| VRAM_GB=$(get_gpu_vram) |
| echo "π§ Detected VRAM: ${VRAM_GB}GB" |
|
|
| CUDA_ARCH=$(map_gpu_to_arch "$GPU_NAME") |
| echo "π Using CUDA architecture: $CUDA_ARCH" |
|
|
| PROFILE=$(map_gpu_to_profile "$GPU_NAME" "$VRAM_GB") |
| echo "βοΈ Selected profile: $PROFILE" |
|
|
| docker build --build-arg CUDA_ARCHITECTURES="$CUDA_ARCH" -t deepbeepmeep/wan2gp . |
|
|
| |
| if [ "$EUID" -ne 0 ]; then |
| SUDO='sudo' |
| else |
| SUDO='' |
| fi |
|
|
| |
| if ! docker info 2>/dev/null | grep -q 'Runtimes:.*nvidia'; then |
| echo "β οΈ NVIDIA Docker runtime not found. Installing nvidia-docker2β¦" |
| $SUDO apt-get update |
| $SUDO apt-get install -y curl ca-certificates gnupg |
| curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | $SUDO apt-key add - |
| distribution=$( |
| . /etc/os-release |
| echo $ID$VERSION_ID |
| ) |
| curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | |
| $SUDO tee /etc/apt/sources.list.d/nvidia-docker.list |
| $SUDO apt-get update |
| $SUDO apt-get install -y nvidia-docker2 |
| echo "π Restarting Docker serviceβ¦" |
| $SUDO systemctl restart docker |
| echo "β
NVIDIA Docker runtime installed." |
| else |
| echo "β
NVIDIA Docker runtime found." |
| fi |
|
|
| |
| echo "π§ͺ Testing NVIDIA runtime..." |
| if timeout 15s docker run --rm --gpus all --runtime=nvidia nvidia/cuda:12.4-runtime-ubuntu22.04 nvidia-smi >/dev/null 2>&1; then |
| echo "β
NVIDIA runtime working" |
| else |
| echo "β NVIDIA runtime test failed - check driver/runtime compatibility" |
| fi |
|
|
| |
| cache_dirs=(numba matplotlib huggingface torch) |
| cache_mounts=() |
| for d in "${cache_dirs[@]}"; do |
| mkdir -p "$HOME/.cache/$d" |
| chmod 700 "$HOME/.cache/$d" |
| cache_mounts+=(-v "$HOME/.cache/$d:/home/user/.cache/$d") |
| done |
|
|
| echo "π§ Optimization settings:" |
| echo " Profile: $PROFILE" |
|
|
| |
| docker run --rm -it \ |
| --name wan2gp \ |
| --gpus all \ |
| --runtime=nvidia \ |
| -p 7860:7860 \ |
| -v "$(pwd):/workspace" \ |
| "${cache_mounts[@]}" \ |
| deepbeepmeep/wan2gp \ |
| --profile "$PROFILE" \ |
| --attention sage \ |
| --compile \ |
| --perc-reserved-mem-max 1 |
|
|