Skip to content

docs: add self-hosted B300 devnote#213

Open
lipikaramaswamy wants to merge 2 commits into
mainfrom
lipikaramaswamy/docs/self-hosted-b300-devnote
Open

docs: add self-hosted B300 devnote#213
lipikaramaswamy wants to merge 2 commits into
mainfrom
lipikaramaswamy/docs/self-hosted-b300-devnote

Conversation

@lipikaramaswamy

@lipikaramaswamy lipikaramaswamy commented Jul 8, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds a developer note for running NeMo Anonymizer fully self-hosted on one Brev B300. The post covers the local vLLM Qwen endpoint, local GLiNER reference server, Anonymizer Replace/Substitute configuration, warm-batch throughput and cost results, and reproducibility notes. It also adds a hero image and entity-density chart.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation update
  • Refactoring

Testing

  • make test passes locally
  • make check passes locally (format + lint + typecheck + lock-check)
  • Added/updated tests for changes

Docs-only change; no tests were added. make check exited 0; its advisory ty step emitted existing diagnostics and is ignored by the make target.

Documentation

  • If docs changed: make docs-build passes locally

Related Issues

Depends on #203

Signed-off-by: lipikaramaswamy <lramaswamy@nvidia.com>
@lipikaramaswamy lipikaramaswamy force-pushed the lipikaramaswamy/docs/self-hosted-b300-devnote branch from 636c458 to 15e13db Compare July 8, 2026 02:26
Signed-off-by: lipikaramaswamy <lramaswamy@nvidia.com>
@lipikaramaswamy lipikaramaswamy marked this pull request as ready for review July 9, 2026 17:33
@lipikaramaswamy lipikaramaswamy requested review from a team as code owners July 9, 2026 17:33
@greptile-apps

greptile-apps Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds a new developer note documenting how to run NeMo Anonymizer fully self-hosted on a single Brev B300 instance, covering the local vLLM Qwen endpoint, GLiNER reference server setup, Anonymizer Replace/Substitute configuration, and measured warm-batch throughput and cost results. It also adds a hero image and an entity-density distribution chart.

  • New self-hosted-anonymizer-b300.md devnote with dataset prep code, service startup commands, full Anonymizer config, and throughput/cost tables for 100- and 250-record batches.
  • Two PNG assets (hero image, entity-density chart) added to docs/devnotes/posts/assets/.
  • mkdocs.yml nav extended with a new entry pointing to the new devnote.

Confidence Score: 3/5

The devnote content is generally solid, but two concrete defects need fixing before the page is reliably usable as a reproducibility guide.

The sidebar nav title and the page H1 use different words, which readers will notice immediately. More consequentially, the bash startup command omits VLLM_DISABLED_KERNELS=FlashInferFP8ScaledMMLinearKernel even though the surrounding prose explicitly states the successful run required this flag on the B300; someone copying the command verbatim could end up with a different kernel path than was tested.

Both mkdocs.yml (nav title) and docs/devnotes/posts/self-hosted-anonymizer-b300.md (bash startup command) need targeted fixes before merging.

Important Files Changed

Filename Overview
docs/devnotes/posts/self-hosted-anonymizer-b300.md New devnote covering the self-hosted B300 setup, throughput results, and cost breakdown; the bash launch command is missing the VLLM_DISABLED_KERNELS env var that the body text describes as having been set during the run, reducing reproducibility.
mkdocs.yml Adds a nav entry for the new devnote, but the nav title ("Fully Self-Hosted") does not match the page H1 ("Fully Contained"), creating a visible inconsistency in the docs.
docs/devnotes/posts/assets/self-hosted-anonymizer-b300-hero.png New hero image asset referenced correctly by the devnote; no issues.
docs/devnotes/posts/assets/self-hosted-anonymizer-b300-entity-density.png New entity-density chart asset referenced correctly by the devnote; no issues.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Load dataset\nHugging Face TAB train split] --> B[Sort by char_len + idx\nTake head 100 / 250]
    B --> C[Write Parquet\ntab_train_compact_N.parquet]

    subgraph LocalStack["Local Stack on B300 (localhost)"]
        D[vLLM serve\nnvidia/Qwen3.6-35B-A3B-NVFP4\n:8001]
        E[serve_gliner.py\nnvidia/gliner-pii\n:9000]
    end

    C --> F[Anonymizer.run]
    D --> F
    E --> F

    subgraph Pipeline["Anonymizer Replace/Substitute Pipeline"]
        F --> G[GLiNER detection\n:9000]
        G --> H[LLM validation\nqwen-detect-1 + qwen-detect-2\n:8001]
        H --> I[LLM augmentation\nqwen-prod :8001]
        I --> J[Substitute-map generation\nqwen-prod :8001]
    end

    J --> K[Anonymized output\nParquet]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[Load dataset\nHugging Face TAB train split] --> B[Sort by char_len + idx\nTake head 100 / 250]
    B --> C[Write Parquet\ntab_train_compact_N.parquet]

    subgraph LocalStack["Local Stack on B300 (localhost)"]
        D[vLLM serve\nnvidia/Qwen3.6-35B-A3B-NVFP4\n:8001]
        E[serve_gliner.py\nnvidia/gliner-pii\n:9000]
    end

    C --> F[Anonymizer.run]
    D --> F
    E --> F

    subgraph Pipeline["Anonymizer Replace/Substitute Pipeline"]
        F --> G[GLiNER detection\n:9000]
        G --> H[LLM validation\nqwen-detect-1 + qwen-detect-2\n:8001]
        H --> I[LLM augmentation\nqwen-prod :8001]
        I --> J[Substitute-map generation\nqwen-prod :8001]
    end

    J --> K[Anonymized output\nParquet]
Loading

Reviews (1): Last reviewed commit: "docs: use public run config import" | Re-trigger Greptile

Comment thread mkdocs.yml
- Developer Notes:
- devnotes/index.md
- "Introducing NeMo Anonymizer": devnotes/posts/anonymizer-intro.md
- "Running NeMo Anonymizer Fully Self-Hosted on One B300": devnotes/posts/self-hosted-anonymizer-b300.md

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Nav title doesn't match page H1

The mkdocs.yml entry reads "Running NeMo Anonymizer Fully Self-Hosted on One B300" but the document's H1 is "Running NeMo Anonymizer Fully Contained on One B300". The word "Self-Hosted" vs "Contained" produces a visible mismatch: a reader sees one title in the sidebar and a different one when they land on the page. Given the file name (self-hosted-anonymizer-b300.md), the PR title, and the PR description all use "self-hosted", aligning the H1 to match the nav title (or vice-versa) would remove the inconsistency.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Comment on lines +108 to +127
```bash
mkdir -p logs

CUDA_ROOT="$PWD/.venv/lib/python3.12/site-packages/nvidia/cu13"

CUDA_HOME="$CUDA_ROOT" \
PATH="$CUDA_ROOT/bin:$PWD/.venv/bin:$PATH" \
LD_LIBRARY_PATH="$CUDA_ROOT/lib:$CUDA_ROOT/lib64:${LD_LIBRARY_PATH:-}" \
VLLM_USE_FLASHINFER_SAMPLER=0 \
nohup .venv/bin/vllm serve nvidia/Qwen3.6-35B-A3B-NVFP4 \
--served-model-name qwen-prod \
--host 127.0.0.1 \
--port 8001 \
--max-model-len 8192 \
--gpu-memory-utilization 0.45 \
--max-num-seqs 32 \
--attention-backend FLASH_ATTN \
--trust-remote-code \
> logs/qwen-vllm.log 2>&1 &
```

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 VLLM_DISABLED_KERNELS missing from reproducible command

The "Blackwell serving note" at line 149 states the successful run "also set VLLM_DISABLED_KERNELS=FlashInferFP8ScaledMMLinearKernel to avoid the FlashInfer FP8 scaled-MM path." That variable does not appear in the bash snippet above, so a reader following the command verbatim on a B300 may hit the FlashInfer FP8 path and get the run configuration that was explicitly avoided. Adding the variable to the snippet (alongside the existing VLLM_USE_FLASHINFER_SAMPLER=0) keeps the presented command consistent with what was actually executed.

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.

2 participants