|
33 | 33 | HAS_GPU=false |
34 | 34 | if lspci 2>/dev/null | grep -qi nvidia; then |
35 | 35 | HAS_GPU=true |
| 36 | +elif command -v lshw > /dev/null 2>&1 && lshw -C display 2>/dev/null | grep -qi nvidia; then |
| 37 | + HAS_GPU=true |
| 38 | +elif command -v nvidia-smi > /dev/null 2>&1 && nvidia-smi -L > /dev/null 2>&1; then |
| 39 | + HAS_GPU=true |
36 | 40 | fi |
37 | 41 |
|
38 | 42 | # Install the NVIDIA Container Toolkit. Shared by Docker and Podman — the |
@@ -139,12 +143,51 @@ setup_podman() { |
139 | 143 | podman --version |
140 | 144 | fi |
141 | 145 |
|
142 | | - # podman-compose is what honours CDI devices; 'podman compose' (the |
143 | | - # docker-compose shim) silently drops them. Install best-effort. |
144 | | - if ! command -v podman-compose > /dev/null 2>&1; then |
| 146 | + # CDI GPU passthrough (podman run --device nvidia.com/gpu=all) needs |
| 147 | + # Podman >= 4.1. Ubuntu 20.04 ships 3.4.x, which cannot do CDI at all. |
| 148 | + local pv pmajor pminor |
| 149 | + pv=$(podman version --format '{{.Client.Version}}' 2>/dev/null || true) |
| 150 | + if [ -z "$pv" ]; then |
| 151 | + pv=$(podman --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true) |
| 152 | + fi |
| 153 | + pmajor=$(echo "$pv" | cut -d. -f1) |
| 154 | + pminor=$(echo "$pv" | cut -d. -f2) |
| 155 | + [ -z "$pminor" ] && pminor=0 |
| 156 | + if [ -n "$pmajor" ] && { [ "$pmajor" -lt 4 ] || { [ "$pmajor" -eq 4 ] && [ "$pminor" -lt 1 ]; }; }; then |
| 157 | + echo "" |
| 158 | + echo "WARNING: Podman $pv is too old for CDI GPU passthrough (requires >= 4.1)." |
| 159 | + echo " 'podman run --device nvidia.com/gpu=all' will NOT work on this version." |
| 160 | + echo " Ubuntu 20.04 ships Podman 3.4.x. Options:" |
| 161 | + echo " - Use Docker instead: ai-studio-cli setup vllm --runtime docker" |
| 162 | + echo " - Upgrade Podman to >= 4.1 (newer Ubuntu, or a backports/Kubic repo)." |
| 163 | + echo "" |
| 164 | + fi |
| 165 | + |
| 166 | + # podman-compose honours CDI devices; 'podman compose' (the docker-compose |
| 167 | + # shim) silently drops them. It is not packaged on older Ubuntu, so fall |
| 168 | + # back to pip3 when apt cannot provide it. |
| 169 | + if command -v podman-compose > /dev/null 2>&1; then |
| 170 | + echo "podman-compose already installed: $(podman-compose --version 2>/dev/null | head -1)" |
| 171 | + else |
145 | 172 | echo "Installing podman-compose..." |
146 | | - sudo -E apt-get install -y podman-compose \ |
147 | | - || echo " Note: podman-compose unavailable via apt — install with 'pip install podman-compose'." |
| 173 | + if sudo -E apt-get install -y podman-compose 2>/dev/null; then |
| 174 | + echo "podman-compose installed via apt." |
| 175 | + else |
| 176 | + echo "podman-compose not in apt repos — installing via pip3..." |
| 177 | + if ! command -v pip3 > /dev/null 2>&1; then |
| 178 | + sudo -E apt-get install -y python3-pip |
| 179 | + fi |
| 180 | + # PEP 668 (Ubuntu 23.04+) marks the system Python as externally |
| 181 | + # managed, so a plain 'pip3 install' is rejected — retry with |
| 182 | + # --break-system-packages for those releases. |
| 183 | + if sudo -E pip3 install podman-compose 2>/dev/null \ |
| 184 | + || sudo -E pip3 install --break-system-packages podman-compose; then |
| 185 | + echo "podman-compose installed via pip3." |
| 186 | + else |
| 187 | + echo "Warning: failed to install podman-compose. Install it manually:" |
| 188 | + echo " sudo pip3 install --break-system-packages podman-compose" |
| 189 | + fi |
| 190 | + fi |
148 | 191 | fi |
149 | 192 |
|
150 | 193 | if [ "$HAS_GPU" = "true" ]; then |
|
0 commit comments