<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hocine Benkelaya</title>
    <description>The latest articles on DEV Community by Hocine Benkelaya (@benkelaya).</description>
    <link>https://dev.to/benkelaya</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3388859%2F7f22af3e-cdff-4a71-9a58-b56646e96011.jpg</url>
      <title>DEV Community: Hocine Benkelaya</title>
      <link>https://dev.to/benkelaya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/benkelaya"/>
    <language>en</language>
    <item>
      <title>nbxtensor: a tensor library for inference that doesn't need PyTorch</title>
      <dc:creator>Hocine Benkelaya</dc:creator>
      <pubDate>Sat, 07 Nov 2026 22:49:21 +0000</pubDate>
      <link>https://dev.to/benkelaya/nbxtensor-a-tensor-library-for-inference-that-doesnt-need-pytorch-5bmp</link>
      <guid>https://dev.to/benkelaya/nbxtensor-a-tensor-library-for-inference-that-doesnt-need-pytorch-5bmp</guid>
      <description>&lt;p&gt;If you want to run a modern model on a GPU from Python, the default answer is "install PyTorch". That is a fine answer for training. For inference it brings a lot along: a large install, a CUDA-first view of the world, and a runtime whose memory behaviour you discover rather than decide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nbxtensor&lt;/strong&gt; is NeuroBrix's answer for inference: a tensor library with Triton kernels, planned memory and certified tuning — and no PyTorch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install nbxtensor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It runs wherever Triton runs: &lt;strong&gt;NVIDIA, AMD, Intel and Apple&lt;/strong&gt; GPUs, on &lt;strong&gt;Linux, Windows and macOS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuxmtsbvnz0bbgd993eua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuxmtsbvnz0bbgd993eua.png" alt="The stack without PyTorch" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What "no PyTorch" means here
&lt;/h2&gt;

&lt;p&gt;Not "PyTorch is optional". nbxtensor never imports torch — not as a dependency, not as an optional extra, not in a fallback branch. Its kernels, its tests and the models NeuroBrix runs on it all work in an environment where torch is not installed.&lt;/p&gt;

&lt;p&gt;The practical effect shows up in the NeuroBrix engine that is built on it: measured on a clean machine, the light install (the Triton engine on nbxtensor) is &lt;strong&gt;1.48 GB&lt;/strong&gt;; the same engine with PyTorch added is &lt;strong&gt;6.82 GB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you do live in a PyTorch codebase, exchange goes through DLPack, so you are not locked in either direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  A first kernel
&lt;/h2&gt;

&lt;p&gt;This is the example from the README, executed by the test suite on every change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nbxtensor.tensor&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;NBXTensor&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nbxtensor.ops.linalg_wrappers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;mm&lt;/span&gt;

&lt;span class="n"&gt;rng&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;default_rng&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rng&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;standard_normal&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rng&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;standard_normal&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NBXTensor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_numpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;NBXTensor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_numpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# a Triton kernel on the GPU, no torch
&lt;/span&gt;
&lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rtol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2e-2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;atol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2e-1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;NBXTensor&lt;/code&gt; holds device memory, a shape and a dtype. The operation dispatches to a Triton kernel. There is nothing else in the path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four parts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Tensors.&lt;/strong&gt; Device memory, shapes, strides, views, dtypes and their promotion rules — the plumbing you need to run a graph, without a framework underneath.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Triton kernels.&lt;/strong&gt; Matrix products, attention, convolutions, normalisations, elementwise and reductions, written in Triton so that one source serves every GPU vendor Triton supports. A device is described by a file of facts — tile sizes, shared memory, the matrix unit — not by code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Planned memory.&lt;/strong&gt; Allocators per device behind one interface, and a planner that sizes buffers before the first run. Every kernel declares what it costs (its outputs, workspace and scratch), so the planner can price a model before running it. In NeuroBrix, that planner is Prism: it decides from your hardware profile whether a model fits on one GPU, is split across several, is streamed, or has its largest operations tiled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Certified tuning.&lt;/strong&gt; A Triton kernel has settings — block sizes, warps, stages — and the right ones depend on the GPU and the shape. The usual approach is to autotune on the user's machine at first run. nbxtensor instead serves settings that were &lt;strong&gt;certified once per GPU class&lt;/strong&gt;: each candidate is checked against a float64 oracle, the ones that pass are timed, and the winner is stored with its proof. 18,552 settings are certified for Apple GPUs today.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbem9amik4ge87805b954.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbem9amik4ge87805b954.png" alt="Certified, not autotuned" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your GPU class has no certificate yet, the missing settings are tuned once on your machine and kept; you can then certify them and share them by pull request, so the next person with your GPU never tunes at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fast where it counts
&lt;/h2&gt;

