Skip to content

Eval bug: [SYCL] Qwen3-Next architecture: layer-split tensor allocation broken on dual Intel Arc Pro B70 (Battlemage/Xe2) on master b9093 #22885

Description

@david-bue

load_attempt.log

[SYCL] Qwen3-Next architecture: layer-split tensor allocation broken on dual Intel Arc Pro B70 (Battlemage/Xe2) on master b9093

Summary

Loading Qwen3-Coder-Next 80B-A3B (arch = qwen3next) on dual Intel Arc Pro B70 with --split-mode layer --tensor-split 50,50 requests a single 25.4 GB (25,371,093,248 byte) allocation on SYCL0, ignoring the tensor-split distribution across the two cards. Each card has 32 GB free at load time, so the model (46.20 GiB total) should fit comfortably split 50/50 with KV cache headroom.

The same model loaded successfully under Windows on the official prebuilt SYCL release from a few weeks earlier (asymmetric distribution: SYCL0 ~30.4 GB, SYCL1 ~31.3 GB). PMZFX's public benchmark of this exact model on dual B70 reports 43.4 t/s on commit ec6f7a6a5c (build b8840-12, 2026-04-21).

Reproduction

Hardware

  • 2× Intel Arc Pro B70 (BMG-G31, full Big Battlemage die)
  • 32 GB GDDR6 ECC per card, PCIe Gen 4 x8 each
  • AMD Ryzen 5 4500, 64 GB system RAM
  • ASRock B550M-A motherboard

Software

  • Fedora 44, kernel 6.19.10-300.fc44.x86_64
  • Intel Compute Runtime 26.09.37435.12
  • oneAPI Level Zero 1.28.2 (V1, V2 disabled via SYCL_UR_USE_LEVEL_ZERO_V2=0)
  • Intel oneAPI 2026.0.0 (DPC++ compiler 2026.0.0.20260331)
  • llama.cpp commit 1e5ad35d5 (build 9093, master HEAD as of 2026-05-09)

Build

cmake -B build \
  -DGGML_SYCL=ON \
  -DGGML_SYCL_F16=ON \
  -DGGML_SYCL_TARGET=INTEL \
  -DCMAKE_C_COMPILER=icx \
  -DCMAKE_CXX_COMPILER=icpx \
  -DGGML_NATIVE=ON \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_C_FLAGS_RELEASE="-O3 -DNDEBUG" \
  -DCMAKE_CXX_FLAGS_RELEASE="-O3 -DNDEBUG" \
  -G Ninja
cmake --build build --config Release -j 4

Build completes cleanly. llama-server --version confirms IntelLLVM 2026.0.0.

Environment

export SYCL_UR_USE_LEVEL_ZERO_V2=0
export GGML_SYCL_DISABLE_OPT=1
export UR_L0_ENABLE_RELAXED_ALLOCATION_LIMITS=1

Launch command

./build/bin/llama-server \
  -m Qwen3-Coder-Next-UD-Q4_K_XL.gguf \
  -ngl 99 \
  --split-mode layer \
  --tensor-split 50,50 \
  -c 32768 \
  -np 1 \
  --host 127.0.0.1 \
  --port 8080

Model: unsloth/Qwen3-Coder-Next-GGUF UD-Q4_K_XL quantization, 46.20 GiB on disk.

Result

Both devices are detected:

llama_prepare_model_devices: using device SYCL0 (Intel(R) Graphics [0xe223]) - 32568 MiB free
llama_prepare_model_devices: using device SYCL1 (Intel(R) Graphics [0xe223]) - 31790 MiB free

But tensor allocation immediately fails on a single 25.4 GB request to SYCL0:

load_tensors: loading model tensors, this can take a while... (mmap = true, direct_io = false)
ggml_backend_sycl_buffer_type_alloc_buffer: can't allocate 25371093248 Bytes of memory on device
alloc_tensor_range: failed to allocate SYCL0 buffer of size 25371093248
llama_model_load: error loading model: unable to allocate SYCL0 buffer
llama_model_load_from_file_impl: failed to load model

The 25.4 GB allocation pattern suggests the entire MoE expert tensor block (or a substantial fraction of model weights) is being allocated as a single contiguous SYCL buffer to SYCL0 before --tensor-split distribution kicks in. With 32 GB available, the allocation is just over the per-card limit but well within the dual-card combined budget.

sycl::ext::intel::experimental::level_zero per-allocation cap with UR_L0_ENABLE_RELAXED_ALLOCATION_LIMITS=1 should allow allocations >4 GB; that env var is set and earlier smaller failures (~8 GB) on a different model also bypassed the 4 GB limit, so the 25 GB request reaches the underlying memory pool, which simply doesn't have that much contiguous space on a single device.

Expected behavior

--split-mode layer --tensor-split 50,50 should distribute model weights across both SYCL devices so that no single allocation exceeds either card's free VRAM. With 32 GB free per card, a 46 GiB model split should produce roughly 23 GB per card.

Comparison with known-good build

PMZFX's public benchmarks (https://github.com/PMZFX/intel-arc-pro-b70-benchmarks) report this exact model loading and running at 43.4 t/s tg128 on commit ec6f7a6a5c (b8840-12, 2026-04-21) using --split-mode layer on the same hardware class. Their hardware.md confirms --split-mode layer works on dual B70 (and --split-mode row segfaults, separately).

The Windows official prebuilt SYCL release from approximately the same era (early-to-mid April 2026) also loaded this model successfully on the same physical hardware, with asymmetric distribution:

  • SYCL0: ~30.4 GB committed
  • SYCL1: ~31.3 GB committed

Strongly suggests a regression in the b8840 → b9093 window affecting dual-card allocation for qwen3next-architecture models.

Additional notes

  • --split-mode none and -ngl 99 on a single card cannot fit this 46 GiB model on a single 32 GB B70, so single-card fallback is not an option.
  • --split-mode row is reported separately as crashing on dual B70 (PMZFX hardware.md, not yet filed upstream).
  • A separate (likely related) failure occurs on Qwen3.6-27B (arch = qwen35, also hybrid attention/SSM) where the same dual-B70 SYCL build cannot allocate an 8.1 GB tensor regardless of context size. May share a root cause with this issue.

Full load attempt log

[Attached: load_attempt.log showing complete output from launch through failure]

llama.cpp version

$ ./build/bin/llama-server --version
version: 9093 (1e5ad35d5)
built with IntelLLVM 2026.0.0 for Linux x86_64

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions