migration of bionemo-recipes to top-level directory#1633
Conversation
Signed-off-by: Peter St. John <pstjohn@nvidia.com>
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
Signed-off-by: Peter St. John <pstjohn@nvidia.com>
Signed-off-by: Peter St. John <pstjohn@nvidia.com>
There was a problem hiding this comment.
Actionable comments posted: 12
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
models/codonfm/tests/generate_golden_values.py (1)
38-44:⚠️ Potential issue | 🔴 Critical | ⚡ Quick winOff-by-one error in REPO_ROOT path calculation.
Line 38 uses
Path(__file__).resolve().parents[4]to compute REPO_ROOT, but this is incorrect for the script's location atmodels/codonfm/tests/generate_golden_values.py.Path hierarchy from the script:
parents[0]→models/codonfm/tests/(script's directory)parents[1]→models/codonfm/parents[2]→models/parents[3]→ repository root ✓parents[4]→ one level above repository root ✗This causes lines 43–44 to construct paths pointing outside the repository:
PTL_TE_DIR # = <parent>/recipes/codonfm_ptl_te (incorrect) NATIVE_TE_DIR # = <parent>/models/codonfm (incorrect)Lines 47–49 will fail to import modules because
sys.pathwill point to nonexistent directories.🐛 Proposed fix
REPO_ROOT = Path(__file__).resolve().parents[3]🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@models/codonfm/tests/generate_golden_values.py` around lines 38 - 44, REPO_ROOT is computed one level too high using Path(__file__).resolve().parents[4], causing PTL_TE_DIR and NATIVE_TE_DIR to point outside the repo; change the parent index to parents[3] so REPO_ROOT correctly refers to the repository root, then confirm PTL_TE_DIR and NATIVE_TE_DIR are built relative to that corrected REPO_ROOT (verify imports that use sys.path thereafter).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/workflows/unit-tests-recipes.yml:
- Line 229: Replace floating action refs in the workflow (the uses entries
`nv-gha-runners/setup-proxy-cache@main`, `actions/checkout@v4`, and
`actions/cache@v4`) with exact commit SHAs: find the latest stable commit SHA
for each repository (e.g., via the GitHub repo page or git ls-remote) and
substitute the tag/branch with the full 40-char commit hash (e.g.,
`nv-gha-runners/setup-proxy-cache@<commit-sha>`), then commit the updated
workflow so the `uses:` lines reference the specific SHAs instead of branch/tag
names.
- Around line 202-260: The run-tests-notebooks job is missing an explicit
permissions block and therefore inherits repository defaults; add a job-level
permissions stanza for the job named run-tests-notebooks (the job block starting
with "run-tests-notebooks:") to enforce least privilege (for example set
permissions: contents: read) so the GITHUB_TOKEN only has the minimal scope
needed for read/test-only actions; place the permissions block directly under
the run-tests-notebooks job key.
- Around line 232-235: The checkout step using actions/checkout@v4 with
sparse-checkout: recipes/evo2_megatron should disable credential persistence to
avoid writing credentials to local git config; update the checkout step (the job
step that calls actions/checkout@v4) to include persist-credentials: false
alongside the existing sparse-checkout and sparse-checkout-cone-mode keys so
credentials are not stored.
In `@ci/lepton/model_convergence/configs/recipes/codonfm_ptl_te.yaml`:
- Line 72: The recipe's out_dir and launcher expect the same workspace root but
checkout_script clones into a different workspace root, breaking artifact
discovery; update checkout_script in this config (and the similar block covering
lines 94-105) so the repo is cloned into the same workspace root referenced by
out_dir (i.e., make checkout destination match out_dir), or alternatively change
out_dir/launcher to match the checkout location—ensure checkout_script and
out_dir use the identical workspace root so W&B convergence telemetry can find
artifacts.
In `@docs/docs/main/contributing/code-review.md`:
- Around line 463-464: Replace the vague phrase "recipe packages/" with concrete
top-level repo paths; update the sentence that currently reads "sub-package
under `recipe packages/`" to instead reference one or more explicit directories
such as `models/`, `recipes/`, or `interpretability/` (or the appropriate single
directory for that specific recipe) so the docs point to the flattened
structure.
In `@docs/docs/main/datasets/uniprot.md`:
- Line 25: The markdown reference-style link for bionemo.common.data.load is
malformed—replace the reference with a proper inline link or add the missing
reference definition; specifically, update the text containing
`[bionemo.common.data.load][bionemo.common.data.load.load]` to either use inline
syntax like `[bionemo.common.data.load.load](https://path/to/api/docs)` or add a
reference definition such as `[bionemo.common.data.load.load]:
https://path/to/api/docs` at the end of the document so the
bionemo.common.data.load link resolves correctly.
In `@docs/docs/main/references/FAQ.md`:
- Line 45: Replace the stale phrase "BioNeMo Framework's mission" with "BioNeMo
Recipes' mission" in the FAQ.md content so the wording matches the renamed
project; search for the exact string "BioNeMo Framework's mission" and update it
to "BioNeMo Recipes' mission" (or "BioNeMo Recipes' mission is..." to match
surrounding grammar) to keep terminology consistent across the document.
- Line 3: Change the heading "Is BioNeMo Recipes free to use?" from h3 (###) to
h2 (##) to satisfy MD001 (heading increment rule), and correct the stray typo
"fo r" to "for" (search for the token "fo r" in the FAQ.md content) so the text
reads correctly.
In `@docs/README.md`:
- Line 17: Update the README line that tells users to open the service: replace
the listen-address example "http://0.0.0.0:8000" with the user-facing URL
"http://localhost:8000" so the docs instruct users to use localhost (0.0.0.0 is
the bind address, not the browser endpoint).
In `@docs/scripts/gen_ref_pages.py`:
- Around line 506-507: The discovery loops currently build source_roots by
chaining (root / "models").rglob("src") and (root / "recipes").rglob("src"),
which omits interpretability content; update each occurrence where source_roots
is created (e.g., the source_roots assignment shown and the similar blocks at
the other noted locations) to also include (root /
"interpretability").rglob("src") in the itertools.chain so
interpretability/*/src directories are discovered and processed alongside models
and recipes.
In `@README.md`:
- Line 17: The inline HTML <img> tag in README.md is missing an alt attribute;
update the <img src="docs/docs/assets/images/esm2/esm2_native_te_benchmarks.svg"
width="600"> element to include a descriptive alt text (for example: alt="ESM2
native TE benchmarks chart showing performance results") so the image is
accessible in rendered README contexts.
- Line 237: The README contains a relative license link
"[LICENSE/license.txt](LICENSE/license.txt)" that resolves incorrectly in
generated docs; update that link to a root-relative path so docs resolve
regardless of current page context — replace the link target with
"/LICENSE/license.txt" (keep the link text unchanged) in README.md to fix broken
link resolution.
---
Outside diff comments:
In `@models/codonfm/tests/generate_golden_values.py`:
- Around line 38-44: REPO_ROOT is computed one level too high using
Path(__file__).resolve().parents[4], causing PTL_TE_DIR and NATIVE_TE_DIR to
point outside the repo; change the parent index to parents[3] so REPO_ROOT
correctly refers to the repository root, then confirm PTL_TE_DIR and
NATIVE_TE_DIR are built relative to that corrected REPO_ROOT (verify imports
that use sys.path thereafter).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 2fa981c4-b98c-4210-9386-4ebf80d0c0b8
⛔ Files ignored due to path filters (4)
interpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/package-lock.jsonis excluded by!**/package-lock.jsoninterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/package-lock.jsonis excluded by!**/package-lock.jsoninterpretability/sparse_autoencoders/sae/src/sae/dashboard/package-lock.jsonis excluded by!**/package-lock.jsoninterpretability/sparse_autoencoders/uv.lockis excluded by!**/*.lock
📒 Files selected for processing (296)
.cursorrules.devcontainer/Dockerfile.devcontainer/README.md.devcontainer/devcontainer.json.devcontainer/initializeCommand.sh.devcontainer/postCreateCommand.sh.devcontainer/requirements.txt.devcontainer/start.sh.github/dependabot.yml.github/labels.yml.github/pull_request_template.md.github/workflows/bionemo-subpackage-ci.yml.github/workflows/scdl-performance-tests.yml.github/workflows/unit-tests-framework.yml.github/workflows/unit-tests-mbridge-recipes.yaml.github/workflows/unit-tests-recipes.yml.gitignore.gitleaks.toml.gitleaksignore.gitmodules.nspect-allowlist.toml.vscode/settings.jsonCLAUDE.mdCODEOWNERSREADME.mdbionemo-recipes/README.mdbionemo-recipes/models/qwen/tests/common/README.mdbionemo-recipes/recipes/eden_megatron/.ci_build.shbionemo-recipes/recipes/esm2_peft_te/collator.pybionemo-recipes/recipes/evo2_megatron/.ci_build.shbionemo-recipes/recipes/evo2_megatron/.ruff.tomlbionemo-recipes/recipes/geneformer_native_te_mfsdp_fp8/.ruff.tomlbionemo-recipes/recipes/llama3_native_te/Dockerfilebionemo-recipes/recipes/llama3_native_te/collator.pybionemo-recipes/recipes/opengenome2_llama_native_te/collator.pybionemo-recipes/recipes/vllm_inference/esm2/state.pyci/Pypi_publish.mdci/benchmarks/partial-conv/evo2_finetuning.yamlci/benchmarks/partial-conv/evo2_pretrain.yamlci/benchmarks/perf/evo2_pretrain.yamlci/lepton/README.mdci/lepton/model_convergence/configs/base.yamlci/lepton/model_convergence/configs/recipes/codonfm_ptl_te.yamlci/lepton/model_convergence/launchers/convergence_tests.shci/lepton/scdl_performance/configs/scdl.yamlci/lepton/scdl_performance/launchers/scdl_performance.shci/scripts/build_docker_image.shci/scripts/check_copied_files.pyci/scripts/recipes_local_test.pyci/scripts/static_checks.shci/scripts/utils.shdocs/README.mddocs/docs/index.mddocs/docs/main/SUMMARY.mddocs/docs/main/about/background/megatron_datasets.mddocs/docs/main/about/overview.mddocs/docs/main/contributing/code-review.mddocs/docs/main/contributing/contributing.mddocs/docs/main/contributing/sub-package_dependency_graph.mddocs/docs/main/datasets/uniprot.mddocs/docs/main/developer-guide/SUMMARY.mddocs/docs/main/examples/.gitignoredocs/docs/main/examples/SUMMARY.mddocs/docs/main/getting-started/development.mddocs/docs/main/getting-started/index.mddocs/docs/main/getting-started/training-models.mddocs/docs/main/getting-started/using-slurm.mddocs/docs/main/references/FAQ.mddocs/docs/models/ESM-2/pre-training.mddocs/docs/models/amplify.mddocs/docs/models/evo2.mddocs/docs/models/geneformer.mddocs/docs/models/index.mddocs/mkdocs.ymldocs/scripts/gen_ref_pages.pyinterpretability/README.mdinterpretability/sparse_autoencoders/.ci_build.shinterpretability/sparse_autoencoders/.gitignoreinterpretability/sparse_autoencoders/README.mdinterpretability/sparse_autoencoders/pyproject.tomlinterpretability/sparse_autoencoders/recipes/README.mdinterpretability/sparse_autoencoders/recipes/codonfm/.gitignoreinterpretability/sparse_autoencoders/recipes/codonfm/1b.shinterpretability/sparse_autoencoders/recipes/codonfm/1b_swissprot.shinterpretability/sparse_autoencoders/recipes/codonfm/README.mdinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/README.mdinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/index.htmlinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/package.jsoninterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/src/App.jsxinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/src/EmbeddingView.jsxinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/src/FeatureCard.jsxinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/src/FeatureDetailPage.jsxinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/src/FeatureList.jsxinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/src/Histogram.jsxinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/src/InfoButton.jsxinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/src/MolstarThumbnail.jsxinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/src/ProteinDetailModal.jsxinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/src/ProteinSequence.jsxinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/src/index.jsxinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/src/utils.jsinterpretability/sparse_autoencoders/recipes/codonfm/codon_dashboard/vite.config.jsinterpretability/sparse_autoencoders/recipes/codonfm/pyproject.tomlinterpretability/sparse_autoencoders/recipes/codonfm/run.pyinterpretability/sparse_autoencoders/recipes/codonfm/run_configs/config.yamlinterpretability/sparse_autoencoders/recipes/codonfm/run_configs/model/1b.yamlinterpretability/sparse_autoencoders/recipes/codonfm/run_configs/model/5b.yamlinterpretability/sparse_autoencoders/recipes/codonfm/run_configs/model/600m.yamlinterpretability/sparse_autoencoders/recipes/codonfm/run_configs/model/80m.yamlinterpretability/sparse_autoencoders/recipes/codonfm/scripts/analyze.pyinterpretability/sparse_autoencoders/recipes/codonfm/scripts/dashboard.pyinterpretability/sparse_autoencoders/recipes/codonfm/scripts/download_codonfm_swissprot.pyinterpretability/sparse_autoencoders/recipes/codonfm/scripts/eval.pyinterpretability/sparse_autoencoders/recipes/codonfm/scripts/eval_gene_enrichment.pyinterpretability/sparse_autoencoders/recipes/codonfm/scripts/eval_swissprot_f1.pyinterpretability/sparse_autoencoders/recipes/codonfm/scripts/extract.pyinterpretability/sparse_autoencoders/recipes/codonfm/scripts/launch_dashboard.pyinterpretability/sparse_autoencoders/recipes/codonfm/scripts/train.pyinterpretability/sparse_autoencoders/recipes/codonfm/src/codonfm_sae/__init__.pyinterpretability/sparse_autoencoders/recipes/codonfm/src/codonfm_sae/data/__init__.pyinterpretability/sparse_autoencoders/recipes/codonfm/src/codonfm_sae/data/csv_loader.pyinterpretability/sparse_autoencoders/recipes/codonfm/src/codonfm_sae/data/types.pyinterpretability/sparse_autoencoders/recipes/codonfm/src/codonfm_sae/eval/__init__.pyinterpretability/sparse_autoencoders/recipes/codonfm/src/codonfm_sae/eval/gene_enrichment.pyinterpretability/sparse_autoencoders/recipes/codonfm/src/codonfm_sae/eval/loss_recovered.pyinterpretability/sparse_autoencoders/recipes/esm2/README.mdinterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/README.mdinterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/index.htmlinterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/package.jsoninterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/src/App.jsxinterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/src/EmbeddingView.jsxinterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/src/FeatureCard.jsxinterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/src/Histogram.jsxinterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/src/MolstarThumbnail.jsxinterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/src/ProteinDetailModal.jsxinterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/src/ProteinSequence.jsxinterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/src/index.jsxinterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/src/utils.jsinterpretability/sparse_autoencoders/recipes/esm2/protein_dashboard/vite.config.jsinterpretability/sparse_autoencoders/recipes/esm2/pyproject.tomlinterpretability/sparse_autoencoders/recipes/esm2/run.pyinterpretability/sparse_autoencoders/recipes/esm2/run_configs/config.yamlinterpretability/sparse_autoencoders/recipes/esm2/run_configs/model/15b.yamlinterpretability/sparse_autoencoders/recipes/esm2/run_configs/model/3b.yamlinterpretability/sparse_autoencoders/recipes/esm2/run_configs/model/650m.yamlinterpretability/sparse_autoencoders/recipes/esm2/scripts/15b.shinterpretability/sparse_autoencoders/recipes/esm2/scripts/3b.shinterpretability/sparse_autoencoders/recipes/esm2/scripts/650m.shinterpretability/sparse_autoencoders/recipes/esm2/scripts/eval.pyinterpretability/sparse_autoencoders/recipes/esm2/scripts/extract.pyinterpretability/sparse_autoencoders/recipes/esm2/scripts/launch_dashboard.pyinterpretability/sparse_autoencoders/recipes/esm2/scripts/train.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/__init__.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/analysis/__init__.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/data/__init__.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/data/annotations.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/data/dataset.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/data/fasta.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/data/types.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/data/uniprot.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/data_export.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/eval/__init__.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/eval/f1.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/eval/loss_recovered.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/viz/__init__.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/viz/feature_activations.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/viz/feature_umap.pyinterpretability/sparse_autoencoders/recipes/esm2/src/esm2_sae/viz/io.pyinterpretability/sparse_autoencoders/recipes/evo2/pyproject.tomlinterpretability/sparse_autoencoders/recipes/evo2/scripts/7b.shinterpretability/sparse_autoencoders/recipes/evo2/scripts/chunk_fasta.pyinterpretability/sparse_autoencoders/recipes/evo2/scripts/extract.pyinterpretability/sparse_autoencoders/recipes/evo2/scripts/train.pyinterpretability/sparse_autoencoders/sae/README.mdinterpretability/sparse_autoencoders/sae/pyproject.tomlinterpretability/sparse_autoencoders/sae/src/sae/__init__.pyinterpretability/sparse_autoencoders/sae/src/sae/activation_store.pyinterpretability/sparse_autoencoders/sae/src/sae/analysis.pyinterpretability/sparse_autoencoders/sae/src/sae/architectures/__init__.pyinterpretability/sparse_autoencoders/sae/src/sae/architectures/base.pyinterpretability/sparse_autoencoders/sae/src/sae/architectures/moe.pyinterpretability/sparse_autoencoders/sae/src/sae/architectures/relu_l1.pyinterpretability/sparse_autoencoders/sae/src/sae/architectures/topk.pyinterpretability/sparse_autoencoders/sae/src/sae/architectures/topk_tp.pyinterpretability/sparse_autoencoders/sae/src/sae/autointerp/__init__.pyinterpretability/sparse_autoencoders/sae/src/sae/autointerp/interpreter.pyinterpretability/sparse_autoencoders/sae/src/sae/autointerp/llm.pyinterpretability/sparse_autoencoders/sae/src/sae/autointerp/sampler.pyinterpretability/sparse_autoencoders/sae/src/sae/benchmarks/__init__.pyinterpretability/sparse_autoencoders/sae/src/sae/benchmarks/bench_decoder.pyinterpretability/sparse_autoencoders/sae/src/sae/collector.pyinterpretability/sparse_autoencoders/sae/src/sae/dashboard/README.mdinterpretability/sparse_autoencoders/sae/src/sae/dashboard/index.htmlinterpretability/sparse_autoencoders/sae/src/sae/dashboard/package.jsoninterpretability/sparse_autoencoders/sae/src/sae/dashboard/src/App.jsxinterpretability/sparse_autoencoders/sae/src/sae/dashboard/src/EmbeddingView.jsxinterpretability/sparse_autoencoders/sae/src/sae/dashboard/src/FeatureCard.jsxinterpretability/sparse_autoencoders/sae/src/sae/dashboard/src/Histogram.jsxinterpretability/sparse_autoencoders/sae/src/sae/dashboard/src/TokenHighlight.jsxinterpretability/sparse_autoencoders/sae/src/sae/dashboard/src/index.jsxinterpretability/sparse_autoencoders/sae/src/sae/dashboard/vite.config.jsinterpretability/sparse_autoencoders/sae/src/sae/demo.pyinterpretability/sparse_autoencoders/sae/src/sae/eval/__init__.pyinterpretability/sparse_autoencoders/sae/src/sae/eval/dead_latents.pyinterpretability/sparse_autoencoders/sae/src/sae/eval/evaluate.pyinterpretability/sparse_autoencoders/sae/src/sae/eval/loss_recovered.pyinterpretability/sparse_autoencoders/sae/src/sae/eval/reconstruction.pyinterpretability/sparse_autoencoders/sae/src/sae/eval/sparsity.pyinterpretability/sparse_autoencoders/sae/src/sae/kernels/__init__.pyinterpretability/sparse_autoencoders/sae/src/sae/kernels/reference.pyinterpretability/sparse_autoencoders/sae/src/sae/kernels/triton_decoder.pyinterpretability/sparse_autoencoders/sae/src/sae/parallel/__init__.pyinterpretability/sparse_autoencoders/sae/src/sae/parallel/checkpoint.pyinterpretability/sparse_autoencoders/sae/src/sae/parallel/comms.pyinterpretability/sparse_autoencoders/sae/src/sae/parallel/topk.pyinterpretability/sparse_autoencoders/sae/src/sae/parallel/training.pyinterpretability/sparse_autoencoders/sae/src/sae/perf_logger.pyinterpretability/sparse_autoencoders/sae/src/sae/process_group_manager.pyinterpretability/sparse_autoencoders/sae/src/sae/streaming.pyinterpretability/sparse_autoencoders/sae/src/sae/training.pyinterpretability/sparse_autoencoders/sae/src/sae/utils/__init__.pyinterpretability/sparse_autoencoders/sae/src/sae/utils/memory.pyinterpretability/sparse_autoencoders/sae/tests/__init__.pyinterpretability/sparse_autoencoders/sae/tests/_dist_utils.pyinterpretability/sparse_autoencoders/sae/tests/test_kernels.pyinterpretability/sparse_autoencoders/sae/tests/test_streaming.pyinterpretability/sparse_autoencoders/sae/tests/test_topk.pyinterpretability/sparse_autoencoders/sae/tests/test_tp_checkpoint.pyinterpretability/sparse_autoencoders/sae/tests/test_tp_comms.pyinterpretability/sparse_autoencoders/sae/tests/test_tp_global_topk.pyinterpretability/sparse_autoencoders/sae/tests/test_tp_init.pyinterpretability/sparse_autoencoders/sae/tests/test_tp_loss.pyinterpretability/sparse_autoencoders/sae/tests/test_tp_topk.pyinterpretability/sparse_autoencoders/sae/tests/test_tp_train_step.pymodels/.ruff.tomlmodels/README.mdmodels/amplify/.devcontainer/Dockerfile.devmodels/amplify/.devcontainer/devcontainer.jsonmodels/amplify/.dockerignoremodels/amplify/.vscode/settings.jsonmodels/amplify/Dockerfilemodels/amplify/LICENSEmodels/amplify/README.mdmodels/amplify/export.pymodels/amplify/model_readme.templatemodels/amplify/pyproject.tomlmodels/amplify/src/amplify/__init__.pymodels/amplify/src/amplify/amplify_hf.pymodels/amplify/src/amplify/amplify_te.pymodels/amplify/src/amplify/export.pymodels/amplify/src/amplify/metrics.pymodels/amplify/src/amplify/rmsnorm.pymodels/amplify/src/amplify/rotary.pymodels/amplify/src/amplify/state.pymodels/amplify/src/amplify/state_dict_convert.pymodels/amplify/tests/conftest.pymodels/amplify/tests/test_amplify_model.pymodels/amplify/tests/test_encoder_block.pymodels/amplify/tests/test_export.pymodels/amplify/tests/test_rotary_embeddings.pymodels/codonfm/dataset.pymodels/codonfm/modeling_codonfm_te.pymodels/codonfm/requirements.txtmodels/codonfm/tests/common/README.mdmodels/codonfm/tests/common/__init__.pymodels/codonfm/tests/common/fixtures.pymodels/codonfm/tests/common/test_modeling_common.pymodels/codonfm/tests/conftest.pymodels/codonfm/tests/generate_golden_values.pymodels/codonfm/tests/golden_state_dict.safetensorsmodels/codonfm/tests/golden_values.jsonmodels/codonfm/tests/test_modeling_codonfm_te.pymodels/codonfm/tokenizer.pymodels/esm2/.dockerignoremodels/esm2/.ruff.tomlmodels/esm2/Dockerfilemodels/esm2/LICENSEmodels/esm2/README.mdmodels/esm2/collator.pymodels/esm2/convert.pymodels/esm2/esm_fast_tokenizer/special_tokens_map.jsonmodels/esm2/esm_fast_tokenizer/tokenizer.jsonmodels/esm2/esm_fast_tokenizer/tokenizer_config.jsonmodels/esm2/export.pymodels/esm2/model_readme.templatemodels/esm2/modeling_esm_te.pymodels/esm2/requirements.txtmodels/esm2/state.pymodels/esm2/tests/common/README.mdmodels/esm2/tests/common/__init__.pymodels/esm2/tests/common/fixtures.pymodels/esm2/tests/common/test_modeling_common.pymodels/esm2/tests/conftest.pymodels/esm2/tests/test_collator.pymodels/esm2/tests/test_collator_context_parallel.pymodels/esm2/tests/test_cp_bshd.pymodels/esm2/tests/test_cp_dataloader.py
💤 Files with no reviewable changes (38)
- .nspect-allowlist.toml
- .cursorrules
- docs/docs/main/contributing/sub-package_dependency_graph.md
- .devcontainer/README.md
- .devcontainer/devcontainer.json
- bionemo-recipes/README.md
- CLAUDE.md
- docs/docs/main/developer-guide/SUMMARY.md
- .github/workflows/scdl-performance-tests.yml
- ci/benchmarks/partial-conv/evo2_finetuning.yaml
- .devcontainer/initializeCommand.sh
- ci/scripts/utils.sh
- .devcontainer/Dockerfile
- bionemo-recipes/recipes/vllm_inference/esm2/state.py
- ci/benchmarks/partial-conv/evo2_pretrain.yaml
- ci/scripts/static_checks.sh
- bionemo-recipes/recipes/evo2_megatron/.ruff.toml
- bionemo-recipes/models/qwen/tests/common/README.md
- ci/Pypi_publish.md
- ci/lepton/scdl_performance/launchers/scdl_performance.sh
- bionemo-recipes/recipes/eden_megatron/.ci_build.sh
- .devcontainer/start.sh
- .github/workflows/bionemo-subpackage-ci.yml
- .github/workflows/unit-tests-mbridge-recipes.yaml
- .devcontainer/postCreateCommand.sh
- .github/workflows/unit-tests-framework.yml
- ci/lepton/scdl_performance/configs/scdl.yaml
- docs/docs/main/SUMMARY.md
- .vscode/settings.json
- bionemo-recipes/recipes/geneformer_native_te_mfsdp_fp8/.ruff.toml
- bionemo-recipes/recipes/evo2_megatron/.ci_build.sh
- bionemo-recipes/recipes/llama3_native_te/Dockerfile
- ci/scripts/build_docker_image.sh
- .devcontainer/requirements.txt
- bionemo-recipes/recipes/llama3_native_te/collator.py
- ci/benchmarks/perf/evo2_pretrain.yaml
- bionemo-recipes/recipes/opengenome2_llama_native_te/collator.py
- bionemo-recipes/recipes/esm2_peft_te/collator.py
| run-tests-notebooks: | ||
| needs: changed-dirs | ||
| runs-on: linux-amd64-gpu-l4-latest-1 | ||
| # Label-only on PRs, automatic on merge_group and nightly schedule. Scoped to evo2_megatron, | ||
| # the only recipe in this suite with example notebooks. | ||
| if: | | ||
| contains(needs.changed-dirs.outputs.dirs, 'recipes/evo2_megatron') && | ||
| ( | ||
| (github.event_name == 'schedule') || | ||
| (github.event_name == 'merge_group') || | ||
| contains(fromJSON(needs.changed-dirs.outputs.labels || '[]'), 'ciflow:all') || | ||
| contains(fromJSON(needs.changed-dirs.outputs.labels || '[]'), 'ciflow:notebooks') | ||
| ) | ||
| name: "notebook-tests (evo2_megatron)" | ||
| container: | ||
| image: svcbionemo023/bionemo-framework:pytorch26.04-py3-squashed | ||
| options: --shm-size=16G | ||
| env: | ||
| CI: true | ||
| HF_TOKEN: ${{ secrets.HF_TOKEN }} | ||
| HF_HOME: /cache/huggingface | ||
| BIONEMO_DATA_SOURCE: ngc | ||
|
|
||
| steps: | ||
| - name: Show GPU info | ||
| run: nvidia-smi | ||
| - name: Setup proxy cache | ||
| uses: nv-gha-runners/setup-proxy-cache@main | ||
|
|
||
| - name: Checkout repository | ||
| uses: actions/checkout@v4 | ||
| with: | ||
| sparse-checkout: recipes/evo2_megatron | ||
| sparse-checkout-cone-mode: false | ||
|
|
||
| - name: Cache Hugging Face models | ||
| uses: actions/cache@v4 | ||
| with: | ||
| path: /cache/huggingface | ||
| key: ${{ runner.os }}-huggingface-evo2_megatron-notebooks-${{ github.sha }} | ||
| restore-keys: | | ||
| ${{ runner.os }}-huggingface-evo2_megatron-notebooks- | ||
| ${{ runner.os }}-huggingface-evo2_megatron- | ||
| ${{ runner.os }}-huggingface- | ||
|
|
||
| - name: Install dependencies | ||
| working-directory: recipes/evo2_megatron | ||
| run: | | ||
| bash .ci_build.sh | ||
| source .ci_test_env.sh | ||
| pip install nbval | ||
|
|
||
| - name: Run notebook tests | ||
| working-directory: recipes/evo2_megatron | ||
| run: | | ||
| source .ci_test_env.sh | ||
| FAST_CI_MODE=1 pytest -v -s --nbval-lax -x -p no:python \ | ||
| examples/lora-fine-tuning-tutorial.ipynb | ||
|
|
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
FILE=".github/workflows/unit-tests-recipes.yml"
echo "== File = $FILE =="
stat "$FILE" || true
echo
echo "== Permissions occurrences =="
rg -n --hidden --no-ignore -S "permissions:" "$FILE" || true
echo
echo "== Snippet around lines 180-280 =="
nl -ba "$FILE" | sed -n '160,290p'Repository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 302
🏁 Script executed:
#!/bin/bash
set -euo pipefail
FILE=".github/workflows/unit-tests-recipes.yml"
echo "== File = $FILE =="
stat "$FILE" || true
echo
echo "== Permissions occurrences =="
rg -n --hidden --no-ignore -S "permissions:" "$FILE" || true
echo
echo "== Snippet around lines 180-280 =="
nl -ba "$FILE" | sed -n '160,290p'Repository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 302
🏁 Script executed:
ls -la .github/workflows || trueRepository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 734
🏁 Script executed:
nl -ba .github/workflows/unit-tests-recipes.yml | sed -n '180,240p'Repository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 117
🏁 Script executed:
rg -n "run-tests-notebooks:" .github/workflows/unit-tests-recipes.ymlRepository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 103
🏁 Script executed:
python3 - <<'PY'
from pathlib import Path
p=Path(".github/workflows/unit-tests-recipes.yml")
print(p.exists(), p)
print(p.read_text().splitlines()[190:220])
PYRepository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 1268
🏁 Script executed:
set -x
ls -la
ls -la .github || true
ls -la .github/workflows || trueRepository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 5931
🏁 Script executed:
echo "hello"Repository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 82
🏁 Script executed:
#!/bin/bash
set -euo pipefail
FILE=".github/workflows/unit-tests-recipes.yml"
echo "== Top of file =="
sed -n '1,120p' "$FILE"
echo
echo "== permissions: occurrences (exact) =="
rg -n --hidden --no-ignore "permissions:" "$FILE" || true
echo
echo "== permissions: occurrences (line-start) =="
rg -n --hidden --no-ignore "^\\s*permissions\\s*:" "$FILE" || true
echo
echo "== run-tests-notebooks job header (around 195-240) =="
sed -n '185,245p' "$FILE"Repository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 7082
🌐 Web query:
GitHub Actions actions/cache@v4requiredpermissionsscopes (e.g.,actions: writevscontents: read)
💡 Result:
For standard usage of GitHub Actions actions/cache@v4 (i.e., restoring and saving caches during a normal workflow run), you generally do not need to explicitly define specific permissions in your workflow YAML [1][2][3]. GitHub Actions provides a default set of permissions that are sufficient for these operations. However, there is an important distinction to note: 1. Standard Caching Operations: When using actions/cache@v4 as intended—to restore and save dependencies based on key matches—the action functions automatically without requiring additional permissions scopes [1][4]. 2. Administrative/Advanced Operations: If your workflow needs to perform administrative tasks on caches, such as listing or deleting caches using the GitHub API or CLI tools, the actions: write permission is required [5]. This is because deleting or managing cache entries via the API is considered a write operation on repository actions data [5]. In summary, for routine dependency caching, the default workflow permissions are sufficient [1][2]. You only need to explicitly add permissions: actions: write if your workflow includes specific steps to manually manage, delete, or modify existing cache entries via API calls [5]. If you are using custom fine-grained permissions, ensure your job has the necessary access, but this is rarely a requirement for the standard actions/cache usage.
Citations:
- 1: https://github.com/actions/cache/tree/v4
- 2: https://github.com/actions/cache?tab=readme-ov-file
- 3: https://raw.githubusercontent.com/actions/cache/main/README.md
- 4: https://github.com/actions/cache/blob/5a3ec84e/README.md
- 5: https://github.com/actions/cache/pull/1123](https:/togithub.com/actions/cache/pull/1123)
🏁 Script executed:
rg -n --hidden --no-ignore "^\s*permissions\s*:" .github/workflowsRepository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 125
🏁 Script executed:
sed -n '1,80p' .github/workflows/trufflehog.ymlRepository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 808
🏁 Script executed:
rg -n --hidden --no-ignore "permissions:" .github/workflowsRepository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 125
🏁 Script executed:
rg -n --hidden --no-ignore "permissions:" .github/workflowsRepository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 125
Add job-level least-privilege permissions for run-tests-notebooks
run-tests-notebooks doesn’t declare permissions, so it inherits whatever repo/org defaults are configured for GITHUB_TOKEN. Add an explicit least-privilege permissions block for this job (e.g., contents: read) to avoid unintentionally granting extra scopes to a read/test-only path.
Suggested hardening
run-tests-notebooks:
+ permissions:
+ contents: read
needs: changed-dirs🧰 Tools
🪛 actionlint (1.7.12)
[error] 204-204: label "linux-amd64-gpu-l4-latest-1" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2025-vs2026", "windows-2022", "windows-11-arm", "ubuntu-slim", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "macos-latest", "macos-latest-xlarge", "macos-latest-large", "macos-26-intel", "macos-26-xlarge", "macos-26-large", "macos-26", "macos-15-intel", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xlarge", "macos-14-large", "macos-14", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file
(runner-label)
🪛 zizmor (1.25.2)
[warning] 231-235: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false
(artipacked)
[warning] 202-259: overly broad permissions (excessive-permissions): default permissions used due to no permissions: block
(excessive-permissions)
[error] 229-229: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)
(unpinned-uses)
[error] 232-232: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)
(unpinned-uses)
[error] 238-238: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)
(unpinned-uses)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.github/workflows/unit-tests-recipes.yml around lines 202 - 260, The
run-tests-notebooks job is missing an explicit permissions block and therefore
inherits repository defaults; add a job-level permissions stanza for the job
named run-tests-notebooks (the job block starting with "run-tests-notebooks:")
to enforce least privilege (for example set permissions: contents: read) so the
GITHUB_TOKEN only has the minimal scope needed for read/test-only actions; place
the permissions block directly under the run-tests-notebooks job key.
Source: Linters/SAST tools
| - name: Show GPU info | ||
| run: nvidia-smi | ||
| - name: Setup proxy cache | ||
| uses: nv-gha-runners/setup-proxy-cache@main |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
FILE=".github/workflows/unit-tests-recipes.yml"
if [ ! -f "$FILE" ]; then echo "Missing $FILE"; exit 1; fi
# Print relevant region around lines 210-250
nl -ba "$FILE" | sed -n '200,260p'
# Also list all uses lines near the region
echo "---- uses lines near 200-260 ----"
nl -ba "$FILE" | awk 'NR>=200 && NR<=260 { if ($0 ~ /uses:/) print $0 }'
# Search for nv-gha-runners/setup-proxy-cache
echo "---- search setup-proxy-cache ----"
rg -n "nv-gha-runners/setup-proxy-cache@" "$FILE" || true
# Print any other uses in workflow with `@main` or `@v4` or non-sha
echo "---- uses with `@main` or `@v4` ----"
rg -n "uses: .*@(main|v4)\b" "$FILE" || trueRepository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 119
🏁 Script executed:
#!/bin/bash
set -euo pipefail
FILE=".github/workflows/unit-tests-recipes.yml"
nl -ba "$FILE" | sed -n '210,255p'
echo "---- uses lines 210-255 ----"
nl -ba "$FILE" | awk 'NR>=210 && NR<=255 { if ($0 ~ /uses:/) print $0 }'
echo "---- search for uses with `@main` or `@v4` ----"
rg -n "uses: .*@((main)|(v4))\b" "$FILE" || true
echo "---- list uses lines 200-260 ----"
nl -ba "$FILE" | awk 'NR>=200 && NR<=260 { if ($0 ~ /uses:/) print $0 }'Repository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 119
🏁 Script executed:
#!/bin/bash
set -euo pipefail
FILE=".github/workflows/unit-tests-recipes.yml"
[ -f "$FILE" ] || { echo "Missing $FILE"; exit 1; }
echo "---- FILE HEADER ----"
head -n 5 "$FILE"
echo "---- Region 210-255 (with line numbers via awk) ----"
awk 'NR>=210 && NR<=255 {printf "%d\t%s\n", NR, $0}' "$FILE"
echo "---- uses: lines near 200-260 ----"
awk 'NR>=200 && NR<=260 && $0 ~ /uses:/ {printf "%d\t%s\n", NR, $0}' "$FILE"
echo "---- Search setup-proxy-cache ----"
rg -n "nv-gha-runners/setup-proxy-cache@" "$FILE" || true
echo "---- Search tag/branch refs for uses: (main/v4) ----"
rg -n "uses:\s+[^@]+@((main)|(v4))\b" "$FILE" || true
echo "---- Search for non-SHA refs (heuristic) ----"
# Match uses: owner/repo@something; exclude obvious 40-hex SHAs and common version-like tags (we'll see actual matches)
rg -n "uses:\s+[^@]+@([0-9a-f]{40}|[0-9a-f]{7,}|sha256:[^ ]+)" "$FILE" || trueRepository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 2721
Pin uses: references to commit SHAs in this workflow
.github/workflows/unit-tests-recipes.yml uses tag/branch refs instead of commit SHAs: nv-gha-runners/setup-proxy-cache@main (229), actions/checkout@v4 (232), and actions/cache@v4 (238). Pin each to an exact action commit SHA.
🧰 Tools
🪛 zizmor (1.25.2)
[error] 229-229: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)
(unpinned-uses)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.github/workflows/unit-tests-recipes.yml at line 229, Replace floating
action refs in the workflow (the uses entries
`nv-gha-runners/setup-proxy-cache@main`, `actions/checkout@v4`, and
`actions/cache@v4`) with exact commit SHAs: find the latest stable commit SHA
for each repository (e.g., via the GitHub repo page or git ls-remote) and
substitute the tag/branch with the full 40-char commit hash (e.g.,
`nv-gha-runners/setup-proxy-cache@<commit-sha>`), then commit the updated
workflow so the `uses:` lines reference the specific SHAs instead of branch/tag
names.
Source: Linters/SAST tools
| uses: actions/checkout@v4 | ||
| with: | ||
| sparse-checkout: recipes/evo2_megatron | ||
| sparse-checkout-cone-mode: false |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
FILE=".github/workflows/unit-tests-recipes.yml"
echo "== File exists? =="
ls -l "$FILE"
echo "== Lines 200-260 (for context) =="
nl -ba "$FILE" | sed -n '200,260p'
echo "== All actions/checkout@v4 uses in this workflow =="
rg -n "uses:\s*actions/checkout@v4" "$FILE"
echo "== Print each matching step block (approx) =="
# Show the immediate YAML context after each uses line
rg -n --context 0 "uses:\s*actions/checkout@v4" "$FILE" | cut -d: -f1 | sort -n | uniq | while read -r ln; do
start=$((ln-10))
end=$((ln+25))
echo "---- Around uses at line $ln (show $start-$end) ----"
nl -ba "$FILE" | sed -n "${start},${end}p"
doneRepository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 282
🏁 Script executed:
#!/bin/bash
set -euo pipefail
FILE=".github/workflows/unit-tests-recipes.yml"
echo "== Lines 220-260 (requested range area) =="
sed -n '220,260p' "$FILE" | cat -n
echo "== All actions/checkout@v4 uses in this workflow =="
rg -n "uses:\s*actions/checkout@v4" "$FILE"
echo "== Any persist-credentials occurrences in this workflow =="
rg -n "persist-credentials" "$FILE" || true
echo "== Show blocks around each checkout@v4 (with lines) =="
# Print a small window around each match line number
rg -n "uses:\s*actions/checkout@v4" "$FILE" | cut -d: -f1 | sort -n | uniq | while read -r ln; do
start=$((ln-12))
end=$((ln+20))
echo "---- Around uses at line $ln (show $start-$end) ----"
sed -n "${start},${end}p" "$FILE" | cat -n
doneRepository: NVIDIA-BioNeMo/bionemo-framework
Length of output: 6004
Disable credential persistence in checkout for notebook tests.
The notebook actions/checkout@v4 step (using sparse-checkout: recipes/evo2_megatron) does not set persist-credentials: false, so credentials may be written to local git config.
Suggested fix
- name: Checkout repository
uses: actions/checkout@v4
with:
+ persist-credentials: false
sparse-checkout: recipes/evo2_megatron
sparse-checkout-cone-mode: false📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| uses: actions/checkout@v4 | |
| with: | |
| sparse-checkout: recipes/evo2_megatron | |
| sparse-checkout-cone-mode: false | |
| uses: actions/checkout@v4 | |
| with: | |
| persist-credentials: false | |
| sparse-checkout: recipes/evo2_megatron | |
| sparse-checkout-cone-mode: false |
🧰 Tools
🪛 zizmor (1.25.2)
[warning] 231-235: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false
(artipacked)
[error] 232-232: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)
(unpinned-uses)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.github/workflows/unit-tests-recipes.yml around lines 232 - 235, The
checkout step using actions/checkout@v4 with sparse-checkout:
recipes/evo2_megatron should disable credential persistence to avoid writing
credentials to local git config; update the checkout step (the job step that
calls actions/checkout@v4) to include persist-credentials: false alongside the
existing sparse-checkout and sparse-checkout-cone-mode keys so credentials are
not stored.
Source: Linters/SAST tools
| # edit these | ||
| max_steps: 200 | ||
| out_dir: "/workspace/bionemo-framework/bionemo-recipes/recipes/codonfm_ptl_te" | ||
| out_dir: "/workspace/bionemo-framework/recipes/codonfm_ptl_te" |
There was a problem hiding this comment.
Unify workspace root paths to avoid missing convergence telemetry.
out_dir and the launcher expect /workspace/bionemo-framework/..., but this recipe-specific checkout_script clones under /workspace/codonfm/bionemo-framework/.... That mismatch can cause W&B artifact discovery to fail for this config during convergence uploads.
Suggested fix
checkout_script: |
- cd /workspace/codonfm
+ cd /workspace
git clone https://github.com/NVIDIA/bionemo-framework.git
cd bionemo-framework
if [ -n "${commit_sha}" ]; then
echo "Checking out commit: ${commit_sha}"
git checkout "${commit_sha}"
elif [ "${branch}" != "main" ]; then
echo "Checking out branch: ${branch}"
git checkout "${branch}"
fi
cd recipes/${recipe_subdir}
pip install -e .Also applies to: 94-105
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@ci/lepton/model_convergence/configs/recipes/codonfm_ptl_te.yaml` at line 72,
The recipe's out_dir and launcher expect the same workspace root but
checkout_script clones into a different workspace root, breaking artifact
discovery; update checkout_script in this config (and the similar block covering
lines 94-105) so the repo is cloned into the same workspace root referenced by
out_dir (i.e., make checkout destination match out_dir), or alternatively change
out_dir/launcher to match the checkout location—ensure checkout_script and
out_dir use the identical workspace root so W&B convergence telemetry can find
artifacts.
| complete and well tested, we move it to the appropriate sub-package under `recipe packages/` | ||
| and complete all the requirements for production. |
There was a problem hiding this comment.
Replace recipe packages/ with concrete top-level paths.
The new wording still references a non-specific location. Use explicit repo paths (models/, recipes/, or interpretability/) to match the flattened structure.
- complete and well tested, we move it to the appropriate sub-package under `recipe packages/`
- and complete all the requirements for production.
+ complete and well tested, we move it to the appropriate top-level directory (`models/`,
+ `recipes/`, or `interpretability/`) and complete all the requirements for production.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| complete and well tested, we move it to the appropriate sub-package under `recipe packages/` | |
| and complete all the requirements for production. | |
| complete and well tested, we move it to the appropriate top-level directory (`models/`, | |
| `recipes/`, or `interpretability/`) and complete all the requirements for production. |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/docs/main/contributing/code-review.md` around lines 463 - 464, Replace
the vague phrase "recipe packages/" with concrete top-level repo paths; update
the sentence that currently reads "sub-package under `recipe packages/`" to
instead reference one or more explicit directories such as `models/`,
`recipes/`, or `interpretability/` (or the appropriate single directory for that
specific recipe) so the docs point to the flattened structure.
| Yes, BioNeMo Recipes is open source and we welcome contributions from organizations and individuals. | ||
| You can do so either by forking the repository and directly opening a PR against our `main` branch from your fork or by | ||
| [contacting us](https://www.nvidia.com/en-us/industries/healthcare/contact-sales/) fo r further assistance. BioNeMo | ||
| Framework's mission is to stay extremely light weight and primarily support building blocks required for various AI |
There was a problem hiding this comment.
Update stale "BioNeMo Framework" reference to "BioNeMo Recipes".
Line 45 still references "BioNeMo Framework's mission" instead of "BioNeMo Recipes," breaking alignment with the renamed project scope throughout this file.
✏️ Proposed fix
-Framework's mission is to stay extremely light weight and primarily support building blocks required for various AI
+Recipes' mission is to stay extremely light weight and primarily support building blocks required for various AI📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Framework's mission is to stay extremely light weight and primarily support building blocks required for various AI | |
| Recipes' mission is to stay extremely light weight and primarily support building blocks required for various AI |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/docs/main/references/FAQ.md` at line 45, Replace the stale phrase
"BioNeMo Framework's mission" with "BioNeMo Recipes' mission" in the FAQ.md
content so the wording matches the renamed project; search for the exact string
"BioNeMo Framework's mission" and update it to "BioNeMo Recipes' mission" (or
"BioNeMo Recipes' mission is..." to match surrounding grammar) to keep
terminology consistent across the document.
| ``` | ||
|
|
||
| ## Hiding/collapsing `.ipynb` cells | ||
| Then open `http://0.0.0.0:8000`. |
There was a problem hiding this comment.
Use localhost for the browser URL.
0.0.0.0 is the listen address; for users, http://localhost:8000 is the reliable endpoint to open.
-Then open `http://0.0.0.0:8000`.
+Then open `http://localhost:8000`.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/README.md` at line 17, Update the README line that tells users to open
the service: replace the listen-address example "http://0.0.0.0:8000" with the
user-facing URL "http://localhost:8000" so the docs instruct users to use
localhost (0.0.0.0 is the bind address, not the browser endpoint).
| source_roots = itertools.chain((root / "models").rglob("src"), (root / "recipes").rglob("src")) | ||
|
|
There was a problem hiding this comment.
Include interpretability/ in the generator’s discovery loops.
The generator still hard-codes only models and recipes, so interpretability content is skipped despite the updated docs contract claiming it is imported.
Suggested patch
- source_roots = itertools.chain((root / "models").rglob("src"), (root / "recipes").rglob("src"))
+ source_roots = itertools.chain(
+ (root / "models").rglob("src"),
+ (root / "recipes").rglob("src"),
+ (root / "interpretability").rglob("src"),
+ )
- for subdir in ["models", "recipes"]:
+ for subdir in ["models", "recipes", "interpretability"]:
- for subdir in ["models", "recipes"]:
+ for subdir in ["models", "recipes", "interpretability"]:
- for section in ("models", "recipes"):
+ for section in ("models", "recipes", "interpretability"):Also applies to: 551-552, 651-652, 688-689
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/scripts/gen_ref_pages.py` around lines 506 - 507, The discovery loops
currently build source_roots by chaining (root / "models").rglob("src") and
(root / "recipes").rglob("src"), which omits interpretability content; update
each occurrence where source_roots is created (e.g., the source_roots assignment
shown and the similar blocks at the other noted locations) to also include (root
/ "interpretability").rglob("src") in the itertools.chain so
interpretability/*/src directories are discovered and processed alongside models
and recipes.
|
|
||
| <p align="center"> | ||
| <img src="docs/docs/assets/images/esm2/esm2_low_precision/esm2_15b_grouped_bars.png" width="600"> | ||
| <img src="docs/docs/assets/images/esm2/esm2_native_te_benchmarks.svg" width="600"> |
There was a problem hiding this comment.
Add alt text to the benchmark image.
The inline HTML image is missing alt, which hurts accessibility in rendered README contexts.
- <img src="docs/docs/assets/images/esm2/esm2_native_te_benchmarks.svg" width="600">
+ <img src="docs/docs/assets/images/esm2/esm2_native_te_benchmarks.svg" alt="ESM-2 training benchmark chart" width="600">📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <img src="docs/docs/assets/images/esm2/esm2_native_te_benchmarks.svg" width="600"> | |
| <img src="docs/docs/assets/images/esm2/esm2_native_te_benchmarks.svg" alt="ESM-2 training benchmark chart" width="600"> |
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 17-17: Images should have alternate text (alt text)
(MD045, no-alt-text)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@README.md` at line 17, The inline HTML <img> tag in README.md is missing an
alt attribute; update the <img
src="docs/docs/assets/images/esm2/esm2_native_te_benchmarks.svg" width="600">
element to include a descriptive alt text (for example: alt="ESM2 native TE
benchmarks chart showing performance results") so the image is accessible in
rendered README contexts.
Source: Linters/SAST tools
|
|
||
| ## License | ||
|
|
||
| This project is licensed under the terms described in [LICENSE/license.txt](LICENSE/license.txt). |
There was a problem hiding this comment.
Fix the license link so generated docs don’t resolve it under main/recipes/.
The current relative link is reported as broken in docs deploy (main/recipes/LICENSE/license.txt not found).
-This project is licensed under the terms described in [LICENSE/license.txt](LICENSE/license.txt).
+This project is licensed under the terms described in [LICENSE/license.txt](https://github.com/NVIDIA-BioNeMo/bionemo-framework/blob/main/LICENSE/license.txt).📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| This project is licensed under the terms described in [LICENSE/license.txt](LICENSE/license.txt). | |
| This project is licensed under the terms described in [LICENSE/license.txt](https://github.com/NVIDIA-BioNeMo/bionemo-framework/blob/main/LICENSE/license.txt). |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@README.md` at line 237, The README contains a relative license link
"[LICENSE/license.txt](LICENSE/license.txt)" that resolves incorrectly in
generated docs; update that link to a root-relative path so docs resolve
regardless of current page context — replace the link target with
"/LICENSE/license.txt" (keep the link text unchanged) in README.md to fix broken
link resolution.
Source: Pipeline failures
Signed-off-by: Peter St. John <pstjohn@nvidia.com>
Signed-off-by: Peter St. John <pstjohn@nvidia.com>
Signed-off-by: Peter St. John <pstjohn@nvidia.com>
Prepares the repo to be renamed "BioNeMo Recipes", dropping our
sub-packagesstructure and lingering CI / references to the legacy framework container.The legacy code has been moved to the bionemo2 branch.
Closes BIO-743
Summary by CodeRabbit
models/,recipes/, andinterpretability/directories