Back openDesk Edu for a sovereign, open-source education â every vote counts.
Vote nowSave products you love by clicking the heart icon.
WebGPU hat den Baseline-Status erreicht, Safari hat endlich WebXR implementiert, KI-gestĂŒtzte XR-Entwicklung von Meta und Google ist angekommen und die Adaption ist um 40 % gestiegen. Ein nĂŒchterner Blick auf das immersive Web-Ăkosystem Mitte 2026.
Practical patterns for integrating LLMs, VLMs, and neural networks with immersive XR environments â from spatial AI assistants to real-time scene understanding.
Real-time XR erfordert kompromisslose Performance. VR-Headsets rendern mit 90+ fps. Mixed-Reality-Overlays mĂŒssen die Kopfbewegungen mit einer Latenz im Sub-Millisekundenbereich tracken. AI-Inferenz â fĂŒr das SzenenverstĂ€ndnis, die Objekterkennung oder konversationale NPCs â muss in unter 16 ms abgeschlossen sein, um Frame-Drops zu vermeiden.
Dieser Artikel ist ein praktischer Leitfaden zur Optimierung der AI-Inferenz fĂŒr XR-Workloads. Wir behandeln Modell-Quantisierung, NPU-Beschleunigung, hierarchisches Serving (Device â Edge â Cloud), Bandbreitenoptimierung und Offloading-Frameworks, die Ihre XR-App reaktionsschnell halten.
Ihr gesamtes Latenzbudget betrÀgt 16,6 ms pro Frame (60 fps) oder 11,1 ms pro Frame (90 fps). Dieses Budget muss auf folgende Komponenten aufgeteilt werden:
| Komponente | Latenz (typisch) | Verbleibendes Budget (90 fps) |
|---|---|---|
| 6-DoF Pose Estimation | 2-4 ms | 7-9 ms |
| Scene Graph Traversal | 1-2 ms | 5-8 ms |
| AI-Inferenz | 3-8 ms (Ziel) | 0-5 ms |
| Rendering (foveated) | 4-6 ms | -2 ms bis 1 ms (ĂŒber Budget!) |
| Warp/Compose | 2-3 ms | -5 ms bis -2 ms |
Das Budget fĂŒr die AI-Inferenz ist knapp â und Sie können keine Zeit von der Pose Estimation oder dem Warping abziehen, ohne Ăbelkeit (Motion Sickness) zu verursachen.
Faustregel: FĂŒr VR muss die AI-Inferenz insgesamt in weniger als 10 ms pro Frame abgeschlossen sein. FĂŒr AR haben Sie etwas mehr Spielraum (bis zu 15 ms), da ein verzögertes Overlay keine Bewegungskrankheit auslöst.
Quantisierung reduziert die ModellprÀzision von 32-Bit-Floats auf 8-Bit-Integer, wodurch der Speicherbedarf um den Faktor 4 sinkt und die Inferenz auf CPUs, NPUs und GPUs um das 2- bis 4-fache beschleunigt wird.
| Modell | FP16 | INT8 | Speedup (INT8 vs FP16) | QualitÀtsverlust |
|---|---|---|---|---|
| LLaMA-7B | 14 GB | 3,5 GB | 2-3x | weniger als 1 % Perplexity |
| Phi-3-mini | 3 GB | 750 MB | 2-3x | VernachlÀssigbar |
| DistilBERT | 420 MB | 105 MB | 3-4x | weniger als 0,5 % F1 |
| Florence-2 (VLM) | 5 GB | 1,25 GB | 2-3x | weniger als 1 % COCO mAP |
| MobileNetV3 (object det) | 28 MB | 7 MB | 3-4x | weniger als 0,5 % mAP |
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "microsoft/Phi-3-mini-4k-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float16)
quantized_model = torch.quantization.quantize_dynamic(
model,
{torch.nn.Linear},
dtype=torch.qint8
)
# Save for XR deployment
quantized_model.save_pretrained("./phi-3-int8")
import * as tf from "@tensorflow/tfjs";
async function quantizeModel(url) {
// Load FP16 model
const model = await tf.loadGraphModel(url);
// Quantize to INT8
const quantizedModel = tf.quantization.quantize(model, {
quantizationBytes: 1, // 8-bit
isSigned: true,
});
// Save for browser deployment
await quantizedModel.save("indexeddb://quantized-xr-model");
}
Quantisierung ist fĂŒr Klassifizierungs- und Detektionsaufgaben fast immer sicher. FĂŒr generative Modelle (LLMs, Diffusion) verwenden Sie:
Vermeiden Sie aggressive Quantisierung (4-Bit oder niedriger) fĂŒr generative Modelle, es sei denn, eine verschlechterte AusgabequalitĂ€t ist akzeptabel.
Neural Processing Units (NPUs) sind speziell fĂŒr Matrixoperationen konzipiert â das HerzstĂŒck der AI-Inferenz. Sie bieten eine 2- bis 10-mal bessere Performance pro Watt als CPUs oder GPUs.
| GerĂ€t | NPU | TOPS (INT8) | Framework-UnterstĂŒtzung |
|---|---|---|---|
| Meta Quest 3 | Snapdragon 8 Gen 2 NPU | 30+ | Qualcomm QNN, ONNX Runtime |
| Apple Vision Pro | Apple Neural Engine | 18+ | Core ML, Metal |
| HoloLens 2 | Snapdragon 850 NPU | 4+ | WinML, ONNX Runtime |
| Magic Leap 2 | Keine dedizierte NPU | â | Nur CPU |
from transformers import AutoModel
import torch
import onnx
from onnxruntime.quantization import quantize_dynamic, QuantType
model_id = "microsoft/Phi-3-mini-4k-instruct"
model = AutoModel.from_pretrained(model_id, torch_dtype=torch.float16)
# Export to ONNX
dummy_input = torch.randint(0, 32000, (1, 512))
torch.onnx.export(
model,
dummy_input,
"phi-3.onnx",
input_names=["input_ids"],
output_names=["logits"],
dynamic_axes={"input_ids": {"0": "batch_size"}, "logits": {"0": "batch_size"}},
opset_version=17
)
quantize_dynamic( "phi-3.onnx", "phi-3-quant.onnx", weight_type=QuantType.QUInt8 )
### Running on Quest 3 (QNN SDK)
```python
import qnn
from qnn import Model as QNNModel
# ONNX-Modell laden
qnn_model = QNNModel.from_onnx("phi-3-quant.onnx")
# FĂŒr Snapdragon NPU kompilieren
backend_config = qnn.BackendConfig(
backend_type="HTP", # Hexagon Tensor Processor
performance_mode="high_performance"
)
compiled_model = qnn_model.compile(backend_config)
# Inferenz
input_ids = np.array([[1, 2, 3, 4, 5]], dtype=np.int64)
output = compiled_model.run(input_ids)
// WebGPU stellt Compute-Shader fĂŒr NPU-Beschleunigung bereit
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
// ONNX-Modell ĂŒber WebGPU-Backend laden
const session = await ort.InferenceSession.create("phi-3-quant.onnx", {
executionProviders: ["webgpu"],
});
// Inferenz
const feeds = { input_ids: new ort.Tensor("int64", inputArray, ["1", "5"]) };
const results = await session.run(feeds);
Not all inference can run on-device. When models are too large or require external data, hierarchical serving distributes the workload.
XR-Device (NPU) â Edge-Server (GPU) â Cloud (Multi-GPU)
â â â
weniger als 10ms weniger als 50ms weniger als 200ms
(Objekterkennung) (LLM, VLM, (Foundation-
Szenenanalyse) Modelle)
| Layer | Model types | Latency target | Use cases |
|---|---|---|---|
| Device (NPU) | Object detection, pose tracking, audio ASR | less than 10ms | Real-time feedback, offline mode |
| Edge (GPU) | LLMs (7-13B), VLMs, spatial mapping | less than 50ms | Conversational NPCs, scene understanding |
| Cloud (multi-GPU) | Foundation models (70B+), batch processing | less than 200ms | Offline training, complex queries |
# xr-edge-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: xr-llm-server
namespace: xr
spec:
replicas: 2
selector:
matchLabels:
app: xr-llm-server
template:
metadata:
labels:
app: xr-llm-server
spec:
nodeSelector:
gpu: "true"
containers:
- name: vllm
image: vllm/vllm-openai:latest
resources:
limits:
nvidia.com/gpu: 1
env:
- name: MODEL
value: "microsoft/Phi-3-mini-4k-instruct"
- name: QUANTIZATION
value: "awq"
- name: MAX_TOKENS
value: "128"
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: xr-llm-service
namespace: xr
spec:
selector:
app: xr-llm-server
ports:
- port: 8000
type: LoadBalancer
async function inferenceWithFallback(input, type) {
// Try device NPU first
try {
return await deviceInference(input, type);
} catch (e) {
console.warn("Device inference failed, falling back to edge");
}
// Fall back to edge
const edgeLatency = await measureEdgeLatency();
if (edgeLatency < 50) {
return await edgeInference(input, type);
}
// Final fallback to cloud
console.warn("Edge unavailable, using cloud");
return await cloudInference(input, type);
}
async function deviceInference(input, type) {
const session = await ort.InferenceSession.create(`${type}-quant.onnx`, {
executionProviders: ["webgpu", "wasm"],
});
const results = await session.run({ input });
return results;
}
Wenn die Latenzbudgets knapp sind, entscheidet ein intelligentes Offloading, wo die Inferenz ausgefĂŒhrt wird.
Ada ist ein Open-Source-Framework, das die Inferenz basierend auf Energiebudgets und Latenzzielen ĂŒber Device, Edge und Cloud verteilt.
from ada import InferenceEngine
engine = InferenceEngine(
device_model="mobilenetv3-int8.onnx",
edge_model="faster-rcnn-quant.onnx",
cloud_model="sam-2.7b.onnx",
power_budget_watts=2.0, // NPU power limit
latency_budget_ms=10
)
# Ada automatically routes to the best target
result = engine.inference(input_frame)
# If device overheats or exceeds budget, Ada routes to edge
XRgo fĂŒhrt die 6-DoF-Reprojektion direkt auf dem GerĂ€t aus, wĂ€hrend rechenintensive Aufgaben an die Edge ausgelagert werden.
import xrgo from "xrgo";
// Initialize
const engine = await xrgo.Engine.init({
mode: "6dof-reprojection",
edgeServer: "wss://edge.xr.example.com/ws",
deviceModel: "mobilenetv3-quant.onnx",
});
// Render loop
xrSession.requestAnimationFrame(async (time, frame) => {
const pose = frame.getViewerPose(referenceSpace);
// Reprojection on-device (1-2ms)
const reprojected = await engine.reproject(pose);
// Offload object detection to edge (5-10ms)
const objects = await engine.detectObjects(reprojected.colorBuffer);
// Render
renderScene(objects, reprojected);
});
Deep Reinforcement Learning (DRL)-Agenten erlernen optimale Offloading-Strategien, indem sie Netzwerkbedingungen, die Energieversorgung des GerÀts und Latenzziele beobachten.
import gymnasium as gym
from stable_baselines3 import PPO
# Define offloading environment
env = gym.make("XROffloading-v0", config={
"network_conditions": ["4g", "5g", "wifi"],
"device_power_states": ["low", "medium", "high"],
"latency_budget_ms": 10
})
# Train DRL agent
model = PPO("MlpPolicy", env, verbose=1)
model.learn(total_timesteps=100000)
# Agent learns to offload based on:
# - Current network bandwidth and latency
# - Device temperature and battery
# - Model complexity and queue depth
Wenn die Inferenz auĂerhalb des GerĂ€ts lĂ€uft, wird die Netzwerkbandbreite zum Flaschenhals. Drei Techniken helfen hierbei:
| Technik | Kompressionsrate | QualitÀtsverlust | Wann zu verwenden |
|---|---|---|---|
| Pruning | 2-5x | weniger als 1% Genauigkeit | Ăberparametrisierte Modelle |
| Quantisierung | 4x (FP16âINT8) | weniger als 0,5% | Fast immer |
| Knowledge Distillation | 2-3x | 1-3% | Wenn ein Teacher-Modell vorhanden ist |
| LoRA-Adapter | 10x (Base + Adapter) | VernachlÀssigbar | LLM-Fine-Tuning |
| Beispiel fĂŒr Pruning: |
import torch.nn.utils.prune as prune
# Prune 50% of weights in linear layers
for module in model.modules():
if isinstance(module, torch.nn.Linear):
prune.l1_unstructured(module, name="weight", amount=0.5)
# Fine-tune to recover accuracy
fine_tune(model, training_data)
# Remove pruning masks permanently
for module in model.modules():
if isinstance(module, torch.nn.Linear):
prune.remove(module, "weight")
Senden Sie zuerst grobe Ergebnisse und verfeinern Sie diese progressiv. Dies ist entscheidend fĂŒr interaktives XR.
async function streamDetectionResults(frame) {
// Send request with progressive=enabled
const response = await fetch("/api/detect", {
method: "POST",
headers: { "X-Progressive": "enabled" },
body: frame,
});
const reader = response.body.getReader();
let coarseResult = await reader.read(); // First chunk (50ms)
// Render coarse result immediately
renderOverlay(coarseResult);
// Refine in background
let refinedResult = await reader.read(); // Second chunk (100ms)
updateOverlay(refinedResult);
}
Senden Sie nur geÀnderte Daten zwischen den Frames, nicht die vollstÀndigen Inferenz-Ergebnisse.
class DeltaTracker {
constructor() {
this.lastFrame = null;
}
computeDelta(currentFrame) {
if (!this.lastFrame) {
this.lastFrame = currentFrame;
return currentFrame;
}
const delta = {
added: [],
removed: [],
modified: [],
};
// Object tracking by ID
for (const obj of currentFrame.objects) {
const lastObj = this.lastFrame.objects.find((o) => o.id === obj.id);
if (!lastObj) {
delta.added.push(obj);
} else if (JSON.stringify(obj) !== JSON.stringify(lastObj)) {
delta.modified.push(obj);
}
}
delta.removed = this.lastFrame.objects.filter(
(o) => !currentFrame.objects.find((c) => c.id === o.id),
);
this.lastFrame = currentFrame;
return delta;
}
}
Bevor Sie die KI-Inferenz in einer XR-Produktionsumgebung bereitstellen, prĂŒfen Sie Folgendes:
Diese Benchmarks stammen von realen GerÀten und Infrastrukturen:
| Szenario | GerÀt | Modell | Latenz (p95) | FPS |
|---|---|---|---|---|
| Objekterkennung (MobileNetV3-INT8) | Quest 3 (NPU) | mobilenetv3-int8.onnx | 6ms | 166 |
| LLM Chat (Phi-3-mini-AWQ) | Edge RTX 4090 | vllm | 35ms | 28 |
| Szenenbeschreibung (Florence-2-INT8) | Edge RTX 4090 | hf | 45ms | 22 |
| Pose Tracking (MediaPipe) | Quest 3 (NPU) | mediapipe.tasks | 4ms | 250 |
| 6-DoF Reprojektion (XRgo) | Quest 3 (GPU) | xrgo | 8ms | 125 |
Kernaussage: On-Device-Inferenz fĂŒr Erkennung und Tracking ist heute machbar. LLMs und VLMs erfordern fĂŒr Echtzeit-Interaktionen ein Edge-Deployment.
Wenn die KI-Inferenz korrekt optimiert ist, wird XR wirklich immersiv â reaktionsschnell, intelligent und stĂ€ndig einsatzbereit. Die Techniken in diesem Artikel helfen Ihnen dabei, Ihr Latenzbudget einzuhalten und gleichzeitig die QualitĂ€t zu bewahren.