refactor: gpu support and docker setup improvements

- Add gpu status refresh with useEffect
- Update docker-compose.yml configuration
- Modify gpu setup scripts
- Improve gpu support checks
This commit is contained in:
vishalkadam47
2024-11-11 23:18:24 +05:30
parent 66c4d8f118
commit b817b4b6ee
3 changed files with 43 additions and 15 deletions

View File

@@ -11,7 +11,7 @@ import {
import { api } from "@/utils/api"; import { api } from "@/utils/api";
import { TRPCClientError } from "@trpc/client"; import { TRPCClientError } from "@trpc/client";
import { CheckCircle2, Cpu, Loader2, RefreshCw, XCircle } from "lucide-react"; import { CheckCircle2, Cpu, Loader2, RefreshCw, XCircle } from "lucide-react";
import { useState } from "react"; import { useEffect, useState } from "react";
import { toast } from "sonner"; import { toast } from "sonner";
interface GPUSupportProps { interface GPUSupportProps {
@@ -54,9 +54,18 @@ export function GPUSupport({ serverId }: GPUSupportProps) {
const handleRefresh = async () => { const handleRefresh = async () => {
setIsRefreshing(true); setIsRefreshing(true);
await refetch(); try {
setIsRefreshing(false); await utils.settings.checkGPUStatus.invalidate({ serverId });
await refetch();
} catch (error) {
toast.error("Failed to refresh GPU status");
} finally {
setIsRefreshing(false);
}
}; };
useEffect(() => {
handleRefresh();
}, []);
const handleEnableGPU = async () => { const handleEnableGPU = async () => {
if (serverId === undefined) { if (serverId === undefined) {

View File

@@ -3,7 +3,6 @@ version: "3.8"
services: services:
blender: blender:
image: lscr.io/linuxserver/blender:latest image: lscr.io/linuxserver/blender:latest
container_name: blender
runtime: nvidia runtime: nvidia
deploy: deploy:
resources: resources:

View File

@@ -87,20 +87,38 @@ const checkRuntime = async (serverId?: string) => {
let runtimeConfigured = false; let runtimeConfigured = false;
try { try {
const runtimeCommand = 'docker info --format "{{json .Runtimes}}"'; // First check: Is nvidia-container-runtime installed?
const { stdout: runtimeInfo } = serverId const checkBinaryCommand = "command -v nvidia-container-runtime";
? await execAsyncRemote(serverId, runtimeCommand) try {
: await execAsync(runtimeCommand); const { stdout } = serverId
? await execAsyncRemote(serverId, checkBinaryCommand)
: await execAsync(checkBinaryCommand);
runtimeInstalled = !!stdout.trim();
} catch (error) {
console.debug("Runtime binary check:", error);
}
const runtimes = JSON.parse(runtimeInfo); // Second check: Is it configured in Docker?
runtimeInstalled = "nvidia" in runtimes; try {
const runtimeCommand = 'docker info --format "{{json .Runtimes}}"';
const { stdout: runtimeInfo } = serverId
? await execAsyncRemote(serverId, runtimeCommand)
: await execAsync(runtimeCommand);
const defaultCommand = 'docker info --format "{{.DefaultRuntime}}"'; const defaultCommand = 'docker info --format "{{.DefaultRuntime}}"';
const { stdout: defaultRuntime } = serverId const { stdout: defaultRuntime } = serverId
? await execAsyncRemote(serverId, defaultCommand) ? await execAsyncRemote(serverId, defaultCommand)
: await execAsync(defaultCommand); : await execAsync(defaultCommand);
runtimeConfigured = defaultRuntime.trim() === "nvidia"; const runtimes = JSON.parse(runtimeInfo);
const hasNvidiaRuntime = "nvidia" in runtimes;
const isDefaultRuntime = defaultRuntime.trim() === "nvidia";
// Only set runtimeConfigured if both conditions are met
runtimeConfigured = hasNvidiaRuntime && isDefaultRuntime;
} catch (error) {
console.debug("Runtime configuration check:", error);
}
} catch (error) { } catch (error) {
console.debug("Runtime check:", error); console.debug("Runtime check:", error);
} }
@@ -279,6 +297,7 @@ const setupRemoteServer = async (serverId: string, daemonConfig: any) => {
"sudo -n true", "sudo -n true",
`echo '${JSON.stringify(daemonConfig, null, 2)}' | sudo tee /etc/docker/daemon.json`, `echo '${JSON.stringify(daemonConfig, null, 2)}' | sudo tee /etc/docker/daemon.json`,
"sudo mkdir -p /etc/nvidia-container-runtime", "sudo mkdir -p /etc/nvidia-container-runtime",
'sudo sed -i "/swarm-resource/d" /etc/nvidia-container-runtime/config.toml',
'echo "swarm-resource = \\"DOCKER_RESOURCE_GPU\\"" | sudo tee -a /etc/nvidia-container-runtime/config.toml', 'echo "swarm-resource = \\"DOCKER_RESOURCE_GPU\\"" | sudo tee -a /etc/nvidia-container-runtime/config.toml',
"sudo systemctl daemon-reload", "sudo systemctl daemon-reload",
"sudo systemctl restart docker", "sudo systemctl restart docker",
@@ -295,6 +314,7 @@ const setupLocalServer = async (daemonConfig: any) => {
`pkexec sh -c ' `pkexec sh -c '
cp ${configFile} /etc/docker/daemon.json && cp ${configFile} /etc/docker/daemon.json &&
mkdir -p /etc/nvidia-container-runtime && mkdir -p /etc/nvidia-container-runtime &&
sed -i "/swarm-resource/d" /etc/nvidia-container-runtime/config.toml &&
echo "swarm-resource = \\"DOCKER_RESOURCE_GPU\\"" >> /etc/nvidia-container-runtime/config.toml && echo "swarm-resource = \\"DOCKER_RESOURCE_GPU\\"" >> /etc/nvidia-container-runtime/config.toml &&
systemctl daemon-reload && systemctl daemon-reload &&
systemctl restart docker systemctl restart docker