Adding install instruction to make GPUs usable

This commit is contained in:
ml
2026-09-30 08:27:18 +02:00
parent 45ccbccaaf
commit 0caf535dcd
+81 -13
View File
@@ -24,6 +24,53 @@ done
IMAGE_NAME="local-ai"; CONTAINER_NAME="local-ai"; PORT=11434 IMAGE_NAME="local-ai"; CONTAINER_NAME="local-ai"; PORT=11434
NOTES=() # machine-specific remarks, echoed to the terminal and RUN_AIDER.md NOTES=() # machine-specific remarks, echoed to the terminal and RUN_AIDER.md
# Distro-specific commands to make an NVIDIA GPU usable from Docker.
# $1 = need_driver (1/0)
gpu_install_steps() {
local need_driver=$1 id="" like=""
[ -r /etc/os-release ] && { id=$(. /etc/os-release; echo "${ID:-}"); like=$(. /etc/os-release; echo "${ID_LIKE:-}"); }
case " $id $like " in
*" ubuntu "*|*" debian "*)
if [ "$need_driver" = 1 ]; then
if [[ " $id $like " == *" ubuntu "* ]]; then
echo "# 1. NVIDIA driver (then reboot; with Secure Boot you must enroll the MOK key when prompted)"
echo "sudo ubuntu-drivers install"
else
echo "# 1. NVIDIA driver (needs the non-free component enabled; then reboot)"
echo "sudo apt install nvidia-driver"
fi
echo "sudo reboot"
echo "nvidia-smi # after reboot: should list your GPU"
echo
fi
echo "# 2. NVIDIA container toolkit (lets Docker use the GPU)"
echo "curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg"
echo "curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list"
echo "sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit"
echo "sudo nvidia-ctk runtime configure --runtime=docker && sudo systemctl restart docker"
;;
*" fedora "*|*" rhel "*|*" centos "*)
if [ "$need_driver" = 1 ]; then
echo "# 1. NVIDIA driver from RPM Fusion (enable RPM Fusion first: https://rpmfusion.org/Configuration), then reboot"
echo "sudo dnf install akmod-nvidia xorg-x11-drv-nvidia-cuda && sudo reboot"
echo
fi
echo "# 2. NVIDIA container toolkit"
echo "curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo"
echo "sudo dnf install -y nvidia-container-toolkit"
echo "sudo nvidia-ctk runtime configure --runtime=docker && sudo systemctl restart docker"
;;
*)
echo "# Install the NVIDIA driver with your distribution's package manager, then the container toolkit:"
echo "# https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html"
echo "# and finish with: sudo nvidia-ctk runtime configure --runtime=docker && sudo systemctl restart docker"
;;
esac
echo
echo "# 3. Verify, then re-run ./setup.sh"
echo "docker run --rm --gpus all ubuntu nvidia-smi"
}
# ---------------------------------------------------------------- detection # ---------------------------------------------------------------- detection
cpu_model=$(grep -m1 'model name' /proc/cpuinfo | cut -d: -f2- | xargs || true) cpu_model=$(grep -m1 'model name' /proc/cpuinfo | cut -d: -f2- | xargs || true)
cpu_threads=$(nproc) cpu_threads=$(nproc)
@@ -31,7 +78,7 @@ ram_gb=$(awk '/MemTotal/ {printf "%.1f", $2/1024/1024}' /proc/meminfo)
disk_gb=$(df -Pk . | awk 'NR==2 {printf "%.0f", $4/1024/1024}') disk_gb=$(df -Pk . | awk 'NR==2 {printf "%.0f", $4/1024/1024}')
grep -qw avx2 /proc/cpuinfo && avx2=yes || avx2=no grep -qw avx2 /proc/cpuinfo && avx2=yes || avx2=no
gpu_name=""; vram_gb=0; gpu_usable=0; nodriver_gpu=0; est_vram=0 gpu_name=""; vram_gb=0; gpu_usable=0; nodriver_gpu=0; est_vram=0; toolkit_only=0; GPU_ADVICE=""; GPU_STEPS=""
if command -v nvidia-smi >/dev/null 2>&1 && nvidia-smi -L >/dev/null 2>&1; then if command -v nvidia-smi >/dev/null 2>&1 && nvidia-smi -L >/dev/null 2>&1; then
gpu_name=$(nvidia-smi --query-gpu=name --format=csv,noheader | head -1) gpu_name=$(nvidia-smi --query-gpu=name --format=csv,noheader | head -1)
vram_mb=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits | head -1) vram_mb=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits | head -1)
@@ -58,7 +105,7 @@ if command -v docker >/dev/null 2>&1; then
fi fi
fi fi
if [ "$gpu_usable" = 1 ] && [ "$docker_nvidia" = no ]; then if [ "$gpu_usable" = 1 ] && [ "$docker_nvidia" = no ]; then
NOTES+=("GPU $gpu_name found but Docker has no NVIDIA runtime (install nvidia-container-toolkit). Running on CPU.") toolkit_only=1
gpu_usable=0 gpu_usable=0
fi fi
[ "$FORCE_GPU" = 1 ] && gpu_usable=1 [ "$FORCE_GPU" = 1 ] && gpu_usable=1
@@ -106,23 +153,39 @@ done
[ "$rec" -ge 0 ] || rec=0 [ "$rec" -ge 0 ] || rec=0
# ------------------------------------------- would a GPU driver help? # ------------------------------------------- would a GPU driver help?
if [ "$nodriver_gpu" = 1 ]; then if [ "$nodriver_gpu" = 1 ] || [ "$toolkit_only" = 1 ]; then
[ "$nodriver_gpu" = 1 ] && gvram=$est_vram || gvram=$vram_gb
best=-1 best=-1
if awk -v v="$est_vram" 'BEGIN{exit !(v>0)}'; then if awk -v v="$gvram" 'BEGIN{exit !(v>0)}'; then
for i in "${!rows[@]}"; do for i in "${!rows[@]}"; do
mem=$(cut -f3 <<<"${rows[$i]}") mem=$(cut -f3 <<<"${rows[$i]}")
awk -v m="$mem" -v v="$est_vram" 'BEGIN{exit !(m<=v*0.9)}' && best=$i awk -v m="$mem" -v v="$gvram" 'BEGIN{exit !(m<=v*0.9)}' && best=$i
done done
fi fi
drv="install the NVIDIA driver and nvidia-container-toolkit, then re-run ./setup.sh" if [ "$nodriver_gpu" = 1 ]; then
if [ "$est_vram" = 0 ]; then what="the NVIDIA driver and nvidia-container-toolkit"
NOTES+=("NVIDIA GPU ($gpu_name) found but not usable (no driver). Installing the driver may speed things up a lot if it has enough VRAM: $drv.") have="has no working NVIDIA driver"
elif [ "$best" -gt "$rec" ]; then
NOTES+=("Worth installing the NVIDIA driver: with ~${est_vram} GB VRAM, ${tags[$best]} would run fully on the GPU (better than the current CPU pick ${tags[$rec]}). $drv.")
elif [ "$best" -ge 0 ]; then
NOTES+=("Optional: an NVIDIA driver would make models up to ${tags[$best]} run fully on the ~${est_vram} GB GPU (much faster) and partly speed up larger ones such as ${tags[$rec]} via partial offload, but ${est_vram} GB VRAM does not unlock bigger models than ${tags[$rec]}. Worth it for speed: $drv.")
else else
NOTES+=("A driver would not help much: ~${est_vram} GB VRAM is too small to hold even the smallest model.") what="nvidia-container-toolkit"
have="is not usable from Docker (no NVIDIA runtime)"
fi
head="Your GPU ($gpu_name) $have, so the model runs on the CPU."
if [ "$gvram" = 0 ]; then
GPU_ADVICE="$head If it has enough VRAM, installing $what may speed things up a lot."
elif [ "$best" -gt "$rec" ]; then
GPU_ADVICE="$head Recommended: install $what. With ~${gvram} GB VRAM, ${tags[$best]} would run fully on the GPU (better than the current CPU pick ${tags[$rec]})."
elif [ "$best" -ge 0 ]; then
GPU_ADVICE="$head Optional, for speed: install $what. With ~${gvram} GB VRAM, models up to ${tags[$best]} would run fully on the GPU and larger ones such as ${tags[$rec]} partly (partial offload), but this VRAM does not unlock bigger models than ${tags[$rec]}."
else
GPU_ADVICE="" # VRAM too small to matter
fi
if [ -n "$GPU_ADVICE" ]; then
GPU_STEPS=$(gpu_install_steps "$nodriver_gpu")
echo "=== GPU hint ==="
echo " $GPU_ADVICE"
echo " To do so (optional; then re-run ./setup.sh):"
sed 's/^/ /' <<<"$GPU_STEPS"
echo
fi fi
fi fi
@@ -226,6 +289,11 @@ model: ollama_chat/$MODEL
- Nothing is sent off the machine once the image is built. - Nothing is sent off the machine once the image is built.
- To switch model or after changing hardware, re-run \`./setup.sh\` then \`./build-ai-image.sh\`. - To switch model or after changing hardware, re-run \`./setup.sh\` then \`./build-ai-image.sh\`.
EOF EOF
if [ -n "$GPU_ADVICE" ]; then
echo; echo "## Optional: use your GPU"; echo
echo "$GPU_ADVICE"; echo
echo '```bash'; echo "$GPU_STEPS"; echo '```'
fi
if [ "${#NOTES[@]}" -gt 0 ]; then if [ "${#NOTES[@]}" -gt 0 ]; then
echo; echo "## Notes about this machine"; echo echo; echo "## Notes about this machine"; echo
for n in "${NOTES[@]}"; do echo "- $n"; done for n in "${NOTES[@]}"; do echo "- $n"; done