Data report, 4 November 2026

d1-Omni-2B on four GPUs

A 2B decision model that takes text, images, audio and video, measured on one labelled set across three Radeon GPUs and an Apple Silicon Mac: accuracy, calibration, latency and memory.

On the 366 text, audio and image answers that all four devices produced, d1-Omni-2B gets 360 right on every device. The six misses are one question, a German voice note labelled work that the model files under travel, and the text version of the same sentence is wrong too. Median text latency is 0.10 to 0.13 s on the three Radeon runs. The model is underconfident: every yes/no confidence bin is fully right, and mean probability on the correct answer is 0.899 against 0.949 for Clef-Flash 9B on the same text and image questions.

Server memory runs from 2.44 GiB at a physical batch size (ubatch) of 1024 to 4.56 GiB at 8192, and ubatch decides which video clips fit at all. The set is small: 37 records, 126 questions, 152 with stills. Read this as a first measurement, not a benchmark.

Model

d1-Omni-2B

PartValue
Modeld1-Omni-2B, LFM3 backbone, 2B parameters. A decision model: it answers typed questions with probabilities and writes no text.
FilesGGUF Q8_0, 1.85 GB, plus a separate Q8_0 multimodal projector (mmproj)
SourceLiquidAI/d1-Omni-2B-GGUF
Question typesnoul (yes/no), choice and score. multiple, extraction and boxes are not supported yet (model card).
Enginellama.cpp, build b11998. The model card asks for b11960 (v0.8.0) or newer. Vulkan (RADV) on the Radeon devices, Metal on the Mac.
Server flags-ngl 999, flash attention on, --jinja, --parallel 1, -b and -ub set to the same value N, context equal to N (ad hoc runs)

The engine requirement and the unsupported question types are vendor-reported and were not re-tested. Everything else in this report was measured.

Method

The set, the repeats and the wire

The set is 37 labelled records and 126 questions: 12 text controls, 12 synthetic voice notes (8 English, 4 German), 9 silent screen recordings and 4 screen recordings with a spoken soundtrack. Voice notes come from macOS text-to-speech at 16 kHz mono. Recordings are rendered frames, 1280x720 H.264 at 2 fps. Labels are known by construction. The last frame of each recording is also sent as a JPEG still, which adds 13 records and 26 questions, so d1 answers 152 questions per pass. The earlier "126 questions" figure counts only the original set.

ModalityRecordsQuestionsQuestion typesAsked
text1248noul, choice, scoreis_task, topic, urgency, language
audio1248noul, choice, scoresame four as text
image (stills)1326noul, choiceshows_error, app
video918noul, choiceshows_error, app
video+audio412noul, choiceshows_error, app, production
all37 + 13 stills126 + 26 = 15254 noul, 74 choice, 24 score

urgency is a 4-level score (can wait, this week, today, right now). production asks whether the speaker says they are working on the production system.

Repeats. Each request was sent 3 times. d1 returned the same answers and nearly the same probabilities each time (the 8060S miss reads 0.182 on every repeat), so the repeats confirm determinism and give latency spread, not accuracy variance. The effective sample is 152 questions, not the 456 rows.

Wire. One System One request per record, with a task string in state and the questions in questions. Audio and video travel as base64 data URIs in files (WAV, MP4). A recording with a soundtrack sends the MP4 and its WAV as two files. Stills travel in images. Text controls carry the voice note's transcript in state.

Scoring. A yes/no answer is yes at probability 0.5 or above. A choice or score answer is the highest-probability option. p(correct) is the probability the model gave the labelled answer. Latency is wall-clock time per request, so p50 and p95 are over requests, with nearest-rank percentiles. Brier is the mean of (1 - p(correct))^2.

Devices

Results by device

Four devices ran the set. The Mac was shared with other work, so its latency is indicative only.

DeviceBackendubatchRowsAccuracyMean pp50 textp50 audiop50 imagep50 videop95 all
Radeon 8060S (Strix Halo)Vulkan81924560.9870.8860.13 s0.21 s0.68 s2.98 s5.56 s
Radeon AI PRO R9700Vulkan10243660.9840.8830.10 s0.19 s0.30 sdid not fit0.33 s
Radeon RX 7900 XTXVulkan40964050.9850.8900.11 s0.20 s0.40 s2.30 s (5 of 9 clips fit)2.31 s
Apple Silicon Mac (shared)Metal81923660.9840.8850.40 s1.42 s2.48 sfailed to decode3.52 s

Rows differ by device because video did not run everywhere (section on memory), so this accuracy column is not like-for-like. "p95 all" mixes modalities. The like-for-like table keeps only the text, audio and image rows every device ran:

DeviceubatchRowsCorrectAccuracyMean pBrier
Radeon 8060S (Strix Halo)8192366360/3660.9840.8850.0306
Radeon AI PRO R97001024366360/3660.9840.8830.0305
Radeon RX 7900 XTX4096366360/3660.9840.8850.0306
Apple Silicon Mac (shared)8192366360/3660.9840.8850.0305

All four devices give 360/366, and the same six rows are wrong on each. The 0.984 to 0.987 spread in the first table comes from which modalities ran, not from the device.

p50 text latency by devicep50 text latency in seconds: R9700 0.10, RX 7900 XTX 0.11, 8060S 0.13, Apple Silicon Mac 0.40 (shared with other work).0 s0.1 s0.2 s0.3 s0.4 sRadeon AI PRO R97000.10 sRadeon RX 7900 XTX0.11 sRadeon 8060S0.13 sApple Silicon Mac (shared)0.40 s, shared
Median text latency. Text requests are 298 to 326 tokens. The three Radeon runs differ by 0.03 s over 36 requests each, within run-to-run noise, so no ordering among them is claimed.
DeviceModalityRequestsp50 sp95 s
Radeon 8060S (Strix Halo)text360.130.23
Radeon 8060S (Strix Halo)audio360.210.37
Radeon 8060S (Strix Halo)image390.680.69
Radeon 8060S (Strix Halo)video272.983.71
Radeon 8060S (Strix Halo)video+audio125.575.58
Radeon AI PRO R9700text360.100.11
Radeon AI PRO R9700audio360.190.23
Radeon AI PRO R9700image390.300.33
Radeon RX 7900 XTXtext360.110.12
Radeon RX 7900 XTXaudio360.200.24
Radeon RX 7900 XTXimage390.400.47
Radeon RX 7900 XTXvideo152.302.45
Radeon RX 7900 XTXvideo+audio33.554.67
Apple Silicon Mac (shared)text360.401.24
Apple Silicon Mac (shared)audio361.425.21
Apple Silicon Mac (shared)image392.483.35

RX 7900 XTX video is 15 requests (five clips) and video+audio is 3 (one clip), so read those rows as single points. The Mac has no video rows: video failed to decode there.

Modality and question type

Results by modality and question type

Cells are correct/rows and mean p(correct). Rows are questions times 3 repeats, so the 3 text misses and 3 audio misses are the same question repeated.

ModalityRadeon 8060SRadeon AI PRO R9700Radeon RX 7900 XTXApple Silicon Mac
text141/144 p 0.888141/144 p 0.888141/144 p 0.888141/144 p 0.889
audio141/144 p 0.864141/144 p 0.863141/144 p 0.864141/144 p 0.864
image78/78 p 0.91878/78 p 0.91278/78 p 0.91878/78 p 0.917
video54/54 p 0.899not run30/30 p 0.937not run
video+audio36/36 p 0.879not run9/9 p 0.918not run

Only the 8060S run covers all five modalities:

ModalityRequestsRowsCorrectAccuracyMean pBrierp50 sp95 s
text36144141/1440.9790.8880.03020.130.23
audio36144141/1440.9790.8640.04120.210.37
image397878/781.0000.9180.01160.680.69
video275454/541.0000.8990.01652.983.71
video+audio123636/361.0000.8790.02555.575.58
all150456450/4560.9870.8860.02850.685.56

Audio has the lowest mean p of the single-input modalities (0.864) and carries the miss. Stills are the cleanest (78/78, 0.918). video+audio is the slowest because the clip and its soundtrack are both encoded.

By question type

