Files
zeekay 8f118cfc08 paper: Hanzo Router — memory-aware local-first routing with a learned SLO policy
9-page paper (mechanism/brain split, memory-aware placement, bilinear
utility + LinUCB, SLO objective quality - lambda*cost - mu*latency).
Itemized cost model beyond API tokens: honest local-compute electricity
figure (~$0.0001/1k tok, not free), cloud-GPU-rental-avoided, run-for-pay
fleet angle, seat consolidation, overage avoidance, 1% routing fee, and a
20-person-team TCO table. Builds clean via pdflatex+bibtex.
2026-07-07 16:43:20 -07:00

52 lines
2.2 KiB
TeX

\begin{figure}[t]
\centering
\begin{tikzpicture}[
font=\scriptsize,
node distance=3.4mm,
box/.style={draw, rounded corners=2pt, align=center, minimum height=5.5mm,
inner xsep=3pt, text width=60mm},
stage/.style={box, fill=hzslate!8, draw=hzslate!60},
reuse/.style={box, fill=hzgreen!14, draw=hzgreen!70},
load/.style={box, fill=hzblue!10, draw=hzblue!70},
cloud/.style={box, fill=hzslate!12, draw=hzslate!60},
learn/.style={box, fill=hzred!8, draw=hzred!55},
arr/.style={-{Latex[length=2mm]}, hzslate!80, line width=0.4pt}
]
\node[stage, fill=hzblue!10, draw=hzblue!70] (req)
{request \textit{(text, tokens, media, SLO)}};
\node[stage, below=of req] (cls)
{\textbf{classify} $\rightarrow$ \texttt{Task}\; (heuristic $\parallel$ encoder)};
\node[stage, below=of cls] (mem)
{\textbf{memory check}\; budget $=$ available $\times f$};
\node[reuse, below=of mem] (reuse)
{\textbf{1. Reuse} resident local model \;---\; \$0 marginal};
\node[load, below=of reuse] (load)
{\textbf{2. LoadLocal} that fits budget};
\node[cloud, below=of load] (cloud)
{\textbf{3. Cloud} \;---\; cheapest usable provider};
\node[learn, below=5mm of cloud] (loop)
{\textbf{enso learning loop}\\[1pt]
serve $\rightarrow$ \texttt{observe}$(u,x,p,r)$ $\rightarrow$ LinUCB update $\theta_u$};
\draw[arr] (req) -- (cls);
\draw[arr] (cls) -- (mem);
\draw[arr] (mem) -- (reuse);
\draw[arr] (reuse) -- (load) node[midway, right=1mm, hzslate!70, font=\tiny] {else};
\draw[arr] (load) -- (cloud) node[midway, right=1mm, hzslate!70, font=\tiny] {else};
\draw[arr] (cloud) -- (loop);
\draw[arr, dashed, hzred!70] (loop.east) -- ++(4mm,0) |- (cls.east)
node[pos=0.25, right, hzred!70, font=\tiny\itshape, align=left] {reward\\feedback};
\end{tikzpicture}
\caption{The router decision flow. A request is classified to a task, checked
against the memory budget, and placed by the ordered walk: reuse a resident
local model (zero marginal cost), else load a local model that fits, else fall
through to the cheapest usable cloud model. The learned policy (\texttt{enso})
closes the loop---each served request yields a reward that updates the per-user
LinUCB weights and, through them, future routing.}
\label{fig:decision}
\end{figure}