<?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: Samuel Watson</title>
    <description>The latest articles on DEV Community by Samuel Watson (@openfluke).</description>
    <link>https://dev.to/openfluke</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%2F4241877%2Fc96234ee-7992-4533-94fb-10062b8127fd.png</url>
      <title>DEV Community: Samuel Watson</title>
      <link>https://dev.to/openfluke</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/openfluke"/>
    <language>en</language>
    <item>
      <title>Welvet: a Go AI engine that trains and runs on your hardware, from Raspberry Pi to CUDA, Metal, Vulkan, ROCm, MLX, and Qualcomm NPU</title>
      <dc:creator>Samuel Watson</dc:creator>
      <pubDate>Thu, 12 Nov 2026 23:06:53 +0000</pubDate>
      <link>https://dev.to/openfluke/welvet-a-go-ai-engine-that-trains-and-runs-on-your-hardware-from-raspberry-pi-to-cuda-metal-2jom</link>
      <guid>https://dev.to/openfluke/welvet-a-go-ai-engine-that-trains-and-runs-on-your-hardware-from-raspberry-pi-to-cuda-metal-2jom</guid>
      <description>&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%2F7j0f4xske2nszp6gqide.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%2F7j0f4xske2nszp6gqide.png" alt="OpenFluke Welvet cross-platform on-device AI demos" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Round 1 demos on Linux, Windows, macOS, iOS, and Android. These are working paths on real hardware, not a claim that anything is fastest or best.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://openfluke.com/welvet" rel="noopener noreferrer"&gt;Welvet&lt;/a&gt; because I wanted a Go engine that can actually train and run neural nets on my own machines, not just ship tensors off to somewhere else.&lt;/p&gt;

&lt;p&gt;Source is at &lt;a href="https://github.com/openfluke/welvet" rel="noopener noreferrer"&gt;github.com/openfluke/welvet&lt;/a&gt;. There's a product page at &lt;a href="https://openfluke.com/welvet" rel="noopener noreferrer"&gt;openfluke.com/welvet&lt;/a&gt; and a feature book at &lt;a href="https://openfluke.github.io/welvet/" rel="noopener noreferrer"&gt;openfluke.github.io/welvet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is a walkthrough of &lt;strong&gt;v1.7&lt;/strong&gt;: backends, training modes, storage, and some of the messier runs (Macs, cheap VMs, ~1GB Raspberry Pi 3Bs).&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Roughly four jobs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run&lt;/strong&gt;: load weights, compute, get an answer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Train&lt;/strong&gt;: update those weights from experience&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store&lt;/strong&gt;: keep dtypes and quants as they are (no fake float32 master copy)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure&lt;/strong&gt;: check what the chosen hardware actually did&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Defaults are portable Go: &lt;strong&gt;CPU tiling&lt;/strong&gt;, &lt;strong&gt;Plan 9 SIMD&lt;/strong&gt;, and &lt;strong&gt;WebGPU&lt;/strong&gt;. Extra accelerators are opt-in mounts. No silent "Prefer" path that pretends GPU/NPU work happened when it didn't.&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%2Fh1vztudhrf29ckbrpd95.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%2Fh1vztudhrf29ckbrpd95.png" alt="Fedora-powered Welvet cross-platform AI engine" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Snapshot (v1.7)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;Open-source Go AI / ML engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core&lt;/td&gt;
&lt;td&gt;Train + local inference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Numbers&lt;/td&gt;
&lt;td&gt;34 storage dtypes, 20 quant formats, storage-truth (no QAT morph)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Training&lt;/td&gt;
&lt;td&gt;29 named training modes, including cameral / multi-branch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Defaults&lt;/td&gt;
&lt;td&gt;Go CPU tiled, Plan 9 SIMD, WebGPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optional CPU&lt;/td&gt;
&lt;td&gt;NativeCPU via &lt;code&gt;welvet.cpp&lt;/code&gt; C ABI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA&lt;/td&gt;
&lt;td&gt;CUDA sessions (train + &lt;code&gt;SyncToGo&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMD&lt;/td&gt;
&lt;td&gt;ROCm sessions (library validated; GPU compute needs HSA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple&lt;/td&gt;
&lt;td&gt;Metal train/run, MLX forward-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulkan&lt;/td&gt;
&lt;td&gt;Linux x86_64 train + &lt;code&gt;SyncToGo&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qualcomm&lt;/td&gt;
&lt;td&gt;Hexagon HTP on Windows ARM64 (Snapdragon X)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Other&lt;/td&gt;
&lt;td&gt;Layer packages, spatial grids, MoE / cameral parallelism&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platforms&lt;/td&gt;
&lt;td&gt;Linux, Windows, macOS (app also targets iOS and Android)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docs&lt;/td&gt;
&lt;td&gt;Book chapters, examples, &lt;code&gt;w2a&lt;/code&gt; validation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Paragon and Loom were earlier engines in the same project line. Welvet is the rewrite. They're history, not competing products.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it can run
&lt;/h2&gt;

&lt;p&gt;Unsupported hosts soft-SKIP. Caps reject unsupported layer×dtype instead of lying.&lt;/p&gt;

&lt;h3&gt;
  
  
  Defaults
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Go CPU tiled&lt;/strong&gt; (&lt;code&gt;BackendCPUTiled&lt;/code&gt;): full layer set, 34 dtypes, 20 quants, train modes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan 9 SIMD&lt;/strong&gt; (&lt;code&gt;BackendSIMD&lt;/code&gt;): Dense + Softmax/SiLU fused paths on amd64/arm64&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebGPU&lt;/strong&gt; (&lt;code&gt;BackendWebGPU&lt;/code&gt;): Dense/MHA/CNN/norms and friends on compatible GPUs&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  NativeCPU
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;BackendNativeCPU&lt;/code&gt; + &lt;code&gt;SyncToNative&lt;/code&gt; can push FormatNone forward, NormalBP, and TrainMode updates through sibling &lt;strong&gt;&lt;a href="https://github.com/openfluke/welvet.cpp" rel="noopener noreferrer"&gt;welvet.cpp&lt;/a&gt;&lt;/strong&gt; on linux/amd64. Sync pending weights before writing &lt;code&gt;.entity&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optional accelerators
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Backend&lt;/th&gt;
&lt;th&gt;Sibling&lt;/th&gt;
&lt;th&gt;Hosts&lt;/th&gt;
&lt;th&gt;Forward&lt;/th&gt;
&lt;th&gt;Train&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apple Metal&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;welvet.metal&lt;/code&gt; / &lt;code&gt;nativemetal.Mount&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Apple silicon macOS&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Explicit &lt;code&gt;SyncToGo&lt;/code&gt;. Not Apple Neural Engine. Book §82–88&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple MLX&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;welvet.mlx&lt;/code&gt; / &lt;code&gt;nativemlx&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Apple silicon macOS&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Forward-only. Book §110–113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA CUDA&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;welvet.cuda&lt;/code&gt; / &lt;code&gt;nativecuda.Mount&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Linux x86_64, Windows amd64&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Two weight copies until &lt;code&gt;SyncToGo()&lt;/code&gt;. Book §89–95&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMD ROCm&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;welvet.rocm&lt;/code&gt; / &lt;code&gt;nativerocm.Mount&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Linux x86_64, Windows amd64&lt;/td&gt;
&lt;td&gt;Yes (API)&lt;/td&gt;
&lt;td&gt;Yes (API)&lt;/td&gt;
&lt;td&gt;Library validated; GPU compute untested until HSA. Book §96–102&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulkan&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;welvet.vulkan&lt;/code&gt; / &lt;code&gt;nativevulkan.Mount&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Linux x86_64&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No silent host fallback labeled as Vulkan. Book §103–109&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qualcomm Hexagon HTP&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;welvet.qnn&lt;/code&gt; / &lt;code&gt;BackendQNN&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Windows ARM64 (Snapdragon X)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Explicit sync/prepare. Never Prefer default. Book §79–81&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mixed Go/C++/GPU JSON routing exists on the mount backends. Automatic routing is Linux amd64 today. You own sync and placement.&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%2Fo6ycw0zbd7zoqtriui7l.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%2Fo6ycw0zbd7zoqtriui7l.png" alt="Standard QAT vs Welvet storage-truth paradigm" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dtypes and quants stay real in storage. Not a QAT morph that quietly becomes float32 underneath.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Some published timings
&lt;/h3&gt;

&lt;p&gt;Same shapes, honest timers from the book / matrices. Not "peak marketing" numbers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Metal, Mamba forwards&lt;/strong&gt; (book §88):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;dtype&lt;/th&gt;
&lt;th&gt;Go&lt;/th&gt;
&lt;th&gt;Metal&lt;/th&gt;
&lt;th&gt;Metal/Go&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;float64&lt;/td&gt;
&lt;td&gt;89.3ms&lt;/td&gt;
&lt;td&gt;29.0ms&lt;/td&gt;
&lt;td&gt;3.1×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;float32&lt;/td&gt;
&lt;td&gt;69.0ms&lt;/td&gt;
&lt;td&gt;29.0ms&lt;/td&gt;
&lt;td&gt;2.4×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;float16&lt;/td&gt;
&lt;td&gt;190.5ms&lt;/td&gt;
&lt;td&gt;28.9ms&lt;/td&gt;
&lt;td&gt;6.6×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bfloat16&lt;/td&gt;
&lt;td&gt;149.4ms&lt;/td&gt;
&lt;td&gt;29.0ms&lt;/td&gt;
&lt;td&gt;5.1×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fp8e4m3&lt;/td&gt;
&lt;td&gt;265.9ms&lt;/td&gt;
&lt;td&gt;29.2ms&lt;/td&gt;
&lt;td&gt;9.1×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Qualcomm NPU, large shapes&lt;/strong&gt; (&lt;code&gt;go_v_qnn&lt;/code&gt; on Snapdragon X; DLL &lt;code&gt;graphExecute&lt;/code&gt; vs Go f32 CPU):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;dtype&lt;/th&gt;
&lt;th&gt;Go f32&lt;/th&gt;
&lt;th&gt;NPU DLL&lt;/th&gt;
&lt;th&gt;vs Go&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dense&lt;/td&gt;
&lt;td&gt;u8&lt;/td&gt;
&lt;td&gt;3.05ms&lt;/td&gt;
&lt;td&gt;164µs&lt;/td&gt;
&lt;td&gt;~95% faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dense&lt;/td&gt;
&lt;td&gt;f32&lt;/td&gt;
&lt;td&gt;3.05ms&lt;/td&gt;
&lt;td&gt;201µs&lt;/td&gt;
&lt;td&gt;~93% faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNN2&lt;/td&gt;
&lt;td&gt;i8&lt;/td&gt;
&lt;td&gt;12.56ms&lt;/td&gt;
&lt;td&gt;763µs&lt;/td&gt;
&lt;td&gt;~94% faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MHA&lt;/td&gt;
&lt;td&gt;f16&lt;/td&gt;
&lt;td&gt;4.51ms&lt;/td&gt;
&lt;td&gt;372µs&lt;/td&gt;
&lt;td&gt;~92% faster&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Online layers still pay compose cost on the full Go→NPU call. The book calls that out on purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it can train
&lt;/h2&gt;

&lt;p&gt;Training lives in the Go runtime (forward, backward, step, TrainMode). You're not exporting to another framework to learn.&lt;/p&gt;

&lt;h3&gt;
  
  
  29 training modes
&lt;/h3&gt;

&lt;p&gt;Not just SGD/backprop. See &lt;a href="https://openfluke.github.io/welvet/chapters/67-train-modes.html" rel="noopener noreferrer"&gt;§67 TrainMode&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Modes include StepBP, Tween*, TweenSplit, HeadProxy, Linear, FastProxy, Sparse, Alt, cameral BranchModes, and more. On the big Tide boards, non-SGD modes beat matched SGD on Acc about 97–98% of the time. SGD still wins some individual boards. It's a baseline, not the religion.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cameral
&lt;/h3&gt;

&lt;p&gt;Cameral stacks sibling branches that share an input, merge, and can train under different rules. CamSync averages cam weights (and same-shape cross-layer pairs). Useful when you want learn / keep / share jobs running together under load.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lucy
&lt;/h3&gt;

&lt;p&gt;Lucy scores whether a net can keep serving while it learns:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lucy Score ≈ Throughput × Availability × Acc&lt;/strong&gt; (scaled)&lt;/p&gt;

&lt;p&gt;That's what drove the Tide/Ocean runs: cameral×LR sweeps, Test53 mode farms, volatile cloud soaks, Pi 1GB layer farms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Train support by backend
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Train?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Go CPU / SIMD / WebGPU&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NativeCPU (&lt;code&gt;welvet.cpp&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metal&lt;/td&gt;
&lt;td&gt;Yes (&lt;code&gt;TrainMSE&lt;/code&gt;, then &lt;code&gt;SyncToGo&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CUDA&lt;/td&gt;
&lt;td&gt;Yes (train on GPU, &lt;code&gt;SyncToGo&lt;/code&gt; before save)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulkan&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROCm&lt;/td&gt;
&lt;td&gt;API yes; GPU compute pending HSA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MLX&lt;/td&gt;
&lt;td&gt;No (forward-only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QNN&lt;/td&gt;
&lt;td&gt;Forward / prepare-exec; see book caps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Layers and the Dense core
&lt;/h2&gt;

&lt;p&gt;Most transformer/CNN FLOPs are weights × activations, so Welvet keeps one Dense stack as the shared MatVec kernel (FormatNone×34 + 20 quants × CPU/SIMD/WebGPU). Layers that are mostly GEMV reuse it.&lt;/p&gt;

&lt;p&gt;Layers include Dense, MHA (RoPE / GQA), SwiGLU, RMSNorm, LayerNorm, Embedding, Softmax, Sequential, Residual, CNN1–3, RNN/LSTM, SeqMix, GDN, Mamba, ConvT 1–3, Soft K-Means, Parallel, Metacognition.&lt;/p&gt;

&lt;p&gt;Also: volumetric grids, ENTITY save/reload, HF helpers, tokenizer/sampling, DNA/evolution/tween, telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Runs on ugly hardware
&lt;/h2&gt;

&lt;p&gt;Catalogue: &lt;a href="https://openfluke.com/welvet/experiments" rel="noopener noreferrer"&gt;openfluke.com/welvet/experiments&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Four experiment waves (cameral LR, Test53 modes, volatile Linode soak, Pi 3B ~1GB farm) finished &lt;strong&gt;90,334&lt;/strong&gt; Tide model cells.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cameral × LR&lt;/strong&gt;: does width and LR matter under Lucy live-fit?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test53&lt;/strong&gt;: dense × all 29 modes × storage types × aggressive LRs; Ocean compares cam1 vs cam3&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volatile online&lt;/strong&gt;: cheap VMs, restarts, crowded dashboards. Checkpoint resume mattered. Cells stayed storage-truth (no silent float32 "rescue")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pi 3B / 1GB&lt;/strong&gt;: 22 layer sprints. Dense/CNN/norms were fast; MHA/LSTM/Mamba still finished. One dense champ hit Lucy Score ~16344 on fp4 &lt;code&gt;tween_chain&lt;/code&gt; with &amp;gt;100k outputs/sec. CNN1 hit ~94% hard Acc on a Lucy champ. Mode-vs-SGD Acc beat-rates ~97–98%&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'm not claiming SOTA. The point is live-fit on honest storage, from Macs to $5 VMs to 1GB Pis, with artefacts you can open.&lt;/p&gt;

&lt;h2&gt;
  
  
  Welvet app (separate, still early)
&lt;/h2&gt;

&lt;p&gt;The library is the Go engine. The &lt;strong&gt;Welvet app&lt;/strong&gt; (0.1.0+1) is a different thing: run and serve models on Linux, Windows, macOS, iOS, and Android.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://openfluke.com/welvet/app" rel="noopener noreferrer"&gt;openfluke.com/welvet/app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openfluke.com/welvet/models" rel="noopener noreferrer"&gt;openfluke.com/welvet/models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Round 1 demos on CUDA/Metal/Vulkan-class stacks&lt;/li&gt;
&lt;li&gt;15 models in the public matrix right now&lt;/li&gt;
&lt;li&gt;"Working" means it runs. Not that it's fast or best yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not language-only. Detection, tracking, classification, depth, segmentation, pose, audio, etc. are in the mix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation / family repos
&lt;/h2&gt;

&lt;p&gt;Engine code stays in &lt;code&gt;welvet/&lt;/code&gt;. Proof and wrappers live elsewhere, mainly &lt;strong&gt;&lt;a href="https://github.com/openfluke/w2a" rel="noopener noreferrer"&gt;w2a&lt;/a&gt;&lt;/strong&gt; (Go↔native parity for cpp/cuda/metal/vulkan/rocm/mlx/qnn), plus C ABI, Python ctypes, and TypeScript/WASM.&lt;/p&gt;

&lt;p&gt;Sibling engines: &lt;code&gt;welvet.cpp&lt;/code&gt;, &lt;code&gt;welvet.cuda&lt;/code&gt;, &lt;code&gt;welvet.metal&lt;/code&gt;, &lt;code&gt;welvet.vulkan&lt;/code&gt;, &lt;code&gt;welvet.rocm&lt;/code&gt;, &lt;code&gt;welvet.mlx&lt;/code&gt;, &lt;code&gt;welvet.qnn&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Hard rules: no silent fallbacks, no hardcoded float32 tensors, storage-truth train, fail closed if a sibling binary is missing.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Product page&lt;/td&gt;
&lt;td&gt;&lt;a href="https://openfluke.com/welvet" rel="noopener noreferrer"&gt;openfluke.com/welvet&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature book&lt;/td&gt;
&lt;td&gt;&lt;a href="https://openfluke.github.io/welvet/" rel="noopener noreferrer"&gt;openfluke.github.io/welvet&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Book on site&lt;/td&gt;
&lt;td&gt;&lt;a href="https://openfluke.com/book" rel="noopener noreferrer"&gt;openfluke.com/book&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Examples&lt;/td&gt;
&lt;td&gt;&lt;a href="https://openfluke.com/examples" rel="noopener noreferrer"&gt;openfluke.com/examples&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Experiments&lt;/td&gt;
&lt;td&gt;&lt;a href="https://openfluke.com/welvet/experiments" rel="noopener noreferrer"&gt;openfluke.com/welvet/experiments&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/openfluke/welvet" rel="noopener noreferrer"&gt;github.com/openfluke/welvet&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture dashboard&lt;/td&gt;
&lt;td&gt;&lt;a href="https://files.openfluke.com/1_7/welvet_1_7_technical_architecture_dashboard.html" rel="noopener noreferrer"&gt;files.openfluke.com/.../dashboard&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Research PDF&lt;/td&gt;
&lt;td&gt;&lt;a href="https://files.openfluke.com/1_7/Welvet%201.7_Technical_Research.pdf" rel="noopener noreferrer"&gt;Welvet 1.7 Technical Research&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature book PDF&lt;/td&gt;
&lt;td&gt;&lt;a href="https://files.openfluke.com/1_7/welvet-feature-book-v1.7.0.pdf" rel="noopener noreferrer"&gt;v1.7.0 PDF&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slides&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://files.openfluke.com/1_7/Welvet_1.7_Architecture.pdf" rel="noopener noreferrer"&gt;PDF&lt;/a&gt; / &lt;a href="https://files.openfluke.com/1_7/Welvet_1.7_Architecture.pptx" rel="noopener noreferrer"&gt;PPTX&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Home&lt;/td&gt;
&lt;td&gt;&lt;a href="https://openfluke.com" rel="noopener noreferrer"&gt;openfluke.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2F3y6kvmvbc5399fxv100r.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%2F3y6kvmvbc5399fxv100r.png" alt="OpenFluke mark" width="800" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you write Go and want train+infer in-process, or you care about dtype honesty and learn-while-serve on edge boxes, give it a look.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://openfluke.com/welvet" rel="noopener noreferrer"&gt;openfluke.com/welvet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openfluke.github.io/welvet/" rel="noopener noreferrer"&gt;Feature book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openfluke/welvet" rel="noopener noreferrer"&gt;github.com/openfluke/welvet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openfluke.com/welvet/experiments" rel="noopener noreferrer"&gt;Experiments&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'm &lt;a href="https://openfluke.com/about" rel="noopener noreferrer"&gt;Samuel Watson&lt;/a&gt; / &lt;a href="https://openfluke.com" rel="noopener noreferrer"&gt;OpenFluke&lt;/a&gt;, Australia. Forks and harsh readings of the scorecard are welcome. The docs try to keep implemented features, recorded measurements, and stubs clearly separated.&lt;/p&gt;

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