Skip to content

Commit ae70bce

Browse files
committed
test(agent): freeze actual WebGPU backend date contrast
1 parent 648393f commit ae70bce

5 files changed

Lines changed: 172 additions & 0 deletions
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import {chromium} from '@playwright/test';import fs from 'node:fs/promises';
2+
const requests=JSON.parse(await fs.readFile('docs/evaluations/2026-10-07-webgpu-backend-date-requests.json','utf8'));
3+
const modelId='Qwen2.5-3B-Instruct-q4f32_1-MLC';const r={scope:'Same-model WebGPU backend date diagnostic only',modelId,runs:[]};
4+
for(const variant of ['default','swiftshader']){
5+
const args=variant==='default'?[]:['--enable-unsafe-webgpu','--use-webgpu-adapter=swiftshader'];const row={variant,args,requests,errors:[],outputs:[]};r.runs.push(row);let c;
6+
try{c=await chromium.launchPersistentContext('.scratch/ai-csp/gpu-profile',{channel:'chromium',args,serviceWorkers:'block'});row.version=c.browser()?.version();const p=await c.newPage();p.on('pageerror',e=>row.errors.push(e.message));await p.goto('http://127.0.0.1:5193/');
7+
row.adapter=await p.evaluate(async()=>{const a=await navigator.gpu.requestAdapter();if(!a)throw Error('No actual adapter');return {vendor:a.info.vendor,architecture:a.info.architecture,isFallbackAdapter:a.info.isFallbackAdapter};});
8+
if(variant==='swiftshader'&&row.adapter.architecture!=='swiftshader')throw Error('Not actual SwiftShader');
9+
if(variant==='default'&&row.adapter.vendor!=='apple')throw Error('Not actual Apple adapter');
10+
await p.evaluate(async modelId=>{const {WebWorkerMLCEngine,prebuiltAppConfig}=await import('/assets/lib-CSLy4uO1.js');window.__record=prebuiltAppConfig.model_list.find(x=>x.model_id===modelId);if(!window.__record)throw Error('Model record missing');window.__engine=new WebWorkerMLCEngine(new Worker('/assets/webllm.worker-CMk6FPDh.js',{type:'module'}),{appConfig:prebuiltAppConfig});window.__loadError=null;window.__engine.reload(modelId,{context_window_size:2048}).then(()=>window.__loaded=true).catch(e=>window.__loadError=String(e));},modelId);
11+
await p.waitForFunction(()=>window.__loaded||window.__loadError,null,{timeout:600000});row.modelRecord=await p.evaluate(()=>window.__record);row.loadError=await p.evaluate(()=>window.__loadError);if(row.loadError)throw Error(row.loadError);
12+
for(const request of requests){await p.evaluate(request=>{window.__completion=null;window.__completionError=null;window.__engine.chat.completions.create(request).then(x=>window.__completion=x).catch(e=>window.__completionError=String(e));},request);await p.waitForFunction(()=>window.__completion||window.__completionError,null,{timeout:300000});const out=await p.evaluate(()=>({completion:window.__completion,error:window.__completionError}));row.outputs.push(out);if(out.error)throw Error(out.error);}
13+
row.finished=true;
14+
}catch(e){row.error=String(e);}finally{if(c)await c.close();row.contextClosed=true;await fs.writeFile('.scratch/2026-10-07-webgpu-backend-date-native.json',JSON.stringify(r,null,2));console.log(JSON.stringify(row));}
15+
}
16+
r.closed=true;await fs.writeFile('.scratch/2026-10-07-webgpu-backend-date-native.json',JSON.stringify(r,null,2));if(r.runs.some(x=>!x.finished))process.exitCode=1;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Same-model WebGPU backend date diagnostic
2+
3+
Primary Chromium source documents Metal as the default Apple WebGPU backend and SwiftShader as a Vulkan software adapter enabled with --enable-unsafe-webgpu and --use-webgpu-adapter=swiftshader: https://chromium.googlesource.com/chromium/src/+/main/gpu/command_buffer/service/webgpu_decoder_impl.cc . Actual preflight identified Apple metal-3 and Google swiftshader, both created devices.
4+
5+
Run default then SwiftShader, same Chromium version, same persistent cache profile, shipped WebWorkerMLCEngine and emitted worker, same Qwen2.5-3B-Instruct-q4f32_1-MLC model record and chat options. Freeze two prior minimal ISO-date-copy requests (23 then 22) including original messages/schema/temperature0/top_p.8/max512. No prompt tuning, CPU fallback or output substitution. This shorter fixed sequence differs from the original interleaved eight-source experiment, so reproduction and backend causality remain conditional on observed results. Require actual adapter identity and actual WebLLM engine completion. Record failures and close both contexts; bounded model initialization 600 seconds and per-request 300 seconds.
6+
7+
No native document edits are made. Date copying is diagnostic only, not summary/translation/rewrite acceptance, physical device coverage or a proposed prompt repair. Preserve model/lib record and raw outputs/timing/errors. Software GPU may be slow or unable to load; retain that outcome without silently selecting another runtime. No model promotion follows.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
[
2+
{
3+
"messages": [
4+
{
5+
"role": "system",
6+
"content": "Copy the ISO date from the user text exactly. Return only JSON with one text field containing that date."
7+
},
8+
{
9+
"role": "user",
10+
"content": "ISO date: 2044-09-23.\n"
11+
}
12+
],
13+
"temperature": 0,
14+
"top_p": 0.8,
15+
"max_tokens": 512,
16+
"response_format": {
17+
"type": "json_object",
18+
"schema": "{\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"text\"],\"properties\":{\"text\":{\"type\":\"string\"}}}"
19+
}
20+
},
21+
{
22+
"messages": [
23+
{
24+
"role": "system",
25+
"content": "Copy the ISO date from the user text exactly. Return only JSON with one text field containing that date."
26+
},
27+
{
28+
"role": "user",
29+
"content": "ISO date: 2044-09-22.\n"
30+
}
31+
],
32+
"temperature": 0,
33+
"top_p": 0.8,
34+
"max_tokens": 512,
35+
"response_format": {
36+
"type": "json_object",
37+
"schema": "{\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"text\"],\"properties\":{\"text\":{\"type\":\"string\"}}}"
38+
}
39+
}
40+
]
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
{
2+
"scope": "Actual WebGPU adapter preflight only; no inference or device-matrix certification",
3+
"source": "https://chromium.googlesource.com/chromium/src/+/main/gpu/command_buffer/service/webgpu_decoder_impl.cc",
4+
"runs": [
5+
{
6+
"variant": "default",
7+
"args": [],
8+
"errors": [],
9+
"version": "151.0.7922.34",
10+
"adapter": {
11+
"available": true,
12+
"adapter": true,
13+
"info": {
14+
"vendor": "apple",
15+
"architecture": "metal-3",
16+
"device": "",
17+
"description": "",
18+
"isFallbackAdapter": false
19+
},
20+
"limits": {
21+
"maxBufferSize": 4294967292,
22+
"maxStorageBufferBindingSize": 4294967292
23+
},
24+
"features": [
25+
"depth32float-stencil8",
26+
"rg11b10ufloat-renderable",
27+
"bgra8unorm-storage",
28+
"texture-formats-tier1",
29+
"texture-compression-bc",
30+
"dual-source-blending",
31+
"core-features-and-limits",
32+
"float32-filterable",
33+
"indirect-first-instance",
34+
"texture-compression-astc-sliced-3d",
35+
"float32-blendable",
36+
"texture-compression-astc",
37+
"texture-compression-etc2",
38+
"depth-clip-control",
39+
"texture-compression-bc-sliced-3d",
40+
"timestamp-query",
41+
"clip-distances",
42+
"texture-formats-tier2",
43+
"shader-f16",
44+
"primitive-index",
45+
"texture-component-swizzle",
46+
"subgroups"
47+
],
48+
"deviceCreated": true
49+
},
50+
"contextClosed": true,
51+
"browserClosed": true
52+
},
53+
{
54+
"variant": "swiftshader",
55+
"args": [
56+
"--enable-unsafe-webgpu",
57+
"--use-webgpu-adapter=swiftshader"
58+
],
59+
"errors": [],
60+
"version": "151.0.7922.34",
61+
"adapter": {
62+
"available": true,
63+
"adapter": true,
64+
"info": {
65+
"vendor": "google",
66+
"architecture": "swiftshader",
67+
"device": "",
68+
"description": "",
69+
"isFallbackAdapter": true
70+
},
71+
"limits": {
72+
"maxBufferSize": 1073741824,
73+
"maxStorageBufferBindingSize": 1073741824
74+
},
75+
"features": [
76+
"depth32float-stencil8",
77+
"rg11b10ufloat-renderable",
78+
"bgra8unorm-storage",
79+
"texture-compression-bc",
80+
"core-features-and-limits",
81+
"chromium-experimental-timestamp-query-inside-passes",
82+
"float32-filterable",
83+
"indirect-first-instance",
84+
"texture-compression-astc-sliced-3d",
85+
"float32-blendable",
86+
"subgroup-size-control",
87+
"texture-compression-astc",
88+
"texture-compression-etc2",
89+
"depth-clip-control",
90+
"texture-compression-bc-sliced-3d",
91+
"timestamp-query",
92+
"clip-distances",
93+
"texture-component-swizzle",
94+
"subgroups"
95+
],
96+
"deviceCreated": true
97+
},
98+
"contextClosed": true,
99+
"browserClosed": true
100+
}
101+
]
102+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import {chromium} from '@playwright/test';import fs from 'node:fs/promises';
2+
const r={scope:'Actual WebGPU adapter preflight only; no inference or device-matrix certification',source:'https://chromium.googlesource.com/chromium/src/+/main/gpu/command_buffer/service/webgpu_decoder_impl.cc',runs:[]};
3+
for(const variant of ['default','swiftshader']){
4+
const args=variant==='default'?[]:['--enable-unsafe-webgpu','--use-webgpu-adapter=swiftshader'];const row={variant,args,errors:[]};r.runs.push(row);let b;
5+
try{b=await chromium.launch({channel:'chromium',args});row.version=b.version();const c=await b.newContext({serviceWorkers:'block'});const p=await c.newPage();p.on('pageerror',e=>row.errors.push(e.message));await p.goto('http://127.0.0.1:5193/');row.adapter=await p.evaluate(async()=>{if(!navigator.gpu)return {available:false};const a=await navigator.gpu.requestAdapter();if(!a)return {available:true,adapter:false};const d=await a.requestDevice();const v={available:true,adapter:true,info:{vendor:a.info.vendor,architecture:a.info.architecture,device:a.info.device,description:a.info.description,isFallbackAdapter:a.info.isFallbackAdapter},limits:{maxBufferSize:a.limits.maxBufferSize,maxStorageBufferBindingSize:a.limits.maxStorageBufferBindingSize},features:[...a.features],deviceCreated:true};d.destroy();return v;});await c.close();row.contextClosed=true;}catch(e){row.error=String(e);}finally{if(b)await b.close();row.browserClosed=true;}
6+
}
7+
await fs.writeFile('.scratch/2026-10-07-webgpu-backend-preflight.json',JSON.stringify(r,null,2));console.log(JSON.stringify(r));

0 commit comments

Comments
 (0)