From 2cc3267c0d8f7f387092af15ba7438b1c0096ad2 Mon Sep 17 00:00:00 2001 From: Philip Petrakian Date: Sun, 25 Jan 2026 19:23:48 +0000 Subject: [PATCH 1/3] Change final review logic for low complexity PRs --- .github/CODEOWNERS | 32 ++++----- .github/workflows/multi-approval-bot.yml | 82 ++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 16 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e319d63f00c..6a455531b02 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,41 +1,41 @@ megatron/core/ @NVIDIA/core-adlr @NVIDIA/core-nemo -megatron/core/models/gpt/ @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/gpt +megatron/core/models/gpt/ @NVIDIA/gpt -megatron/core/models/multimodal/ @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/multi-modal +megatron/core/models/multimodal/ @NVIDIA/multi-modal -megatron/core/models/mamba/ @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/hybrid-mamba -megatron/core/ssm/ @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/hybrid-mamba +megatron/core/models/mamba/ @NVIDIA/hybrid-mamba +megatron/core/ssm/ @NVIDIA/hybrid-mamba -megatron/core/datasets/ @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/datasets +megatron/core/datasets/ @NVIDIA/datasets -megatron/core/distributed/fsdp/ @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/megatron-fsdp +megatron/core/distributed/fsdp/ @NVIDIA/megatron-fsdp -megatron/core/transformer/fsdp_dtensor_checkpoint.py @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/megatron-fsdp +megatron/core/transformer/fsdp_dtensor_checkpoint.py @NVIDIA/megatron-fsdp -megatron/core/dist_checkpointing/ @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/dist-checkpointing +megatron/core/dist_checkpointing/ @NVIDIA/dist-checkpointing -megatron/core/optimizer/distrib_optimizer/ @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/dist-optimizer +megatron/core/optimizer/distrib_optimizer/ @NVIDIA/dist-optimizer -megatron/core/inference/modelopt_support @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/quantization-and-inference +megatron/core/inference/modelopt_support @NVIDIA/quantization-and-inference -megatron/core/datasets/ @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/datasets +megatron/core/datasets/ @NVIDIA/datasets -megatron/core/pipeline_parallel/ @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/pipeline-parallelism +megatron/core/pipeline_parallel/ @NVIDIA/pipeline-parallelism megatron/core/transformer/ @NVIDIA/core-adlr @NVIDIA/core-nemo -megatron/core/transformer/moe/ @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/mixture-of-experts-adlr @NVIDIA/mixture-of-experts-devtech +megatron/core/transformer/moe/ @NVIDIA/mixture-of-experts-adlr @NVIDIA/mixture-of-experts-devtech -megatron/core/inference/ @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/inference +megatron/core/inference/ @NVIDIA/inference megatron/core/parallel_state.py @NVIDIA/core-adlr @NVIDIA/core-nemo -megatron/core/post_training/ @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/post-training +megatron/core/post_training/ @NVIDIA/post-training megatron/post_training/ @NVIDIA/post-training -megatron/core/transformer/cuda_graphs.py @NVIDIA/core-adlr @NVIDIA/core-nemo @NVIDIA/cuda-graphs +megatron/core/transformer/cuda_graphs.py @NVIDIA/cuda-graphs .gitlab/ @NVIDIA/ci .github/ @NVIDIA/ci diff --git a/.github/workflows/multi-approval-bot.yml b/.github/workflows/multi-approval-bot.yml index e8507605aa7..c35b0da9b05 100644 --- a/.github/workflows/multi-approval-bot.yml +++ b/.github/workflows/multi-approval-bot.yml @@ -26,6 +26,88 @@ jobs: if: startsWith(github.ref, 'refs/heads/pull-request/') uses: nv-gha-runners/get-pr-info@main + - name: Check for complexity:low label + id: check-label + env: + PR_INFO: ${{ steps.get-pr-info.outputs.pr-info }} + run: | + if echo "$PR_INFO" | jq -e '.labels[]? | select(.name == "complexity: low")' > /dev/null 2>&1; then + echo "is_low_complexity=true" >> $GITHUB_OUTPUT + else + echo "is_low_complexity=false" >> $GITHUB_OUTPUT + fi + + - name: Request reviews from required teams + env: + GH_TOKEN: ${{ secrets.PAT }} + PR_NUMBER: ${{ fromJSON(steps.get-pr-info.outputs.pr-info || '{}').number }} + IS_LOW_COMPLEXITY: ${{ steps.check-label.outputs.is_low_complexity }} + run: | + # Always request core-nemo + gh api repos/${{ github.repository }}/pulls/$PR_NUMBER/requested_reviewers \ + --method POST -f team_reviewers[]="core-nemo" 2>/dev/null || true + + # Request core-adlr unless complexity:low + if [ "$IS_LOW_COMPLEXITY" != "true" ]; then + gh api repos/${{ github.repository }}/pulls/$PR_NUMBER/requested_reviewers \ + --method POST -f team_reviewers[]="core-adlr" 2>/dev/null || true + fi + + - name: Check core-nemo approval (always required) + env: + GH_TOKEN: ${{ secrets.PAT }} + PR_NUMBER: ${{ fromJSON(steps.get-pr-info.outputs.pr-info || '{}').number }} + run: | + # Get team members + MEMBERS=$(gh api orgs/NVIDIA/teams/core-nemo/members --jq '.[].login' 2>/dev/null || echo "") + if [ -z "$MEMBERS" ]; then + echo "Warning: Could not fetch core-nemo team members" + exit 1 + fi + + # Get PR approvers + APPROVERS=$(gh api repos/${{ github.repository }}/pulls/$PR_NUMBER/reviews \ + --jq '[.[] | select(.state == "APPROVED")] | [.[].user.login] | unique | .[]') + + # Check if any team member approved + for member in $MEMBERS; do + if echo "$APPROVERS" | grep -q "^${member}$"; then + echo "✅ core-nemo approval found from: $member" + exit 0 + fi + done + + echo "❌ Missing approval from @NVIDIA/core-nemo" + exit 1 + + - name: Check core-adlr approval (required unless complexity:low) + if: steps.check-label.outputs.is_low_complexity != 'true' + env: + GH_TOKEN: ${{ secrets.PAT }} + PR_NUMBER: ${{ fromJSON(steps.get-pr-info.outputs.pr-info || '{}').number }} + run: | + # Get team members + MEMBERS=$(gh api orgs/NVIDIA/teams/core-adlr/members --jq '.[].login' 2>/dev/null || echo "") + if [ -z "$MEMBERS" ]; then + echo "Warning: Could not fetch core-adlr team members" + exit 1 + fi + + # Get PR approvers + APPROVERS=$(gh api repos/${{ github.repository }}/pulls/$PR_NUMBER/reviews \ + --jq '[.[] | select(.state == "APPROVED")] | [.[].user.login] | unique | .[]') + + # Check if any team member approved + for member in $MEMBERS; do + if echo "$APPROVERS" | grep -q "^${member}$"; then + echo "✅ core-adlr approval found from: $member" + exit 0 + fi + done + + echo "❌ Missing approval from @NVIDIA/core-adlr" + exit 1 + - name: Checkout action uses: actions/checkout@v3 with: From eb6ddb96a90c23dc72ba6b20d2a07054df88bbc8 Mon Sep 17 00:00:00 2001 From: Philip Petrakian Date: Sun, 25 Jan 2026 19:33:29 +0000 Subject: [PATCH 2/3] Only add reviewers to core and training PRs --- .github/workflows/multi-approval-bot.yml | 29 ++++++++++++++++++------ 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/.github/workflows/multi-approval-bot.yml b/.github/workflows/multi-approval-bot.yml index c35b0da9b05..1ec123a117d 100644 --- a/.github/workflows/multi-approval-bot.yml +++ b/.github/workflows/multi-approval-bot.yml @@ -26,24 +26,38 @@ jobs: if: startsWith(github.ref, 'refs/heads/pull-request/') uses: nv-gha-runners/get-pr-info@main - - name: Check for complexity:low label - id: check-label + - name: Check for complexity:low label and core paths + id: check-conditions env: + GH_TOKEN: ${{ secrets.PAT }} PR_INFO: ${{ steps.get-pr-info.outputs.pr-info }} + PR_NUMBER: ${{ fromJSON(steps.get-pr-info.outputs.pr-info || '{}').number }} run: | + # Check for complexity:low label if echo "$PR_INFO" | jq -e '.labels[]? | select(.name == "complexity: low")' > /dev/null 2>&1; then echo "is_low_complexity=true" >> $GITHUB_OUTPUT else echo "is_low_complexity=false" >> $GITHUB_OUTPUT fi + # Check if any changed files are in megatron/core or megatron/training + CHANGED_FILES=$(gh api repos/${{ github.repository }}/pulls/$PR_NUMBER/files --jq '.[].filename') + if echo "$CHANGED_FILES" | grep -qE '^megatron/(core|training)/'; then + echo "has_core_changes=true" >> $GITHUB_OUTPUT + echo "PR has changes in megatron/core or megatron/training" + else + echo "has_core_changes=false" >> $GITHUB_OUTPUT + echo "PR does not have changes in megatron/core or megatron/training" + fi + - name: Request reviews from required teams + if: steps.check-conditions.outputs.has_core_changes == 'true' env: GH_TOKEN: ${{ secrets.PAT }} PR_NUMBER: ${{ fromJSON(steps.get-pr-info.outputs.pr-info || '{}').number }} - IS_LOW_COMPLEXITY: ${{ steps.check-label.outputs.is_low_complexity }} + IS_LOW_COMPLEXITY: ${{ steps.check-conditions.outputs.is_low_complexity }} run: | - # Always request core-nemo + # Request core-nemo for core changes gh api repos/${{ github.repository }}/pulls/$PR_NUMBER/requested_reviewers \ --method POST -f team_reviewers[]="core-nemo" 2>/dev/null || true @@ -53,7 +67,8 @@ jobs: --method POST -f team_reviewers[]="core-adlr" 2>/dev/null || true fi - - name: Check core-nemo approval (always required) + - name: Check core-nemo approval (required for core changes) + if: steps.check-conditions.outputs.has_core_changes == 'true' env: GH_TOKEN: ${{ secrets.PAT }} PR_NUMBER: ${{ fromJSON(steps.get-pr-info.outputs.pr-info || '{}').number }} @@ -80,8 +95,8 @@ jobs: echo "❌ Missing approval from @NVIDIA/core-nemo" exit 1 - - name: Check core-adlr approval (required unless complexity:low) - if: steps.check-label.outputs.is_low_complexity != 'true' + - name: Check core-adlr approval (required for core changes unless complexity:low) + if: steps.check-conditions.outputs.has_core_changes == 'true' && steps.check-conditions.outputs.is_low_complexity != 'true' env: GH_TOKEN: ${{ secrets.PAT }} PR_NUMBER: ${{ fromJSON(steps.get-pr-info.outputs.pr-info || '{}').number }} From 074b8a8949e3405509af41d51cce6fc4268a0c29 Mon Sep 17 00:00:00 2001 From: Philip Petrakian Date: Thu, 29 Jan 2026 00:57:16 +0000 Subject: [PATCH 3/3] Remove duplicate datasets --- .github/CODEOWNERS | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6a455531b02..7d40c8718b1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -19,8 +19,6 @@ megatron/core/optimizer/distrib_optimizer/ @NVIDIA/dist-optimizer megatron/core/inference/modelopt_support @NVIDIA/quantization-and-inference -megatron/core/datasets/ @NVIDIA/datasets - megatron/core/pipeline_parallel/ @NVIDIA/pipeline-parallelism megatron/core/transformer/ @NVIDIA/core-adlr @NVIDIA/core-nemo