TypeRadeon 8060SRadeon AI PRO R9700Radeon RX 7900 XTXApple Silicon Mac
noul162/162 p 0.910111/111 p 0.921132/132 p 0.924111/111 p 0.925
choice216/222 p 0.909177/183 p 0.908195/201 p 0.913177/183 p 0.910
score72/72 p 0.76172/72 p 0.76172/72 p 0.76172/72 p 0.761

Every miss is a choice question. Score questions (urgency) are all correct and carry the lowest mean p, 0.761 on every device.

By question and by modality, Radeon 8060S

QuestionTypeRowsCorrectMean p
appchoice7878/780.906
is_tasknoul7272/720.921
languagechoice7272/720.956
productionnoul1212/120.764
shows_errornoul7878/780.923
topicchoice7266/720.866
urgencyscore7272/720.761
Modalitynoul (yes/no)choicescore
text36/36 p 0.93569/72 p 0.92436/36 p 0.771
audio36/36 p 0.90769/72 p 0.89836/36 p 0.751
image39/39 p 0.93339/39 p 0.903none
video27/27 p 0.91127/27 p 0.887none
video+audio24/24 p 0.84212/12 p 0.954none

video+audio yes/no questions have the lowest mean p of the yes/no cells (0.842), driven by production (0.764), the one question that depends on the spoken soundtrack.

Calibration

Underconfident, and right in every bin

For a yes/no question the probability of the answer given is stored exactly, so a true reliability table can be built. Pooled over the four device runs (516 rows, same model and quant), every confidence bin is 100% right. d1 reports 0.625 mean confidence on 15 rows that were all right. Clef-Flash, 75 rows, shows the same pattern with three rows per bin below 0.9, so its bins say little. Expected calibration error is 0.0806 for d1 and 0.0632 for Flash, both driven by underconfidence.

Confidence in the answer givend1 rowsd1 accuracyd1 mean confidenceFlash rowsFlash accuracyFlash mean confidence
0.50 to 0.6000
0.60 to 0.70151.0000.62531.0000.677
0.70 to 0.8061.0000.76431.0000.768
0.80 to 0.90631.0000.85931.0000.833
0.90 to 0.953811.0000.939271.0000.928
0.95 to 1.00511.0000.955391.0000.984
all5161.0000.919751.0000.937

Across all question types the picture is the same. Bins are by the probability on the correct answer, pooled over 1,593 d1 rows:

p(correct) binRowsAnswered correctlyShare correctMean p
0.00 to 0.201200.0000.184
0.20 to 0.401200.0000.307
0.40 to 0.6024241.0000.503
0.60 to 0.7087871.0000.648
0.70 to 0.801141141.0000.757
0.80 to 0.902702701.0000.848
0.90 to 0.955615611.0000.936
0.95 to 1.005135131.0000.969

The 24 wrong answers all sit below 0.31 on the correct option. The lowest p(correct) among right answers is 0.495, a score question. Per-option probabilities were not stored, so the probability of the wrong answer actually given is unknown for choice and score misses, and a confidence-in-answer table cannot be built for those types.

Brier score against Clef-Flash

d1 is the Radeon 8060S run restricted to the 222 text and still rows Flash also answered. Brier here is on the correct-option probability only: exact for yes/no, a lower bound on the full multiclass score for choice and score. Lower is better.

Typed1 rowsd1 accuracyd1 mean pd1 BrierFlash rowsFlash accuracyFlash mean pFlash Brier
noul751.0000.9340.0052751.0000.9370.0096
choice1110.9730.9170.02331111.0000.9700.0016
score361.0000.7710.0633361.0000.9110.0106
all2220.9860.8990.02372221.0000.9490.0058

Pooled over all modalities and four devices, d1 is 0.0103 on yes/no, 0.0277 on choice and 0.0678 on score. The gap to Flash is mostly the score questions (0.0633 against 0.0106) and the single wrong choice question.

Comparison

Against Clef-Flash 9B Q8_0 and Clef-Omni

Clef-Flash, same set, same run day

Measured1-Omni-2BClef-Flash 9B Q8_0
Rows (text and still questions, 3 repeats)222222
Accuracy0.986 (219/222)1.000 (222/222)
Mean p(correct)0.8990.949
Mean p, score questions0.7710.911
p50 text latency, RX 7900 XTX0.11 s0.17 s
p50 image latency, RX 7900 XTX0.40 s0.62 s
Input tokens, text298 to 326455 to 462
Input tokens, image1,869 to 1,8731,133 to 1,135
Audio inputyesno
Video inputyes (needs ffmpeg in the build)no

