Skip to content

Add a post on Dynamo support and per-cluster serving stacks - #37

Draft
negz wants to merge 2 commits into
modelplaneai:mainfrom
negz:grove-is-in-the-heart
Draft

Add a post on Dynamo support and per-cluster serving stacks#37
negz wants to merge 2 commits into
modelplaneai:mainfrom
negz:grove-is-in-the-heart

Conversation

@negz

@negz negz commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

What and why

Modelplane now lets a platform team choose the serving stack each cluster runs, either the stack Modelplane composes itself or NVIDIA Dynamo's components. Nothing on the blog covers it yet. The post's argument is why a cluster can change stacks without an ML team rewriting anything: a ModelDeployment describes an engine rather than a stack, so what matters is whether a stack can run two pod specs with distinct commands and give a worker a way to find its leader.

It leads with what gang scheduling and peer-to-peer weight transfer are worth, then walks through the cluster opt-in, what a Leader and Worker gang becomes on each stack, and how ModelExpress moves weights between replicas. The worked example is the two-node Qwen3-Coder manifest from the Modelplane docs, opted into ModelExpress.

Draft because it needs a cover image at public/blog/dynamo-fleet-wide/cover.png. Every other post has one, and I left the frontmatter field out rather than point at a file that isn't there.

The first commit has nothing to do with the post itself, and fixes a next build failure the post triggers. normalizeAuthors set every optional author field even where frontmatter omits it, so an omitted field became an explicit undefined that getStaticProps can't serialize. It surfaced now because this is my second post on the blog, and it would have happened on anyone's second post. Happy to split it into its own PR if you'd rather review it separately.

Checklist

  • Ran npm run build locally. npm run lint drops into next's interactive ESLint setup prompt, so there's no lint config in the repo to run.
  • Ran npm run validate-posts.
  • Signed off my commits with git commit -s.

A post's frontmatter can omit any author field except name, but
normalizeAuthors set every one of them regardless, so an omitted field
became an explicit undefined. getAllAuthors then reintroduced the same
keys when merging an author's posts, because ??= assigns when the left
side is nullish. The author pages pass an author straight through as a
getStaticProps prop, and Next.js refuses to serialize undefined, so the
build failed once an author who omits a field had a second post.

Drop undefined values when normalizing, and merge an author's posts by
spread rather than field by field, so a field absent from every post is
missing rather than undefined.

Signed-off-by: Nic Cope <nicc@rk0n.org>
Modelplane now lets a platform team choose whether a cluster serves
models with the stack Modelplane composes itself or with NVIDIA Dynamo's
components. Nothing on the blog covers it, and the reason it works is
worth writing down: a ModelDeployment describes an engine rather than a
stack, so a cluster can change stacks without an ML team rewriting
anything.

The post leads with what gang scheduling and peer-to-peer weight
transfer are worth, then walks through the cluster opt-in, what a Leader
and Worker gang becomes on each stack, and how ModelExpress moves
weights between replicas. The worked example is the two-node
Qwen3-Coder manifest from the docs, opted into ModelExpress.

Signed-off-by: Nic Cope <nicc@rk0n.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant