| name | build-and-dependency |
| description | Build and dependency management for NeMo-RL. Covers Docker image building and running, uv usage, venv setup, and adding dependencies. |
| when_to_use | Setting up a dev environment; building or running the Docker container; adding or removing a dependency; uv errors; 'how do I install', 'ModuleNotFoundError', 'build the image', 'run in Docker', 'uv sync fails'. |
Build and Dependency Guide
Docker Images
Build the release image (includes all dependencies and pre-fetched venvs):
docker buildx build -f docker/Dockerfile --tag nemo-rl:latest .
docker buildx build -f docker/Dockerfile \
--build-arg NRL_GIT_REF=main \
--tag nemo-rl:latest \
https://github.com/NVIDIA-NeMo/RL.git
Skip optional backends to reduce build time:
docker buildx build -f docker/Dockerfile \
--build-arg SKIP_VLLM_BUILD=1 \
--build-arg SKIP_SGLANG_BUILD=1 \
--build-arg SKIP_TRTLLM_BUILD=1 \
--tag nemo-rl:latest .
See @docs/docker.md for full options.
Always Use uv
Never use pip install directly — always go through uv.
uv run examples/run_grpo.py
uv run --group test bash tests/run_unit.sh
uv sync --locked
Exception: Dockerfile.ngc_pytorch is exempt from this rule.
Adding Dependencies
uv add <package>
uv add --optional --extra <group> <package>
uv lock
Commit both pyproject.toml and uv.lock together:
git add pyproject.toml uv.lock
git commit -s -m "build: add <package> dependency"
Bumping Megatron-Bridge (and Megatron-LM)
megatron-bridge is installed directly from the submodule's own pyproject.toml
([tool.uv.sources] points at 3rdparty/Megatron-Bridge-workspace/Megatron-Bridge),
and megatron-core at the Megatron-LM checkout nested inside it. Their dependency
lists — including megatron-core[dev,mlm] — flow transitively, so there is no
mirrored dependency list to maintain in NeMo RL.
The bump procedure is:
cd 3rdparty/Megatron-Bridge-workspace/Megatron-Bridge
git fetch origin && git checkout <new-commit>
git submodule update --init --recursive
cd -
uv lock
When uv lock errors after a bump
Package X was included as a URL dependency. URL dependencies must be expressed as direct requirements or constraints — upstream changed or added a git/URL dep
in Megatron-Bridge's or Megatron-LM's [tool.uv.sources] (e.g., Megatron-LM bumping
its emerging-optimizers rev). uv requires such URLs to also appear as a direct
requirement or constraint of the root project: update the matching pin in
constraint-dependencies (where emerging-optimizers and fast-hadamard-transform
live today) / the mcore extra / [tool.uv.sources] / override-dependencies in
pyproject.toml to the same URL/rev.
- Version conflicts — resolve via
[tool.uv] override-dependencies in
pyproject.toml, same as any other conflict.
Known fragilities
- uv currently does not enforce
requires-python for path dependencies
(Megatron-Bridge caps <3.13 while NeMo RL runs 3.13). If a future uv upgrade
starts enforcing it, uv lock will fail loudly: ask upstream to relax the cap,
or reintroduce a thin proxy package with its own pyproject.toml.
- Megatron-Bridge's and Megatron-LM's own
[tool.uv.sources] are honored for their
dependencies. Root-level pins (e.g., nvidia-modelopt from git) win only because
they are direct requirements of NeMo RL — don't remove those direct deps without
re-checking where the transitive resolution lands.
Common Pitfalls
| Problem | Cause | Fix |
|---|
uv sync --locked fails | Dependency conflict or stale lockfile | Re-run uv lock and commit updated lock |
ModuleNotFoundError after pip install | pip installed outside uv-managed venv | Use uv add + uv sync, never bare pip install |
| Docker build fails at vLLM | vLLM build time overhead | Pass --build-arg SKIP_VLLM_BUILD=1 |