Skip to content

xpu-smi --query-gpu during Vulkan llama.cpp inference causes VK_ERROR_DEVICE_LOST on Arc B390 (Windows) #164

Description

@mschuettlerTNG

Hi!

While developing a feature to display GPU utilization in https://github.com/intel/AI-Playground/ we stumbled upon an issue where querying the information via xpu-smi during inference via llama.cpp (Vulkan / Windows) caused the device to crash. Below is an AI generated summary and reproducer. Let me know if you need more info or if this is too far outside the xpu-smi use-case.

Best,
Markus

Summary

Polling GPU metrics with xpu-smi --query-gpu=… while llama.cpp is running a Vulkan decode on the same Intel Arc GPU causes a Vulkan device lost. llama.cpp then fails with:

E ggml_vulkan: device lost on Vulkan0
E ggml_vulkan: getFenceStatus at ggml/src/ggml-vulkan/ggml-vulkan.cpp:2646
E srv  update_slots: decode() failed: vk::Device::getFenceStatus: ErrorDeviceLost

xpu-smi itself keeps running and prints plausible CSV. The inference process is the one that dies.

The same inference completes if xpu-smi is not running. Windows PDH GPU Engine counters (\GPU Engine(*)\Utilization Percentage) polled on the same cadence also do not trigger the loss — only the Level Zero xpu-smi query does.

No Windows System TDR (event 4101) is logged. The loss is visible to Vulkan only.

Environment

OS Windows 11 Pro 10.0.26200
GPU Intel Arc B390
Graphics driver 32.0.101.8974
xpu-smi 2.1.0.20250225 (8389eee7)
Level Zero 1.32.0
llama.cpp win-vulkan-x64, 0.3.0-dev build 10666 (4e97ac86e)
Model Qwen3.5-9B-Q4_K_M.gguf, --gpu-layers 999 --ctx-size 32000 -fa on --no-mmap --cache-ram 16384

How to reproduce

Two processes only: stock llama-server and a 2-second xpu-smi loop. No other app.

  1. Start llama.cpp (Vulkan):
llama-server.exe --model Qwen3.5-9B-Q4_K_M.gguf --port 39110 --ctx-size 32000 --gpu-layers 999 --log-prefix --jinja --no-mmap -fa on --cache-ram 16384 --host 127.0.0.1
  1. Wait until GET http://127.0.0.1:39110/health returns {"status":"ok"}.

  2. In another terminal, poll every 2s (this is the query this xpu-smi 2.1 build accepts):

:loop
xpu-smi.exe --query-gpu=index,name,utilization.gpu,memory.used,memory.total,power.draw,clocks.current.graphics --format=csv,noheader,nounits
timeout /t 2 /nobreak >nul
goto loop
  1. Send a generation long enough to overlap several polls (~12s / ~200 tokens is enough):
curl http://127.0.0.1:39110/v1/chat/completions -H "Content-Type: application/json" -d "{\"messages\":[{\"role\":\"user\",\"content\":\"Write a complete single-file HTML and JavaScript tic-tac-toe game.\"}],\"max_tokens\":1024,\"temperature\":0.7}"

Expected: completion finishes (~19 t/s on this box).

Actual: around 160–190 generated tokens (~12s into decode) llama-server returns HTTP 500:

{"error":{"code":500,"message":"decode() failed: vk::Device::getFenceStatus: ErrorDeviceLost","type":"server_error"}}

Isolation

Same llama-server, same prompt, 2s poll interval:

Concurrent sampler Result
none (control) OK, 512 tokens @ ~19.6 t/s
Windows PDH \GPU Engine(*)\Utilization Percentage only OK, 1024 tokens
xpu-smi --query-gpu=… on the first request after a fresh server device-lost at ~160–190 tokens
xpu-smi --query-gpu=… on a later request device-lost

While the query is running, xpu-smi reports the card busy (example: util ~14%, power ~24 W, clock 2500 MHz, memory.used ~35 GiB on this iGPU). After the Vulkan loss, later PDH engine rows drop to 0.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions