Hintergrund & Funktionsweise
Vielleicht haben Sie sich ebenfalls schon einmal die Frage gestellt, wie es möglich ist den oft in Notebooks verbauten integrierten Grafikprozessor (iGPU) von Intel für KI-Anwendungen zu nutzen. Unter Windows 111 in Verbindung mit WSL22 und dem Model-Server OpenVINO3 auf Basis der Container Management Umgebung Podman4 ist das relativ einfach umzusetzen. Dieser Artikel beschreibt die notwendigen Schritte, um schlussendlich eine Kommunikation mit einem Large Language Model zu ermöglichen. Anhand des Modells “DeepSeek-R1-Distill-Qwen-7B”5 wird gezeigt wie dies sicher lokal möglich ist. Nach Ausführung der gezeigten Schritte kann mit dem Modell per “Chat Completions” auf Basis der OpenAI-API6 kommuniziert werden.
Folgende Features werden unterstützt:
- Sichere lokale Nutzung von Large Language Modellen (LLMs) innerhalb der WSL2-Umgebung
- Lokaler Betrieb des OpenVINO Model-Servers auf Basis von Container Virtualisierung mit Podman
- Nutzung der lokalen iGPU von Intel für Inference des Modells innerhalb des Containers
- Lokale Prompts an das Modell “DeepSeek-R1-Distill-Qwen-7B”
Voraussetzungen
- Mindestens Windows 11 ist installiert
- WSL2 muss unter Windows 11 aktiviert sein
-
→ Eine WSL2-Linux-Distribution ist installiert
- Die Schritte 1-3 sind bereits ausgeführt
Schritte
-
Starten des installierten Subsystems
- innerhalb der Windows Eingabeaufforderung -
- Die Tastenkombination Windows-Taste + R-Taste betätigen
- Im kleinen Fenster cmd eingeben und mit der Return-Taste bestätigen oder OK klicken
- System starten
wsl -d mylinux
- Hinweise:
- Die Windows Eingabeaufforderung wechselt in das Terminal der Linux-Distribution
- Der Distributionsname “mylinux” wurde innerhalb eines vorherigen Artikels festgelegt, siehe → 3. Voraussetzung
-
Distribution aktualisieren
- innerhalb des Terminals der Linux-Distribution -
- APT-Repositories updaten und Pakete upgraden
sudo apt update && sudo apt upgrade -y
- APT-Repositories updaten und Pakete upgraden
-
Installieren der Intel GPU Treiber
- innerhalb des Terminals der Linux-Distribution -
-
Key des APT-Repositories für Grafik-Treiber von Intel hinzufügen
sudo wget -qO - https://repositories.intel.com/gpu/intel-graphics.key | sudo gpg --yes --dearmor --output /usr/share/keyrings/intel-graphics.gpg
-
APT-Repository hinzufügen
sudo echo "deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu noble unified" | sudo tee /etc/apt/sources.list.d/intel-gpu-noble.list
-
APT-Repositories updaten und Treiber installieren
sudo apt update && sudo apt install -y libze-intel-gpu1 intel-opencl-icd clinfo
-
Optional: Benutzer zur Render-Gruppe hinzufügen
- für den Fall, dass der aktuell angemeldete User NICHT “root” ist (check per “whoami”-Befehl) -
sudo gpasswd -a ${USER} render
-
Überprüfen ob GPU korrekt erkannt wird
clinfo | grep "Device Name"
- Die resultierende Ausgabe sollte folgendermaßen aussehen
Device Name Intel(R) Graphics [0x7d45] Device Name Intel(R) Graphics [0x7d45] Device Name Intel(R) Graphics [0x7d45] Device Name Intel(R) Graphics [0x7d45]
- Die resultierende Ausgabe sollte folgendermaßen aussehen
-
-
Vorbereiten des Modells
- innerhalb des Terminals der Linux-Distribution -
- Python Manager für virtuelle Umgebungen installieren
sudo apt install -y python3.12-venv
- Virtuelle Python-Umgebung erzeugen
python3 -m venv ~/venv-optimum-cli
- Virtuelle Python-Umgebung aktivieren
. ~/venv-optimum-cli/bin/activate
- Installieren des Optimum CLI
python -m pip install "optimum-intel[openvino]"@git+https://github.com/huggingface/optimum-intel.git@v1.22.0
- Download des Modells und Durchführung der Quantisierung
optimum-cli export openvino --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --weight-format int4 ~/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
- Virtuelle Python-Umgebung deaktivieren
deactivate
- Model-Repository Konfiguration anlegen
tee ~/models/config.json > /dev/null <<EOT { "mediapipe_config_list": [ { "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", "base_path": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B" } ], "model_config_list": [] } EOT
- MediaPipe-Graph anlegen für HTTP-Inference
tee ~/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B/graph.pbtxt > /dev/null <<EOT input_stream: "HTTP_REQUEST_PAYLOAD:input" output_stream: "HTTP_RESPONSE_PAYLOAD:output" node: { name: "LLMExecutor" calculator: "HttpLLMCalculator" input_stream: "LOOPBACK:loopback" input_stream: "HTTP_REQUEST_PAYLOAD:input" input_side_packet: "LLM_NODE_RESOURCES:llm" output_stream: "LOOPBACK:loopback" output_stream: "HTTP_RESPONSE_PAYLOAD:output" input_stream_info: { tag_index: 'LOOPBACK:0', back_edge: true } node_options: { [type.googleapis.com / mediapipe.LLMCalculatorOptions]: { models_path: "./", plugin_config: '{ }', enable_prefix_caching: false, cache_size: 2, max_num_seqs: 256, device: "GPU", } } input_stream_handler { input_stream_handler: "SyncSetInputStreamHandler", options { [mediapipe.SyncSetInputStreamHandlerOptions.ext] { sync_set { tag_index: "LOOPBACK:0" } } } } } EOT
- Python Manager für virtuelle Umgebungen installieren
-
Installieren der Container Management Umgebung
- innerhalb des Terminals der Linux-Distribution -
- Podman installieren
sudo apt install -y podman
- Podman installieren
-
Deployment des Modell Servers
- innerhalb des Terminals der Linux-Distribution -
- OpenVINO Image herunterladen und Container starten
podman run -d --name openvino-server --device /dev/dri/card0 --device /dev/dri/renderD128 --device /dev/dxg --group-add=$(stat -c "%g" /dev/dri/render*) --group-add=$(stat -c "%g" /dev/dxg) --rm -p 8000:8000 -v ~/models:/workspace:ro -v /usr/lib/wsl:/usr/lib/wsl docker.io/openvino/model_server:2025.0-gpu --rest_port 8000 --config_path /workspace/config.json
- OpenVINO Image herunterladen und Container starten
-
Testen des Modell Servers
- innerhalb des Terminals der Linux-Distribution -
- Konfigurations-Endpunkt des OpenVINO Servers anfragen
curl http://localhost:8000/v1/config
- Die Response des Requests sollte folgendermaßen aussehen:
{ "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B": { "model_version_status": [ { "version": "1", "state": "AVAILABLE", "status": { "error_code": "OK", "error_message": "OK" } } ] }
- Die Response des Requests sollte folgendermaßen aussehen:
- Konfigurations-Endpunkt des OpenVINO Servers anfragen
-
Mit dem Modell kommunizieren
- innerhalb des Terminals der Linux-Distribution -
- Einfaches Python-basiertes Chat-Tool für Demozwecke abspeichern
tee ~/ovchat.py > /dev/null <<EOT import requests, json, readline USER_COLOR, ASSISTANT_COLOR, RESET_COLOR = "\033[94m", "\033[92m", "\033[0m" LOCAL_SERVER_URL = 'http://localhost:8000/v3/chat/completions' def chat_with_local_server(messages): response = requests.post(LOCAL_SERVER_URL, json={"model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", "messages": messages, "stream": True}, stream=True) if response.status_code == 200: for line in response.iter_lines(): if line: try: raw_data = line.decode('utf-8') if raw_data.startswith("data: "): raw_data = raw_data[6:] if raw_data == '[DONE]': break json_data = json.loads(raw_data) if 'choices' in json_data: message_content = json_data['choices'][0]['delta'].get('content', '') if message_content: print(ASSISTANT_COLOR + message_content + RESET_COLOR, end='', flush=True) except json.JSONDecodeError as e: print(f"JSON-Error: {e}") except Exception as e: print(f"Exception: {e}") else: print(f"Fehler: {response.status_code} - {response.text}") def main(): messages = [{"role": "system", "content": "You're a helpful assistent."}] print("Type 'exit' quitting.") while True: user_input = input(USER_COLOR + "\nYou: " + RESET_COLOR) if user_input.lower() == 'exit': break messages.append({"role": "user", "content": user_input}) print(ASSISTANT_COLOR + "Assistent: " + RESET_COLOR, end=' ') chat_with_local_server(messages) if __name__ == "__main__": main() EOT
- Mit dem Modell chatten
python3 ~/ovchat.py
- Einfaches Python-basiertes Chat-Tool für Demozwecke abspeichern
-
GPU-Nutzung verifizieren
- innerhalb der Windows Eingabeaufforderung -
- Die Tastenkombination Windows-Taste + R-Taste betätigen
- Im kleinen Fenster taskmgr eingeben und mit der Return-Taste bestätigen oder OK klicken
- Auf den Reiter “Leistung” wechseln
- Während der Kommunikation mit dem Modell sollte das Diagramm eine deutliche Auslastung der GPU zeigen:
- Während der Kommunikation mit dem Modell sollte das Diagramm eine deutliche Auslastung der GPU zeigen:
Quellen
- ↗ https://dgpu-docs.intel.com/driver/client/overview.html
- ↗ https://docs.openvino.ai/2025/get-started/install-openvino/configurations/configurations-intel-gpu.html
- ↗ https://huggingface.co/docs/optimum/main/en/intel/openvino/export
- ↗ https://docs.openvino.ai/2025/model-server/ovms_docs_deploying_server_docker.html
- ↗ https://docs.openvino.ai/2025/model-server/ovms_docs_mediapipe.html
- ↗ https://github.com/openvinotoolkit/model_server/blob/main/docs/llm/reference.md
- ↗ https://ai.google.dev/edge/mediapipe/framework/framework_concepts/graphs