layout | title | permalink |
---|---|---|
page |
Implementation Status of WebNN Operations |
/webnn-status/ |
Execution Provider
External Delegate
[1] XNNPack node definition in xnn_define_*
[2] DirectML API
[3] MLService / TensorFlow Lite Builtin Options
[4] This feature is experimental. Can be enabled by setting #web-machine-learning-neural-network
flag to Enabled
. Supported on CPUs on Windows.
[5] This feature is experimental. Can be enabled by setting #web-machine-learning-neural-network
flag to Enabled
. Supported on GPUs on Windows 11 21H2 or higher.
[6] This feature is experimental. Can be enabled by setting #web-machine-learning-neural-network
flag to Enabled
. Supported on CPUs on ChromeOS.
[7] ONNX Operator Schemas
and WebNN EP Helper
[8] TensorFlow Lite built-in operators kTfLiteBuiltin*
Interested in contributing to this implementation status page? See contributing guidelines.
<script> const qS = (selector) => { return document.querySelector(selector); } const qSA = (selector) => { return document.querySelectorAll(selector); } const init = () => { let ops = document.querySelector('#ops'); let opsFramework = document.querySelector('#ops_framework'); let jsonPath = "../assets/json/webnn_status.json"; if(location.hostname.toLowerCase().indexOf('webmachinelearning.github.io') >-1) { jsonPath = "https://webmachinelearning.github.io/assets/json/webnn_status.json"; } fetch(jsonPath) .then(response => response.json()) .then(data => { let impl_status = data.impl_status; let oplist = ''; let oplistFramework = ''; for (let s of impl_status) { let spec = `${s.op}` let wpt = ''; if (s.wpt_progress === 4) { wpt = ` 📈 🧪` } if (s.wpt_progress === 3) { wpt = `🚀🚀` } let xnnpack = ''; if (s.xnnpack_op.toString().trim() === "") { xnnpack = `${s.xnnpack_chromium_version_added}`; } else if (s.xnnpack_progress === 4) { let xnnpack_ops = ''; if (s.xnnpack_op.length > 1) { for (let o of s.xnnpack_op) { xnnpack_ops = `✅ ${o}`; xnnpack += xnnpack_ops; } } else if (s.xnnpack_op.length === 1) { xnnpack = '✅ ' + s.xnnpack_op; } else { xnnpack = `` } xnnpack = `${xnnpack}${s.xnnpack_chromium_version_added}`; } else if (s.xnnpack_progress === 3) { let xnnpack_ops = ''; if (s.xnnpack_op.length > 1) { for (let o of s.xnnpack_op) { xnnpack_ops = `🚀 ${o}
`; xnnpack += xnnpack_ops; } } else if (s.xnnpack_op.length === 1) { xnnpack = '🚀 ' + s.xnnpack_op; } else { xnnpack = `` } xnnpack = `${xnnpack}${s.xnnpack_chromium_version_added}`; } else if (s.xnnpack_progress === 2) { let xnnpack_ops = ''; if (s.xnnpack_op.length > 1) { for (let o of s.xnnpack_op) { xnnpack_ops = `📅 ${o}
`; xnnpack += xnnpack_ops; } } else if (s.xnnpack_op.length === 1) { xnnpack = '📅 ' + s.xnnpack_op; } else { xnnpack = `` } xnnpack = `${xnnpack}${s.xnnpack_chromium_version_added}`; } else { xnnpack = `${s.xnnpack_chromium_version_added}`; } let dml = ''; if (s.dml_op.toString().trim() === "") { dml = `${s.dml_chromium_version_added}`; } else if (s.dml_progress === 4) { let dml_ops = ''; if (s.dml_op.length > 1) { for (let o of s.dml_op) { dml_ops = `✅ ${o}
`; dml += dml_ops; } } else if (s.dml_op.length === 1) { dml = '✅ ' + s.dml_op; } else { dml = `` } dml = `${dml}${s.dml_chromium_version_added}`; } else if (s.dml_progress === 3) { let dml_ops = ''; if (s.dml_op.length > 1) { for (let o of s.dml_op) { dml_ops = `🚀 ${o}
`; dml += dml_ops; } } else if (s.dml_op.length === 1) { dml = '🚀 ' + s.dml_op; } else { dml = `` } dml = `${dml}${s.dml_chromium_version_added}`; } else if (s.dml_progress === 2) { let dml_ops = ''; if (s.dml_op.length > 1) { for (let o of s.dml_op) { dml_ops = `📅 ${o}
`; dml += dml_ops; } } else if (s.dml_op.length === 1) { dml = '📅 ' + s.dml_op; } else { dml = `` } dml = `${dml}${s.dml_chromium_version_added}`; } else { dml = `${s.dml_chromium_version_added}`; } let mlservice = ''; if (s.mlservice_op.toString().trim() === "") { mlservice = `${s.mlservice_chromium_version_added}`; } else if (s.mlservice_progress === 4) { let mlservice_ops = ''; if (s.mlservice_op.length > 1) { for (let o of s.mlservice_op) { mlservice_ops = `✅ ${o}
`; mlservice += mlservice_ops; } } else if (s.mlservice_op.length === 1) { mlservice = '✅ ' + s.mlservice_op; } else { mlservice = `` } mlservice = `${mlservice}${s.mlservice_chromium_version_added}`; } else if (s.mlservice_progress === 3) { let mlservice_ops = ''; if (s.mlservice_op.length > 1) { for (let o of s.mlservice_op) { mlservice_ops = `🚀 ${o}
`; mlservice += mlservice_ops; } } else if (s.mlservice_op.length === 1) { mlservice = '🚀 ' + s.mlservice_op; } else { mlservice = `` } mlservice = `${mlservice}${s.mlservice_chromium_version_added}`; } else if (s.mlservice_progress === 2) { let mlservice_ops = ''; if (s.mlservice_op.length > 1) { for (let o of s.mlservice_op) { mlservice_ops = `📅 ${o}
`; mlservice += mlservice_ops; } } else if (s.mlservice_op.length === 1) { mlservice = '📅 ' + s.mlservice_op; } else { mlservice = `` } mlservice = `${mlservice}${s.mlservice_chromium_version_added}`; } else { mlservice = `${s.mlservice_chromium_version_added}`; } let tflite = ''; if (s.tflite_op.toString().trim() === "") { tflite = `${s.tflite_version_added}`; } else if (s.tflite_progress === 4) { let tflite_ops = ''; if (s.tflite_op.length > 1) { for (let o of s.tflite_op) { tflite_ops = `✅ ${o}
`; tflite += tflite_ops; } } else if (s.tflite_op.length === 1) { tflite = '✅ ' + s.tflite_op; } else { tflite = `` } tflite = `${tflite}${s.tflite_version_added}`; } else if (s.tflite_progress === 3) { let tflite_ops = ''; if (s.tflite_op.length > 1) { for (let o of s.tflite_op) { tflite_ops = `🚀 ${o}
`; tflite += tflite_ops; } } else if (s.tflite_op.length === 1) { tflite = '🚀 ' + s.tflite_op; } else { tflite = `` } tflite = `${tflite}${s.tflite_version_added}`; } else if (s.tflite_progress === 2) { let tflite_ops = ''; if (s.tflite_op.length > 1) { for (let o of s.tflite_op) { tflite_ops = `📅 ${o}
`; tflite += tflite_ops; } } else if (s.tflite_op.length === 1) { tflite = '📅 ' + s.tflite_op; } else { tflite = `` } tflite = `${tflite}${s.tflite_version_added}`; } else { tflite = `${s.tflite_version_added}`; } let ort = ''; if (s.ort_op.toString().trim() === "") { ort = `${s.ort_version_added}`; } else if (s.ort_progress === 4) { let ort_ops = ''; if (s.ort_op.length > 1) { for (let o of s.ort_op) { ort_ops = `✅ ${o}
`; ort += ort_ops; } } else if (s.ort_op.length === 1) { ort = '✅ ' + s.ort_op; } else { ort = `` } ort = `${ort}${s.ort_version_added}`; } else if (s.ort_progress === 3) { let ort_ops = ''; if (s.ort_op.length > 1) { for (let o of s.ort_op) { ort_ops = `🚀 ${o}
`; ort += ort_ops; } } else if (s.ort_op.length === 1) { ort = '🚀 ' + s.ort_op; } else { ort = `` } ort = `${ort}${s.ort_version_added}`; } else if (s.ort_progress === 2) { let ort_ops = ''; if (s.ort_op.length > 1) { for (let o of s.ort_op) { ort_ops = `📅 ${o}
`; ort += ort_ops; } } else if (s.ort_op.length === 1) { ort = '📅 ' + s.ort_op; } else { ort = `` } ort = `${ort}${s.ort_version_added}`; } else { ort = `${s.ort_version_added}`; } oplist += ` ${spec} ${wpt} ${xnnpack} ${dml} ${mlservice} `; oplistFramework += ` ${spec} ${ort} ${tflite} `; } oplist = oplist + ` `; oplistFramework = oplistFramework + ` `; ops.innerHTML = oplist; opsFramework.innerHTML = oplistFramework; count(); }) .catch(console.error); } const count = () => { let spec_defined_total = 78; let spec_s = qSA('.spec').length / 2; qS('#spec_total').innerHTML = `${spec_s}`; qS('#spec2_total').innerHTML = `${spec_s}`; let wpt_s = qSA('.wpt_s').length; let wpt_percentage = (wpt_s / spec_defined_total * 100).toFixed(1) ; qS('#wpt_total').innerHTML = `${wpt_s} / ${spec_defined_total}, ${wpt_percentage}%`; let x_s = qSA('.x_s').length; let x_pi = qSA('.x_pi').length; let x_wip = qSA('.x_wip').length; let x_percentage = (x_s / spec_defined_total * 100).toFixed(1) ; qS('#x_total').innerHTML = `${x_s} / ${spec_defined_total}, ${x_percentage}%`; qS('#x_supported').innerHTML = x_s; qS('#x_partlyimplemented').innerHTML = x_pi; qS('#x_workinprogress').innerHTML = x_wip; let dml_s = qSA('.dml_s').length; let dml_pi = qSA('.dml_pi').length; let dml_wip = qSA('.dml_wip').length; let dml_percentage = (dml_s / spec_defined_total * 100).toFixed(1) ; qS('#dml_total').innerHTML = `${dml_s} / ${spec_defined_total}, ${dml_percentage}%`; qS('#dml_supported').innerHTML = dml_s; qS('#dml_partlyimplemented').innerHTML = dml_pi; qS('#dml_workinprogress').innerHTML = dml_wip; let mlservice_s = qSA('.mlservice_s').length; let mlservice_pi = qSA('.mlservice_pi').length; let mlservice_wip = qSA('.mlservice_wip').length; let mlservice_percentage = (mlservice_s / spec_defined_total * 100).toFixed(1) ; qS('#mlservice_total').innerHTML = `${mlservice_s} / ${spec_defined_total}, ${mlservice_percentage}%`; qS('#mlservice_supported').innerHTML = mlservice_s; qS('#mlservice_partlyimplemented').innerHTML = mlservice_pi; qS('#mlservice_workinprogress').innerHTML = mlservice_wip; let ed_s = qSA('.ed_s').length; let ed_pi = qSA('.ed_pi').length; let ed_wip = qSA('.ed_wip').length; let ed_percentage = (ed_s / spec_defined_total * 100).toFixed(1) ; qS('#ed_total').innerHTML = `${ed_s} / ${spec_defined_total}, ${ed_percentage}%`; qS('#ed_supported').innerHTML = ed_s; qS('#ed_partlyimplemented').innerHTML = ed_pi; qS('#ed_workinprogress').innerHTML = ed_wip; let ep_s = qSA('.ep_s').length; let ep_pi = qSA('.ep_pi').length; let ep_wip = qSA('.ep_wip').length; let ep_percentage = (ep_s / spec_defined_total * 100).toFixed(1) ; qS('#ep_total').innerHTML = `${ep_s} / ${spec_defined_total}, ${ep_percentage}%`; qS('#ep_supported').innerHTML = ep_s; qS('#ep_partlyimplemented').innerHTML = ep_pi; qS('#ep_workinprogress').innerHTML = ep_wip; } document.addEventListener('DOMContentLoaded', init, false); </script>