<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[What is Nodus Compute]]></title><description><![CDATA[What is Nodus Compute]]></description><link>https://nodus-compute.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 12 Nov 2026 08:13:02 GMT</lastBuildDate><atom:link href="https://nodus-compute.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[KernelBench, two TritonBenches, and the denominator behind your score]]></title><description><![CDATA[Six public benchmark projects, pinned source revisions, and a four-task example showing how correctness and missing results change the score.]]></description><link>https://nodus-compute.hashnode.dev/kernelbench-two-tritonbenches-and-the-denominator-behind-your-score</link><guid isPermaLink="true">https://nodus-compute.hashnode.dev/kernelbench-two-tritonbenches-and-the-denominator-behind-your-score</guid><category><![CDATA[Machine Learning]]></category><dc:creator><![CDATA[Viswaretas Kotra]]></dc:creator><pubDate>Thu, 12 Nov 2026 00:08:33 GMT</pubDate><content:encoded><![CDATA[<p>This Nodus article summarizes inspected public source revisions and original evaluation design. We did not run the benchmarks or train a model for this guide.</p>
<p>Original source: <a href="https://data.nodus-compute.ai/blog/choose-the-benchmark-for-the-claim?utm_source=hashnode&amp;utm_medium=research&amp;utm_campaign=kernel_rl_benchmarks">Choose the benchmark for the claim</a>. Its downloadable JSON records the input, comparison, correctness gate, metric, denominator and measurement boundary for each row.</p>
<p>Before wiring a benchmark into an evaluation pipeline, write down the result you intend to report. “Correct and faster on these tasks” needs different evidence from “this training data improves a model.”</p>
<table>
<thead>
<tr>
<th>Project</th>
<th>Use it to investigate</th>
<th>Keep attached to the result</th>
</tr>
</thead>
<tbody><tr>
<td><a href="https://github.com/ScalingIntelligence/KernelBench/blob/423217d9fda91e0c2d67e4a43bf62f96f6d104f1/README.md">KernelBench</a></td>
<td>Model-generated kernel correctness and speed against a PyTorch reference</td>
<td>Intended task set, aligned baselines, missing results, runtime conditions</td>
</tr>
<tr>
<td><a href="https://github.com/thunlp/TritonBench/blob/603e28a5050e8c268f6883a69709d477a272d49a/README.md">THUNLP TritonBench</a></td>
<td>Generation of Triton operators</td>
<td>Exact generation/evaluation setup and selected task coverage</td>
</tr>
<tr>
<td><a href="https://github.com/meta-pytorch/tritonbench/blob/6394394849c41c23699f757b4cc2712d35ad4d86/README.md">Meta/PyTorch TritonBench</a></td>
<td>Performance of operator implementations</td>
<td>Input shapes, implementation, hardware and software revisions</td>
</tr>
<tr>
<td><a href="https://github.com/NVIDIA/SOL-ExecBench/blob/a9fa0804c793d438e70850c33fe34426e66d53dd/README.md">SOL-ExecBench</a></td>
<td>Kernel evaluation with optimized and analytical anchors</td>
<td>Correctness gates, baseline and hardware-limit assumptions</td>
</tr>
<tr>
<td><a href="https://github.com/flashinfer-ai/flashinfer-bench/blob/15618a67e8d7b7f49ca61b5ba3b9f26a876d0bee/README.md">FlashInfer-Bench</a></td>
<td>Kernel definitions, workloads, solutions and evaluation traces</td>
<td>Whether a workload has an actual completed evaluation</td>
</tr>
<tr>
<td><a href="https://github.com/mlcommons/inference_policies/blob/d3eba2f21026d868ad65cdcad2bb81e4a17ce3d3/inference_rules.adoc">MLPerf Inference</a></td>
<td>Inference-system performance in defined scenarios</td>
<td>Request scenario, quality requirement, latency and throughput rules</td>
</tr>
</tbody></table>
<p>Use the full repository name for TritonBench. The two projects answer different questions.</p>
<p>One implementation detail is easy to lose when a score reaches a chart. KernelBench's <a href="https://github.com/ScalingIntelligence/KernelBench/blob/423217d9fda91e0c2d67e4a43bf62f96f6d104f1/src/kernelbench/score.py">pinned fastp function</a> requires correctness and a speed ratio strictly greater than p. The denominator is the supplied n. At p=1, a correct result at equal speed does not count as faster.</p>
<p>Its <a href="https://github.com/ScalingIntelligence/KernelBench/blob/423217d9fda91e0c2d67e4a43bf62f96f6d104f1/scripts/benchmark_eval_analysis.py">analysis script</a> patches missing evaluations as failures, while tasks without baseline entries are skipped. Consequently, the final aligned entries may cover less than the task set you intended to evaluate. Report both intended coverage and aligned coverage; retain the reason for every exclusion.</p>
<p>This original, synthetic example illustrates the arithmetic:</p>
<table>
<thead>
<tr>
<th>Task</th>
<th>Outcome</th>
<th>Counts for strict fast_1?</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Correct; speed ratio 1.5</td>
<td>Yes</td>
</tr>
<tr>
<td>B</td>
<td>Correct; speed ratio 1.0</td>
<td>No</td>
</tr>
<tr>
<td>C</td>
<td>Incorrect</td>
<td>No</td>
</tr>
<tr>
<td>D</td>
<td>No result</td>
<td>No</td>
</tr>
</tbody></table>
<p>All four tasks have baselines. The score is therefore 1/4 = 25%. These are invented numbers for explaining the metric, not observed model scores.</p>
<p>The original article includes a <a href="https://data.nodus-compute.ai/assets/lab-research-benchmark-claim-example.py">small Python arithmetic example</a> and <a href="https://data.nodus-compute.ai/assets/lab-research-benchmark-claim-guide.json">the full comparison JSON</a>. They make the denominator and source pins inspectable without requiring a GPU.</p>
<p>A training-data evaluation needs an additional layer. Our proposed design freezes an independent held-out bank before training, matches base model and training/inference budgets across conditions, and measures paired changes in correctness or correct-and-fast success. Split by source group. Multiple repair trajectories from the same kernel do not become independent held-out tasks.</p>
<p>The capacity design uses a different endpoint: accepted work from a fixed offered workload within its deadline. Capture request, admission, readiness, completion and cleanup, plus retained state and every failed or unfinished attempt. Shared GPU treatments also need a qualified measurement scope. Economic comparisons require settled costs. Neither proposed design is an executed Nodus result in this article.</p>
<p>When preparing your evaluation, record:</p>
<ul>
<li>The exact claim, task set and success rule.</li>
<li>Source, model, hardware and software revisions.</li>
<li>Correctness checks and baseline coverage.</li>
<li>Complete attempt outcomes and measurement boundaries.</li>
<li>For data utility, the source-group split and matched budgets.</li>
<li>For capacity, deadlines, lifecycle boundaries and settled costs where a cost claim is made.</li>
</ul>
<p>The six public projects deserve credit for their own tools and definitions. The two proposed Nodus study designs in the <a href="https://data.nodus-compute.ai/blog/choose-the-benchmark-for-the-claim?utm_source=hashnode&amp;utm_medium=research&amp;utm_campaign=kernel_rl_benchmarks">comparison</a> are explicitly marked as proposals. No training uplift, provider ranking or upstream endorsement is claimed.</p>
]]></content:encoded></item><item><title><![CDATA[Test weight and bias separately: a normalization ablation]]></title><description><![CDATA[A fixed CPU ablation shows why varying weights alone or biases alone leaves blind spots. Includes all 504 observations and reproduction files.]]></description><link>https://nodus-compute.hashnode.dev/test-weight-and-bias-separately-a-normalization-ablation</link><guid isPermaLink="true">https://nodus-compute.hashnode.dev/test-weight-and-bias-separately-a-normalization-ablation</guid><dc:creator><![CDATA[Viswaretas Kotra]]></dc:creator><pubDate>Wed, 11 Nov 2026 21:34:07 GMT</pubDate><content:encoded><![CDATA[<p>A normalization test with <code>weight=1</code> and <code>bias=0</code> cannot distinguish several altered formulas from the intended calculation. Varying just one parameter still leaves a blind spot.</p>
<p>Building on <strong>zzw4257's original <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25">SOL-ExecBench issue #25</a></strong>, Nodus ran a fixed CPU ablation to separate weight variation from bias variation. The <a href="https://data.nodus-compute.ai/blog/more-seeds-wont-test-a-parameter-you-never-vary?utm_source=hashnode&amp;utm_medium=research&amp;utm_campaign=kernel_rl_benchmarks">canonical article and complete evidence</a> include every planned observation, the source and reproduction instructions.</p>
<h2>Change one parameter at a time</h2>
<p>For each configuration, draw <code>x</code>, varied weight and varied bias once. Reuse those exact tensors across four regimes:</p>
<ol>
<li>Identity: unit weight, zero bias.</li>
<li>Weight only: varied weight, zero bias.</li>
<li>Bias only: unit weight, varied bias.</li>
<li>Both: varied weight and bias.</li>
</ol>
<p>The grid uses shapes <code>1×8</code>, <code>4×64</code> and <code>4×127</code>; dtypes <code>float32</code> and <code>float16</code>; and seeds <code>7</code>, <code>42</code> and <code>2026</code>. These are <strong>18 correlated configurations in one exposed development normalization family</strong>, not independent tasks.</p>
<p>Each configuration has four regimes and seven outputs: six selected altered formulas and one copied-reference control. That gives <strong>504 planned observations</strong>. All completed, with no errors or missing observations. All <strong>72 copied-reference controls</strong> passed.</p>
<p><img src="https://data.nodus-compute.ai/assets/lab-research-affine-ablation-matrix.png" alt="Altered-formula acceptances per 18 correlated CPU configurations. Identity accepts all six formulas; weight-only leaves omitted bias undetected; bias-only leaves omitted weight undetected; both-varied accepts none." /></p>
<table>
<thead>
<tr>
<th>Altered formula</th>
<th align="right">Identity</th>
<th align="right">Weight only</th>
<th align="right">Bias only</th>
<th align="right">Both</th>
</tr>
</thead>
<tbody><tr>
<td>Omit all affine</td>
<td align="right">18/18</td>
<td align="right">0/18</td>
<td align="right">0/18</td>
<td align="right">0/18</td>
</tr>
<tr>
<td>Omit weight</td>
<td align="right">18/18</td>
<td align="right">0/18</td>
<td align="right">18/18</td>
<td align="right">0/18</td>
</tr>
<tr>
<td>Omit bias</td>
<td align="right">18/18</td>
<td align="right">18/18</td>
<td align="right">0/18</td>
<td align="right">0/18</td>
</tr>
<tr>
<td>Scalar affine</td>
<td align="right">18/18</td>
<td align="right">0/18</td>
<td align="right">0/18</td>
<td align="right">0/18</td>
</tr>
<tr>
<td>Apply affine twice</td>
<td align="right">18/18</td>
<td align="right">0/18</td>
<td align="right">0/18</td>
<td align="right">0/18</td>
</tr>
<tr>
<td>Affine before normalization</td>
<td align="right">18/18</td>
<td align="right">0/18</td>
<td align="right">0/18</td>
<td align="right">0/18</td>
</tr>
</tbody></table>
<p>Each cell counts accepted observations out of 18. Across the full plan, 216 observations were accepted, including the 72 controls, and 288 were rejected.</p>
<p>If bias stays zero, removing the bias term gives the same value on that slice. More random inputs, shapes or seeds cannot restore the missing distinction. Acceptance there is a coverage limitation; it does not mean the output is wrong for that particular fixture.</p>
<h2>Inspect what the checker accepted</h2>
<p>The reference is eager <code>layer_norm(x, (N,), eps=1e-5)</code>, followed by multiplication and addition in the selected dtype. This sequence is not asserted bit-identical to fused affine LayerNorm or an independent real-arithmetic oracle. The control is <code>reference.clone()</code>: it checks transport and checker consistency, rather than an independently implemented correct kernel.</p>
<p>The unchanged public <a href="https://github.com/NVIDIA/SOL-ExecBench/blob/a9fa0804c793d438e70850c33fe34426e66d53dd/src/sol_execbench/core/bench/correctness.py"><code>compute_error_stats</code> helper</a> is pinned at SOL-ExecBench commit <code>a9fa0804c793d438e70850c33fe34426e66d53dd</code>. It converts to float32, applies fixed <code>0.01</code> absolute and relative tolerances with at least 99% matched elements, and retains its nonfinite/all-zero checks. There is no separate maximum-error cap. This is not ordinary <code>torch.allclose</code>. Seeds and tolerances were fixed before execution.</p>
<p>The <a href="https://data.nodus-compute.ai/assets/lab-research-affine-ablation-result.json">retained result JSON</a> contains all 504 observations, fixture/reference tensor bytes, checker statistics and limitations. It can be inspected without installing Torch.</p>
<h2>Reproduce the scoped result</h2>
<p>The <a href="https://data.nodus-compute.ai/assets/lab-research-affine-ablation-package.zip">source/evidence ZIP</a> contains the unchanged runner and protocol, the complete plan/events/result, the exact 26-file public checker import bundle, and upstream licenses and notices. Its SHA-256 is:</p>
<pre><code class="language-text">88a313be781593f3284b9e59298239d9d83e3f5745133e9ff176913f139d248a
</code></pre>
<p>From the extracted <code>nodus-affine-input-ablation-v1</code> directory, print the fixed plan:</p>
<pre><code class="language-sh">python3.12 -I -B affine_ablation.py --backend cpu
</code></pre>
<p>Plan-only mode imports neither Torch nor the checker. Use the <a href="https://data.nodus-compute.ai/assets/lab-research-affine-ablation-reproduce.txt">full runtime and reproduction instructions</a> for an actual attempt, including a fresh output directory, bounded direct-child timeout and retention of partial outputs and errors. Missing completions remain unknown, not rejected.</p>
<p>The observed run used macOS arm64, CPython 3.12.14, Torch 2.14.1 and Pydantic 2.12.5. The Mac package constraints are version records, not a wheel-hash lock or a claim of identical binary builds. The optional Linux Torch 2.9.0+cu130 runtime describes a separate reproduction cohort. <strong>This 504-observation grid has not been run on Linux or CUDA.</strong> Our <a href="https://data.nodus-compute.ai/blog/identity-inputs-hide-normalization-errors">earlier single-fixture T4 reproduction</a> does not confirm this grid.</p>
<p>The six formulas are selected examples, not an estimate of benchmark-wide defect prevalence. This result does not establish exhaustive correctness, held-out transfer, kernel performance or model-training improvement. It gives a concrete check to add when evaluating normalization tests: vary weight and bias separately, then together, and retain the complete outcome matrix.</p>
]]></content:encoded></item><item><title><![CDATA[Keeping training state when the GPU node changes]]></title><description><![CDATA[A controlled Nodus node replacement preserved a checkpoint and advanced training from step 8 to 9. Evidence, timing boundaries and limitations.]]></description><link>https://nodus-compute.hashnode.dev/keeping-training-state-when-the-gpu-node-changes</link><guid isPermaLink="true">https://nodus-compute.hashnode.dev/keeping-training-state-when-the-gpu-node-changes</guid><category><![CDATA[GPU]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[Cloud Computing]]></category><dc:creator><![CDATA[Viswaretas Kotra]]></dc:creator><pubDate>Tue, 10 Nov 2026 19:26:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac84ac0b34c8375bca6e9e3/174700d2-bf13-41b2-8881-474939454561.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Disclosure: This is an AI-generated article.</p>
<p>A controlled Nodus test kept a Python environment, cache and checkpoint across two sequential eight-H200 nodes. We separate platform readiness, the first CUDA operation and the single-GPU checkpoint recovery.</p>
<p><img src="https://data.nodus-compute.ai/assets/lab-research-retained-state-timings.png" alt="Two separate timing intervals from one controlled replacement pair. API creation to platform Ready: initial node 421.205 s, replacement node 372.765 s. Payload entry to first completed CUDA: fresh environment 221.654 s, retained environment 19.411 s. Checkpoint recovery was measured separately as successful advancement from step 8 to 9 on one GPU, without a restore-duration measurement." /></p>
<p>One controlled replacement pair; one observation per phase. First CUDA was measured before checkpoint restore. Checkpoint step 8→9 was separately verified on one GPU; eight-GPU checks were separate. The initial payload installed PyTorch and recovery reused the environment. No causal provisioning speedup is established.</p>
<h2>Key takeaways</h2>
<ul>
<li>A second Nodus node loaded the exact saved checkpoint, restored a small model and optimizer, and advanced training from step 8 to step 9.</li>
<li>The observed first-CUDA interval after payload entry was 221.654 s initially and 19.411 s with the retained environment. Both measurements precede checkpoint restoration.</li>
<li>This was one controlled replacement pair. Separate eight-rank GPU checks passed; the training checkpoint exercise used one GPU.</li>
</ul>
<h2>The node changed. The saved work stayed.</h2>
<p>We shut down one Nodus eight-H200 node, started a second node on the same retained filesystem, and continued a small PyTorch training job from its saved checkpoint. The second node loaded the exact checkpoint written at step 8, restored the model, optimizer and random-number-generator states, and completed step 9. The prepared Python environment and a 64 MiB cache were still there. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<p>This was a controlled production test on November 2, 2026: two sequential nodes, one retained 512 GiB filesystem, and one observation per phase. Both nodes also passed separate CUDA and NCCL checks across all eight GPUs. The checkpoint exercise itself ran on one GPU. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<h2>Three different readiness questions</h2>
<p>A node reaching Ready, a program completing its first CUDA operation, and a training job restoring its state are different milestones. We recorded the first two as timed intervals. The checkpoint test records successful restoration and advancement, without a separate restore-duration measurement. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<ul>
<li>API creation to platform Ready: 421.205 s on the initial node; 372.765 s on the second node.</li>
<li>Detached payload entry to its first completed CUDA operation: 221.654 s initially; 19.411 s on the second node.</li>
<li>Checkpoint continuity: the initial job saved step 8; the recovery job verified that file’s SHA-256, loaded its state, and saved step 9.</li>
</ul>
<h2>What changed between the two CUDA measurements</h2>
<p>The initial payload created a virtual environment and installed torch==2.14.0 from the CUDA 12.6 package index. The recovery payload executed the retained interpreter directly. It checked that the Torch version, CUDA version, Python version and Torch path matched the initial environment metadata. Its code had no package-install branch. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<p>The first-CUDA timer started at payload entry, before filesystem, GPU inventory and NVLink topology checks. It stopped after a one-element CUDA operation, synchronization and an equality check. Environment preparation and imports fall inside this interval. Checkpoint loading and the eight-rank checks happen afterward. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<p>The 19.411 s observation therefore describes getting this particular payload to its first completed CUDA operation with a retained environment. It does not measure how long checkpoint recovery took. The experiment also does not isolate package-install savings from every other difference between the two launches. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<h2>What the checkpoint test actually checked</h2>
<p>The training probe used a 64-input, 16-output linear layer and AdamW. The initial run trained for eight steps. The second run required the checkpoint file to match the first node’s recorded SHA-256 and required its saved step to equal 8 before loading model parameters, optimizer state and CPU, CUDA and Python RNG states. It then ran one further step, checked finite loss and changed parameters, and committed a new checkpoint at step 9. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<p>The filesystem check also verified that the 64 MiB cache retained its original hash. This gives us evidence that saved state survived the node replacement and was used successfully. It does not establish bitwise agreement with an uninterrupted training run, large-model recovery or distributed training checkpoint restoration. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<p>The eight-GPU check was a separate torchrun job. Each rank completed a matrix multiplication check, and an NCCL all-reduce had to produce the expected value on every rank. All eight ranks reported success on both nodes. Those checks establish the tested GPU and communication behavior; they do not turn the single-GPU checkpoint probe into an eight-GPU training result. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<h2>What the shorter Ready interval can tell us</h2>
<p>Both launches used the same platform source, payload, native instance type, region and retained filesystem. They were different VMs at different times. The receipts do not establish identical physical hosts, driver versions or immutable full-image digests. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<p>The second node reached platform Ready 48.440 s sooner after API creation in this pair. That is an observation, not evidence that retaining state accelerated provisioning. Native STARTING-to-RUNNING took 332.287 s and 332.472 s respectively, while the earlier confirmation delays differed. The records do not divide those phases into boot, storage attachment and mount-setup costs. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<p>Platform creation and Ready use platform timestamps. The two first-CUDA markers use the same guest clock within each run, so a constant guest offset cancels for that interval. They are wall-clock measurements; we did not record a clock-adjustment bound. Differences spanning platform, native-service and guest clocks retain unmeasured offset uncertainty. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<h2>What this result establishes</h2>
<p>The evidence download preserves the timestamps, metric definitions, checkpoint hashes and source pins behind these observations. Both jobs named payload SHA-256 e5de06a7073e3d920b9daa82bfed52c1e4b521f66a1a59382ba4686c2ad66a3c and platform commit be542b312b5552c3c94e7cf8b7cfc53283d3f811. It is a prepared technical snapshot of retained receipts, not the full operational logs; its preparation-time publication status is preserved. The originals contain private account and infrastructure identifiers and are not published as-is. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<p>We deliberately stopped the first node and created the second. This did not exercise automatic preemption recovery or a snapshot-restore mechanism. One pair cannot establish startup percentiles, uninterrupted capacity, an idle-capacity advantage or a comparison with other GPU providers. What it does establish is that the tested environment, cache and checkpoint survived a controlled node replacement, and the small training job continued. <a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">1</a></p>
<p>A separate download provides a trace-conformance checker and synthetic example for future experiments. It checks planned-attempt coverage, declared timing and target bindings, and cost arithmetic. It does not replay hardware, authenticate receipts or establish usable training data or fleet idle-capacity performance. <a href="https://data.nodus-compute.ai/assets/nodus-trace-conformance-v1.zip">2</a></p>
<p>For teams considering interruptible GPU workloads, we can scope a Nodus recovery pilot around your actual checkpoint format, retained data and first useful resumed operation. Those boundaries make the result useful to an engineering decision.</p>
<h2>Sources</h2>
<ol>
<li><a href="https://data.nodus-compute.ai/assets/lab-research-retained-state-evidence.json">Download: retained-state observation, timing definitions, checkpoint continuity and source pins (JSON)</a></li>
<li><a href="https://data.nodus-compute.ai/assets/nodus-trace-conformance-v1.zip">Download: trace-conformance checker, contract and synthetic example (ZIP)</a></li>
</ol>
<p><a href="https://data.nodus-compute.ai/blog/keeping-state-across-replacement-gpu-nodes?utm_source=hashnode&amp;utm_medium=research&amp;utm_campaign=kernel_rl_benchmarks">Original article on Nodus Research</a></p>
<p><a href="https://discovery-meeting.nodus-compute.ai/?utm_source=hashnode&amp;utm_medium=research&amp;utm_campaign=kernel_rl_benchmarks&amp;utm_content=keeping-state-across-replacement-gpu-nodes">Discuss a GPU recovery pilot</a></p>
]]></content:encoded></item><item><title><![CDATA[Six wrong normalization formulas passed a correctness check]]></title><description><![CDATA[Six incorrect normalization formulas passed with identity inputs and failed with varied parameters in separate synthetic CPU and T4 CUDA runs.]]></description><link>https://nodus-compute.hashnode.dev/six-wrong-normalization-formulas-passed-a-correctness-check</link><guid isPermaLink="true">https://nodus-compute.hashnode.dev/six-wrong-normalization-formulas-passed-a-correctness-check</guid><category><![CDATA[Machine Learning]]></category><category><![CDATA[GPU]]></category><category><![CDATA[Reinforcement Learning]]></category><dc:creator><![CDATA[Viswaretas Kotra]]></dc:creator><pubDate>Mon, 09 Nov 2026 13:53:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac84ac0b34c8375bca6e9e3/2d620877-9920-4625-a558-2442a39558d6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Disclosure: This is an AI-generated article.</p>
<p>An original synthetic reproduction of SOL-ExecBench issue #25 on CPU and CUDA: identity-valued inputs hid six affine errors. Small elementwise perturbations exposed all six while preserving the copied expected-output control.</p>
<img src="https://data.nodus-compute.ai/assets/lab-research-affine-counterexample.png" alt="Six deliberately incorrect LayerNorm affine formulas were accepted with identity weights and biases; none were accepted after varied affine inputs. One synthetic CPU float32 case, shape 4 by 64, seed 42. No GPU speed or training benefit established. Original issue: zzw4257." style="display:block;margin:0 auto" />

