Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
7fe9ba2
fix(rccl): score madengine training runs on the running-average throu…
mkuznet1 Oct 5, 2026
04c6ac3
fix(rccl): point llama-4-scout at its own multiple_results CSV
mkuznet1 Oct 5, 2026
2243b09
feat(rccl): score the madengine gate against a same-node baseline
mkuznet1 Oct 6, 2026
0202bfd
ci(rccl): bump the madengine pin to 10a0414 (madengine#213)
mkuznet1 Oct 6, 2026
5d0152f
ci(rccl): run madengine from a conda env the compute nodes can execute
mkuznet1 Oct 6, 2026
9d7f1f3
ci(rccl): name the baseline and candidate RCCL builds in the madengin…
mkuznet1 Oct 7, 2026
14fce83
ci(rccl): upload the madengine results from each A/B phase directory
mkuznet1 Oct 7, 2026
86af35f
ci(rccl): pin madengine at #213 rebased on #190; drop the template patch
mkuznet1 Oct 12, 2026
90ad5d2
fix(rccl): give each A/B phase the allocation's time limit
mkuznet1 Oct 12, 2026
d186c1a
ci(rccl): pin madengine on ROCm develop and MAD on the current mad-rccl
mkuznet1 Oct 14, 2026
55abccd
fix(rccl): fail the A/B when an expected precision is missing from bo…
mkuznet1 Oct 14, 2026
2458b6c
fix(rccl): keep each workload's archived results apart; lock the data…
mkuznet1 Oct 14, 2026
ef9d2ef
docs(rccl): state what the madengine gate does, not how it got there
mkuznet1 Oct 14, 2026
285eb35
fix(rccl): cancel the allocation when the A/B times out
mkuznet1 Oct 14, 2026
50e9ea2
fix(rccl): expect BF16 from llama-4-scout too
mkuznet1 Oct 14, 2026
66cc9fe
fix(rccl): keep conda and pip out of the runner account's home
mkuznet1 Oct 19, 2026
2e79bc7
Merge branch 'develop' into ci/madengine-same-node-ab
mkuznet1 Oct 20, 2026
7606f5a
fix(rccl-ci): build the madengine overlay only on the compute nodes
mkuznet1 Oct 20, 2026
14f41ab
fix(rccl-ci): tighten the same-node A/B gate and its cleanup
mkuznet1 Oct 22, 2026
ceb55dc
fix(rccl-ci): never pull an image to clean up a node workspace
mkuznet1 Oct 22, 2026
740a289
style(rccl-ci): trim comments to the constraints they state
mkuznet1 Oct 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 43 additions & 26 deletions .github/workflows/therock-rccl-test-madengine.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,19 +101,26 @@ jobs:
exit 1
fi

- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: '3.12'

# A venv on top of it: these runners are shared and long-lived, so anything
# installed straight into the interpreter would persist into the next job.
# This one lives under WORK_DIR and the cleanup step deletes it.
- name: Create Python virtual environment
# Conda-forge Python under WORK_DIR: the compute nodes (another distro, older
# glibc) run madengine from it via PATH, where setup-python's build won't start.
- name: Create Python environment
env:
MINIFORGE_VERSION: "26.7.2-0"
MINIFORGE_SHA256: "281b0ac7d550802efc81af633225a5e6116d29ae72f3ab4eae7168c3931a4c05"
run: |
# conda must write to $HOME, a small shared quota; redirect it into the
# conda prefix for this step only, so the nodes keep the real home.
export HOME="${WORK_DIR}/conda/home"
echo "PIP_CACHE_DIR=${HOME}/.cache/pip" >> "$GITHUB_ENV"
mkdir -p "${WORK_DIR}"
python3 -m venv "${WORK_DIR}/venv"
echo "${WORK_DIR}/venv/bin" >> "$GITHUB_PATH"
installer="${WORK_DIR}/Miniforge3.sh"
curl -fsSL -o "${installer}" \
"https://github.com/conda-forge/miniforge/releases/download/${MINIFORGE_VERSION}/Miniforge3-${MINIFORGE_VERSION}-Linux-x86_64.sh"
echo "${MINIFORGE_SHA256} ${installer}" | sha256sum -c -
bash "${installer}" -b -p "${WORK_DIR}/conda"
rm -f "${installer}"
"${WORK_DIR}/conda/bin/conda" create -y -q -p "${WORK_DIR}/env" python=3.12
echo "${WORK_DIR}/env/bin" >> "$GITHUB_PATH"

# The datastore is only appended to at the very end of the workload, so
# an unwritable RESULTS_DIR would surface three hours in. A directory
Expand Down Expand Up @@ -163,13 +170,13 @@ jobs:
--output-dir="${OUTPUT_ARTIFACTS_DIR}" \
--rccl

# Both A/B phases in one allocation, plus its queue wait.
- name: Run MADEngine workload
timeout-minutes: 210
timeout-minutes: 360
env:
NCCL_DEBUG: WARN
MAD_SECRETS_HFTOKEN: ${{ secrets.HF_TOKEN || '' }}
run: |
source "${WORK_DIR}/venv/bin/activate"
export PYTHONPATH="rocm-systems/projects/rccl/ci/scripts:${PYTHONPATH}"

NOTIFY_ARGS=""
Expand Down Expand Up @@ -198,22 +205,32 @@ jobs:
# nodes can only be read by someone with cluster access: the job log
# shows that SLURM failed, not why.
path: |
${{ env.WORK_DIR }}/perf.csv
${{ env.WORK_DIR }}/perf_entry_super.csv
${{ env.WORK_DIR }}/perf_entry_super.json
${{ env.WORK_DIR }}/perf_super.csv
${{ env.WORK_DIR }}/madengine_summary.txt
${{ env.WORK_DIR }}/manifest.json
${{ env.WORK_DIR }}/slurm_output/*.out
${{ env.WORK_DIR }}/slurm_output/*.err
${{ env.WORK_DIR }}/ab/*/perf.csv
${{ env.WORK_DIR }}/ab/*/perf_entry_super.csv
${{ env.WORK_DIR }}/ab/*/perf_entry_super.json
${{ env.WORK_DIR }}/ab/*/perf_super.csv
${{ env.WORK_DIR }}/ab/*/manifest.json
${{ env.WORK_DIR }}/ab/*/slurm_output/*.out
${{ env.WORK_DIR }}/ab/*/slurm_output/*.err
retention-days: 30

- name: Cleanup work directory
if: always()
run: |
# node_venv is the per-node bootstrap: on a single-node run the template
# puts WORKSPACE on the shared filesystem, so it lands here rather than
# in node-local storage and would otherwise outlive the run.
rm -rf "${WORK_DIR}/madengine" "${WORK_DIR}/MAD" "${WORK_DIR}/venv" \
"${WORK_DIR}/node_venv" "${WORK_DIR}/overlay_ctx" \
"${WORK_DIR}/docker_builds"
# `ab` holds the per-node logs, the only part that grows with the run;
# the upload step above has already kept them as an artifact.
rm -rf "${WORK_DIR}/madengine" "${WORK_DIR}/MAD" "${WORK_DIR}/conda" \
"${WORK_DIR}/env" "${WORK_DIR}/overlay_ctx" \
Comment thread
mkuznet1 marked this conversation as resolved.
"${WORK_DIR}/docker_builds" "${WORK_DIR}/ab"

# Remove per-run tags and bases left by earlier versions of this job on
# the shared Docker disk; no -f, so images a container still uses stay.
docker system df || true
{
docker images --format '{{.Repository}}:{{.Tag}}' \
| grep -E -- '-(rccl-gfx[0-9a-z]+|primus-v[0-9.]+|mad-[0-9a-f]{8})-' || true
python3 -c 'import sys; sys.path.insert(0, sys.argv[1]); import test_madengine as t; print(*sorted({c["base_image"] for c in t.WORKLOAD_CONFIGS.values()}), sep="\n")' \
rocm-systems/projects/rccl/ci/scripts
} | sort -u | xargs -r docker image rm 2>&1 | grep -v 'No such image' || true
docker system df || true
Loading
Loading