d1 is faster on both modalities and less accurate by 3 rows (the German note, repeated 3 times) and less confident. Both models ran on the same Radeon RX 7900 XTX.

Earlier Clef-Omni runs

Clef-Omni was run on the same 37 records and 126 questions on an earlier harness: MLX on an Apple M4 Pro on 2026-10-10, and PyTorch with int4 experts on the GPUs on 2026-10-11. Those runs got one pass, no stills and a different engine, and were read from their stored results, not re-run. p(correct) and latency are therefore not controlled comparisons. d1 below is restricted to its 126 non-still questions.

RunDevicePassesCorrect on the 126 questionsMean p
d1-Omni-2B Q8_0, llama.cpp Vulkan (this report)Radeon 8060S3 x 126, plus 26 stills372/378 on the 126-question subset0.880
Clef-Omni 4-bit, MLX (earlier run, 2026-10-10)Apple M4 Pro1 x 126125/1260.828
Clef-Omni int4, PyTorch (earlier run, 2026-10-11)Radeon 8060S1 x 126126/1260.826
Clef-Omni int4, PyTorch (earlier run, 2026-10-11)Radeon AI PRO R97001 x 126126/1260.825
Clef-Omni int4, PyTorch (earlier run, 2026-10-11)Radeon RX 7900 XTX1 x 126126/1260.824

The earlier summary lists Clef-Omni's mean p as not recorded. The stored rows carry it (field p) and it is computed here: 0.824 to 0.828. The one Clef-Omni miss, on the M4 Pro, is a different question from d1's: voice07 language, an English note read as German at p 0.578. d1 got that question right.

Device (earlier Clef-Omni vs d1)Omni textd1 textOmni audiod1 audioOmni videod1 video
Radeon 8060S5.680.136.970.219.432.98
Radeon AI PRO R97002.620.102.860.193.21did not fit
Radeon RX 7900 XTX2.290.112.590.202.802.30
Apple Silicon (M4 Pro, MLX, earlier) vs Mac (Metal, shared)0.530.400.631.422.16failed to decode

Median latency in seconds. On the Radeon 8060S d1 is lower by 43.6x (text), 33.6x (audio), 3.2x (video) and 1.9x (video+audio). The RX 7900 XTX pair is the same card under the earlier PyTorch harness and under llama.cpp. The Apple Silicon pair compares an M4 Pro with an unspecified Mac that was shared with other work; d1 is slower on audio there, 1.42 s against 0.63 s.

Memory: earlier Clef-Omni peaks were 21.0 GB (M4 Pro, MLX), 21.1 GiB (RX 7900 XTX) and 23.5 GiB (8060S and R9700), as reported by those runs. d1 uses 2.44 to 4.56 GiB. The measures differ (peak during a run against server memory), so a ratio of roughly 5 to 10 is indicative.

The miss

One German voice note, wrong as audio and as text

The note is "Bitte ruf heute noch den Kunden wegen des Angebots zurück" (call the customer back today about the offer), labelled work. d1 answers travel in every repeat on every device, and also when the same sentence is sent as text, so the cause is the model's reading of the sentence, not audio decoding and not a device. p(work) is 0.18 to 0.19 for audio and 0.31 for text.

RunVoice note, topicp(work)Text twin, topicp(work)
Radeon 8060S (Strix Halo)3/3 wrong, travel x30.1823/3 wrong, travel x30.305
Radeon AI PRO R97003/3 wrong, travel x30.1853/3 wrong, travel x30.310
Radeon RX 7900 XTX3/3 wrong, travel x30.1823/3 wrong, travel x30.305
Apple Silicon Mac (shared)3/3 wrong, travel x30.1883/3 wrong, travel x30.308
Radeon 8060S, ubatch 20483/3 wrong, travel x30.1823/3 wrong, travel x30.305
Text via a proxy, device not recordednot sent3/3 wrong, travel x30.305
Clef-Flash 9B Q8_0, RX 7900 XTX (same text)no audio input0/3 wrong0.893
Clef-Omni 4-bit, M4 Pro (earlier run)right0.982right0.971

