{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/posts/torch-2-nnef-open-sourcing/",
    "result": {"data":{"sanityPost":{"id":"-af676331-bfe6-55f9-9dda-ea58916dfa0b","slug":{"current":"torch-2-nnef-open-sourcing"},"title":"Shipping neural networks with Torch to NNEF","mainImage":{"altText":"Torch 2 NNEF open sourcing","asset":{"path":"images/znqtjj88/production/18ee45057aa31a7a9d2a0b910ffc36fbdde7a65c-1600x1200.png","metadata":{"dimensions":{"width":1600,"height":1200,"aspectRatio":1.3333333333333333},"lqip":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsTAAALEwEAmpwYAAABMUlEQVR4nNWRX2+CMBTFS1voH6EoLdqS9sGpU3iRYTCZJkvUhOfh9/8wi8CDZlu2V3/py83p6b09F4BnxvuJXridu2sQwkHqwRiHYSiE4JxTShljvANj38M+JiwSIumQUiZJEoYhQmh4jFJqrS2KIs/z5XK5WCw2eb5Zr5VMSazH7rXc1ZfL+XQ+H4/Hqqqcc4SQW3/P8wghxpiyLA+HQ1VV2+12v9/Xu53NHJ++qNXb+8fpem0/27ZpmrqurbWDGQAAIWSMpWnqnNNaz2Yza60xRkSCjMajyTSzbtUxn8+11pxzCOFDYAghjHEQBKL7oRAiiqI4Hk864jhmjPm+jzF+COyeIAiUUlprKaVUyhiTZVlf9qP+6gQAIIQopX3slNJRR18OCf9n59/3/7fzSfgCYuYdIG1uKToAAAAASUVORK5CYII=","palette":{"dominant":{"background":"#1eacfc"}}}}},"categories":[{"_id":"2a760cee-ab0b-432c-866e-eae71039e09d","title":"Machine Learning"},{"_id":"1d950f02-0913-497f-963e-656aff479e94","title":"Open Source"},{"_id":"bc847f9a-0b28-4d6f-99e4-94ff6c8859a1","title":"Software"}],"publishedAt":"2025-09-25T14:46:05.528Z","noHeaderImage":null,"authors":[{"name":"Julien Balian","_rawBio":[{"_key":"8f344df7872a","_type":"block","children":[{"_key":"804d852569f2","_type":"span","marks":[],"text":"Senior Machine Learning Engineer, Sonos Voice Experience"}],"markDefs":[],"style":"normal"}]}],"_rawBodyCopy":[{"_key":"7e18730231d8","_type":"block","children":[{"_key":"c7c9d387d0a7","_type":"span","marks":[],"text":"We’re excited to announce the open-sourcing of "},{"_key":"5679a89b380d","_type":"span","marks":["09051d6ff7ea","strong"],"text":"torch_to_nnef"},{"_key":"107e651d17b3","_type":"span","marks":[],"text":", a tightly integrated toolchain that enables seamless export of PyTorch models to the "},{"_key":"d7cd01ce0dd7","_type":"span","marks":["strong"],"text":"NNEF"},{"_key":"e510b612d5e3","_type":"span","marks":[],"text":" format for use with "},{"_key":"7f974ad250ca","_type":"span","marks":["ddcf786e3b13","strong"],"text":"tract"},{"_key":"6fb8d368af78","_type":"span","marks":[],"text":", our Rust-based neural inference engine. This post explores why model exchange formats matter, what makes NNEF unique, and why we built torch_to_nnef to power on-device machine learning at Sonos."}],"markDefs":[{"_key":"09051d6ff7ea","_type":"link","href":"https://sonos.github.io/torch-to-nnef/latest/"},{"_key":"ddcf786e3b13","_type":"link","href":"https://github.com/sonos/tract"}],"style":"normal"},{"_key":"02da29ebe519","_type":"block","children":[{"_key":"59676ead289b","_type":"span","marks":[],"text":"Why convert a neural network's format ?"}],"markDefs":[],"style":"h2"},{"_key":"a2ae4bc59f61","_type":"block","children":[{"_key":"6b4e07fd574e","_type":"span","marks":[],"text":"Developing a machine learning–powered product generally involves two distinct stages:"}],"markDefs":[],"style":"normal"},{"_key":"2f1587e401fd","_type":"block","children":[{"_key":"032d8baf1ee7","_type":"span","marks":[],"text":""}],"markDefs":[],"style":"normal"},{"_key":"f927f1987896","_type":"sonosImage","altText":"illustration of the 2 stages to build a neural network and their antagonistic goals","asset":{"_id":"image-fb7380fedf3eb2be531cd60472eb89a3792e0fec-3072x1923-jpg","_type":"sanity.imageAsset","_rev":"T61320X0nTKj8AgLSsC9dL","_createdAt":"2025-10-02T11:32:29Z","_updatedAt":"2025-10-02T11:32:29Z","assetId":"fb7380fedf3eb2be531cd60472eb89a3792e0fec","extension":"jpg","metadata":{"_type":"sanity.imageMetadata","blurHash":"VANdO8t7IUt7~q-;ayofofRj_3ofWBofRj%MWBWBj[j[","dimensions":{"_type":"sanity.imageDimensions","aspectRatio":1.5975039001560063,"height":1923,"width":3072},"hasAlpha":false,"isOpaque":true,"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgf/xAAeEAABBQADAQEAAAAAAAAAAAABAAIDBBESITETFP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwDYH2nC8WAHA7PU23cyElgdu52MUmo39Zl5HSdTbsIli47neoCpI6SAE+oVq0XziDd1CD//2Q==","palette":{"_type":"sanity.imagePalette","darkMuted":{"_type":"sanity.imagePaletteSwatch","background":"#5a5a5a","foreground":"#fff","population":0.66,"title":"#fff"},"darkVibrant":{"_type":"sanity.imagePaletteSwatch","background":"#424242","foreground":"#fff","population":0,"title":"#fff"},"dominant":{"_type":"sanity.imagePaletteSwatch","background":"#bcbcbc","foreground":"#000","population":4.55,"title":"#fff"},"lightMuted":{"_type":"sanity.imagePaletteSwatch","background":"#bcbcbc","foreground":"#000","population":4.55,"title":"#fff"},"lightVibrant":{"_type":"sanity.imagePaletteSwatch","background":"#bcbcbc","foreground":"#000","population":0,"title":"#fff"},"muted":{"_type":"sanity.imagePaletteSwatch","background":"#7c7c7c","foreground":"#fff","population":0.64,"title":"#fff"},"vibrant":{"_type":"sanity.imagePaletteSwatch","background":"#7f7f7f","foreground":"#fff","population":0,"title":"#fff"}}},"mimeType":"image/jpeg","originalFilename":"t2n-fig1.jpg","path":"images/znqtjj88/production/fb7380fedf3eb2be531cd60472eb89a3792e0fec-3072x1923.jpg","sha1hash":"fb7380fedf3eb2be531cd60472eb89a3792e0fec","size":503649,"uploadId":"VyQFlj8QHHsc91hBu0S13MvwRWlvGHyF","url":"https://cdn.sanity.io/images/znqtjj88/production/fb7380fedf3eb2be531cd60472eb89a3792e0fec-3072x1923.jpg","filename":"t2n-fig1.jpg","width":3072,"height":1923,"placeholderUrl":"https://cdn.sanity.io/images/znqtjj88/production/fb7380fedf3eb2be531cd60472eb89a3792e0fec-3072x1923.jpg?rect=895,0,1282,1923&w=%width%&h=%height%&q=80","id":"image-fb7380fedf3eb2be531cd60472eb89a3792e0fec-3072x1923-jpg","children":[],"parent":null},"caption":"Figure 1. illustration of the 2 stages to build a neural network and their antagonistic goals","mediaOpacity":1},{"_key":"70fc4184915d","_type":"block","children":[{"_key":"b422f7d95c9a","_type":"span","marks":[],"text":"Training and Evaluation"}],"markDefs":[],"style":"h3"},{"_key":"7c08476ea1f2","_type":"block","children":[{"_key":"7f5d9851f5bc","_type":"span","marks":[],"text":"Performed in a research environment, this stage emphasizes experimentation and iteration to best solve a user task within computational and data constraints. The training is most commonly supervised, that is based on a dataset of input and output pairs. It is composed of the following main steps: 1. The neural network processes the inputs and provides the predicted outputs in a step known as the forward pass. 2. A loss score is computed based on the distance between expected outputs and the predictions. 3. A correction is applied to the network backwards (from outputs to inputs) based on the error value; this step is known as backpropagation and is guided by an optimizer. The process is repeated many times during training. Evaluation happens during and after training to evaluate models with the ‘fixed’ parameters just learned."}],"markDefs":[],"style":"normal"},{"_key":"006fe1ae7c54","_type":"block","children":[{"_key":"ec6357048ae1","_type":"span","marks":[],"text":"Production"}],"markDefs":[],"style":"h3"},{"_key":"e27756951863","_type":"block","children":[{"_key":"935eb991613e","_type":"span","marks":[],"text":"Once a model meets quality criteria it is frozen and shipped to production, where it is optimized for efficient, reliable inference. This ‘frozen’ state is obtained by keeping only the forward pass of the neural network. Also this transformation replaces the set of operators applied to the tensors, so that they are hardware agnostic and decomposed into a primitive set (often called an operator set), more easily reinterpretable by other engines. The ‘inference engine’ running this frozen model often has far less dependencies, is more stable, and puts more emphasis on computational-efficiency for the targeted hardware."}],"markDefs":[],"style":"normal"},{"_key":"12a674847745","_type":"block","children":[{"_key":"2dd74d4326e0","_type":"span","marks":[],"text":""}],"markDefs":[],"style":"normal"},{"_key":"ff166284a9ef","_type":"block","children":[{"_key":"ce019c8ed5af","_type":"span","marks":[],"text":""}],"markDefs":[],"style":"normal"},{"_key":"0471eadb4ac8","_type":"block","children":[{"_key":"d83092d6ff4f","_type":"span","marks":[],"text":"These two distinct environments have inherently different goals (see Figure 1), which naturally creates the need for a "},{"_key":"b4f438c10aef","_type":"span","marks":["strong"],"text":"bridge"},{"_key":"fbcb635c83c5","_type":"span","marks":[],"text":" between them. That bridge is typically an "},{"_key":"814701bd53b3","_type":"span","marks":["strong"],"text":"intermediate representation (IR)"},{"_key":"230acc710644","_type":"span","marks":[],"text":", or an "},{"_key":"390d0bc0e59b","_type":"span","marks":["strong"],"text":"exchange format."},{"_key":"f63733821e1b","_type":"span","marks":[],"text":" Popular examples include "},{"_key":"7423ad800f66","_type":"span","marks":["5378ce2f0b1d"],"text":"ONNX"},{"_key":"13b5366c163b","_type":"span","marks":[],"text":" and "},{"_key":"f2fdc9381add","_type":"span","marks":["03f8659f1dcb"],"text":"PyTorch IR"},{"_key":"4d4d8f378551","_type":"span","marks":[],"text":"."}],"markDefs":[{"_key":"5378ce2f0b1d","_type":"link","href":"https://onnx.ai/"},{"_key":"03f8659f1dcb","_type":"link","href":"https://docs.pytorch.org/docs/stable/export.ir_spec.html"}],"style":"normal"},{"_key":"36e92115fb8f","_type":"block","children":[{"_key":"5ff07a0f2e86","_type":"span","marks":[],"text":"What composes a neural network model asset ?"}],"markDefs":[],"style":"h3"},{"_key":"5ae3bc3a8503","_type":"block","children":[{"_key":"852e4dd5acb2","_type":"span","marks":[],"text":"A "},{"_key":"667483e237d8","_type":"span","marks":["strong"],"text":"neural network asset"},{"_key":"39bced0aacc1","_type":"span","marks":[],"text":" is the packaged output of training that is designed for efficient inference. It typically contains two essential components:"}],"markDefs":[],"style":"normal"},{"_key":"b2fe3ba55e32","_type":"block","children":[{"_key":"78fcf8ae95d2","_type":"span","marks":[],"text":"A list of "},{"_key":"acda906bb260","_type":"span","marks":["strong"],"text":"tensors"},{"_key":"97a9341edfba","_type":"span","marks":[],"text":" with names and values (the parameters learned during the training process)."}],"level":1,"listItem":"bullet","markDefs":[],"style":"normal"},{"_key":"c082b9cd55d6","_type":"block","children":[{"_key":"b4ae2d2774d6","_type":"span","marks":["strong"],"text":"A computation graph"},{"_key":"556f09246573","_type":"span","marks":[],"text":" stitching the tensors together: inputs, outputs, data types, tensor shapes, and the sequence of operators."}],"level":1,"listItem":"bullet","markDefs":[],"style":"normal"},{"_key":"be24cca3f955","_type":"block","children":[{"_key":"7a530eb4cdad","_type":"span","marks":[],"text":"What is NNEF ?"}],"markDefs":[],"style":"h2"},{"_key":"3c95f7b9d769","_type":"block","children":[{"_key":"06563f57c680","_type":"span","marks":[],"text":"Many machine learning practitioners will be familiar with ONNX as a neural network model exchange format. NNEF is also an exchange format, but while ONNX focuses on trainable networks, NNEF is designed to address the needs of neural networks at a different stage of their lifetime, inference instead of training."}],"markDefs":[],"style":"normal"},{"_key":"8257e5010516","_type":"sonosImage","asset":{"_id":"image-8a17add1e4f7c3aa4b75bc9e39f05ad77d10c21c-3072x1662-jpg","_type":"sanity.imageAsset","_rev":"w91DwuoaXeCJRgO5YEGrWs","_createdAt":"2025-10-02T11:32:31Z","_updatedAt":"2025-10-02T11:32:31Z","assetId":"8a17add1e4f7c3aa4b75bc9e39f05ad77d10c21c","extension":"jpg","metadata":{"_type":"sanity.imageMetadata","blurHash":"M4OzSs_3t7~qxu9FkBWBt7-;?bIUofD%j[","dimensions":{"_type":"sanity.imageDimensions","aspectRatio":1.848375451263538,"height":1662,"width":3072},"hasAlpha":false,"isOpaque":true,"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEB//EACAQAAIBAwQDAAAAAAAAAAAAAAECAAMREgQhMbFBUWH/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A3GtTFg4LEj0YrLnp8jkWAvivMsVyGFuoqMRVYjk/IElJmK7gjfzCV1SS+/UIH//Z","palette":{"_type":"sanity.imagePalette","darkMuted":{"_type":"sanity.imagePaletteSwatch","background":"#4b4e4b","foreground":"#fff","population":0.45,"title":"#fff"},"darkVibrant":{"_type":"sanity.imagePaletteSwatch","background":"#7d071b","foreground":"#fff","population":0,"title":"#fff"},"dominant":{"_type":"sanity.imagePaletteSwatch","background":"#4b4e4b","foreground":"#fff","population":0.45,"title":"#fff"},"lightMuted":{"_type":"sanity.imagePaletteSwatch","background":"#94c48c","foreground":"#000","population":0,"title":"#fff"},"lightVibrant":{"_type":"sanity.imagePaletteSwatch","background":"#fcccd4","foreground":"#000","population":0,"title":"#000"},"muted":{"_type":"sanity.imagePaletteSwatch","background":"#6c9464","foreground":"#fff","population":0,"title":"#fff"},"vibrant":{"_type":"sanity.imagePaletteSwatch","background":"#f00e33","foreground":"#fff","population":0,"title":"#fff"}}},"mimeType":"image/jpeg","originalFilename":"t2n-fig2.jpg","path":"images/znqtjj88/production/8a17add1e4f7c3aa4b75bc9e39f05ad77d10c21c-3072x1662.jpg","sha1hash":"8a17add1e4f7c3aa4b75bc9e39f05ad77d10c21c","size":450672,"uploadId":"GECCBrI2ejGXjXouN48hhBdJ7Mi0XT6b","url":"https://cdn.sanity.io/images/znqtjj88/production/8a17add1e4f7c3aa4b75bc9e39f05ad77d10c21c-3072x1662.jpg","filename":"t2n-fig2.jpg","width":3072,"height":1662,"placeholderUrl":"https://cdn.sanity.io/images/znqtjj88/production/8a17add1e4f7c3aa4b75bc9e39f05ad77d10c21c-3072x1662.jpg?rect=982,0,1108,1662&w=%width%&h=%height%&q=80","id":"image-8a17add1e4f7c3aa4b75bc9e39f05ad77d10c21c-3072x1662-jpg","children":[],"parent":null},"mediaOpacity":1},{"_key":"ecc931dfa1a6","_type":"block","children":[{"_key":"7365d0a70462","_type":"span","marks":[],"text":"The Neural Network Exchange Format (NNEF), developed by the Khronos Group, is an open standard designed for interoperability across frameworks, tools, and hardware platforms. It provides a framework-agnostic way to represent trained neural networks, enabling models to be:"}],"markDefs":[],"style":"normal"},{"_key":"dc96390f4e97","_type":"block","children":[{"_key":"1616b973af28","_type":"span","marks":["strong"],"text":"Shared"},{"_key":"14871adc3eb9","_type":"span","marks":[],"text":" across environments."}],"level":1,"listItem":"bullet","markDefs":[],"style":"normal"},{"_key":"50ef77ffffdf","_type":"block","children":[{"_key":"6f07adae3de6","_type":"span","marks":["strong"],"text":"Optimized"},{"_key":"7f8c363ee981","_type":"span","marks":[],"text":" for performance."}],"level":1,"listItem":"bullet","markDefs":[],"style":"normal"},{"_key":"912bb3a00631","_type":"block","children":[{"_key":"60312cd9b664","_type":"span","marks":["strong"],"text":"Deployed"},{"_key":"2dec99407a7d","_type":"span","marks":[],"text":" across diverse hardware without loss of fidelity."}],"level":1,"listItem":"bullet","markDefs":[],"style":"normal"},{"_key":"9b3a251e423b","_type":"block","children":[{"_key":"ddbe0bd7e18f","_type":"span","marks":[],"text":"Interested readers can dive into the specifications of this format "},{"_key":"ecef652e5257","_type":"span","marks":["f4ba8aed4b23"],"text":"here"},{"_key":"fd9f4db2a8d8","_type":"span","marks":[],"text":"."}],"markDefs":[{"_key":"f4ba8aed4b23","_type":"link","href":"https://registry.khronos.org/NNEF/specs/1.0/nnef-1.0.5.html"}],"style":"normal"},{"_key":"255a83c88087","_type":"block","children":[{"_key":"89779dca04d5","_type":"span","marks":[],"text":"Why Torch to NNEF ?"}],"markDefs":[],"style":"h2"},{"_key":"bbe9b875e93a","_type":"block","children":[{"_key":"1596fe0f87ca","_type":"span","marks":[],"text":"At Sonos we build machine learning solutions from training to inference, serving millions of customers. We have been pushing hard to allow neural network computation to happen on devices. As part of this journey we develop an open-source neural network inference engine written in Rust: "},{"_key":"7095efc28351","_type":"span","marks":["3f1a01352ec3"],"text":"tract"},{"_key":"f45965480c49","_type":"span","marks":[],"text":"."}],"markDefs":[{"_key":"3f1a01352ec3","_type":"link","href":"https://github.com/sonos/tract"}],"style":"normal"},{"_key":"b4a78bcff1ea","_type":"block","children":[{"_key":"4eaaf8cede58","_type":"span","marks":["ae42027a0468"],"text":"NNEF"},{"_key":"34c177efbe34","_type":"span","marks":[],"text":" is the preferred format to store neural networks on disk in tract. This allows short model load time, good human readability, while being easily extensible and debuggable."}],"markDefs":[{"_key":"ae42027a0468","_type":"link","href":"https://registry.khronos.org/NNEF/specs/1.0/nnef-1.0.5.html"}],"style":"normal"},{"_key":"e2d2811e2db3","_type":"block","children":[{"_key":"22d67b82f205","_type":"span","marks":[],"text":"Our neural modeling teams investigate the use of compression techniques and in particular quantization. This ability to export quantized models is critical because of limited on-device resources and the advent of multi-billion parameter models."}],"markDefs":[],"style":"normal"},{"_key":"a9e4fa8d473f","_type":"block","children":[{"_key":"89c8bc9a3cd5","_type":"span","marks":[],"text":"To complement tract "},{"_key":"de5ec0fe7373","_type":"span","marks":["3b80dafa1809"],"text":"ONNX"},{"_key":"6579b76a8069","_type":"span","marks":[],"text":" support, we wanted something more tailored to our needs when shipping neural model assets to tract. Especially:"}],"markDefs":[{"_key":"3b80dafa1809","_type":"link","href":"https://onnxruntime.ai/docs/performance/model-optimizations/quantization.html"}],"style":"normal"},{"_key":"32a72edec84c","_type":"block","children":[{"_key":"befb640da391","_type":"span","marks":[],"text":"To specify quantized networks with 4 bits or less in their tensor data type"}],"level":1,"listItem":"bullet","markDefs":[],"style":"normal"},{"_key":"a5cb2aef8669","_type":"block","children":[{"_key":"2d4c50df3b14","_type":"span","marks":[],"text":"To unlock the ability to export advanced quantization/dequantization functions"}],"level":1,"listItem":"bullet","markDefs":[],"style":"normal"},{"_key":"fb11110d9fb9","_type":"block","children":[{"_key":"f058f5f5b277","_type":"span","marks":[],"text":"To get a deeper integration when needed for specific models like ‘Large Language Models’."}],"level":1,"listItem":"bullet","markDefs":[],"style":"normal"},{"_key":"2e0cb7d52533","_type":"block","children":[{"_key":"23efea7e12e4","_type":"span","marks":[],"text":"Protocol Buffer, is used as a meta binary format by ONNX and for model storage by TensorFlow. Both use it to bundle the model graph and the tensor values together. While there is merit in this approach, that bundling makes it hard to easily extend or build upon."}],"markDefs":[],"style":"normal"},{"_key":"1ed6a35bed3e","_type":"block","children":[{"_key":"d475f6f6572b","_type":"span","marks":[],"text":"In that regard NNEF sounds more attractive to us. Keeping the graph description in plain text allows for a human readable format accessible without intermediate tools. Modifying a text specification is easier and can even be done in an editor during prototyping or debug sessions. The NNEF graph can be seen as a Domain Specific Language (DSL) with control-flow limited to compilation time. The specification enables the definition of ‘fragments’ that can be seen as pure functions. Neural networks being mostly defined by repeating blocks of transformations, it makes a lot of sense to avoid repeating the same sequence of operations through composition. Sometimes it’s convenient to share tensors between multiple graphs; in NNEF, distinct graph files can be defined and share stored tensors references (tract propose such mechanism). Each tensor in the graph is stored in a distinct binary file, making it easy to manipulate and reference (opening possibilities for "},{"_key":"c6382954a637","_type":"span","marks":["4be68a396684"],"text":"PEFT"},{"_key":"4bcbcfa40361","_type":"span","marks":[],"text":" export for example). The tensor format structure proposed shines in its flexibility to add new data types depending on the need."}],"markDefs":[{"_key":"4be68a396684","_type":"link","href":"https://huggingface.co/docs/peft/en/index"}],"style":"normal"},{"_key":"e8cbc0211376","_type":"block","children":[{"_key":"72857acc9a58","_type":"span","marks":[],"text":"In 2022, we started the development of \"torch_to_NNEF\" to support the use of these desired features. We are excited to announce that we are open-sourcing this Python library, enabling anyone to directly export neural networks from PyTorch to the NNEF format compatible with tract. This new capability made possible the productization of the neural assets inside Sonos Voice Control as well as the recent Speech Enhancement feature described in a previous blog post ("},{"_key":"a4db66aac221","_type":"span","marks":["2e073a638c97"],"text":"link"},{"_key":"ff8a8a418e23","_type":"span","marks":[],"text":")"}],"markDefs":[{"_key":"2e073a638c97","_type":"link","href":"https://tech-blog.sonos.com/posts/arc-ultra-speech-enhancement-announcing-a-step-change-in-speech-enhancement-using-ai/"}],"style":"normal"},{"_key":"4a6a35aae3a8","_type":"block","children":[{"_key":"aaddd2199fa7","_type":"span","marks":[],"text":"Live demos"}],"markDefs":[],"style":"h2"},{"_key":"d55cce7882d8","_type":"block","children":[{"_key":"7514154beff5","_type":"span","marks":[],"text":"To showcase the practicality of "},{"_key":"095646adfbd4","_type":"span","marks":["5934e4e02160","strong"],"text":"torch_to_nnef"},{"_key":"479175735123","_type":"span","marks":[],"text":" and "},{"_key":"0d970163fa54","_type":"span","marks":["810f1ccf7ced","strong"],"text":"tract"},{"_key":"bbf8fc86447e","_type":"span","marks":[],"text":", we’ve built interactive demos running entirely in "},{"_key":"9cfb75cc7986","_type":"span","marks":["strong"],"text":"WebAssembly (WASM)"},{"_key":"41315c663659","_type":"span","marks":[],"text":". These demonstrate PyTorch-to-NNEF conversion and tract efficient inference on real workloads:"}],"markDefs":[{"_key":"5934e4e02160","_type":"link","href":"http://github.com/sonos/torch-to-nnef"},{"_key":"810f1ccf7ced","_type":"link","href":"http://github.com/sonos/tract"}],"style":"normal"},{"_key":"6858185e63ac","_type":"block","children":[{"_key":"0d2aa3873e9c","_type":"span","marks":["2c9b5e796b3b"],"text":"Image Classifier"}],"level":1,"listItem":"bullet","markDefs":[{"_key":"2c9b5e796b3b","_type":"link","href":"https://sonos.github.io/torch-to-nnef/latest/html/demo_image_classifier.html"}],"style":"normal"},{"_key":"9add0d38ff4c","_type":"block","children":[{"_key":"67b46e988e91","_type":"span","marks":["cb58b69bb476"],"text":"Human pose estimation"}],"level":1,"listItem":"bullet","markDefs":[{"_key":"cb58b69bb476","_type":"link","href":"https://sonos.github.io/torch-to-nnef/latest/html/demo_pose_estimation.html"}],"style":"normal"},{"_key":"198aa61bcf9c","_type":"block","children":[{"_key":"f7a47c767eb0","_type":"span","marks":["c06d2f40c396"],"text":"Voice Activity Detection (VAD)"}],"level":1,"listItem":"bullet","markDefs":[{"_key":"c06d2f40c396","_type":"link","href":"https://sonos.github.io/torch-to-nnef/latest/html/demo_vad.html"}],"style":"normal"},{"_key":"dfd35e7afd5e","_type":"block","children":[{"_key":"850ed0940a0b","_type":"span","marks":["6428b4e7a58e"],"text":"Poem Generator"}],"level":1,"listItem":"bullet","markDefs":[{"_key":"6428b4e7a58e","_type":"link","href":"https://sonos.github.io/torch-to-nnef/latest/html/demo_poem_generator.html"}],"style":"normal"},{"_key":"2ca518c68be4","_type":"block","children":[{"_key":"eb077f97e97f","_type":"span","marks":[],"text":"Conclusion"}],"markDefs":[],"style":"h2"},{"_key":"5eb350d962bb","_type":"block","children":[{"_key":"952ddadc876e","_type":"span","marks":[],"text":"By open-sourcing "},{"_key":"bb7ce1ad43c4","_type":"span","marks":["d8ea50378ac9","strong"],"text":"torch_to_nnef"},{"_key":"8ba515c69b64","_type":"span","marks":[],"text":", we aim to make it easier for practitioners to bring PyTorch models into production environments that require efficient inference on constrained devices. Whether for audio, speech, or other on-device ML workloads, we hope this contribution will enable broader adoption of NNEF and tract within the ML community."}],"markDefs":[{"_key":"d8ea50378ac9","_type":"link","href":"https://sonos.github.io/torch-to-nnef/latest/"}],"style":"normal"},{"_key":"0d191c7bce20","_type":"block","children":[{"_key":"319cfdd405b3","_type":"span","marks":[],"text":"Acknowledgements"}],"markDefs":[],"style":"h2"},{"_key":"415b2d4ec58d","_type":"block","children":[{"_key":"3c4255039979","_type":"span","marks":[],"text":"This project would not have been possible without the contributions and support of many colleagues across Sonos:"}],"markDefs":[],"style":"normal"},{"_key":"bb94e1dc2f63","_type":"block","children":[{"_key":"9b6abf44b921","_type":"span","marks":["strong"],"text":""}],"markDefs":[],"style":"normal"},{"_key":"915e58f7bfbc","_type":"block","children":[{"_key":"fa377873b127","_type":"span","marks":["strong"],"text":"Sonos Voice Control team"}],"markDefs":[],"style":"normal"},{"_key":"9f5fab664b76","_type":"block","children":[{"_key":"cc53cdffb38b","_type":"span","marks":["em"],"text":"Raffaele Tavarone"},{"_key":"30907dc610bb","_type":"span","marks":[],"text":" – trusted the first prototype in 2022."}],"markDefs":[],"style":"normal"},{"_key":"c6227aa64d84","_type":"block","children":[{"_key":"c223fea5dde3","_type":"span","marks":["em"],"text":"Mathieu Poumeyrol"},{"_key":"3701e34f5442","_type":"span","marks":[],"text":" – lead developer of tract, with whom we co-designed many features."}],"markDefs":[],"style":"normal"},{"_key":"d0088f63783c","_type":"block","children":[{"_key":"fb662b8119b6","_type":"span","marks":["em"],"text":"Emrick Sinitambirivoutin"},{"_key":"c7ff7900fb4c","_type":"span","marks":[],"text":" – my manager, contributor and supportive of open-sourcing."}],"markDefs":[],"style":"normal"},{"_key":"18d50e3b7809","_type":"block","children":[{"_key":"a67b4c73db48","_type":"span","marks":["em"],"text":"Hubert De La Jonquiere"},{"_key":"31c313ce43a0","_type":"span","marks":[],"text":" – gave insightful ideas on LLM integration."}],"markDefs":[],"style":"normal"},{"_key":"1b34f9c79dd2","_type":"block","children":[{"_key":"984ad915c3e0","_type":"span","marks":["em"],"text":"Joseph Dureau"},{"_key":"9316c0a546d5","_type":"span","marks":[],"text":" – saw the potential early and encouraged its adoption."}],"markDefs":[],"style":"normal"},{"_key":"0a096da62067","_type":"block","children":[{"_key":"3098086d74e9","_type":"span","marks":[],"text":"And the full team, for their feedback and patience as the tool matured."}],"markDefs":[],"style":"normal"},{"_key":"00ce319fd2ce","_type":"block","children":[{"_key":"9c97500bab09","_type":"span","marks":[],"text":""}],"markDefs":[],"style":"normal"},{"_key":"a6e00e156df6","_type":"block","children":[{"_key":"95e6ee3934ee","_type":"span","marks":["strong"],"text":"Sonos Audio Team"}],"markDefs":[],"style":"normal"},{"_key":"5e18a4825080","_type":"block","children":[{"_key":"30270293c42c","_type":"span","marks":["em"],"text":"Matt Benatan"},{"_key":"b0f6db495886","_type":"span","marks":[],"text":" and his team, who shipped the first neural Speech Enhancement feature in production with the tool."}],"markDefs":[],"style":"normal"},{"_key":"1c804241026c","_type":"block","children":[{"_key":"784ba0ad6c7b","_type":"span","marks":[],"text":""}],"markDefs":[],"style":"normal"},{"_key":"fa287605d901","_type":"block","children":[{"_key":"9c2d2595abec","_type":"span","marks":["strong"],"text":"Sonos Tech blog committee"}],"markDefs":[],"style":"normal"},{"_key":"1fee90d69b7c","_type":"block","children":[{"_key":"0abdbf06901f","_type":"span","marks":[],"text":"That helped to make this article clear and more legible."}],"markDefs":[],"style":"normal"},{"_key":"fc2df7f62404","_type":"block","children":[{"_key":"ac7075713d85","_type":"span","marks":["strong"],"text":"Sonos Legal team"}],"markDefs":[],"style":"normal"},{"_key":"b3cf424d72f1","_type":"block","children":[{"_key":"2e2f676251d2","_type":"span","marks":[],"text":"That helped to clarify the open-source licensing and made it in such a short time period"}],"markDefs":[],"style":"normal"},{"_key":"6767510131b4","_type":"block","children":[{"_key":"66d5774cd34d","_type":"span","marks":[],"text":""}],"markDefs":[],"style":"normal"},{"_key":"0bb662685184","_type":"block","children":[{"_key":"8c4a9ce32c35","_type":"span","marks":[],"text":"Finally, a special thanks to "},{"_key":"2b63a2b62bec","_type":"span","marks":["strong"],"text":"Francesco Caltagirone"},{"_key":"fced63daae3f","_type":"span","marks":[],"text":" and "},{"_key":"b364c05a5555","_type":"span","marks":["strong"],"text":"Nick Millington"},{"_key":"77bb97dab689","_type":"span","marks":[],"text":" for championing the open sourcing of this technology."}],"markDefs":[],"style":"normal"},{"_key":"6e12fbd15325","_type":"block","children":[{"_key":"8f816472eec0","_type":"span","marks":[],"text":""}],"markDefs":[],"style":"normal"}]},"allCategoryMatchedPost":{"nodes":[{"id":"-d4d60d4a-43ab-585a-a84c-4d5ca6ff73d7","slug":{"current":"arc-ultra-speech-enhancement-delivering-inclusive-sound-experiences"},"title":"Arc Ultra Speech Enhancement: Delivering Inclusive Sound Experiences","mainImage":{"altText":null,"asset":{"path":"images/znqtjj88/production/42eb1aaa9b3ccc1dae66a23c4e3db20e7b88daf6-5433x3318.jpg","metadata":{"dimensions":{"width":5433,"height":3318,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAcIBAX/xAAiEAACAgIBAwUAAAAAAAAAAAABAgMRAAQFBhMxISJBUWH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQP/xAAaEQACAwEBAAAAAAAAAAAAAAAAAQMREmEC/9oADAMBAAIRAxEAPwDoHbQabhIR3Ahpv2sm/qffXYm2EfVKzGQhpPs3lGRopjNjyMXPWnG6kfE7kywIJD7rr5B84JfeGumkUe0+CrXX1UUBno1eGZJzchND1wy0Gz//2Q==","palette":{"dominant":{"background":"#d7d1ce"}}}}},"categories":[{"_id":"206af755-cb46-43e7-a143-5c0934c1c26b","title":"Audio processing"},{"_id":"2a760cee-ab0b-432c-866e-eae71039e09d","title":"Machine Learning"},{"_id":"e6f46514-b50b-47c5-bc59-9074fdd774e8","title":"Quality Assurance"}],"publishedAt":"2025-05-27T16:38:49.534Z"},{"id":"-2246d2d9-f0d4-59d3-8a0a-e8a3eea9dedb","slug":{"current":"arc-ultra-speech-enhancement-announcing-a-step-change-in-speech-enhancement-using-ai"},"title":"Arc Ultra Speech Enhancement: Announcing A Step Change in Speech Enhancement Using AI","mainImage":{"altText":"Three people watching a western in a living room set-up with several Sonos products","asset":{"path":"images/znqtjj88/production/b7b663f8e55e1b8abea4d8de0046d8de7a7d9b51-5433x3318.jpg","metadata":{"dimensions":{"width":5433,"height":3318,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAYEBQf/xAAgEAABBAICAwEAAAAAAAAAAAABAAIDBAUREyESIkFC/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAEDBP/EABgRAQEBAQEAAAAAAAAAAAAAAAECABEh/9oADAMBAAIRAxEAPwDGcHHHI0Riix5DDt2x2mWhBHFT4LdFsTHO2ZGkaASDkrMtWbUDywBv5VjlchYOJxw89cjfbX1ZqqvNeIFzJcxsBnJrRyGIjon6hQJbFhjYQ2xKBxt68kI65Mg83//Z","palette":{"dominant":{"background":"#806e57"}}}}},"categories":[{"_id":"2a760cee-ab0b-432c-866e-eae71039e09d","title":"Machine Learning"},{"_id":"206af755-cb46-43e7-a143-5c0934c1c26b","title":"Audio processing"}],"publishedAt":"2025-05-11T07:04:00.000Z"},{"id":"-987bbe04-fb66-54d0-b0c4-18ed19df09dd","slug":{"current":"sonos-voice-control-adds-support-for-weather"},"title":"Sonos Voice Control adds support for Weather","mainImage":{"altText":null,"asset":{"path":"images/znqtjj88/production/3ce3482c6ec537a07eb63e9efa962f9f0cf5134c-5433x3318.jpg","metadata":{"dimensions":{"width":5433,"height":3318,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAUEBgf/xAAiEAACAQMEAgMAAAAAAAAAAAABAgMABBEFBhITISMxQnH/xAAVAQEBAAAAAAAAAAAAAAAAAAACA//EABcRAQEBAQAAAAAAAAAAAAAAAAEAEQL/2gAMAwEAAhEDEQA/AE8zTQSTS2049i5Ab6iqwdT1EapDdSdrdTYyB4AqA+s3SKIh18VQqCV8gUnN1ccgO6TDfI5VA5IZbjDcSzQpJGzlGAIJxRSDZt3LJt+3LnJGVH4KKimML//Z","palette":{"dominant":{"background":"#849475"}}}}},"categories":[{"_id":"62d8d786-aaf0-42f1-8c23-269f3fb1381b","title":"User Experience"},{"_id":"2a760cee-ab0b-432c-866e-eae71039e09d","title":"Machine Learning"}],"publishedAt":"2024-05-07T22:43:00.000Z"},{"id":"-eeea6166-14a4-53cb-9403-2a9176d634ea","slug":{"current":"reproducing-on-device-data-accurately-for-private-by-design-voice-control"},"title":"Reproducing On-Device Data Accurately for Private-by-Design Voice Control","mainImage":{"altText":null,"asset":{"path":"images/znqtjj88/production/87105e334cbb0c83b019c207e1c4d5481f6c8a40-3622x2212.jpg","metadata":{"dimensions":{"width":3622,"height":2212,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQCAwf/xAAfEAADAQACAQUAAAAAAAAAAAABAgMAETEFBBNBUWH/xAAVAQEBAAAAAAAAAAAAAAAAAAABBf/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AMhfx9lgtQA6t8L3l6RpMA0RlB+xnU8l6hI+2pULxx1k6WpQAUdmH6dcSleNNgOesZD/2Q==","palette":{"dominant":{"background":"#14345c"}}}}},"categories":[{"_id":"2a760cee-ab0b-432c-866e-eae71039e09d","title":"Machine Learning"},{"_id":"baa46497-c2bf-4eeb-bf51-bd08238af629","title":"Data Engineering"}],"publishedAt":"2023-04-26T13:40:20.236Z"},{"id":"-39df5d53-fb34-50b9-8a1e-c364a165b51e","slug":{"current":"sonos-at-icassp-2022"},"title":"Sonos at ICASSP 2022","mainImage":{"altText":null,"asset":{"path":"images/znqtjj88/production/26f43436c320e404a6366bc188c35da0ac885718-3622x2212.jpg","metadata":{"dimensions":{"width":3622,"height":2212,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQFAwf/xAAhEAACAQQCAgMAAAAAAAAAAAABAgMABBEhBRIUIjJBUf/EABUBAQEAAAAAAAAAAAAAAAAAAAIF/8QAGBEAAwEBAAAAAAAAAAAAAAAAAAECEVH/2gAMAwEAAhEDEQA/AOEwXjyt38bX6Qd1st/idFYKiH5Z+qX4/kZo7aJVCYwBsVR5CKKa2VmijBG/UYzQ0oxVNaTJuUcSsFI6g6opWW3j7aGKKQHd9P/Z","palette":{"dominant":{"background":"#5c2c3c"}}}}},"categories":[{"_id":"2a760cee-ab0b-432c-866e-eae71039e09d","title":"Machine Learning"},{"_id":"206af755-cb46-43e7-a143-5c0934c1c26b","title":"Audio processing"}],"publishedAt":"2022-07-28T01:54:00.000Z"},{"id":"-132e200f-c065-576b-9c38-dd6511bcfe8d","slug":{"current":"on-device-voice-control-on-sonos-speakers"},"title":"On-device voice control on Sonos speakers","mainImage":{"altText":"Putting speed, accuracy, and privacy on an equal footing","asset":{"path":"images/znqtjj88/production/dc14b81267a9648117e40a9086901d5ec5cfa112-3622x2212.jpg","metadata":{"dimensions":{"width":3622,"height":2212,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBBQf/xAAbEAACAwEBAQAAAAAAAAAAAAABAgADBBEhUv/EABYBAQEBAAAAAAAAAAAAAAAAAAUBAv/EABURAQEAAAAAAAAAAAAAAAAAAAAS/9oADAMBAAIRAxEAPwDM8qZGpQOtRYj0nnZN+XHcoUPXWR8kSlsUBFIHsXHBdG6UrS5lqYso86YRUJWX/9k=","palette":{"dominant":{"background":"#14345c"}}}}},"categories":[{"_id":"2a760cee-ab0b-432c-866e-eae71039e09d","title":"Machine Learning"},{"_id":"62d8d786-aaf0-42f1-8c23-269f3fb1381b","title":"User Experience"}],"publishedAt":"2022-05-11T20:05:43.587Z"},{"id":"-7ecd5676-3402-565d-b1db-61a5ff9a0b5b","slug":{"current":"renovating-setup-with-flutter"},"title":"Renovating Setup, With Flutter","mainImage":{"altText":null,"asset":{"path":"images/znqtjj88/production/753fc967ed6ec91efee87a6794231cb10424ec89-3622x2212.jpg","metadata":{"dimensions":{"width":3622,"height":2212,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAQFB//EAB8QAAICAwACAwAAAAAAAAAAAAEDAhEABAUSISIxkf/EABYBAQEBAAAAAAAAAAAAAAAAAAIEBf/EABcRAQEBAQAAAAAAAAAAAAAAAAEAE5H/2gAMAwEAAhEDEQA/AMZRwNqCIylsrIZRBkfrFehzm6u4sNdRoGon0ceV0n7PNKWCHgAACBRGTNhkpbEBM+dCgZezmoHKBYLTZ+MvzDIzt14ZICdC8MG5LJv/2Q==","palette":{"dominant":{"background":"#15335c"}}}}},"categories":[{"_id":"bc847f9a-0b28-4d6f-99e4-94ff6c8859a1","title":"Software"},{"_id":"62d8d786-aaf0-42f1-8c23-269f3fb1381b","title":"User Experience"}],"publishedAt":"2022-05-04T19:29:13.819Z"},{"id":"-7e02ed0f-fcfc-5957-8c2a-d5b9938e6994","slug":{"current":"assembly-still-matters-cortex-a53-vs-m1"},"title":"Assembly still matters: Cortex-A53 vs M1","mainImage":{"altText":"main thumbnail for neural network part 3 article","asset":{"path":"images/znqtjj88/production/3dcdc1df41628b23566b4f14bdffe3c1f5fa40ea-5433x3318.jpg","metadata":{"dimensions":{"width":5433,"height":3318,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABwADBP/EACEQAAEDAwQDAAAAAAAAAAAAAAMAAQIEBRESFSFBMVJh/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAED/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAMAwEAAhEDEQA/AEyBxThF9fllzVdxhRhkUmmTR6zyjLeK2LM0TOzfFmW61ZXyQurrlYxCaK7hMOJGxFpNnDqRhuNT7qSD/9k=","palette":{"dominant":{"background":"#bcc4b4"}}}}},"categories":[{"_id":"2a760cee-ab0b-432c-866e-eae71039e09d","title":"Machine Learning"},{"_id":"1d950f02-0913-497f-963e-656aff479e94","title":"Open Source"}],"publishedAt":"2021-12-06T16:39:00.000Z"},{"id":"-7f45fa4b-3fa4-5c5d-808b-690fbfca317e","slug":{"current":"the-anatomy-of-efficient-matrix-multipliers"},"title":"The anatomy of efficient matrix multipliers","mainImage":{"altText":"Anatomy of efficient matrix multipliers","asset":{"path":"images/znqtjj88/production/254104d719b6bfbadca599bbd47c571ac1dc06b9-5433x3318.jpg","metadata":{"dimensions":{"width":5433,"height":3318,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABwABA//EACEQAAEEAwABBQAAAAAAAAAAAAEAAgMRBAUhEjEyQXGh/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAED/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAMAwEAAhEDEQA/AESGWJzAQ/3LnLlNYDbm8+L6i8bjOaB4zOAHKCybaZcrgZJS416lYxCMdhGSbP7SkZnYZF9df2pIP//Z","palette":{"dominant":{"background":"#bcc4b3"}}}}},"categories":[{"_id":"1d950f02-0913-497f-963e-656aff479e94","title":"Open Source"},{"_id":"2a760cee-ab0b-432c-866e-eae71039e09d","title":"Machine Learning"}],"publishedAt":"2021-11-15T16:31:00.000Z"},{"id":"-95e7be32-d005-5e85-b582-4083e327a088","slug":{"current":"optimising-a-neural-network-for-inference"},"title":"Optimising a neural network for inference","mainImage":{"altText":null,"asset":{"path":"images/znqtjj88/production/cc476ac5536e251b0f57e7d60d362d94f365a4d8-5433x3318.jpg","metadata":{"dimensions":{"width":5433,"height":3318,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABwAFCP/EACYQAAIBAwMBCQAAAAAAAAAAAAECAwAEBQYREwcUFSIxQVFTYXH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/8QAGBEBAAMBAAAAAAAAAAAAAAAAAAECESH/2gAMAwEAAhEDEQA/AFG/vYLbHz3RYHjjL7b/AFR9onWkuoMwFnRInCOJYlbcAA+FhWBqPL3rYG+TmYDhby/KLOlOWvRqaUmYsXiKkn2FZRXhOsO1wj1FVGHed18lVTgf/9k=","palette":{"dominant":{"background":"#bcc4b3"}}}}},"categories":[{"_id":"2a760cee-ab0b-432c-866e-eae71039e09d","title":"Machine Learning"},{"_id":"1d950f02-0913-497f-963e-656aff479e94","title":"Open Source"}],"publishedAt":"2021-10-13T11:58:00.000Z"}]}},"pageContext":{"id":"-af676331-bfe6-55f9-9dda-ea58916dfa0b","categories":["Machine Learning","Open Source","Software"]}},
    "staticQueryHashes": ["4145174575"]}