<p>One synthetic CPU float32 case (4×64, seed 42): all six deliberately incorrect affine formulas were accepted with identity inputs, and none with varied inputs. The copied-reference control passed both. Original issue reported by zzw4257; Nodus CPU reproduction. No GPU performance or training benefit measured.</p>
<h2>Key takeaways</h2>
<ul>
<li>All six deliberately incorrect formulas passed with identity affine inputs and failed after the input change in our synthetic CPU case and separate CUDA confirmation.</li>
<li>A random activation tensor does not test whether a program uses its weights and biases correctly. Those parameters must exercise the behavior being checked.</li>
<li>These are correctness-generator observations on one synthetic workload, with separate CPU and CUDA results. They do not measure GPU leaderboard effects, kernel speed, or training improvement.</li>
</ul>
<h2>The check passed because the inputs hid the mistake</h2>
<p>We sent six deliberately incorrect normalization formulas through SOL-ExecBench’s numerical checker on an original synthetic CPU workload. Every formula was accepted. After changing the generated normalization weights and biases from identity values to small elementwise random perturbations, all six were rejected. The correct-output control remained accepted. <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">2</a></p>
<p>The underlying issue and proposed perturbation were reported by zzw4257 in SOL-ExecBench issue #25. Our contribution is an independent CPU reproduction using a new synthetic Definition and Workload, explicit-constant controls, and a local regression patch. We published the reproduction as a follow-up to that report. <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25">1</a> <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">2</a></p>
<p>We later confirmed the same before-and-after verdicts on a Tesla T4 with PyTorch 2.9.0+cu130. That CUDA run is reported separately below; the graphic and six numerical error values remain results from the original CPU run. <a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-result.json">7</a> <a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-provenance.json">8</a></p>
<h2>When six different mistakes produce the same answer</h2>
<p>Write the normalized activation as z = layer_norm(x). The intended affine result is y = z × weight + bias. In the pinned default generator, recognized normalization weights become all ones and normalization biases become all zeros—even when the workload requests random inputs. <a href="https://github.com/NVIDIA/SOL-ExecBench/blob/a9fa0804c793d438e70850c33fe34426e66d53dd/src/sol_execbench/core/bench/io.py#L281">3</a></p>
<p>For these inputs, the expected result is simply z. Leaving out the weight, leaving out the bias, or leaving out both produces the same result. Reading element zero of each affine tensor also works because every element is identical. Applying the identity affine transform twice changes nothing. Applying it to x before normalization changes nothing either.</p>
<p>Randomizing x cannot separate those formulas while weight and bias remain identity values. This is an input-coverage problem: on this restricted input set, the checker receives the same output from the intended computation and each wrong variant.</p>
<h2>The six observed CPU results</h2>
<p>The case uses x with shape 4 × 64, 64-element affine tensors, float32, and seed 42. We called the real gen_inputs and compute_error_stats functions from upstream commit a9fa0804c793d438e70850c33fe34426e66d53dd. The checker used max_atol = 0.01, max_rtol = 0.01, and required_matched_ratio = 0.99. No benchmark dataset was loaded. <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">2</a> <a href="https://github.com/NVIDIA/SOL-ExecBench/blob/a9fa0804c793d438e70850c33fe34426e66d53dd/src/sol_execbench/core/bench/correctness.py#L91">4</a></p>
<p>Each row shows acceptance before → after, followed by the maximum absolute error after the change. All six errors were exactly 0.0 before the change. Error values below are rounded to six decimal places; the public reproduction records full precision. <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">2</a></p>
<ul>
<li>Omit both weight and bias — accepted → rejected; max absolute error 0.523450.</li>
<li>Omit the weight — accepted → rejected; max absolute error 0.540673.</li>
<li>Omit the bias — accepted → rejected; max absolute error 0.214417.</li>
<li>Use weight[0] and bias[0] for every element — accepted → rejected; max absolute error 0.635101.</li>
<li>Apply the affine transform twice — accepted → rejected; max absolute error 0.473204.</li>
<li>Apply the affine transform before normalization — accepted → rejected; max absolute error 0.092222.</li>
</ul>
<h2>A narrow change to the default generator</h2>
<p>The local patch draws each weight element as 1 + 0.1 × N(0,1), and each bias element as 0.1 × N(0,1). Values remain near familiar normalization parameters, but the tensors no longer act as identity constants. In this run, each affine tensor changed from one unique value to 64. These are Gaussian draws, not strict numerical bounds. <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">2</a></p>
<p>The change applies to the default random-input path. Explicit custom and safetensor inputs retain their values, and the existing low-precision fallback remains unchanged. Intentional constants still have a valid place in a test contract. Dataset-specific get_inputs functions need their own review; this two-branch change does not audit them. <a href="https://github.com/NVIDIA/SOL-ExecBench/blob/a9fa0804c793d438e70850c33fe34426e66d53dd/src/sol_execbench/core/bench/io.py#L281">3</a> <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">2</a></p>
<p>The CPU correct control was a copy of the expected affine output. It passed before and after with zero error. That confirms the positive case for this numerical-checker experiment; it is not an independent correct implementation. <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">2</a></p>
<h2>What the CPU run verified</h2>
<p>The original CPU experiment ran on macOS arm64 with Python 3.12.14 and PyTorch 2.14.1. The upstream project pins PyTorch 2.9.0 with a CUDA stack. The CPU error values and test results retain their original environment scope; the later CUDA confirmation is a separate run. <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">2</a> <a href="https://github.com/NVIDIA/SOL-ExecBench/blob/a9fa0804c793d438e70850c33fe34426e66d53dd/pyproject.toml">5</a></p>
<p>With the patch, the input-generation and numerical-correctness test files passed all 197 tests on CPU. The focused regression covers float32, float16 and bfloat16, the six wrong affine transformations, and preservation of explicit custom/safetensor constants. Ruff checks and git diff --check also passed. These checks validate the local CPU change; they are not a GPU benchmark. <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">2</a></p>
<p>The published issue follow-up records that CPU reproduction and proposes the limited change for maintainer feedback. It does not establish that a fix has been accepted upstream. <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">2</a></p>
<h2>CUDA confirmation on one Tesla T4</h2>
<p>On November 9, 2026, we ran the original synthetic workload through the selected public SOL-ExecBench input-generation and numerical-checker paths on CUDA. All six incorrect formulas were accepted with identity affine inputs and rejected after the narrow generator change. The copied-reference control passed both conditions. These are 14 candidate observations—seven outputs under two input conditions—on one float32 case with shape 4×64 and seed 42. <a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-result.json">7</a></p>
<p>The recorded environment was a Tesla T4, Python 3.12.10, PyTorch 2.9.0+cu130 and NVIDIA driver 610.57.04, reported through NVML. The selected public source was pinned to a9fa0804c793d438e70850c33fe34426e66d53dd. The numerical checker was unchanged; the input-generator patch varied the normalization weights and biases. The run synchronized CUDA after generation, reference computation, each candidate and each checker call. <a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-provenance.json">8</a></p>
<p>The activation tensor was identical across the before and after phases within this CUDA run. CPU and CUDA random-number streams are not asserted to be bit-identical, so the historical CPU error values above must not be read as CUDA measurements. The downloadable result records the CUDA tensors, numerical errors and verdicts; its provenance file records the result hash, source pins, runtime and review scope. <a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-result.json">7</a> <a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-provenance.json">8</a></p>
<p>To repeat the CUDA check, download the public source bundle, runtime lock bundle, instructions and SHA-256 checksum file linked here. The procedure targets Linux x86_64 with Python 3.12. Installing the locked runtime downloads 30 pinned wheels, about 2.74 GB; the bundles contain no wheels, and Modal is not required. The instruction file provides the CPU composition check and CUDA commands. <a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-source.tar.gz">9</a> <a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-runtime-lock.tar.gz">10</a> <a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-reproduce.txt">11</a> <a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-reproduction.sha256">12</a></p>
<p>This confirmation used one original synthetic fixture and selected public functions. It did not execute the full SOL evaluator or its dataset, rerun the 197-test CPU suite on GPU, measure kernel speed, evaluate a model, establish training benefit, or qualify a production environment. An earlier invocation failed while transporting its output; no numerical result was recovered from that invocation. The successful run used the same built runtime with a corrected result-transport path, as disclosed in the provenance. <a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-provenance.json">8</a></p>
<h2>Repeat the original CPU reproduction</h2>
<p>Our linked issue follow-up contains the complete standalone Python script, the two-line source change, and the observed results. It constructs its own Definition and Workload and calls the upstream generator and numerical checker directly. <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">2</a></p>
<p>To repeat the comparison, use an isolated checkout at a9fa0804c793d438e70850c33fe34426e66d53dd and save the script as reproduce_sol_norm_affine.py. With the Python dependencies available, run PYTHONPATH=src python reproduce_sol_norm_affine.py from the checkout root. Save the JSON, apply the two-line generator change shown in the issue follow-up, then run the same script again. The output includes the device, Torch version, seed, tolerance and verdict for every candidate. <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">2</a></p>
<p>Treat the recorded environment as part of the result. Other Torch versions or hardware can produce different random samples and numerical values. A six-case result does not establish exhaustive correctness, and our synthetic script makes no claim about the benchmark’s full task distribution.</p>
<h2>Inspect the recorded outputs</h2>
<p>The interactive fixture lets you switch between identity and varied affine inputs, inspect all six incorrect variants, and locate individual output differences. It displays the recorded Python tensor values and checker decisions. The browser does not execute a GPU kernel or rerun the checker; the copied expected-output control remains a sanity check. <a href="https://huggingface.co/spaces/Viswa-k/nodus-affine-input-counterexample">6</a></p>
<h2>A correctness label can become training data</h2>
<p>In a kernel-writing environment, the correctness decision can determine whether a candidate receives a performance reward. If a wrong affine computation is indistinguishable from the reference on generated inputs, the resulting label can look valid. That creates a plausible route to misleading training feedback. We have demonstrated the input blind spot here; we have not measured its effect on a trained model.</p>
<p>This gives evaluator authors a concrete check: deliberately omit a scale, omit a bias, reuse the wrong parameter index, or apply a transformation twice. Confirm that the intended reference passes and that each relevant mutation fails under the declared numerical contract. Record which behavior each input distribution exercises. A larger number of evaluations cannot compensate for an operation the inputs never test.</p>
<p>For labs training kernel-writing agents, we would like to compare a small set of meaningful wrong-program controls against your current evaluator and scope a Nodus environment or data pilot. The useful starting point is a specific skill, a protected correctness contract, and a result both sides can reproduce.</p>
<h2>Sources</h2>
<ol>
<li><a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25">Original report by zzw4257: SOL-ExecBench issue #25</a></li>
<li><a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">Nodus follow-up: standalone synthetic CPU reproduction, observed results and proposed patch</a></li>
<li><a href="https://github.com/NVIDIA/SOL-ExecBench/blob/a9fa0804c793d438e70850c33fe34426e66d53dd/src/sol_execbench/core/bench/io.py#L281">Pinned SOL-ExecBench input generator</a></li>
<li><a href="https://github.com/NVIDIA/SOL-ExecBench/blob/a9fa0804c793d438e70850c33fe34426e66d53dd/src/sol_execbench/core/bench/correctness.py#L91">Pinned SOL-ExecBench numerical checker</a></li>
<li><a href="https://github.com/NVIDIA/SOL-ExecBench/blob/a9fa0804c793d438e70850c33fe34426e66d53dd/pyproject.toml">Pinned SOL-ExecBench dependency versions</a></li>
<li><a href="https://huggingface.co/spaces/Viswa-k/nodus-affine-input-counterexample">Interactive LayerNorm counterexample with recorded CPU tensors and provenance</a></li>
<li><a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-result.json">Download: original synthetic CUDA result (JSON)</a></li>
<li><a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-provenance.json">Download: CUDA result provenance, source pins and scope (JSON)</a></li>
<li><a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-source.tar.gz">Download: public CUDA reproduction source bundle</a></li>
<li><a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-runtime-lock.tar.gz">Download: pinned CUDA runtime lock bundle (no wheels)</a></li>
<li><a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-reproduce.txt">Read: CUDA reproduction instructions</a></li>
<li><a href="https://data.nodus-compute.ai/assets/lab-research-affine-cuda-reproduction.sha256">Download: SHA-256 checksums for the reproduction files</a></li>
</ol>
<p><a href="https://data.nodus-compute.ai/blog/identity-inputs-hide-normalization-errors?utm_source=hashnode&amp;utm_medium=research&amp;utm_campaign=kernel_rl_benchmarks">Original article: Six wrong normalization formulas passed a correctness check</a></p>
<p><a href="https://discovery-meeting.nodus-compute.ai/?utm_source=hashnode&amp;utm_medium=research&amp;utm_campaign=kernel_rl_benchmarks&amp;utm_content=identity-inputs-hide-normalization-errors">Discuss a kernel evaluator pilot</a></p>
]]></content:encoded></item><item><title><![CDATA[The reward is part of the dataset]]></title><description><![CDATA[Six wrong normalization formulas passed a CPU checker with identity inputs. What this means for kernel RL feedback and held-out evaluation.]]></description><link>https://nodus-compute.hashnode.dev/the-reward-is-part-of-the-dataset</link><guid isPermaLink="true">https://nodus-compute.hashnode.dev/the-reward-is-part-of-the-dataset</guid><category><![CDATA[Machine Learning]]></category><category><![CDATA[Reinforcement Learning]]></category><category><![CDATA[GPU]]></category><dc:creator><![CDATA[Viswaretas Kotra]]></dc:creator><pubDate>Mon, 09 Nov 2026 09:31:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac84ac0b34c8375bca6e9e3/83fbd189-13bd-4fc8-bb94-ab13201521c1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Disclosure: This is an AI-generated article.</p>
<p>Set every normalization weight to one and every bias to zero. A program that skips the entire affine transform can now return the expected answer. So can one that applies the transform twice.</p>
<p>That is a concrete problem for kernel reinforcement learning: the correctness label can become part of the training signal.</p>
<p>Following <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25">zzw4257’s report in SOL-ExecBench</a>, we built an original synthetic CPU reproduction. Six deliberately incorrect affine formulas passed the numerical checker with identity inputs. Small elementwise perturbations of the weights and biases caused all six to fail; the correct-output control still passed. The <a href="https://github.com/NVIDIA/SOL-ExecBench/issues/25#issuecomment-6734823293">public follow-up includes the script and results</a>. This was CPU correctness evidence, not a GPU performance or training experiment.</p>
<p>The example explains why Nodus’s benchmark program separates three questions: can an agent produce correct, fast kernels; can an environment provide trustworthy feedback efficiently; and does training on the resulting data improve performance on new work?</p>
<p><a href="https://github.com/ScalingIntelligence/KernelBench">KernelBench</a> provides a starting point for the first question. A useful score still needs the task revision, reference implementation, hardware and generation budget. Otherwise a stronger model, longer search or weaker baseline can look like a data improvement.</p>
<p>Our proposed measurement experiment addresses the second question. Freeze candidate/reference pairs, measure them in isolation, then replay them under declared GPU sharing and contention settings. Keep the task, judge, software stack and hardware profile fixed. A full GPU and a MIG slice are different targets, so a ranking change between them is not automatically a measurement error.</p>
<p>We want to know which candidates labeled fast under sharing remain fast in isolation. We will retain ambiguous near-ties, timing uncertainty, failed attempts and missing results. Repeating a timing loop does not create additional independent tasks. Correctness must hold during timing as well as before it; skipped computation cannot count as a speedup.</p>
<p>Cost belongs in that record too. Compilation, startup, interrupted work, retries and validation consume resources. The useful unit is an independently validated result, with its attributable cost and elapsed time. An unknown charge is not a zero-dollar result.</p>
<p>The third question needs a separate learning experiment. Start from the same trainable checkpoint, freeze the training recipe, and hold out source or workload families before generating training examples. Compare a baseline with the proposed data treatment under an explicitly matched budget, then evaluate on untouched work. Report regressions and uncertainty alongside improvements. Extra shape variants of a familiar task do not establish transfer.</p>
<p>This is the research design described in <a href="https://data.nodus-compute.ai/blog/what-kernel-rl-benchmarks-should-measure?utm_source=hashnode&amp;utm_medium=research&amp;utm_campaign=kernel_rl_benchmarks">The reward is part of the dataset</a>. We have not reported a measured Nodus training gain or provider-comparison result from these proposed experiments.</p>
<p>If your lab trains agents that write GPU kernels, <a href="https://discovery-meeting.nodus-compute.ai/?utm_source=hashnode&amp;utm_medium=research&amp;utm_campaign=kernel_rl_benchmarks&amp;utm_content=reward_is_part_of_dataset">discuss a scoped Nodus environment or data pilot</a>. We would start with your evaluation protocol and the improvement that would make the data worth using.</p>
]]></content:encoded></item></channel></rss>