Move NVIDIA MIG configuration to pure systemd with templating, and colon seperating GPU indexs instead of spaces

Signed-off-by: root <root@warewulf>
This commit is contained in:
root
2026-02-01 17:54:52 -07:00
committed by Josh Burks
parent cc20a65848
commit c78f40ec3d
5 changed files with 49 additions and 51 deletions

View File

@@ -1,13 +0,0 @@
[Unit]
DefaultDependencies=no
Description=Configure NVIDIA MIG (Multi-Instance GPU) partitions at boot time
Before=nvidia-persistenced.service nvidia-dcgm.service dcgm_exporter.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/_config_mig "{{ .Tags.gpuMigType | default "2,2" }}"
ExecStop=sh -c 'nvidia-smi mig -dci ; nvidia-smi mig -dgi ; nvidia-smi -mig 0'
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,32 @@
[Unit]
DefaultDependencies=no
Description=Configure NVIDIA MIG (Multi-Instance GPU) partitions via Warewulf
Before=nvidia-persistenced.service nvidia-dcgm.service dcgm_exporter.service nvsm.service nvsm-core.service
ConditionPathExists=/usr/bin/nvidia-smi
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=-/usr/bin/nvidia-smi -pm 1
ExecStartPre=/usr/bin/nvidia-smi -mig 1
{{- $rawMigProfiles := default "2,2" .Tags.gpuMigProfiles -}}
{{- $migProfiles := splitList ":" $rawMigProfiles -}}
{{- if gt (len $migProfiles) 1 -}}
{{- range $gpuIndex, $migProfile := $migProfiles -}}
{{- if ne $migProfile "" }}
ExecStart=/usr/bin/nvidia-smi mig -cgi {{$migProfile}} -i {{$gpuIndex}} -C
{{- end -}}
{{- end -}}
{{- else }}
ExecStart=/usr/bin/nvidia-smi mig -cgi {{$rawMigProfiles}} -C
{{- end }}
ExecStartPost=-/usr/bin/nvidia-smi -L
ExecStartPost=-/usr/bin/sh /usr/local/sbin/mig2gres
ExecStop=-/usr/bin/nvidia-smi mig -dci
ExecStop=-/usr/bin/nvidia-smi mig -dgi
ExecStop=/usr/bin/nvidia-smi -mig 0
TimeoutStartSec=300
TimeoutStopSec=300
[Install]
WantedBy=multi-user.target

View File

@@ -1,37 +0,0 @@
#!/usr/bin/bash
set -euo pipefail
# This script configures NVIDIA MIG (Multi-Instance GPU) partitions based on the provided
# gpuMigType string argument. It supports both a single configuration for all GPUs or
# individual configurations per GPU.
# Example inputs:
# "14,14,14,15" # single config for all GPUs
# "14,14,14,15 7,7,7,8" # per-GPU configs for GPU0 and GPU1
# See https://docs.nvidia.com/datacenter/tesla/mig-user-guide/supported-mig-profiles.html for details on supported MIG profiles
# Get the gpuMigType string from the first argument
MIG_STRING="${1}"
if [[ -z "$MIG_STRING" ]]; then
echo "Usage: $0 <gpuMigType string>" >&2
exit 1
fi
# Check if nvidia-smi command exists
if ! command -v nvidia-smi &> /dev/null; then
echo "Error: nvidia-smi command not found" >&2
exit 1
fi
# enable MIG mode
nvidia-smi -mig 1
# per-GPU space-separated list (one token per GPU), otherwise single-string common case
if [[ "$MIG_STRING" == *" "* ]]; then
read -a PER_GPU_MIG_CONFIGS <<< "$MIG_STRING"
for gpu_index in "${!PER_GPU_MIG_CONFIGS[@]}"; do
nvidia-smi mig -cgi "${PER_GPU_MIG_CONFIGS[$gpu_index]}" -i "$gpu_index" -C
done
else
nvidia-smi mig -cgi "$MIG_STRING" -C
fi

View File

@@ -14,6 +14,21 @@ if ! command -v nvidia-smi &> /dev/null; then
exit 1
fi
if ! command -v grep &> /dev/null; then
echo "Error: grep command not found" >&2
exit 1
fi
if ! command -v awk &> /dev/null; then
echo "Error: awk command not found" >&2
exit 1
fi
if ! command -v hostname &> /dev/null; then
echo "Error: hostname command not found" >&2
exit 1
fi
hostname=$(hostname -s)
nvidia-smi mig -lgi | grep -E '^\|' | grep -v '===' | grep -v 'GPU.*Name' | while read line; do
@@ -25,6 +40,7 @@ nvidia-smi mig -lgi | grep -E '^\|' | grep -v '===' | grep -v 'GPU.*Name' | whil
pattern="gpu${gpu}/gi${gi}/access"
minor=$(grep "^${pattern} " /proc/driver/nvidia-caps/mig-minors | awk '{print $2}')
device_file="/dev/nvidia-caps/nvidia-cap${minor}"
echo "NodeName=${hostname} Name=gpu Type=${name} File=/dev/nvidia-caps/nvidia-cap${minor}"
echo "NodeName=${hostname} Name=gpu Type=${name} File=${device_file}"
done