&lt;p&gt;Two examples of what that buys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In NeuroBrix's global benchmark of 2026-11-05 on V100 16 GB GPUs, the Triton engine on nbxtensor was faster than the PyTorch engine on 18 of 49 models, up to 5x on Janus-Pro-7B (212.6 s down to 41.8 s).&lt;/li&gt;
&lt;li&gt;On Volta, Triton compiles matrix products to FMA, so the V100's tensor cores sit idle. nbxtensor brings them back with hand-written m8n8k4 kernels, chosen per operation by measurement rather than by rule.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Apple Silicon
&lt;/h2&gt;

&lt;p&gt;PyPI publishes no Triton for macOS. nbxtensor installs NeuroBrix's own Triton build for Apple GPUs (&lt;a href="https://github.com/NeuroBrix/triton-ext" rel="noopener noreferrer"&gt;NeuroBrix/triton-ext&lt;/a&gt;) in one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;nbxtensor
python &lt;span class="nt"&gt;-m&lt;/span&gt; nbxtensor install-metal
python &lt;span class="nt"&gt;-m&lt;/span&gt; nbxtensor doctor     &lt;span class="c"&gt;# -&amp;gt; backend in force: metal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;doctor&lt;/code&gt; works on every platform: it names the backend in force and, when a GPU runtime or a Triton backend is missing, the command that installs it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is used
&lt;/h2&gt;

&lt;p&gt;nbxtensor is the foundation of the Triton engine of &lt;a href="https://github.com/NeuroBrix/neurobrix" rel="noopener noreferrer"&gt;NeuroBrix&lt;/a&gt;, which runs 49 models in 9 families — language, code, vision-language, omni, speech recognition, speech understanding, text-to-speech, image, video and upscaling — from one &lt;code&gt;.nbx&lt;/code&gt; container format and one entry point. Every NeuroBrix release runs all 49 models on both engines through that entry point and compares the outputs byte for byte with judged outputs.&lt;/p&gt;

&lt;p&gt;Inference first: training is not in this release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/NeuroBrix/nbxtensor" rel="noopener noreferrer"&gt;github.com/NeuroBrix/nbxtensor&lt;/a&gt; — Apache 2.0&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/NeuroBrix/neurobrix/blob/main/docs/nbxtensor/API.md" rel="noopener noreferrer"&gt;API reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/NeuroBrix/neurobrix" rel="noopener noreferrer"&gt;NeuroBrix&lt;/a&gt; · &lt;a href="https://neurobrix.es" rel="noopener noreferrer"&gt;neurobrix.es&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Found a bug on your hardware? Open an issue on the repository.&lt;/p&gt;

&lt;p&gt;— Hocine Benkelaya, NeuroBrix&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>NeuroBrix 0.6: 49 AI models, one engine, no PyTorch</title>
      <dc:creator>Hocine Benkelaya</dc:creator>
      <pubDate>Sat, 07 Nov 2026 22:48:45 +0000</pubDate>
      <link>https://dev.to/benkelaya/neurobrix-06-49-ai-models-one-engine-no-pytorch-16ha</link>
      <guid>https://dev.to/benkelaya/neurobrix-06-49-ai-models-one-engine-no-pytorch-16ha</guid>
      <description>&lt;p&gt;Most inference stacks are a collection of pipelines: one for language models, another for speech, another for image generation, another for video, each with its own loader, its own memory habits and its own list of supported GPUs. NeuroBrix takes the opposite route. &lt;strong&gt;One engine runs every model.&lt;/strong&gt; Version 0.6 is its first stable release.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install neurobrix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It runs on &lt;strong&gt;Linux, Windows and macOS&lt;/strong&gt;, on &lt;strong&gt;NVIDIA, AMD, Intel and Apple&lt;/strong&gt; GPUs — wherever Triton runs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Famsx9ol6ighfuxvfy9ql.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Famsx9ol6ighfuxvfy9ql.png" alt="How NeuroBrix works" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  49 models, 9 families, one entry point
&lt;/h2&gt;

&lt;p&gt;NeuroBrix 0.6 runs 49 models across 9 families: language and code models (Qwen3-30B-A3B, Qwen3-Coder, DeepSeek-Coder-V2-Lite, DeepSeek-MoE), vision-language and omni models (GLM-4.1V, Qwen3-VL, Qwen3-Omni, Janus-Pro, MiniCPM-o), speech recognition (Whisper, Parakeet), speech understanding (Voxtral), text-to-speech (Kokoro, VibeVoice, Orpheus), image generation (Sana 1K and 4K, PixArt, Flex.1), video generation (Wan 2.1 and 2.2, CogVideoX, Mochi, Allegro, Open-Sora 2) and upscaling (Real-ESRGAN, HAT, SwinIR, Swin2SR).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvail7zc0ydgabme7mvud.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvail7zc0ydgabme7mvud.png" alt="49 models, 9 families, one engine" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They all go through the same command. The family is read from the model, so &lt;code&gt;run&lt;/code&gt; asks for the inputs that family needs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;neurobrix import TinyLlama/TinyLlama-1.1B-Chat-v1.0
neurobrix run &lt;span class="nt"&gt;--model&lt;/span&gt; TinyLlama-1.1B-Chat-v1.0 &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Explain recursion."&lt;/span&gt; &lt;span class="nt"&gt;--max-tokens&lt;/span&gt; 256

neurobrix run &lt;span class="nt"&gt;--model&lt;/span&gt; whisper-large-v3-turbo &lt;span class="nt"&gt;--audio&lt;/span&gt; recording.wav
neurobrix run &lt;span class="nt"&gt;--model&lt;/span&gt; Kokoro-82M &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Hello from NeuroBrix."&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; speech.wav
neurobrix run &lt;span class="nt"&gt;--model&lt;/span&gt; Flex.1-alpha &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"a lighthouse at dusk"&lt;/span&gt; &lt;span class="nt"&gt;--steps&lt;/span&gt; 20 &lt;span class="nt"&gt;--seed&lt;/span&gt; 42 &lt;span class="nt"&gt;--output&lt;/span&gt; lighthouse.png
neurobrix run &lt;span class="nt"&gt;--model&lt;/span&gt; CogVideoX-2b &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"a hot air balloon over mountains"&lt;/span&gt; &lt;span class="nt"&gt;--num-frames&lt;/span&gt; 17 &lt;span class="nt"&gt;--output&lt;/span&gt; balloon.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browsable list lives at &lt;a href="https://neurobrix.es/models" rel="noopener noreferrer"&gt;neurobrix.es/models&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  One container, no per-model code
&lt;/h2&gt;

&lt;p&gt;Every model ships as a &lt;code&gt;.nbx&lt;/code&gt; container: one file format that holds the model's graph and its weights. The engine reads the container and executes it. There is no &lt;code&gt;if model == ...&lt;/code&gt; anywhere in the runtime, no model-specific pipeline to maintain, and adding a model does not mean writing a new code path. That is what lets one small team run 49 models through a single entry point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two engines in one package
&lt;/h2&gt;

&lt;p&gt;NeuroBrix carries two execution engines that share the container, the plan and the flow, and share no compute code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Triton engine&lt;/strong&gt;, built on &lt;a href="https://github.com/NeuroBrix/nbxtensor" rel="noopener noreferrer"&gt;nbxtensor&lt;/a&gt;, NeuroBrix's own tensor library. It does not use PyTorch at all — not at import, not at run time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An optional PyTorch engine&lt;/strong&gt;, for those who already have PyTorch: &lt;code&gt;pip install "neurobrix[pytorch]"&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By default NeuroBrix uses PyTorch if it is installed and the Triton engine otherwise. The difference shows on disk. Measured on a clean machine, the light install is &lt;strong&gt;1.48 GB&lt;/strong&gt;; with PyTorch it is &lt;strong&gt;6.82 GB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuxmtsbvnz0bbgd993eua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuxmtsbvnz0bbgd993eua.png" alt="The stack without PyTorch" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prism: placement from facts, not guesses
&lt;/h2&gt;

&lt;p&gt;Before anything runs, Prism, NeuroBrix's memory and placement planner, decides how the model sits on your hardware: on a single GPU, across several GPUs, streamed in pieces, or with its largest operations tiled. It works from a hardware profile — a file of facts about your devices — rather than from heuristics baked into code. When the machine is busy, it says so and tells you what it chose instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed
&lt;/h2&gt;

&lt;p&gt;Speed comes from kernels that are measured, not assumed. In the global benchmark of 2026-11-05 on V100 16 GB GPUs, the Triton engine was faster than the PyTorch engine on 18 of the 49 models, up to 5x on Janus-Pro-7B (212.6 s down to 41.8 s).&lt;/p&gt;

&lt;p&gt;Two pieces make that possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Certified kernel tuning.&lt;/strong&gt; Every kernel setting is certified once per GPU class — checked against a float64 oracle, then timed — instead of autotuning on your machine. 18,552 settings are certified for Apple GPUs alone, and anyone can certify their own GPU and share it by pull request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V100 tensor cores, back.&lt;/strong&gt; Triton compiles matrix products to FMA on Volta, which leaves the tensor cores of a V100 idle. nbxtensor brings them back with hand-written m8n8k4 kernels, chosen per operation by measurement.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Validated the boring way
&lt;/h2&gt;

&lt;p&gt;Every release runs all 49 models on both engines through the real entry point — the same &lt;code&gt;neurobrix run&lt;/code&gt; you type. For 0.6.0 that was 196 of 196 cells on 4x V100. Outputs are compared byte for byte with outputs that were judged by eye (text read, images and videos looked at, audio transcribed), and runs are deterministic: the same inputs give identical outputs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apple Silicon
&lt;/h2&gt;

&lt;p&gt;On a Mac, PyPI has no Triton build. NeuroBrix maintains its own Triton build for Apple GPUs, &lt;a href="https://github.com/NeuroBrix/triton-ext" rel="noopener noreferrer"&gt;NeuroBrix/triton-ext&lt;/a&gt;, installed in one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;neurobrix
python &lt;span class="nt"&gt;-m&lt;/span&gt; nbxtensor install-metal
neurobrix doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Engine: &lt;a href="https://github.com/NeuroBrix/neurobrix" rel="noopener noreferrer"&gt;github.com/NeuroBrix/neurobrix&lt;/a&gt; — Apache 2.0&lt;/li&gt;
&lt;li&gt;Tensor library: &lt;a href="https://github.com/NeuroBrix/nbxtensor" rel="noopener noreferrer"&gt;github.com/NeuroBrix/nbxtensor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Models: &lt;a href="https://neurobrix.es/models" rel="noopener noreferrer"&gt;neurobrix.es/models&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Release notes: &lt;a href="https://github.com/NeuroBrix/neurobrix/releases/tag/v0.6.2" rel="noopener noreferrer"&gt;v0.6.2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Discussion: &lt;a href="https://github.com/orgs/NeuroBrix/discussions/4" rel="noopener noreferrer"&gt;github.com/orgs/NeuroBrix/discussions/4&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Found a model that misbehaves on your GPU? Open an issue — that is exactly the feedback this release is for.&lt;/p&gt;

&lt;p&gt;— Hocine Benkelaya, NeuroBrix&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
