<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TinyComputers.io (Posts about openmythos)</title><link>https://tinycomputers.io/</link><description></description><atom:link href="https://tinycomputers.io/categories/openmythos.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 A.C. Jokela 
&lt;!-- div style="width: 100%" --&gt;
&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;&lt;img alt="" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/80x15.png" /&gt; Creative Commons Attribution-ShareAlike&lt;/a&gt;&amp;nbsp;|&amp;nbsp;
&lt;!-- /div --&gt;
</copyright><lastBuildDate>Tue, 21 Apr 2026 03:38:09 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Architecture Verified, Mythology Intact: Running OpenMythos on a Strix Halo</title><link>https://tinycomputers.io/posts/architecture-verified-mythology-intact.html?utm_source=feed&amp;utm_medium=rss&amp;utm_campaign=rss</link><dc:creator>A.C. Jokela</dc:creator><description>&lt;p&gt;Anthropic has a rumored upcoming model called Mythos. The weights are not public, the architecture is not published, and Anthropic has said nothing official about how it works. That has not stopped people from guessing.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/kyegomez/OpenMythos"&gt;OpenMythos&lt;/a&gt; is one of those guesses: an open-source "theoretical reconstruction" by Kye Gomez, built from publicly available research on what Anthropic's architecture might look like. The repository's disclaimer is blunt: "an independent, community-driven theoretical reconstruction based solely on publicly available research and speculation. It is not affiliated with, endorsed by, or connected to Anthropic."&lt;/p&gt;
&lt;p&gt;The architecture Gomez bets on is called a Recurrent-Depth Transformer. That's a specific and unusual design choice. Most current language models, like GPT or Llama, are feed-forward: tokens enter at the bottom, flow through dozens of distinct layers stacked on top of each other, and exit as predicted next tokens. A Recurrent-Depth Transformer splits that stack differently. A small number of ordinary layers run once at the start and once at the end. In between, a single layer runs many times in sequence, with the output of each run fed back in as the input to the next. Same weights. More computation.&lt;/p&gt;
&lt;p&gt;You can pip install OpenMythos. It has configurations from &lt;code&gt;mythos_1b&lt;/code&gt; (one billion parameters, toy scale) up to &lt;code&gt;mythos_1t&lt;/code&gt; (one trillion, frontier scale). The README shows you how to instantiate the 1B version in about ten lines of Python and run a forward pass.&lt;/p&gt;
&lt;p&gt;I ran that 1B variant on my Strix Halo box (a Ryzen AI MAX+ 395 with an integrated Radeon 8060S GPU, 60 GB of unified memory, running PyTorch on ROCm). The question is not whether it runs. The question is what running it can tell you. The answer turns out to be interesting in both directions: more than expected about the &lt;em&gt;architecture&lt;/em&gt;, and exactly nothing about the &lt;em&gt;model&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;The Setup&lt;/h3&gt;
&lt;p&gt;The Strix Halo has one GPU. OpenMythos targets distributed training via FSDP, but the forward and inference paths work single-GPU. Install path:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;pip install --no-deps open-mythos
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;--no-deps&lt;/code&gt; matters. The &lt;code&gt;pyproject.toml&lt;/code&gt; pins &lt;code&gt;torch = "2.11.0"&lt;/code&gt;, which is not what my gfx1151 wheels are at, and the package's actual runtime requirements are satisfied by any torch &amp;gt;=2.1. Skipping deps keeps my ROCm stack intact.&lt;/p&gt;
&lt;p&gt;One ROCm-specific patch was needed. The &lt;code&gt;DepthWiseLoRA&lt;/code&gt; module's forward has this line:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loop_t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That creates a 0-dim tensor and passes it to an &lt;code&gt;nn.Embedding&lt;/code&gt;. On gfx1151 this produces a hip launch failure. The fix is a one-line change to index the embedding weight directly:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;loop_t&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Same semantics, different kernel path, no crash. Expect similar papercuts in any research code run on non-reference hardware.&lt;/p&gt;
&lt;p&gt;With that done, &lt;code&gt;mythos_1b&lt;/code&gt; instantiates cleanly. Parameter count: 1,064,028,034. A forward pass at batch 1, sequence 128, 16 loops, using bfloat16 mixed precision (a numerical format that halves memory versus regular float32 with negligible quality loss for inference): 2.07 seconds. Peak GPU memory: 6.44 GB. Well within the Strix Halo's envelope.&lt;/p&gt;
&lt;p&gt;That gives me a working model. The rest of this post is what I did with it.&lt;/p&gt;
&lt;h3&gt;Why a Looped Transformer, Briefly&lt;/h3&gt;
&lt;p&gt;Before the experiments, a quick tour of what's specifically weird about this architecture, because everything downstream depends on it.&lt;/p&gt;
&lt;p&gt;A standard transformer has roughly 32 to 100 distinct layers. Each layer has its own parameters. A prompt passes through every layer once. The parameter count is proportional to the layer count times the width of each layer.&lt;/p&gt;
&lt;p&gt;A looped transformer keeps only one "inner" layer but runs it many times. Training on 32 "effective layers" requires only 1 layer's worth of parameters. Inference with more loops is equivalent to running a deeper model, without actually storing a deeper model. The architectural bet: if you can get this to work, you get a deeper reasoning model for a fraction of the memory.&lt;/p&gt;
&lt;p&gt;There are two reasons to care about this for a model like Claude Mythos. First, memory efficiency at scale. A trillion-parameter model is expensive to serve; a looped model with the capability of a trillion-parameter feed-forward model but 1/16th the parameters would be dramatically cheaper. Second, reasoning depth. A 2025 paper by Saunshi et al. proved mathematically that running a looped transformer for T loops is equivalent to doing T implicit steps of chain-of-thought reasoning (the now-familiar "let me think step by step" trick that makes large models better at hard problems), except the "thoughts" happen in continuous latent space inside the model rather than being emitted as visible text tokens. If Mythos is doing that, it would explain why the model seems to do multi-step reasoning without the user ever seeing intermediate "scratch" tokens.&lt;/p&gt;
&lt;p&gt;The catch is that training a looped transformer is notoriously unstable. If the single inner layer amplifies the signal each time it runs, that amplification compounds. A 5% boost per loop becomes a 65% boost after 10 loops, and a model with a 65% boost per forward pass either explodes in training or produces outputs that don't resemble language. Most attempts at looped transformers over the last decade failed for exactly this reason.&lt;/p&gt;
&lt;p&gt;The fix that makes OpenMythos (and the hypothesized Mythos) workable is borrowed from a 2026 paper called Parcae (Prairie et al.). It introduces a clever parameterization of the "gain" of the recurrent update. Instead of letting the model learn arbitrary weights in the core recurrence, Parcae constrains one piece of the architecture to always have its largest amplification factor strictly less than 1. In dynamical-systems terms, the "spectral radius" of the update matrix is always less than one. That guarantee is what makes the loops stable: any signal gets damped by each repeated application, so repeated iteration converges toward a useful fixed point instead of blowing up.&lt;/p&gt;
&lt;p&gt;This is the claim I'm about to test. The spectral radius should be less than 1 by construction. Without that constraint, training should break. And the failure mode should match what Parcae predicts.&lt;/p&gt;
&lt;h3&gt;What I Verified&lt;/h3&gt;
&lt;h4&gt;1. The spectral radius at initialization&lt;/h4&gt;
&lt;p&gt;The cleanest possible check: the &lt;a href="https://arxiv.org/abs/2501.19181"&gt;Parcae paper&lt;/a&gt; claims a specific mathematical structure for the stability-guaranteeing matrix. Starting from the parameters' default initialized values of zero, the formula works out to a single number: &lt;code&gt;exp(-1) = 0.3679&lt;/code&gt;. If the code matches the paper, a fresh &lt;code&gt;mythos_1b&lt;/code&gt; should have its key matrix set to exactly that value everywhere.&lt;/p&gt;
&lt;p&gt;The parameterization in the code is:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;A = exp(-exp(log_dt + log_A))
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With &lt;code&gt;log_A&lt;/code&gt; and &lt;code&gt;log_dt&lt;/code&gt; both initialized to zero, that becomes &lt;code&gt;exp(-exp(0)) = exp(-1) = 0.3679&lt;/code&gt;. The matrix in question is diagonal, meaning it's effectively a list of numbers rather than a two-dimensional grid, so the spectral radius (technical definition: magnitude of the largest eigenvalue) reduces to the largest absolute value in that list. At initialization, every entry is the same 0.3679.&lt;/p&gt;
&lt;p&gt;Measurement on the instantiated 1B model:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;log_A init value (first 5): [0. 0. 0. 0. 0.]
A min: 0.367879
A max: 0.367879
rho(A) at init: 0.367879
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Matches the theoretical prediction to six decimal places. The constraint is doing what the paper claims. This is the kind of thing you can only verify by actually running the code, because documentation and papers often drift from implementations, and subtle bugs in implementations of clever mathematical constructions are common.&lt;/p&gt;
&lt;h4&gt;2. The loops are not a no-op&lt;/h4&gt;
&lt;p&gt;Next question: do the loops actually do anything? The README claims each loop iteration is "functionally equivalent to one step of chain-of-thought." In practical terms, that means running more loops should produce different (and presumably better) output than running fewer. If the recurrent block has learned to do nothing, or if the architecture happens to be set up such that the injection of the original input drowns out everything the loop contributes, then all loop counts would produce identical outputs and the whole looped-transformer idea is moot.&lt;/p&gt;
&lt;p&gt;The cleanest test: take the same input, the same random-initialized model, and run it with different loop counts. Compare the outputs. For each token position, the model predicts a probability distribution over the next token. Two different ways to compare:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Argmax agreement&lt;/strong&gt; is just "for what fraction of positions does the most-likely-next-token come out the same?" If two runs pick the same top token 95% of the time, they mostly agree. If they agree 35% of the time, they're meaningfully different. The comparison below uses the 16-loop run as the reference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KL divergence&lt;/strong&gt; is a standard measure of how different two probability distributions are, expressed in nats (units of the natural logarithm). Zero means identical distributions. Higher means more different. Intuitively: how much information is lost if you model a distribution as something other than itself.&lt;/p&gt;
&lt;p&gt;Running a fresh, &lt;em&gt;untrained&lt;/em&gt; &lt;code&gt;mythos_1b&lt;/code&gt; with a fixed input and seed:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;n_loops= 1: argmax agreement with 16-loop run = 35.2%   KL = 0.19 nats
n_loops= 2: argmax agreement                  = 65.6%   KL = 0.10 nats
n_loops= 3: argmax agreement                  = 72.7%   KL = 0.07 nats
n_loops= 4: argmax agreement                  = 80.5%   KL = 0.06 nats
n_loops= 6: argmax agreement                  = 88.3%   KL = 0.04 nats
n_loops= 8: argmax agreement                  = 90.6%   KL = 0.02 nats
n_loops=12: argmax agreement                  = 96.1%   KL = 0.005 nats
n_loops=16: argmax agreement                  =100.0%   KL = 0 nats
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Even with random initialization, the loops do substantive work. After a single loop, only 35% of the 128 output tokens match what the model produces after 16 loops. By three loops, 73% match. By twelve, 96%. The KL divergence tells the same story from a different angle: the probability distributions converge monotonically toward the 16-loop baseline as loop count rises.&lt;/p&gt;
&lt;p&gt;This is exactly the signature of a well-behaved recurrent system settling toward a fixed point. The loops aren't a no-op. They also aren't chaotic: each successive loop gets closer to convergence, which is what the stability guarantee predicts.&lt;/p&gt;
&lt;h4&gt;3. The stability constraint does its job&lt;/h4&gt;
&lt;p&gt;The reconstruction becomes load-bearing here. The Parcae paper claims the constraint on the matrix A is not just a nice-to-have but a requirement. Without it, they say, training diverges at aggressive learning rates. With it, training is stable.&lt;/p&gt;
&lt;p&gt;The test: build three otherwise-identical small models (shrunk to a 128-dimensional hidden state for training speed while keeping the full looped architecture). The only difference is how the matrix A is parameterized:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;stable&lt;/strong&gt;: the shipped &lt;code&gt;LTIInjection&lt;/code&gt; that uses the &lt;code&gt;exp(-exp(...))&lt;/code&gt; construction to keep A in the stable range by construction&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;unstable (start at 0.368)&lt;/strong&gt;: replace the clever construction with a raw learnable parameter initialized to the same value the stable version starts at&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;unstable (start at 0.95)&lt;/strong&gt;: same raw parameter, but initialized close to the stability boundary, to see whether training pushes it over&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Trained at a deliberately high learning rate of 0.05 with 8 recurrent loops per forward pass, for 300 steps, on random next-token prediction. (The point isn't to train a good model. It's to stress-test the stability mechanism under conditions where unstable training would be expected to break.)&lt;/p&gt;
&lt;p&gt;The metric is &lt;code&gt;max|A|&lt;/code&gt;, the largest entry in the diagonal. For the stable version, this is the spectral radius and the theory guarantees it stays below 1. For the unstable versions, nothing guarantees anything; we're watching whether training happens to keep it bounded.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: right;"&gt;Step&lt;/th&gt;
&lt;th style="text-align: center;"&gt;Stable&lt;/th&gt;
&lt;th style="text-align: center;"&gt;Unstable (0.368)&lt;/th&gt;
&lt;th style="text-align: center;"&gt;Unstable (0.95)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;0&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0.368&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0.418&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;20&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0.496&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0.719&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1.319&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;60&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0.480&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0.749&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1.340&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;100&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0.477&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0.736&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1.315&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;200&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0.474&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0.700&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1.251&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;299&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0.469&lt;/td&gt;
&lt;td style="text-align: center;"&gt;0.666&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1.190&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Within 20 training steps, both unstable variants push at least one entry of A well above the stable version's cap. The 0.95-init case jumps past 1 immediately and stays there. Above 1 is the forbidden regime: a diagonal entry greater than 1 in magnitude means that dimension's contribution to the hidden state grows with every loop instead of shrinking. The Parcae paper says this is fatal. Does it actually kill training?&lt;/p&gt;
&lt;p&gt;Mostly, yes. The stable variant kept producing meaningful gradients the whole way through and the loss moved (noisily, because the training data was random). Both unstable variants had their gradient norm collapse to machine zero within 20 steps and stay there. Their loss froze at &lt;code&gt;log(512) = 6.238&lt;/code&gt;, which is the entropy of a uniform distribution over the 512-token vocabulary we used: the training signal became meaningless because the model was outputting a flat "I have no preference about any token" distribution regardless of input.&lt;/p&gt;
&lt;p&gt;This isn't the classic way training fails. It's not the "loss explodes to infinity and the whole job crashes" failure mode most people think of. It's subtler: the recurrent state grows large enough that the final output saturates to uniform, every possible update to the weights produces the same (wrong) uniform output, so the gradients go to zero and the optimizer stops making progress. Training is effectively dead, silently.&lt;/p&gt;
&lt;p&gt;That is a specific failure mode the Parcae paper warns about, and it is exactly what happens here when the constraint is removed.&lt;/p&gt;
&lt;h4&gt;4. Hidden states blow up by exactly the predicted factor per loop&lt;/h4&gt;
&lt;p&gt;The previous experiment showed that removing the stability constraint breaks training. This one looks at the mechanism underneath. What does "the recurrent state grows unboundedly" actually look like numerically?&lt;/p&gt;
&lt;p&gt;The theory predicts that if the spectral radius is ρ, then after each loop the magnitude of the hidden state grows (or shrinks) by a factor of roughly ρ. With ρ &amp;lt; 1, repeated shrinkage by less than one converges toward a fixed value. With ρ &amp;gt; 1, repeated growth by more than one goes to infinity exponentially.&lt;/p&gt;
&lt;p&gt;Setup: instrument the model to record the magnitude of the hidden state at each loop iteration. Force A to specific values from stable (0.37) through borderline (1.0) through clearly unstable (2.0). Disable ACT halting (an early-exit mechanism explained below in experiment 5) so all 8 loops run and we can see the full trajectory. Each number below is the magnitude of the hidden state measured after that loop iteration completes.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: right;"&gt;Loop&lt;/th&gt;
&lt;th style="text-align: right;"&gt;ρ=0.37&lt;/th&gt;
&lt;th style="text-align: right;"&gt;ρ=0.9&lt;/th&gt;
&lt;th style="text-align: right;"&gt;ρ=1.0&lt;/th&gt;
&lt;th style="text-align: right;"&gt;ρ=1.2&lt;/th&gt;
&lt;th style="text-align: right;"&gt;ρ=1.5&lt;/th&gt;
&lt;th style="text-align: right;"&gt;ρ=2.0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1&lt;/td&gt;
&lt;td style="text-align: right;"&gt;91&lt;/td&gt;
&lt;td style="text-align: right;"&gt;91&lt;/td&gt;
&lt;td style="text-align: right;"&gt;91&lt;/td&gt;
&lt;td style="text-align: right;"&gt;91&lt;/td&gt;
&lt;td style="text-align: right;"&gt;91&lt;/td&gt;
&lt;td style="text-align: right;"&gt;92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;2&lt;/td&gt;
&lt;td style="text-align: right;"&gt;124&lt;/td&gt;
&lt;td style="text-align: right;"&gt;172&lt;/td&gt;
&lt;td style="text-align: right;"&gt;182&lt;/td&gt;
&lt;td style="text-align: right;"&gt;200&lt;/td&gt;
&lt;td style="text-align: right;"&gt;228&lt;/td&gt;
&lt;td style="text-align: right;"&gt;274&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;3&lt;/td&gt;
&lt;td style="text-align: right;"&gt;136&lt;/td&gt;
&lt;td style="text-align: right;"&gt;246&lt;/td&gt;
&lt;td style="text-align: right;"&gt;272&lt;/td&gt;
&lt;td style="text-align: right;"&gt;330&lt;/td&gt;
&lt;td style="text-align: right;"&gt;432&lt;/td&gt;
&lt;td style="text-align: right;"&gt;638&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;4&lt;/td&gt;
&lt;td style="text-align: right;"&gt;141&lt;/td&gt;
&lt;td style="text-align: right;"&gt;312&lt;/td&gt;
&lt;td style="text-align: right;"&gt;363&lt;/td&gt;
&lt;td style="text-align: right;"&gt;487&lt;/td&gt;
&lt;td style="text-align: right;"&gt;738&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1367&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;5&lt;/td&gt;
&lt;td style="text-align: right;"&gt;143&lt;/td&gt;
&lt;td style="text-align: right;"&gt;371&lt;/td&gt;
&lt;td style="text-align: right;"&gt;454&lt;/td&gt;
&lt;td style="text-align: right;"&gt;675&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1199&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2825&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;6&lt;/td&gt;
&lt;td style="text-align: right;"&gt;143&lt;/td&gt;
&lt;td style="text-align: right;"&gt;425&lt;/td&gt;
&lt;td style="text-align: right;"&gt;544&lt;/td&gt;
&lt;td style="text-align: right;"&gt;901&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1889&lt;/td&gt;
&lt;td style="text-align: right;"&gt;5740&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;7&lt;/td&gt;
&lt;td style="text-align: right;"&gt;144&lt;/td&gt;
&lt;td style="text-align: right;"&gt;473&lt;/td&gt;
&lt;td style="text-align: right;"&gt;635&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1172&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2924&lt;/td&gt;
&lt;td style="text-align: right;"&gt;11570&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;8&lt;/td&gt;
&lt;td style="text-align: right;"&gt;144&lt;/td&gt;
&lt;td style="text-align: right;"&gt;517&lt;/td&gt;
&lt;td style="text-align: right;"&gt;726&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1498&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4476&lt;/td&gt;
&lt;td style="text-align: right;"&gt;23232&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Two things to notice. First, the stable column (ρ=0.37) converges to a fixed value around 143 and stops moving. Each loop shrinks the hidden state closer to an equilibrium, then settles. This is the intended behavior: a useful, computation-performing recurrent system that's doing work but not running away.&lt;/p&gt;
&lt;p&gt;Second, the ρ=2.0 column grows by almost exactly 2× per loop after the first couple: 274 → 638 → 1367 → 2825 → 5740 → 11570 → 23232. The last three ratios average 2.02×, which is as close to the theoretical 2.0 as you'd expect given the transformer block itself contributes nonlinear noise on top of the linear dynamics. The prediction is tight.&lt;/p&gt;
&lt;p&gt;Four loops of ρ=2.0 take the hidden state from 91 to 1367, already a 15× blowup. Sixteen loops (the designed inference depth for &lt;code&gt;mythos_1b&lt;/code&gt;) would push it to around 10^7, which is well past the representable range of bfloat16 and would produce infinities in a real forward pass.&lt;/p&gt;
&lt;p&gt;That is the stability analysis verified on actual silicon. The clever &lt;code&gt;exp(-exp(...))&lt;/code&gt; construction does what the paper says it does, and removing it produces exactly the divergence the paper says it produces, at the rate the paper says it produces it.&lt;/p&gt;
&lt;h4&gt;5. Throughput on a consumer APU&lt;/h4&gt;
&lt;p&gt;The numbers for curiosity, not for the thesis. Single prompt of 128 tokens, bfloat16, running on the integrated Radeon 8060S:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: right;"&gt;n_loops&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Latency&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Tokens/sec&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Peak GB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1&lt;/td&gt;
&lt;td style="text-align: right;"&gt;141 ms&lt;/td&gt;
&lt;td style="text-align: right;"&gt;910&lt;/td&gt;
&lt;td style="text-align: right;"&gt;6.29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;2&lt;/td&gt;
&lt;td style="text-align: right;"&gt;254 ms&lt;/td&gt;
&lt;td style="text-align: right;"&gt;503&lt;/td&gt;
&lt;td style="text-align: right;"&gt;6.37&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;4&lt;/td&gt;
&lt;td style="text-align: right;"&gt;501 ms&lt;/td&gt;
&lt;td style="text-align: right;"&gt;255&lt;/td&gt;
&lt;td style="text-align: right;"&gt;6.42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;8&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1021 ms&lt;/td&gt;
&lt;td style="text-align: right;"&gt;125&lt;/td&gt;
&lt;td style="text-align: right;"&gt;6.44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;16&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2071 ms&lt;/td&gt;
&lt;td style="text-align: right;"&gt;62&lt;/td&gt;
&lt;td style="text-align: right;"&gt;6.44&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Latency is almost perfectly linear in loop count, which is what you'd expect: double the loops, double the compute, double the wall-clock time. The knee of the inference-time scaling curve, to the extent one exists, sits around 6 to 8 loops before the "more reasoning" benefit stops being worth the "wait twice as long" cost.&lt;/p&gt;
&lt;p&gt;The architecture has a feature called Adaptive Computation Time (ACT) that is supposed to help here. ACT learns, per-position in the prompt, whether that token's representation has "converged enough" to stop looping. Easy tokens (a period, a common function word) should halt after a couple of loops; hard tokens (the key answer in a math problem) keep looping. In theory, this saves compute on easy tokens.&lt;/p&gt;
&lt;p&gt;In practice, ACT had no measurable effect on throughput in my runs. Two reasons. First, ACT only breaks the loop early if &lt;em&gt;every&lt;/em&gt; position in the batch has halted, because the GPU runs all positions in parallel and can't just skip one. With 128 positions in the prompt, the probability that every single position happens to halt simultaneously is effectively zero, so the early-exit path never fires. Second, the halting decision is made by a learned predictor, and my model was randomly initialized (not trained). An untrained model doesn't know which tokens are easy. You'd need actual training plus a mix of easy-and-hard positions for ACT to help. Neither was present in my experiments.&lt;/p&gt;
&lt;h3&gt;The Architectural Ceiling I Didn't Expect&lt;/h3&gt;
&lt;p&gt;While trying to run 24 loops for an ablation that's not in this post, I hit this error:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;IndexError&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dimension&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It turned out the architecture has a small per-loop adaptation component, a tiny learnable "tweak" that's different for each loop iteration, letting loop #1 behave slightly differently from loop #8. That component is implemented as a lookup table with exactly &lt;code&gt;max_loop_iters&lt;/code&gt; entries. If you configured the model to train on 16 loops, you have 16 entries in the table. Trying to run a 17th loop means looking up entry 16 in a 16-entry table, which fails.&lt;/p&gt;
&lt;p&gt;This matters because one of the headline claims about looped transformers is &lt;em&gt;depth extrapolation&lt;/em&gt;: train the model on (say) 5-step reasoning chains, then at inference time let it run 10 or 20 loops to handle harder problems than it ever saw during training. The theoretical argument is that running more loops = more reasoning depth, and this should emerge as a free capability at inference time.&lt;/p&gt;
&lt;p&gt;The OpenMythos implementation supports depth extrapolation only up to &lt;code&gt;max_loop_iters&lt;/code&gt;. Past that, the per-loop adaptation lookup fails. You can extend the table, but only by reinitializing it larger and resuming training. You cannot simply crank a knob at inference time.&lt;/p&gt;
&lt;p&gt;That's a genuine constraint on the "more loops = deeper reasoning at inference" story, and it's the kind of thing you find only by trying to cross the boundary. Nothing in the README warns you about it. It's the sort of detail that disappears when a paper's theoretical claim ("more loops at inference!") becomes a concrete implementation ("a table indexed by loop number, which has a fixed size").&lt;/p&gt;
&lt;h3&gt;What I Could Not Verify&lt;/h3&gt;
&lt;p&gt;Nothing I did tells you anything about Claude Mythos.&lt;/p&gt;
&lt;p&gt;The architecture OpenMythos implements could be exactly the Mythos architecture. It could be a reasonable guess that shares some features with Mythos. It could be entirely wrong. You and I have no way to check, because Anthropic has not published the architecture. The &lt;code&gt;mythos_1b&lt;/code&gt; I trained is a 1B-parameter looped transformer that &lt;em&gt;behaves&lt;/em&gt; consistently with published research on looped transformers. It is not Mythos.&lt;/p&gt;
&lt;p&gt;This is the epistemic limit that the repo's disclaimer is trying to name. Running a speculative reconstruction tells you whether the reconstruction is internally coherent, and whether it matches the published research it claims to match. It tells you nothing about whether the reconstruction maps to the thing it was reconstructed from. No amount of running it closes that gap. The gap is closed only by information the model's creators chose not to release, and running silicon against latent belief doesn't produce that information.&lt;/p&gt;
&lt;p&gt;So "I verified that OpenMythos's architecture works as claimed" is a real and useful statement. "I verified that Claude Mythos uses this architecture" is not something I can say, and nobody outside Anthropic can, no matter how thoroughly they run the reconstruction.&lt;/p&gt;
&lt;h3&gt;What an Open Reconstruction Is Good For&lt;/h3&gt;
&lt;p&gt;It's good for three things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One, as a teaching artifact.&lt;/strong&gt; There's a live research line on looped transformers. Most descriptions of it are paper-shaped: dense with notation, theorem statements, ablation tables. OpenMythos is one of the few places you can read the whole architecture as working code in a single file, with every piece named and addressable. The stability guarantee that takes several pages of the Parcae paper to motivate resolves to one line of Python:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_A&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_dt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That's the whole guarantee. You can read it, you can run it, you can verify it on your bench. The paper claim goes from abstract math to a concrete object you can measure. For anyone who wants to understand why looped transformers work and has been bouncing off the academic literature, that's worth the install.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two, as a testbed for your own ideas.&lt;/strong&gt; If you want to try modifying the architecture (swap which attention variant it uses, change how the experts are routed, make the loops behave differently at different depths) the code is about 1000 lines of clean PyTorch. You don't need to build a looped transformer from scratch; you can start from a working baseline and modify. The research is live and you can participate in it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Three, as a way to calibrate your expectations.&lt;/strong&gt; My 1B-parameter &lt;code&gt;mythos_1b&lt;/code&gt; produces 62 tokens per second at 16 loops on the 8060S. A full-scale Mythos would be far larger and presumably run at similar or more loops per token. If Mythos is actually a Recurrent-Depth Transformer, that tells you something about the real cost of running it: every token takes the full loop count of compute, regardless of how "easy" it is. That's a different cost shape than a standard transformer, which uses the same compute per token but over a fixed number of distinct layers. You can form a rough sense of the compute-per-token ratio that a looped architecture would imply for a frontier deployment, which is useful even if you never run a frontier model yourself.&lt;/p&gt;
&lt;p&gt;None of those three things are "I now know how Claude Mythos works." They are all "I now know things about looped transformers that I did not know before." For the blogger running an 8060S in a home lab, that's the realistic upside, and it's a larger upside than zero.&lt;/p&gt;
&lt;h3&gt;Coda: The Reconstruction as Thing&lt;/h3&gt;
&lt;p&gt;I wrote a &lt;a href="https://tinycomputers.io/posts/the-thing-and-the-endpoint.html"&gt;philosophy piece earlier this week&lt;/a&gt; about Heidegger's distinction between things and endpoints. A Z80 on a RetroShield is a thing: it gathers a world of silicon, engineers, software history, and your own hands. A cloud API is an endpoint: it offers a contract and deliberately hides everything behind it.&lt;/p&gt;
&lt;p&gt;Claude Mythos is an endpoint. You send tokens, you get tokens, the weights are not yours, the architecture is not yours, and if Anthropic swaps the backing model nothing changes for the caller by design. That's the whole value proposition. It refuses to gather.&lt;/p&gt;
&lt;p&gt;OpenMythos is a thing. I have its weights. I know the parameter count down to the last entry: 1,064,028,034. I measured its internal stability matrix at initialization and watched it move across training. I watched the hidden state blow up to 23,000 when I forced the instability and disabled the halting mechanism. I know how long a forward pass takes on my specific GPU with my specific ROCm wheel on a specific Tuesday in April 2026. It gathers a whole lineage: the 2026 Parcae paper that explained the stability trick, the older research on looped transformers that it built on, Kye Gomez's speculative synthesis of the two into a candidate architecture for Mythos, the AMD gfx1151 toolchain that lets me run any of this on a Ryzen APU at all, the one-line patch I had to apply to the code, my own debugging session, and thirty minutes of my GPU's fans running at full tilt.&lt;/p&gt;
&lt;p&gt;The thing gathers. What it gathers, though, is the &lt;em&gt;reconstruction&lt;/em&gt;. Not the reconstructed. My 1B model is a physical artifact with measurable behavior. It is not a window onto Anthropic's internals. Those internals remain an endpoint, and the endpoint remains abstract.&lt;/p&gt;
&lt;p&gt;Mythology intact. Architecture verified. That is what a home lab buys you in 2026.&lt;/p&gt;</description><category>ai</category><category>claude</category><category>looped transformer</category><category>mythos</category><category>openmythos</category><category>philosophy</category><category>reconstruction</category><category>recurrent depth transformer</category><category>rocm</category><category>strix halo</category><guid>https://tinycomputers.io/posts/architecture-verified-mythology-intact.html</guid><pubDate>Mon, 20 Apr 2026 13:00:00 GMT</pubDate></item></channel></rss>