d1 got the other three questions on the same note right, and the other three German notes (voice09 to voice11) were 12/12 each, at mean p 0.888, 0.902 and 0.844. Clef-Flash (text twin only) and the earlier Clef-Omni run (voice and text) both labelled this note work. Why d1 reads the sentence as travel was not investigated.

Memory

Memory against ubatch, and which media fit

Server memory against ubatchGiB: 2.44 at ubatch 1024 and 2.66 at 2048 on the R9700; 3.13 at 4096 on the RX 7900 XTX; 3.58 at 4096 and 4.56 at 8192 on the 8060S.0 GiB1.25 GiB2.5 GiB3.75 GiB5 GiB1024, Radeon AI PRO R97002.44 GiB2048, Radeon AI PRO R97002.66 GiB4096, Radeon RX 7900 XTX3.13 GiB4096, Radeon 8060S3.58 GiB8192, Radeon 8060S4.56 GiB
Server memory by ubatch and device. Taken from the per-device measurements in the run report, not from the result files. The 8060S has unified memory, so its figure is VRAM plus GTT; the discrete cards report VRAM, so the devices are not strictly like-for-like.

Within one device the growth is 0.22 GiB per 1024 of ubatch from 1024 to 2048 (R9700) and 0.245 GiB per 1024 from 4096 to 8192 (8060S). Across the mixed devices, end to end, it is 0.30 GiB per 1024 (2.12 GiB over 7168 tokens). An earlier summary rounded the figure to 0.25 GiB.

llama.cpp refuses a request whose input exceeds the physical batch size ("input (4484 tokens) is too large to process, increase the physical batch size"). Text, audio and still images fit at every ubatch tested, including 1024. Video does not:

ClipKindTokens in the rejection messageTokens in the usage field (accepted run)ub 1024ub 2048ub 4096ub 8192
screen-page-404video35967213nonoyesyes
screen-page-500video35967213nonoyesyes
screen-page-okvideo35967213nonoyesyes
screen-tests-failvideo35967213nonoyesyes
screen-tests-okvideo35967213nonoyesyes
narr-local-testvideo+audio365210979nonoyesyes
screen-build-failvideo44848989nononoyes
screen-build-okvideo44848989nononoyes
screen-edit-codevideo44848989nononoyes
screen-edit-notesvideo44848989nononoyes
narr-prod-500video+audio452913610nononoyes
narr-deploy-prodvideo+audio454013643nononoyes
narr-staging-okvideo+audio454013643nononoyes

Rejection-message counts run from 3,596 to 4,540 tokens (3.6K to 4.5K). At 4096 the 3.6K clips fit and the 4.5K ones do not; at 1024 and 2048 no clip fits; at 8192 all 13 do. The usage field of the accepted runs reports about twice the rejection count for video (7,213 against 3,596) and about three times for video+audio (10,979 against 3,652). Both are shown and the reason was not established. Stills are 1,069 tokens in the usage field at ubatch 1024 against 1,869 at 2048 and above, so the image encoder produced fewer tokens at the smaller batch.

Practical limits

What stops a deployment

Sizing media by base64 length overestimates audio

A proxy in front of the server admitted requests by estimating input tokens from base64 length, against a 2048-token physical batch limit. It rejected all 36 audio requests with estimates of about 29,800 to 56,800 tokens, when the server used 366 to 494.

ModalityRequests rejectedEstimated tokensTokens in the usage fieldEstimate over usage
audio1229,768 to 56,782366 to 49481.3x to 114.9x (median 98.3x)
video93,389 to 8,4187,213 to 8,9890.5x to 1.1x (median 0.7x)
video+audio451,581 to 66,83210,979 to 13,6433.8x to 6.1x (median 4.7x)

The estimate is 81x to 115x too high for audio (median 98x), roughly right for video and 3.8x to 6.1x high for video+audio. A proxy for decision wires that carry media needs a per-modality estimate. The same proxy rejected all 39 stills as unsupported images. Text through it: d1 0.979 accuracy at 0.11 s p50, Clef-Flash 1.000 at 0.16 s.

Limitations

What this does not show

Sources

Sources and caveats