NCA-ADS domain - 6% of the exam

Software and Environment Management

Software and Environment Management is 6% of the NCA-ADS exam. These are the objectives it covers, each with practice questions, with every answer explained.

The domain in numbers

32
Practice questions
4
Objectives
24
Easy
8
Medium

Where people go wrong

  • Reading the nvidia-smi CUDA version as the toolkit version

    The wrong answers treat the CUDA Version in the nvidia-smi header as the installed toolkit release, as a RAPIDS package version, or as a sign of corruption when it differs from nvcc. That figure is the highest CUDA runtime the installed driver can support. nvcc reports the toolkit that is actually installed, which can be older. A gap between them is expected, though compiled extensions may then not match the driver.

    See it in a sample question
  • Expecting a conda file or pip pins to reproduce the whole stack

    The wrong answers offer a conda environment file, pinned wheels, a mounted conda environment or written instructions when the requirement covers system libraries, the CUDA runtime and the driver interface. Those tools fix only the Python and conda layer. A Docker image built on an official NVIDIA RAPIDS base image bundles the operating system libraries, CUDA runtime and packages into one artefact that runs identically on any host with a compatible NVIDIA driver.

    See it in a sample question
  • Pinning only top-level packages instead of locking the resolved graph

    The wrong answers commit a loosely specified environment file, a major-version pin, a prose package list or a shell script of install commands. None of these records the exact versions of transitive dependencies, so a later rebuild can pick newer builds and model output can change. A hand-maintained list of every pin is error-prone and drifts from the real solved graph. A lock file generated from the validated solve records the exact version of every direct and transitive package, so a rebuild resolves identically.

    See it in a sample question
  • Sharing one interpreter instead of isolating each project

    The wrong answers assume two projects can share one installation: that the interpreter picks a cuDF version per project, that pip selects versions at runtime, or that installing into the system Python first is harmless. A single installation holds one version of each package, so a second install overwrites the first. One named environment per project, activated before use, gives each project its own stack on the shared driver.

    See it in a sample question
  • Choosing a git command that sounds related but does another job

    The wrong answers pick a neighbouring git command. git status names files but prints no history, git diff without a flag shows unstaged changes, git push sends commits up, git fetch stops before merging, and git clone copies an existing repository. The correct commands are git log for history, git diff --staged for staged changes, git pull to fetch and integrate, and git init to start a repository.

    See it in a sample question

Objectives in this domain

Sample questions from this domain

Free sampleSoftware and Environment Managementeasy

A data scientist runs nvidia-smi on a workstation and sees a CUDA Version of 12.2 listed in the top-right corner of the output. They then run nvcc --version and it reports CUDA compilation tools release 11.8. What does this mismatch most likely indicate?

  • ABoth values report the same underlying CUDA runtime, so the mismatch is cosmetic and will not affect GPU-accelerated libraries.
  • Bnvidia-smi and nvcc both read from the same CUDA runtime library, so the figures should always agree and any difference points to a corrupted installation.
  • CThe driver supports CUDA 12.2, but the CUDA toolkit installed for compiling is version 11.8, so compiled extensions may not match the driver capabilities. Correct
  • DThe CUDA version shown by nvidia-smi reflects the toolkit release, so upgrading the driver would bring nvcc in line without reinstalling the toolkit.
Distinguish what nvidia-smi CUDA Version reports versus what nvcc --version reports and explain the practical consequence of a mismatch. nvidia-smi displays the highest CUDA version that the installed GPU driver can support. nvcc --version displays the version of the CUDA compiler toolkit that is installed on the system. These two values can legitimately differ because the driver and the toolkit are separate software components. When the toolkit version is lower than the driver ceiling, compiled GPU code will use older APIs and may not access features available in the newer driver. Libraries such as cuDF and cuML are compiled against a specific toolkit version, so confirming that the installed toolkit matches the version the library was built against is an essential environment check.

Why A is wrong: This is a common misconception. The two values come from different sources - the driver and the installed toolkit - and a mismatch can cause real runtime errors when a library compiled against 12.2 tries to use toolkit-11.8 symbols.

Why B is wrong: nvidia-smi reads from the GPU driver, not the CUDA runtime library. It is normal and expected for the driver-reported CUDA ceiling to be higher than the toolkit version, so a difference does not automatically mean corruption.

Why C is correct: nvidia-smi reports the maximum CUDA version the installed driver can support, while nvcc reports the toolkit version actually installed. A gap between the two means compiled CUDA code targets an older toolkit, which can cause compatibility issues with libraries expecting 12.x features.

Why D is wrong: nvidia-smi shows the maximum CUDA version the driver supports, not the toolkit release. Upgrading the driver raises that ceiling further but does not change the installed toolkit version reported by nvcc.

Free sampleSoftware and Environment Managementeasy

A team needs to reproduce a RAPIDS pipeline on a colleague's machine such that not only the Python packages match but also the system libraries, the CUDA runtime, and the way the host driver is presented to the application. Which approach most completely satisfies this full-stack reproducibility requirement?

  • AShare an exported conda environment file so the colleague can recreate the identical Python package set on their own operating system.
  • BSend a requirements file pinning every Python package version so pip installs the exact same wheels on the colleague's host.
  • CDocument the exact CUDA toolkit and driver versions in the README so the colleague can install matching versions manually on their own system.
  • DDistribute a container image built on an official RAPIDS base image, run it with the GPU-enabled container runtime, and pin the package versions inside the image. Correct
Use a GPU-enabled container image to reproduce the full stack of system libraries, CUDA runtime, and pinned packages. Reproducibility below the Python layer requires capturing operating-system libraries and the CUDA runtime, which a container image bundles and a GPU-aware runtime serves consistently against the host driver, so containers reproduce the whole stack rather than only Python packages.

Why A is wrong: A conda environment file reproduces the Python and conda-managed layer well, which is why it is tempting, but it does not capture the surrounding operating-system libraries or guarantee the same CUDA runtime image the way a container does.

Why B is wrong: Pinned wheels fix the Python layer, but pip does not control the host system libraries or the CUDA runtime image, so the surrounding stack can still differ between the two machines.

Why C is wrong: Written instructions help, but manual installation is error-prone and still depends on the colleague's base operating system, so it does not deliver the bundled, reproducible full-stack environment a container image provides.

Why D is correct: A container image packages the operating-system libraries, CUDA runtime, and pinned Python packages together, and the GPU-enabled runtime exposes the host driver consistently, so it reproduces the full software stack rather than only the Python layer.

Free sampleSoftware and Environment Managementeasy

A team wants a colleague who clones their repository months later to rebuild exactly the same set of package versions the original author used, down to the transitive dependencies, rather than just the loosely specified top-level packages. Which artefact, committed to version control, most directly delivers this guarantee?

  • AA lock file that records the fully resolved, exact versions of every direct and transitive dependency in the environment. Correct
  • BA README section that lists the main libraries the project uses, so the colleague can install whichever current versions match those names.
  • CAn unpinned environment file that names the top-level packages but lets the solver choose versions at install time.
  • DA copy of the installed package binaries committed alongside the source code for the colleague to reuse directly.
A committed lock file pins exact resolved versions of all direct and transitive dependencies for reproducible rebuilds. Loose specifications let a solver pick newer versions at rebuild time, but a lock file freezes the entire resolved dependency graph at exact versions, so a later rebuild reconstructs the identical environment instead of re-solving against current packages.

Why A is correct: A lock file captures the complete resolved dependency graph with exact pinned versions, so rebuilding from it reproduces the identical package set rather than re-solving against newer releases.

Why B is wrong: A prose list documents intent, but it omits exact versions and transitive dependencies, so the colleague would install whatever is current and likely reproduce a different dependency set.

Why C is wrong: An unpinned environment file is tempting because it is machine-readable, but without pinned versions the solver picks newer builds later, so the rebuilt environment can drift from the original.

Why D is wrong: Committing built binaries is brittle and platform-specific, bloats the repository, and is not the standard reproducibility mechanism, whereas a lock file is the portable, supported way to pin a resolved environment.

Free sampleSoftware and Environment Managementeasy

A team maintains two separate GPU-accelerated projects on the same workstation. Project A requires cuDF 23.10 and Project B requires cuDF 24.06. Without per-project virtual environments, what is the most likely consequence when both projects are run from a single shared Python installation?

  • ABoth versions of cuDF are loaded simultaneously into memory, and Python selects the correct one automatically based on the import context.
  • BOnly one version of cuDF can be installed in the shared environment, so one project will run against an incompatible version and may produce incorrect results or fail with import errors. Correct
  • CThe projects run correctly because pip resolves version conflicts at import time by inspecting each script's requirements file.
  • DThe RAPIDS compatibility matrix prevents installation of cuDF 24.06 when cuDF 23.10 is already present, so the team is warned before any conflict occurs.
Identify the dependency conflict risk that arises from running multiple projects with differing library versions in a single shared Python environment. A standard Python interpreter holds one installed copy of each package. When two projects demand different versions of the same library, whichever version was installed last wins. The other project then operates against an incompatible version, which may cause import errors, silent behavioural changes, or numerical differences in GPU kernels. Isolating each project into its own virtual environment or conda environment ensures each gets precisely the versions it was developed and tested against, eliminating cross-project dependency conflicts entirely.

Why A is wrong: Python can only have one version of a package active in a given interpreter at a time. There is no automatic context-based version switching within a single installation; installing a second version simply overwrites the first.

Why B is correct: A standard Python installation holds exactly one version of each package. Upgrading cuDF for Project B overwrites the version Project A requires. The affected project then either fails to import or silently uses an API surface that has changed, risking incorrect computation without an obvious error.

Why C is wrong: pip does not perform runtime version selection. Resolution happens at install time, not import time. Once a package is installed, all scripts using that interpreter see the same version, making runtime conflict resolution impossible.

Why D is wrong: pip and conda will typically overwrite the existing version rather than block installation outright, depending on solver settings. A warning or solver error may appear, but the protection comes from isolated environments, not from a built-in compatibility matrix block.

Free sampleSoftware and Environment Managementeasy

An analyst clones a shared RAPIDS repository and, while a teammate continues pushing commits to the remote main branch, makes no local commits of her own. Later she wants to bring those new remote commits into her local main branch so her working copy is up to date. Which git command both fetches the remote commits and integrates them into her current branch in one step?

  • ARun git push, which transfers the newer remote commits down into the current local branch.
  • BRun git pull, which fetches commits from the remote and merges them into the current local branch. Correct
  • CRun git clone again, which re-downloads the repository and integrates the new commits into the existing branch.
  • DRun git fetch, which downloads the remote commits and immediately merges them into the current branch.
Use git pull to fetch and integrate new remote commits into the current branch in one step. git pull combines git fetch, which retrieves new objects and updates remote tracking branches, with an integration step (merge by default) that advances the local branch. git fetch alone updates only the tracking refs, leaving the checked-out branch behind.

Why A is wrong: Tempting because push also synchronises with the remote, but push sends local commits up to the remote; it never brings remote commits down, so it cannot update the local branch.

Why B is correct: Correct. git pull is a fetch followed by an integration step; it downloads the new remote commits and merges (or rebases) them into the current branch, updating the working copy in a single command.

Why C is wrong: Tempting because cloning does obtain remote history, but git clone creates a fresh copy of the whole repository into a new directory; it does not update an existing working copy in place.

Why D is wrong: Tempting because fetch is the first half of the answer, but git fetch only downloads the remote commits into remote tracking refs and stops there; it does not merge them into the current branch, so the working copy is unchanged.

Other domains in this exam

See also the NCA-ADS cert hub, the study guide, and the cheat sheet.

Examworthy is not affiliated with or endorsed by NVIDIA. Original, blueprint-aligned practice material only.