Skip to content

fix(customizer): reduce complexity of the tasks images used by customizer backends#684

Merged
soluwalana merged 13 commits into
mainfrom
solu/simplify-tasks
Jul 15, 2026
Merged

fix(customizer): reduce complexity of the tasks images used by customizer backends#684
soluwalana merged 13 commits into
mainfrom
solu/simplify-tasks

Conversation

@soluwalana

@soluwalana soluwalana commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features
    • Added the shared nmp-customizer-tasks CPU container and dedicated smoke-test image for customization steps (file I/O, model entity, model-spec analysis, LoRA sidecar).
    • Enabled overriding the tasks image via NMP_CUSTOMIZER_TASKS_IMAGE and standardized CPU task command wiring across Automodel, RL, and Unsloth.
  • Documentation
    • Updated release catalogs, setup/config references, and troubleshooting docs to replace legacy “tasks” images with nmp-customizer-tasks, including new container documentation pages.
  • Refactor
    • Retired legacy Automodel/RL CPU “tasks” containers and removed now-obsolete task entrypoints/scripts, routing CPU steps through the shared customization workflow.
  • Tests
    • Added/updated smoke tests and markers, refreshed compiler/image expectations, and improved/added unit coverage for file I/O output metadata.

…izer backends

Signed-off-by: Sam Oluwalana <soluwalana@nvidia.com>
@soluwalana
soluwalana requested review from a team as code owners July 14, 2026 19:16
@github-actions github-actions Bot added the fix label Jul 14, 2026
@github-actions

Copy link
Copy Markdown
Contributor

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The change adds the shared nmp-customizer-tasks container, centralizes file and model entity tasks in nmp.customization_common, updates Automodel, RL, and Unsloth job wiring, removes obsolete task images, and aligns release metadata, configuration, documentation, and smoke tests.

Changes

Customizer task runtime and packaging

Layer / File(s) Summary
Shared task runtime and entrypoints
packages/nmp_customization_common/...
Adds shared image resolution, configurable task metadata, CLI entrypoints, file I/O and model entity runners, output metadata construction, and tests.
Customizer container build and bake wiring
docker/customizer/*, docker/Dockerfile.nmp-customizer-tasks, docker-bake.hcl
Adds the customizer workspace and runtime image with CUDA dependencies and smoke tests while removing obsolete task targets.

Backend and platform integration

Layer / File(s) Summary
Automodel, RL, and Unsloth integration
services/automodel/..., services/rl/..., services/unsloth/...
Routes CPU steps to shared task commands and images, retains dedicated GPU training images, and attaches upload metadata.
Container runtime validation
packages/nmp_customization_common/..., plugins/.../jobs/jobs.py
Replaces Docker-only compilation checks with container-runtime checks for supported job types.

Catalog and validation alignment

Layer / File(s) Summary
Catalog, configuration, documentation, and smoke tests
.github/*, docs/*, tests/*, pytest.ini
Updates release catalogs, sidecar and model-spec references, documentation, markers, and customizer smoke tests.

Possibly related PRs

Suggested labels: refactor

Suggested reviewers: anubhutivyas

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 43.53% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title matches the main change: customizer backends now use a shared, simplified tasks image setup.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch solu/simplify-tasks

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 25462/32662 78.0% 62.5%
Integration Tests 14704/31311 47.0% 19.3%

@coderabbitai coderabbitai Bot left a comment

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.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
tests/agentic-use/customizer-lora-job-cli/environment/setup-env.sh (1)

6-14: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Update the stale image-pull diagnostics.

The script pulls nmp-customizer-tasks, but the heading and failure guidance still reference Automodel and BASE_TAG_AUTOMODEL. Update them to the customizer-tasks image and its actual build variable.

🤖 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 `@tests/agentic-use/customizer-lora-job-cli/environment/setup-env.sh` around
lines 6 - 14, Update the image-pull heading and the failure guidance associated
with TASKS_IMAGE in the setup script to reference the customizer-tasks image and
its actual build variable, while leaving the training-image diagnostics
unchanged.
packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io/run.py (1)

119-152: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Move callback creation outside the retry loop

_download_with_retry and _upload_with_retry rebuild their progress callbacks on every tenacity retry. That re-sends the initial ACTIVE progress update each attempt, and upload also re-walks src_path just to recompute file totals. Build the callbacks once in download_fileset / upload_fileset and pass them into the retried helper.

🤖 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
`@packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io/run.py`
around lines 119 - 152, Update download_fileset and upload_fileset to construct
their progress callbacks and any associated file totals before invoking
_download_with_retry or _upload_with_retry. Extend both retried helpers to
accept and reuse the prebuilt callbacks, removing callback creation and upload
source re-walking from each retry attempt while preserving existing progress
behavior.
packages/nmp_customization_common/src/nmp/customization_common/tasks/model_entity/run.py (1)

121-149: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Retry filter doesn't cover the newly re-raised transient exceptions.

ClientInternalServerError, httpx.TimeoutException, and httpx.ConnectError are re-raised here to propagate as transient, but the @retry decorator's retry_if_exception_type only matches InternalServerError, APITimeoutError, APIConnectionError. These three new types will never trigger a retry — they'll simply fail on first occurrence, undermining the intent of separating them from the generic wrap-into-ModelEntityCreationError path.

🔁 Include the new transient types in the retry filter
     `@retry`(
         stop=stop_after_attempt(MAX_RETRIES),
         wait=wait_exponential(multiplier=2, min=INITIAL_BACKOFF_SECONDS, max=MAX_BACKOFF_SECONDS),
-        retry=retry_if_exception_type((InternalServerError, APITimeoutError, APIConnectionError)),
+        retry=retry_if_exception_type((
+            InternalServerError,
+            APITimeoutError,
+            APIConnectionError,
+            ClientInternalServerError,
+            httpx.TimeoutException,
+            httpx.ConnectError,
+        )),
         reraise=True,
     )
     def create_model_entity(self, config: ModelEntityTaskConfig) -> tuple[dict, ModelEntity]:
🤖 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
`@packages/nmp_customization_common/src/nmp/customization_common/tasks/model_entity/run.py`
around lines 121 - 149, Update the retry filter on create_model_entity to
include ClientInternalServerError, httpx.TimeoutException, and
httpx.ConnectError alongside the existing transient exception types, so
exceptions re-raised by its fileset validation block trigger the configured
retries.
packages/nmp_customization_common/tests/tasks/test_file_io.py (1)

199-200: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Restore the path-traversal regression tests
TestValidateSafePath / TestBuildOutputMetadata are gone here, and there’s no replacement in packages/nmp_customization_common/tests/tasks/test_file_io_utils.py. Add coverage for the PathTraversalError path before merging.

🤖 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 `@packages/nmp_customization_common/tests/tasks/test_file_io.py` around lines
199 - 200, Add regression coverage for path traversal handling in
TestValidateSafePath and TestBuildOutputMetadata, restoring the missing tests or
adding equivalent cases in test_file_io_utils.py. Verify unsafe paths raise
PathTraversalError and that the download flow does not invoke sdk.files.download
when validation fails.
🧹 Nitpick comments (2)
services/automodel/tests/test_images.py (1)

47-48: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Keep registry-override coverage on get_tasks_image().

This now tests only the training-image path, so a regression in get_tasks_image() passing image_registry to get_customizer_tasks_image() would pass unnoticed. Assert the customizer-task image here and add a separate training-image assertion if needed.

🤖 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 `@services/automodel/tests/test_images.py` around lines 47 - 48, Update the
test around get_automodel_qualified_image so it asserts the customizer-task
image produced by get_tasks_image(), preserving coverage that image_registry is
forwarded to get_customizer_tasks_image(). Add a separate assertion for the
training-image path only if that behavior also needs coverage.
services/unsloth/src/nmp/unsloth/images.py (1)

6-6: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Drop unneeded from __future__ import annotations.

File only uses native str | None hints — no forward refs needed. This future-import makes all annotations string-based at runtime, which the guideline for **/*.py explicitly discourages.

As per coding guidelines: "prefer concrete type hints over string-based type hints, and do not import those types only under TYPE_CHECKING; import them normally when possible."

♻️ Proposed fix
 """Docker image resolution for nmp-unsloth job steps."""
-
-from __future__ import annotations
🤖 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 `@services/unsloth/src/nmp/unsloth/images.py` at line 6, Remove the unnecessary
from __future__ import annotations from images.py, leaving the existing native
str | None annotations unchanged so they remain concrete at runtime.

Source: Coding guidelines

🤖 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/assets/ngc/containers/nmp-customizer-tasks.md:
- Line 6: Change the document’s opening “NeMo Customizer Tasks Container”
heading from level two to a top-level level-one heading to satisfy markdownlint
MD041.

In @.github/assets/ngc/containers/nmp-rl-training.md:
- Line 6: Change the document’s first heading, “NeMo-RL Training Container,”
from level 2 to level 1 by updating its Markdown marker from ## to #, preserving
the heading text.

In `@docker/unsloth/README.md`:
- Around line 9-11: Update the Dockerfile reference in the README table for
nmp-unsloth-training to use docker/Dockerfile.nmp-unsloth-training, matching the
repository-root command context and existing file location.

In `@docs/set-up/config-reference.mdx`:
- Around line 531-540: Update the source configuration descriptions for
lora_sidecar_image_name, lora_sidecar_command, and lora_sidecar_args, then
regenerate the generated reference using make generate-config-reference-docs; do
not hand-edit docs/set-up/config-reference.mdx or commit manual changes there.

In `@services/automodel/src/nmp/automodel/tasks/docker/README.md`:
- Line 47: Add a concise “Next Steps” section to the Docker README after the
configuration content, including links to the related customizer task and
compiler documentation. Preserve the existing setup instructions and use the
repository’s established documentation links where available.

In `@tests/smoke_gpu/test_customizer_tasks.py`:
- Around line 47-52: Update test_nmp_customizer_tasks_importable to import
nmp.customization_common.tasks.file_io.__main__ rather than only the file_io
package. Preserve the existing import checks for the other module entrypoints.

---

Outside diff comments:
In
`@packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io/run.py`:
- Around line 119-152: Update download_fileset and upload_fileset to construct
their progress callbacks and any associated file totals before invoking
_download_with_retry or _upload_with_retry. Extend both retried helpers to
accept and reuse the prebuilt callbacks, removing callback creation and upload
source re-walking from each retry attempt while preserving existing progress
behavior.

In
`@packages/nmp_customization_common/src/nmp/customization_common/tasks/model_entity/run.py`:
- Around line 121-149: Update the retry filter on create_model_entity to include
ClientInternalServerError, httpx.TimeoutException, and httpx.ConnectError
alongside the existing transient exception types, so exceptions re-raised by its
fileset validation block trigger the configured retries.

In `@packages/nmp_customization_common/tests/tasks/test_file_io.py`:
- Around line 199-200: Add regression coverage for path traversal handling in
TestValidateSafePath and TestBuildOutputMetadata, restoring the missing tests or
adding equivalent cases in test_file_io_utils.py. Verify unsafe paths raise
PathTraversalError and that the download flow does not invoke sdk.files.download
when validation fails.

In `@tests/agentic-use/customizer-lora-job-cli/environment/setup-env.sh`:
- Around line 6-14: Update the image-pull heading and the failure guidance
associated with TASKS_IMAGE in the setup script to reference the
customizer-tasks image and its actual build variable, while leaving the
training-image diagnostics unchanged.

---

Nitpick comments:
In `@services/automodel/tests/test_images.py`:
- Around line 47-48: Update the test around get_automodel_qualified_image so it
asserts the customizer-task image produced by get_tasks_image(), preserving
coverage that image_registry is forwarded to get_customizer_tasks_image(). Add a
separate assertion for the training-image path only if that behavior also needs
coverage.

In `@services/unsloth/src/nmp/unsloth/images.py`:
- Line 6: Remove the unnecessary from __future__ import annotations from
images.py, leaving the existing native str | None annotations unchanged so they
remain concrete at runtime.
🪄 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: e49c6830-52fb-46c5-88bd-1b095d86deb6

📥 Commits

Reviewing files that changed from the base of the PR and between 0101419 and 5f7e05c.

📒 Files selected for processing (77)
  • .github/assets/ngc/containers/nmp-customizer-tasks.md
  • .github/assets/ngc/containers/nmp-rl-training.md
  • .github/workflows/release.yaml
  • RELEASING.md
  • conftest.py
  • docker-bake.hcl
  • docker/Dockerfile.nmp-customizer-tasks
  • docker/Dockerfile.nmp-rl-tasks
  • docker/automodel/Dockerfile.nmp-automodel-tasks
  • docker/automodel/README.md
  • docker/customizer/Dockerfile.platform-workspace
  • docker/customizer/pyproject.workspace.toml
  • docker/unsloth/README.md
  • docs/customizer/index.mdx
  • docs/set-up/config-reference.mdx
  • packages/nmp_customization_common/src/nmp/customization_common/config.py
  • packages/nmp_customization_common/src/nmp/customization_common/service/images.py
  • packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io/__init__.py
  • packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io/__main__.py
  • packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io/callbacks.py
  • packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io/run.py
  • packages/nmp_customization_common/src/nmp/customization_common/tasks/model_entity/__init__.py
  • packages/nmp_customization_common/src/nmp/customization_common/tasks/model_entity/__main__.py
  • packages/nmp_customization_common/src/nmp/customization_common/tasks/model_entity/run.py
  • packages/nmp_customization_common/tests/tasks/test_file_io.py
  • packages/nmp_platform/README.md
  • packages/nmp_platform/config/local.yaml
  • packages/nmp_platform_runner/src/nmp/platform_runner/config/local.yaml
  • plugins/nemo-customizer/src/nemo_customizer/skills/nemo-customizer/SKILL.md
  • plugins/nemo-customizer/src/nemo_customizer/skills/nemo-customizer/references/rl-kubernetes-runtime.md
  • plugins/nemo-rl/README.md
  • pytest.ini
  • services/automodel/README.md
  • services/automodel/pyproject.toml
  • services/automodel/src/nmp/automodel/app/jobs/compiler.py
  • services/automodel/src/nmp/automodel/config.py
  • services/automodel/src/nmp/automodel/images.py
  • services/automodel/src/nmp/automodel/tasks/__main__.py
  • services/automodel/src/nmp/automodel/tasks/docker/README.md
  • services/automodel/src/nmp/automodel/tasks/docker/docker-compose.yaml
  • services/automodel/src/nmp/automodel/tasks/file_io/__init__.py
  • services/automodel/src/nmp/automodel/tasks/file_io/__main__.py
  • services/automodel/src/nmp/automodel/tasks/file_io/callbacks.py
  • services/automodel/src/nmp/automodel/tasks/file_io/run.py
  • services/automodel/src/nmp/automodel/tasks/model_entity/__init__.py
  • services/automodel/src/nmp/automodel/tasks/model_entity/__main__.py
  • services/automodel/src/nmp/automodel/tasks/model_entity/run.py
  • services/automodel/tests/test_compiler.py
  • services/automodel/tests/test_images.py
  • services/core/models/pyproject.toml
  • services/core/models/src/nmp/core/models/api/v2/models.py
  • services/core/models/src/nmp/core/models/controllers/backends/k8s_nim_operator/config.py
  • services/rl/pyproject.toml
  • services/rl/src/nmp/rl/app/jobs/compiler.py
  • services/rl/src/nmp/rl/config.py
  • services/rl/src/nmp/rl/images.py
  • services/rl/src/nmp/rl/tasks/file_io/__main__.py
  • services/rl/src/nmp/rl/tasks/file_io/callbacks.py
  • services/rl/src/nmp/rl/tasks/file_io/run.py
  • services/rl/src/nmp/rl/tasks/model_entity/__init__.py
  • services/rl/src/nmp/rl/tasks/model_entity/__main__.py
  • services/rl/src/nmp/rl/tasks/model_entity/run.py
  • services/rl/tests/test_compiler.py
  • services/unsloth/pyproject.toml
  • services/unsloth/src/nmp/unsloth/app/jobs/compiler.py
  • services/unsloth/src/nmp/unsloth/images.py
  • services/unsloth/src/nmp/unsloth/tasks/file_io/__init__.py
  • services/unsloth/src/nmp/unsloth/tasks/file_io/__main__.py
  • services/unsloth/src/nmp/unsloth/tasks/model_entity/__init__.py
  • services/unsloth/src/nmp/unsloth/tasks/model_entity/__main__.py
  • services/unsloth/tests/test_images.py
  • services/unsloth/tests/test_model_entity.py
  • tests/agentic-use/customizer-lora-job-cli/environment/setup-env.sh
  • tests/agentic-use/customizer-lora-job-cli/instruction.md
  • tests/smoke_gpu/conftest.py
  • tests/smoke_gpu/test_customizer_automodel.py
  • tests/smoke_gpu/test_customizer_tasks.py
💤 Files with no reviewable changes (23)
  • docker/automodel/Dockerfile.nmp-automodel-tasks
  • services/automodel/src/nmp/automodel/tasks/file_io/main.py
  • services/automodel/src/nmp/automodel/tasks/file_io/init.py
  • services/rl/src/nmp/rl/tasks/model_entity/main.py
  • services/rl/src/nmp/rl/tasks/file_io/main.py
  • services/unsloth/src/nmp/unsloth/tasks/file_io/main.py
  • services/automodel/src/nmp/automodel/tasks/model_entity/main.py
  • services/automodel/pyproject.toml
  • services/rl/src/nmp/rl/tasks/model_entity/init.py
  • services/unsloth/src/nmp/unsloth/tasks/model_entity/init.py
  • services/automodel/src/nmp/automodel/tasks/model_entity/init.py
  • docker/Dockerfile.nmp-rl-tasks
  • services/unsloth/src/nmp/unsloth/tasks/file_io/init.py
  • services/rl/src/nmp/rl/tasks/model_entity/run.py
  • services/unsloth/pyproject.toml
  • services/automodel/src/nmp/automodel/tasks/model_entity/run.py
  • services/automodel/src/nmp/automodel/tasks/file_io/run.py
  • services/rl/pyproject.toml
  • tests/smoke_gpu/test_customizer_automodel.py
  • services/rl/src/nmp/rl/tasks/file_io/run.py
  • services/unsloth/src/nmp/unsloth/tasks/model_entity/main.py
  • services/automodel/src/nmp/automodel/tasks/file_io/callbacks.py
  • services/rl/src/nmp/rl/tasks/file_io/callbacks.py

Comment thread .github/assets/ngc/containers/nmp-customizer-tasks.md
Comment thread .github/assets/ngc/containers/nmp-rl-training.md
Comment thread docker/unsloth/README.md Outdated
Comment thread docs/set-up/config-reference.mdx
Comment thread services/automodel/src/nmp/automodel/tasks/docker/README.md
Comment thread tests/smoke_gpu/test_customizer_tasks.py Outdated
Signed-off-by: Sam Oluwalana <soluwalana@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

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.

Actionable comments posted: 1

🧹 Nitpick comments (2)
packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io_metadata.py (1)

13-13: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use a concrete return type.

Change -> dict to -> dict[str, str]; the implementation already guarantees that shape, but the current annotation discards it.

As per coding guidelines, Python code should “prefer concrete type hints over string-based type hints.”

🤖 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
`@packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io_metadata.py`
at line 13, Update the affected function’s return annotation from dict to
dict[str, str], preserving the existing implementation and behavior while
exposing its guaranteed key and value types.

Source: Coding guidelines

services/unsloth/README.md (1)

53-58: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy lift

Separate the architecture explanation from this reference README.

The added “Why a service package?” section mixes explanation with the package/layout reference content. Move the rationale to a linked explanation page and keep this README within one Diataxis type.

As per coding guidelines, each documentation page should fit ONE Diataxis quadrant; do not mix architecture explanations with reference material; use cross-links instead.

🤖 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 `@services/unsloth/README.md` around lines 53 - 58, Remove the “Why a service
package, not just a plugin module?” architecture rationale from the reference
README and place it on a separate explanation page. Add a clear link from this
README to that page, while keeping the remaining content focused solely on
package/layout reference material.

Source: Coding guidelines

🤖 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 `@plugins/nemo-unsloth/README.md`:
- Around line 36-39: Update the README documentation for the model-upload and
model-entity-creation steps to list all required task arguments: include both
--service-source unsloth and --service-name unsloth for the shared file_io
upload task, and --service-name unsloth for the model_entity task. Keep the
existing step descriptions and behavior unchanged.

---

Nitpick comments:
In
`@packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io_metadata.py`:
- Line 13: Update the affected function’s return annotation from dict to
dict[str, str], preserving the existing implementation and behavior while
exposing its guaranteed key and value types.

In `@services/unsloth/README.md`:
- Around line 53-58: Remove the “Why a service package, not just a plugin
module?” architecture rationale from the reference README and place it on a
separate explanation page. Add a clear link from this README to that page, while
keeping the remaining content focused solely on package/layout reference
material.
🪄 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: cea18e40-c50f-4351-b860-d3137fa26313

📥 Commits

Reviewing files that changed from the base of the PR and between 5f7e05c and 01f50e0.

📒 Files selected for processing (12)
  • docker-bake.hcl
  • docker/automodel/README.md
  • packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io_metadata.py
  • packages/nmp_customization_common/tests/tasks/test_file_io_metadata.py
  • packages/nmp_platform/README.md
  • plugins/nemo-unsloth/README.md
  • services/rl/README.md
  • services/rl/src/nmp/rl/app/jobs/compiler.py
  • services/rl/tests/test_compiler.py
  • services/unsloth/README.md
  • services/unsloth/src/nmp/unsloth/app/jobs/compiler.py
  • services/unsloth/tests/test_compiler_validation_path.py
🚧 Files skipped from review as they are similar to previous changes (4)
  • packages/nmp_platform/README.md
  • services/rl/tests/test_compiler.py
  • docker/automodel/README.md
  • services/rl/src/nmp/rl/app/jobs/compiler.py

Comment thread plugins/nemo-unsloth/README.md Outdated
>
Signed-off-by: Sam Oluwalana <soluwalana@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
services/automodel/src/nmp/automodel/tasks/docker/README.md (1)

27-30: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Add the required Python SDK alternative.

This HOW-TO currently documents only the CLI workflow. Add the equivalent Python SDK example in a tab-set alongside the Docker command.

As per coding guidelines, “Provide both Python SDK and CLI examples in tab-sets for consistency and to support multiple user workflows.”

🤖 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 `@services/automodel/src/nmp/automodel/tasks/docker/README.md` around lines 27
- 30, Update the Docker usage section in the README to add a tab-set containing
both the existing CLI workflow and its equivalent Python SDK example. Preserve
the current Docker command, and add the SDK invocation for running the file-IO
task with the same automodel service source and customizer service name.

Source: Coding guidelines

🤖 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.

Outside diff comments:
In `@services/automodel/src/nmp/automodel/tasks/docker/README.md`:
- Around line 27-30: Update the Docker usage section in the README to add a
tab-set containing both the existing CLI workflow and its equivalent Python SDK
example. Preserve the current Docker command, and add the SDK invocation for
running the file-IO task with the same automodel service source and customizer
service name.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: e5d78500-c3f5-4e35-9401-d1df7950966c

📥 Commits

Reviewing files that changed from the base of the PR and between 01f50e0 and 03bacb0.

📒 Files selected for processing (8)
  • docker/unsloth/README.md
  • packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io/run.py
  • services/automodel/src/nmp/automodel/app/jobs/compiler.py
  • services/automodel/src/nmp/automodel/tasks/docker/README.md
  • services/rl/src/nmp/rl/app/jobs/compiler.py
  • services/unsloth/src/nmp/unsloth/app/jobs/compiler.py
  • tests/smoke_gpu/test_customizer_automodel.py
  • tests/smoke_gpu/test_customizer_tasks.py
💤 Files with no reviewable changes (2)
  • tests/smoke_gpu/test_customizer_automodel.py
  • packages/nmp_customization_common/src/nmp/customization_common/tasks/file_io/run.py
🚧 Files skipped from review as they are similar to previous changes (5)
  • tests/smoke_gpu/test_customizer_tasks.py
  • services/automodel/src/nmp/automodel/app/jobs/compiler.py
  • docker/unsloth/README.md
  • services/unsloth/src/nmp/unsloth/app/jobs/compiler.py
  • services/rl/src/nmp/rl/app/jobs/compiler.py

Signed-off-by: Sam Oluwalana <soluwalana@nvidia.com>

@crookedstorm crookedstorm left a comment

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.

Looks right from the devops side.

Signed-off-by: Sam Oluwalana <soluwalana@nvidia.com>

@gabwow gabwow left a comment

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.

Overall looks like a good rework, small suggestions

Comment thread .github/assets/ngc/containers/nmp-rl-training.md Outdated

@albcui albcui left a comment

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.

Massive refactor! A couple of minor correctness concerns.

Signed-off-by: Sam Oluwalana <soluwalana@nvidia.com>
@soluwalana
soluwalana disabled auto-merge July 15, 2026 16:21
Signed-off-by: Sam Oluwalana <soluwalana@nvidia.com>
Signed-off-by: Sam Oluwalana <soluwalana@nvidia.com>
@albcui
albcui self-requested a review July 15, 2026 18:01
Signed-off-by: Sam Oluwalana <soluwalana@nvidia.com>
@soluwalana
soluwalana added this pull request to the merge queue Jul 15, 2026
Merged via the queue into main with commit dc2e5e3 Jul 15, 2026
57 checks passed
@soluwalana
soluwalana deleted the solu/simplify-tasks branch July 15, 2026 21:19
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.

4 participants