From 431733a0e8433184f2d204d266813695956238dd Mon Sep 17 00:00:00 2001 From: Kristian Ollikainen <14197772+DatCaptainHorse@users.noreply.github.com> Date: Tue, 28 Jan 2025 06:52:05 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9C=20fix(scripts):=20Use=20class=20co?= =?UTF-8?q?des=20to=20check=20for=20lspci=20GPU=20devices=20(#168)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes gpu_helpers returning "Non-VGA" devices as GPUs. I was curious about DeepSeek's so I tried it's hand with this as my head isn't quite up-to-speed yet :sweat_smile: But yeah it seems less error-prone than previous naive string-approach. --------- Co-authored-by: DatCaptainHorse Co-authored-by: Wanjohi Co-authored-by: Wanjohi <71614375+wanjohiryan@users.noreply.github.com> --- .github/workflows/runner.yml | 3 +- containers/runner.Containerfile | 1 + packages/scripts/entrypoint.sh | 21 +++++------ packages/scripts/gpu_helpers.sh | 67 +++++++++++++++------------------ 4 files changed, 43 insertions(+), 49 deletions(-) diff --git a/.github/workflows/runner.yml b/.github/workflows/runner.yml index cff63731..743f8841 100644 --- a/.github/workflows/runner.yml +++ b/.github/workflows/runner.yml @@ -7,6 +7,7 @@ on: paths: - "containers/runner.Containerfile" - "packages/server/**" + - "packages/scripts/**" - ".github/workflows/runner.yml" schedule: - cron: 7 0 * * 1,3,6 # Regularly to keep that build cache warm @@ -139,4 +140,4 @@ jobs: # name: Move cache # run: | # rm -rf /tmp/.buildx-cache - # mv /tmp/.buildx-cache-new /tmp/.buildx-cache \ No newline at end of file + # mv /tmp/.buildx-cache-new /tmp/.buildx-cache diff --git a/containers/runner.Containerfile b/containers/runner.Containerfile index 66e9cce8..1b6da92d 100644 --- a/containers/runner.Containerfile +++ b/containers/runner.Containerfile @@ -160,6 +160,7 @@ ENV XDG_RUNTIME_DIR=/run/user/${UID} \ # Required for NVIDIA.. they want to be special like that # ENV NVIDIA_DRIVER_CAPABILITIES=all +ENV NVIDIA_VISIBLE_DEVICES=all # DBus run directory creation # RUN mkdir -p /run/dbus diff --git a/packages/scripts/entrypoint.sh b/packages/scripts/entrypoint.sh index 9d46ca8a..2d58a49f 100644 --- a/packages/scripts/entrypoint.sh +++ b/packages/scripts/entrypoint.sh @@ -36,19 +36,16 @@ source /etc/nestri/gpu_helpers.sh get_gpu_info -# Identify vendor -if [[ "${vendor_full_map[0],,}" =~ "intel" ]]; then - echo "Intel GPU detected, installing required packages..." - #chwd -a - pacman -Sy --noconfirm gstreamer-vaapi gst-plugin-va gst-plugin-qsv - # chwd missed a thing - pacman -Sy --noconfirm vpl-gpu-rt -elif [[ "${vendor_full_map[0],,}" =~ "amd" ]]; then - echo "AMD GPU detected, installing required packages..." - #chwd -a - pacman -Sy --noconfirm gstreamer-vaapi gst-plugin-va -elif [[ "${vendor_full_map[0],,}" =~ "nvidia" ]]; then +# Check vendors in priority order +if [[ -n "${vendor_devices[nvidia]:-}" ]]; then echo "NVIDIA GPU detected. Assuming drivers are linked" +elif [[ -n "${vendor_devices[intel]:-}" ]]; then + echo "Intel GPU detected, installing required packages..." + pacman -Sy --noconfirm gstreamer-vaapi gst-plugin-va gst-plugin-qsv + pacman -Sy --noconfirm vpl-gpu-rt +elif [[ -n "${vendor_devices[amd]:-}" ]]; then + echo "AMD GPU detected, installing required packages..." + pacman -Sy --noconfirm gstreamer-vaapi gst-plugin-va else echo "Unknown GPU vendor. No additional packages will be installed" fi diff --git a/packages/scripts/gpu_helpers.sh b/packages/scripts/gpu_helpers.sh index 777eb41f..4b367f9d 100644 --- a/packages/scripts/gpu_helpers.sh +++ b/packages/scripts/gpu_helpers.sh @@ -1,52 +1,47 @@ #!/bin/bash set -euo pipefail -declare -a vendor_full_map=() -declare -a vendor_id_map=() -declare -A vendor_index_map=() +declare -A vendor_devices=() function get_gpu_info { - # Initialize arrays/maps to avoid unbound variable errors - vendor_full_map=() - vendor_id_map=() - vendor_index_map=() + vendor_devices=() - # Use lspci to detect GPU info - gpu_info=$(lspci | grep -i 'vga\|3d\|display') + local gpu_info=$(lspci -nn | grep -E '\<(0300|0302|0380)\>') - # Parse each line of GPU info while IFS= read -r line; do - # Extract vendor name and ID from lspci output - vendor=$(echo "$line" | awk -F: '{print $3}' | sed -E 's/^[[:space:]]+//g' | tr '[:upper:]' '[:lower:]') - id=$(echo "$line" | awk '{print $1}') + # Extract vendor_id from [vendor_id:device_id] + local vendor_id=$(echo "$line" | sed -nE 's/.*\[([[:xdigit:]]{4}):[[:xdigit:]]{4}\].*/\1/p' | tr '[:upper:]' '[:lower:]') + local id=$(echo "$line" | awk '{print $1}') - # Normalize vendor name - if [[ $vendor =~ .*nvidia.* ]]; then - vendor="nvidia" - elif [[ $vendor =~ .*intel.* ]]; then - vendor="intel" - elif [[ $vendor =~ .*advanced[[:space:]]micro[[:space:]]devices.* ]]; then - vendor="amd" - elif [[ $vendor =~ .*ati.* ]]; then - vendor="amd" - else - vendor="unknown" - fi + # Map vendor_id to known vendors + local vendor="unknown" + case "$vendor_id" in + 10de) vendor="nvidia" ;; + 8086) vendor="intel" ;; + 1002 | 1022) vendor="amd" ;; + # Add other vendor IDs as needed + esac - # Add to arrays/maps if unique - if ! [[ "${vendor_index_map[$vendor]:-}" ]]; then - vendor_index_map[$vendor]="${#vendor_full_map[@]}" - vendor_full_map+=("$vendor") + if [[ "$vendor" != "unknown" ]]; then + vendor_devices["$vendor"]+="$id " fi - vendor_id_map+=("$id") - done <<< "$gpu_info" + done <<<"$gpu_info" } function debug_gpu_info { - echo "Vendor Full Map: ${vendor_full_map[*]}" - echo "Vendor ID Map: ${vendor_id_map[*]}" - echo "Vendor Index Map:" - for key in "${!vendor_index_map[@]}"; do - echo " $key: ${vendor_index_map[$key]}" + echo "Detected GPUs:" + for vendor in "${!vendor_devices[@]}"; do + echo " $vendor: ${vendor_devices[$vendor]}" done } + +# # Usage example: +# get_gpu_info +# debug_gpu_info + +# # Access NVIDIA GPUs specifically +# if [[ -n "${vendor_devices[nvidia]:-}" ]]; then +# echo "NVIDIA GPUs detected: ${vendor_devices[nvidia]}" +# else +# echo "No NVIDIA GPUs found" +# fi \ No newline at end of file