Skip to content

Refresh deprecating NIMs → 3.5-lightning / nemotron-3-embed-1b@2048 / ultra (eval, proposed) - #129

Open
karthikt-nvidia wants to merge 22 commits into
mainfrom
refresh/aug-nim-deprecation-swaps
Open

Refresh deprecating NIMs → 3.5-lightning / nemotron-3-embed-1b@2048 / ultra (eval, proposed)#129
karthikt-nvidia wants to merge 22 commits into
mainfrom
refresh/aug-nim-deprecation-swaps

Conversation

@karthikt-nvidia

Copy link
Copy Markdown

What & why

Three hosted NIMs on the default cloud deploy path are deprecating (Aug 2026). This updates all three to their successors, validated end-to-end on a GPU. Every runtime reference is updated (compose + all agent configs); doc/example refs updated for consistency.

Break old → new
Reasoning LLM (all 4 agents) nvidia/nemotron-3-nano-30b-a3bnvidia/nemotron-3.5-lightning-30b-a3b
Embedder (Milvus retrieval) nvidia/nv-embedqa-e5-v5nvidia/nemotron-3-embed-1b (2048-dim)
Eval judge (nat eval only) meta/llama-3.1-70b-instructnvidia/nemotron-3-ultra-550b-a55b

The eval-judge swap is eval-only — it never runs during nat serve, only nat eval — and is proposed pending your confirmation; trivial to drop or point elsewhere if you'd prefer a different judge.

The one code change: embedding dimension

nemotron-3-embed-1b is 2048-dim (vs nv-embedqa-e5-v5's 1024), and seed_milvus.py hardcoded the old value. Changed to env-driven (default 2048):

# seed_milvus.py
- EMBEDDING_DIM = 1024
+ EMBEDDING_DIM = int(os.getenv("NIM_EMBED_DIM", "2048"))

The Milvus collection is (re)built at 2048 — a fresh deploy does this automatically; an in-place upgrade needs the vector volume wiped so the collection is recreated at the new width.

Validated on real hardware

Deployed the full cloud-mode stack on a GPU — 14 containers, all healthy. Seeder: SUCCESS: Seeded 17 products into Milvus, Generated 17 embeddings (dim=2048).

Probe (search-agent /generate, query "running shoes for men"):

  • Returns prod_17 / Athletic Running Shoes (distance 0.9155), count(*) = 17, deployed dim = 2048.
  • 0 dimension-mismatch errors across the seeder and both retrieval agents.
  • An irrelevant query ("industrial hydraulic pump gaskets") correctly returns empty — so retrieval genuinely discriminates; the pass isn't a false positive.

Models confirmed from the running containers: all 4 agents on nemotron-3.5-lightning-30b-a3b; search/recommendation/seeder on nemotron-3-embed-1b; NIM_EMBED_DIM=2048.

Note on the new LLM

nemotron-3.5-lightning is a reasoning model — its "thinking" needs to be off for the strict-JSON agent contract, or chain-of-thought leaks into responses and breaks parsing. This repo already ships chat_template_kwargs: enable_thinking: false on the serve LLM blocks, so no change was needed there; verified 0 chain-of-thought leaks in the logs and clean structured JSON from both a RAG agent and a structured-output agent.

Minor (pre-existing, not from this change)

  • Startup race: the search agent can log Fail connecting to server on milvus-standalone:19530 at boot (depends_on doesn't gate on Milvus readiness); it retries and goes healthy.

Prepared and validated by an automated blueprint-refresh CI (deploy → swap → re-validate on a GPU). Please review before merging.

karthikt-nvidia and others added 4 commits August 18, 2026 23:00
…bed-1b (2048), eval-judge->ultra

Three hosted NIMs on the default cloud path are deprecating (Aug 2026):
- LLM (all 4 agents): nemotron-3-nano-30b-a3b -> nemotron-3.5-lightning-30b-a3b
- embedder: nv-embedqa-e5-v5 -> nemotron-3-embed-1b (2048-dim; EMBEDDING_DIM made
  env-driven, Milvus recreated at 2048)
- eval judge (nat eval only, proposed): meta/llama-3.1-70b-instruct -> nemotron-3-ultra-550b-a55b

Validated end-to-end on a GPU: 14 containers healthy, probe returns real ranked
products at dim=2048 with 0 dimension-mismatch errors and a passing negative control.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The post-purchase agent returns a JSON object whose `message` field is a
multi-line shipping email. Without output enforcement the LLM can emit
literal newlines inside that JSON string, which is invalid JSON and fails
the NAT functional check ("post-purchase returned invalid JSON"). It is the
only agent whose output naturally contains newlines, so only this config
needs the guard.

Set response_format: {type: json_object} on the serve LLM. NAT forwards this
to ChatNVIDIA, so the NIM uses guided JSON decoding and emits escaped \n,
guaranteeing a strictly-parseable response.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The recommendation workflow is a sequential ARAG pipeline (NLI scoring ->
user-understanding -> context-summary -> item-ranker) where each chat_completion
stage passes JSON text to the next and output_contract_guard parses it strictly.
If any stage emits malformed JSON the contract guard yields empty
recommendations, so the Apps SDK widget renders zero products ("You May Also
Like" shows nothing) and the dependent cart/checkout UI flows fail.

Set response_format: {type: json_object} on both serve LLMs (nim_llm, nim_llm_nli)
that drive the four chat_completion stages, matching the post-purchase fix. The
search agent is a tool_calling_agent and is deliberately left unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@antoniomtz
antoniomtz self-requested a review August 19, 2026 23:36
@antoniomtz
antoniomtz marked this pull request as ready for review August 19, 2026 23:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants