GPUtil-Fehler beheben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
GIJoe007
User
Beiträge: 1
Registriert: Montag 7. Oktober 2024, 15:17

Hallo Zusammen,

ich habe ein Pythonskript auf einem USB-Stick an einem Ubuntuserver hängen.
Es hat folgenden Code:

Code: Alles auswählen

import os

# Activate the virtual environment
activate_script = os.path.join('myenv','bin','activate')
print(f"source {activate_script}")
import psutil
import GPUtil

print("Virtuelle Umgebung gestartet")
def get_system_data():
    # Get CPU usage
    cpu_usage = psutil.cpu_percent(interval=1)

    # Get RAM usage
    ram = psutil.virtual_memory()
    ram_usage = ram.percent

    # Get GPU data
    gpus = GPUtil.getGPUs()
    gpu_data = []
    for gpu in gpus:
        gpu_data.append({
            'id': gpu.id,
            'name': gpu.name,
            'load': gpu.load * 100,
            'memoryTotal': gpu.memoryTotal,
            'memoryUsed': gpu.memoryUsed,
            'memoryFree': gpu.memoryFree,
            'temperature': gpu.temperature,
            'uuid': gpu.uuid
        })

    return {
        'cpu_usage': cpu_usage,
        'ram_usage': ram_usage,
        'gpu_data': gpu_data
    }



if __name__ == "__main__":
    system_data = get_system_data()
    print(f"System Data: {system_data}")
AUf meinem Laptop habe ich ein Anderes SKript welches das Skript auf dem Server aufruft:

Code: Alles auswählen

import time
import requests
import paramiko

def execute_remote_script(hostname, port, username, password, script_path):
    try:
        # Verbindung zum Remote-Server herstellen
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        client.connect(hostname, port=port, username=username, password=password)

        # Skript auf dem Remote-Server ausführen
        stdin, stdout, stderr = client.exec_command(f'python3 {script_path}')
        output = stdout.read().decode()
        error = stderr.read().decode()

        # Verbindung schließen
        client.close()

        if error:
            print(f"Fehler beim Ausführen des Skripts: {error}")
            return None
        return output
    except Exception as e:
        print(f"Fehler bei der Verbindung zum Remote-Server: {e}")
        return None

# Remote-Server-Details
REMOTE_HOSTNAME = ""
REMOTE_PORT = 
REMOTE_USERNAME = ""
REMOTE_PASSWORD = ""
REMOTE_SCRIPT_PATH = "/mnt/usb/Daten_auslesen.py"

# OpenWebUI API-Details
OPENWEBUI_API_URL = "http://"
OPENWEBUI_API_KEY = "mein key"

def measure_latency_and_response_time(api_url, payload):
    start_time = time.time()
    try:
        response = requests.post(api_url, json=payload, timeout=60)  # Timeout auf 30 Sekunden erhöhen
    except requests.exceptions.RequestException as e:
        print(f"Fehler bei der API-Anfrage: {e}")
        return None, None, None
    end_time = time.time()
    
    latency = end_time - start_time
    response_time = response.elapsed.total_seconds()
    
    return latency, response_time, response.json()

def main():
    payload = {
        "model": "llama:8b",
        "prompt": "1+1"
    }
    
    # Remote-Skript auf dem Server ausführen
    remote_script_output = execute_remote_script(REMOTE_HOSTNAME, REMOTE_PORT, REMOTE_USERNAME, REMOTE_PASSWORD, REMOTE_SCRIPT_PATH)
    
    if remote_script_output is None:
        print("Fehler beim Ausführen des Remote-Skripts. Überprüfe die Verbindung und das Skript.")
        return
    
    print(f"Ausgabe des Remote-Skripts: {remote_script_output}")
    
    # Messen der Latenzzeit und Antwortzeit
    latency, response_time, result = measure_latency_and_response_time(OPENWEBUI_API_URL, payload)
    
    if latency is None or response_time is None or result is None:
        print("Fehler bei der API-Anfrage. Überprüfe die Verbindung und die API-URL.")
        return
    
    # Ausgabe der Ergebnisse
    print(f"Latenzzeit: {latency} Sekunden")
    print(f"Antwortzeit: {response_time} Sekunden")
    print(f"API-Antwort: {result}")

if __name__ == "__main__":
    main()
Nun bekomme ich die Fehlermeldung: "Fehler beim Ausführen des Skripts: Traceback (most recent call last):
File "/mnt/usb/Daten_auslesen.py", line 7, in <module>
import GPUtil
ModuleNotFoundError: No module named 'GPUtil'

Fehler beim Ausführen des Remote-Skripts. Überprüfe die Verbindung und das Skript. "

Habt Ihr eine Idee wie man den Fehler behebt? GPUtil ist auf beiden Systemen, dem Leptop und dem Server installiert. Auf dem Server in einer virtuellen Umgebung.
Benutzeravatar
sparrow
User
Beiträge: 4525
Registriert: Freitag 17. April 2009, 10:28

Wie kommst du darauf, dass das venv aktiv ist? Du baust dir da einen Pfad zusammen und gibst den aus. Ausgeführt wird da nichts.

Das wäre auch unüblich bis falsch. Aktiviere das venv _vor_ dem Befehl das Script zu starten oder verwende den Interpreter aus dem venv um das Script zu starten.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1221
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Die ganzen Fehler würde ich außerhalb der Funktion abfangen. Das Python-Programm einfach mit dem Interpreter aus dem venv direkt starten.
Paramiko unterstützt Kontextmanager.

Code: Alles auswählen

import socket
from getpass import getpass
from pathlib import Path

from paramiko import AutoAddPolicy, SSHClient
from paramiko.ssh_exception import AuthenticationException, NoValidConnectionsError


def execute_remote_script(hostname, port, username, password, python_venv, script_path):
    with SSHClient() as client:
        client.set_missing_host_key_policy(AutoAddPolicy())
        client.connect(hostname, port=port, username=username, password=password)

        _, stdout, stderr = client.exec_command(f"{python_venv} {script_path}")
        output = stdout.read().decode()
        error = stderr.read().decode()

    if error:
        raise RuntimeError(f"Fehler beim Ausführen des Skripts: {error}")

    return output


try:
    output = execute_remote_script(
        "archive.server101.icu",
        22,
        "public",
        getpass("Passwort: "),
        "/home/public/.pyenv/versions/3.12.5/bin/python",
        "test.py",
    )
except socket.gaierror:
    print("Kann DNS nicht auflösen.")
except NoValidConnectionsError:
    print("Kann SSH-Verbindung nicht aufbauen.")
except AuthenticationException:
    print("Authentifizierung fehlgeschlagen. Passwort richtig?")
except RuntimeError as e:
    print(e.args[0])
else:
    print(output)

sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13999
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@GIJoe007: Neben dem Umstand, dass das aktivieren eines venv so nicht funktioniert, sollten auf Modulebene keine Variablen definiert werden. Also entweder müsste das Hauptprogramm auch in einer Funktion verschwinden, oder man bindet einfach das Zwischenergebnis nicht an einen Namen.

Der Code für `gpu_data` schreit nach einer „list comprehension“. Und dann muss man auch da nicht alles an Namen binden in der Funktion.

Code: Alles auswählen

import GPUtil
import psutil


def get_system_data():
    return {
        "cpu_usage": psutil.cpu_percent(interval=1),
        "ram_usage": psutil.virtual_memory().percent,
        "gpu_data": [
            {
                "id": gpu.id,
                "name": gpu.name,
                "load": gpu.load * 100,
                "memoryTotal": gpu.memoryTotal,
                "memoryUsed": gpu.memoryUsed,
                "memoryFree": gpu.memoryFree,
                "temperature": gpu.temperature,
                "uuid": gpu.uuid,
            }
            for gpu in GPUtil.getGPUs()
        ],
    }


if __name__ == "__main__":
    print(f"System Data: {get_system_data()}")
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten