Skip to content

VitisAI EP (VAIML): access violation (0xC0000005) kills the host during InferenceSession creation — Silero VAD and Sortformer, Ryzen AI 9 365, EP 1.8.68.0 #394

Description

@jkkma

Two public ONNX speech models reproducibly take the host process down with an access violation
(0xC0000005) during InferenceSession creation on the Vitis AI EP. One of them is Silero VAD,
which is 2.2 MiB and about as widely deployed as an ONNX graph gets, so the repro is cheap.

This is not a caught error — no exception reaches managed code, no CPU fallback happens, and the
process exits 139. An application cannot log it or degrade around it.

Environment

CPU AMD Ryzen AI 9 365 w/ Radeon 880M (Strix Point)
NPU driver 32.0.20102.3930 (2026-05-06)
XRT 2.21.0, hash 15e6319be8de1e76a6150111a3861729e988fdb5, 2026-05-07
NPU firmware 1.1.2.64
OS Windows 11 Home 25H2, build 26200.8873
EP VitisAIExecutionProvider, package MicrosoftCorporationII.WinML.AMD.NPU.EP.1.8 1.8.68.0
EP acquisition Windows ML — ExecutionProviderCatalog.GetDefault()EnsureReadyAsync(). The Ryzen AI SDK is not installed.
ONNX Runtime 1.23.x as supplied by Windows ML; the EP device reports ep.version 1.23.2
AI Engine Compiler RAI 1.8, build b69afd0, 2026-06-05, target aie2p

The hardware and the EP are otherwise healthy

Establishing this first, because it rules out a broken install:

  • xrt-smi validate passes all three tests: latency 68.0 µs, throughput 60,837 op/s, GEMM 51.3 TOPS.
  • Synthetic ONNX graphs compile through VAIML and execute on the arrayxrt-smi examine --report aie-partitions shows the process holding a hardware context across all 8 columns with
    9,538 completed submissions and 0 errors.
  • A static MatMul and a small Conv/Relu stack both compile and run correctly.

Repro 1 — Silero VAD

Model: silero_vad.onnx, 2.2 MiB, the standard published graph
(https://github.com/snakers4/silero-vad). Inputs input [1, N] float32, state [2, 1, 128] float32,
sr [1] int64.

Creating an InferenceSession with the Vitis AI EP appended crashes. Last log lines before the
fault:

WARNING: Logging before InitGoogleLogging() is written to STDERR
I... register_dynamicdispatch.cpp:49] Running DynamicDispatchOpRegister::register_ops
I... register_castavx.cpp:48] Running CastAvxOpRegister::register_ops
Exception Code: 0xC0000005
 #0 0x00007fff9db31576 (...\ExecutionProvider\vaiml.dll+0x921576)
 #1 0x00007fff9f136f36 (...\ExecutionProvider\vaiml.dll+0x1f26f36)
 #2 0x00007fff9f136d52 (...\ExecutionProvider\vaiml.dll+0x1f26d52)
 #3 0x00007fffa0886734 (...\ExecutionProvider\vaiml.dll+0x3676734)
 #4 0x00007fff9d5a1d05 (...\ExecutionProvider\vaiml.dll+0x391d05)
 ...
#28 0x00007ff85038e957 (C:\WINDOWS\System32\KERNEL32.DLL+0x2e957)
#29 0x00007ff85252ad6c (C:\WINDOWS\SYSTEM32\ntdll.dll+0xaad6c)

Process exit code 139. The full 30-frame stack is all vaiml.dll offsets and can be attached if
useful.

Note the graph contains an If around an RNN — If_0_then_branch__Inline_0__/decoder/rnn/Squeeze
is a node name in it. AMD's MIGraphX EP fails on the same model differently, with a clean parse
error naming that node, rather than crashing.

Repro 2 — NVIDIA Streaming Sortformer diarizer

Model: NVIDIA Streaming Sortformer 4spk v2.1 exported to ONNX, 452.6 MiB. Same EP, same crash code,
faulting one frame higher:

Fatal error.
0xC0000005
   at Microsoft.ML.OnnxRuntime.InferenceSession.Init(System.String,
      Microsoft.ML.OnnxRuntime.SessionOptions,
      Microsoft.ML.OnnxRuntime.PrePackedWeightsContainer)

This graph carries an explicit state tensor in and out across chunks and has no If/Loop.

Minimal C# repro

using Microsoft.ML.OnnxRuntime;
using Microsoft.Windows.AI.MachineLearning;

var catalog = ExecutionProviderCatalog.GetDefault();
await catalog.EnsureAndRegisterCertifiedAsync();

var env = OrtEnv.Instance();
var dev = env.GetEpDevices().First(d => d.EpName == "VitisAIExecutionProvider");

var opts = new SessionOptions();
opts.AppendExecutionProvider(env, new[] { dev }, new Dictionary<string, string>());

// crashes here — 0xC0000005, process exits 139
using var session = new InferenceSession(@"silero_vad.onnx", opts);

net10.0-windows10.0.26100.0, Microsoft.WindowsAppSDK 1.8.250916003, with
<WindowsPackageType>None</WindowsPackageType> set so the bootstrapper initialises.

What I would expect instead

Either compile the graph, or decline it and let ONNX Runtime place those nodes on the CPU — which is
what the EP does cleanly for every other unsupported construct I tested. In a matrix of eight
minimal graphs covering LSTM, GRU, If, Loop, carried state and control flow wrapping
recurrence, none crashed; each was either compiled or declined, and the declines were recorded
properly in graph_partition_trace.csv. So the crash is not simply "unsupported operator" — the
decline path exists and works.

Not a duplicate of

Happy to attach full logs, the preliminary-vaiml-pass-summary.txt / graph_partition_trace.csv
from the cache, or a trimmed repro project if that helps.

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