Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
2c819e8
[Config] Add gfx942 a8w8 blockscale GEMM tunings for Qwen3/Qwen3.5/GL…
siliangchen-amd Sep 28, 2026
d4cc625
[HIP] [OPUS] [FlyDSL] gfx950 MXFP8 e8m0 GEMM + DeepSeek-V4/V4.1 tuned…
valarLip Sep 28, 2026
ec3f3a1
[Triton/Gluon] [ASM] [HIP] Mha v4: adds bf16 sparse, LSE support, KV …
jcaraban Sep 28, 2026
f7a769b
[tuner] Fail a task as soon as its worker process exits (#5841)
siliangchen-amd Sep 28, 2026
7b7be3b
[CI] Update Aiter artifact downloads to v8.0.1 (#5908)
leo-automation Sep 28, 2026
48bebf9
[MLA v4 nm] Test fix _run_one_point reading packed BF16 as FP32 parti…
liyjiang Sep 28, 2026
1bdfe57
[AOT] Inline the FlyDSL FP8 FMHA head shapes, drop the config CSVs (#…
gbyu-amd Sep 28, 2026
12c0fc1
[FlyDSL] gfx942 fp8_mqa_logits: let _auto_variant choose rows_per_blo…
jin-amd Sep 28, 2026
d8e6ff0
[Triton] [MHA] Add a tuned gfx1101 config, split small_head/default (…
Ragua1 Sep 28, 2026
13ce786
[Triton/Gluon] Consolidate tuning harnesses (#5874)
Boss2002n Sep 28, 2026
593761d
[Bugfix][Gluon][MLA] Follow-up: fix stale comments + test hardening (…
Rohan138 Sep 28, 2026
1a28588
[Triton/Gluon] [Config] gemm_a16w16: gfx950 tuned per-shape configs (…
NimitPtl Sep 28, 2026
9b3421a
replacing the fp32 mfma with two bf16 mfma. fn is split inside the ke…
ahmed-bsod Sep 28, 2026
15f4539
perf(fused-moe): add tuned DSV4.1 TP4 configs (#5919)
yifehuan Sep 29, 2026
1af1bd5
[Config] Add Qwen3.8-27B TP1 a8w8 blockscale GEMM tunings for gfx942 …
phambinhfin Sep 29, 2026
5b997f4
[HIP] [OPUS] [JIT] Unify gfx950 + gfx1250 MXFP4 paged MQA-logits into…
shay-li77 Sep 29, 2026
a5affca
[FlyDSL] feat(mega_moe/gfx1250): bind mori tokoff-ext allocator on th…
jhchouuu Sep 29, 2026
cab3da8
[Triton] Do not write segment softmax state at NUM_SEGMENTS_PER_SEQ =…
sogalin Sep 29, 2026
114c939
[Triton/Gluon] Enable unified-attention skip-mask for gfx950 hd256 FP…
vorapolsiloai Sep 29, 2026
20766ef
[Triton/Gluon] [Kimi-K3][ROCm] Add merged MoE front (#5321)
jiacao-amd Sep 29, 2026
1a72386
[Triton/Gluon] Add SonicMoE pure-Triton grouped GEMM MoE (#5725)
WuLei-AMD Sep 29, 2026
5b12905
[Triton/Gluon] Move the KDA_DECODE configs into the nested config lay…
Boss2002n Sep 29, 2026
3db29ec
[Triton/Gluon] Move _triton_kernels/gated_delta_rule/ to _triton_kern…
Boss2002n Sep 29, 2026
7a6fedb
[Triton/Gluon] Move _gluon_kernels/gfx1250/norm/ to _gluon_kernels/gf…
Boss2002n Sep 29, 2026
519d44b
[CI] Select impacted Triton and Gluon unit tests (#5878)
Boss2002n Sep 29, 2026
2012670
[Triton/Gluon] [Config] Drop no-op kpack from RDNA GEMM configs (#5917)
hyjuunn Sep 29, 2026
45f24c9
mxfp8 gemm cga update, update (#5055)
k50112113 Sep 29, 2026
babbe32
stop fused_bmm_rope_kv_cache from using batched_gemm_a8w8_a_per_token…
Boss2002n Sep 29, 2026
53722a9
[Triton/Gluon] Add Triton-based Conv3D kernels (#5952)
saeid-rostami Sep 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1,263 changes: 384 additions & 879 deletions .github/scripts/select_triton_tests.py

Large diffs are not rendered by default.

41 changes: 40 additions & 1 deletion .github/scripts/split_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,23 @@
# Parameters:
# --shards N number of shards (required)
# --test-type TYPE test type, default aiter
# --select-file F only shard test files listed in F (one per line)
# --dry-run only output allocation plan, do not execute
# -v Pytest's -v option, no effect
# Exit code: always 0
# Exit code: 0 on success, 1 for invalid arguments or selected paths

set -euo pipefail

SHARDS=0
TEST_TYPE="aiter"
DRY_RUN=0
SELECT_FILE=""

while [[ $# -gt 0 ]]; do
case "$1" in
--shards) SHARDS="$2"; shift 2 ;;
--test-type) TEST_TYPE="$2"; shift 2 ;;
--select-file) SELECT_FILE="$2"; shift 2 ;;
--dry-run) DRY_RUN=1; shift ;;
-v|--verbose) shift ;; # compatibility, ignore
*)
Expand Down Expand Up @@ -67,6 +70,42 @@ if [[ ${#ALL_FILES[@]} -eq 0 ]]; then
exit 1
fi

# Apply the optional selection before sharding.
if [[ -n "$SELECT_FILE" ]]; then
if [[ ! -f "$SELECT_FILE" ]]; then
echo "Selection file not found: $SELECT_FILE" >&2
exit 1
fi
declare -A SELECTED=()
while IFS= read -r line || [[ -n "$line" ]]; do
[[ -n "$line" ]] && SELECTED["$line"]=1
done < "$SELECT_FILE"
FILTERED=()
for f in "${ALL_FILES[@]}"; do
if [[ -n "${SELECTED[$f]:-}" ]]; then
FILTERED+=("$f")
unset "SELECTED[$f]"
fi
done
# Never silently drop a path the selector asked to run.
if [[ ${#SELECTED[@]} -gt 0 ]]; then
echo "Selection lists paths that are not test files under ${TEST_DIR}:" >&2
for f in "${!SELECTED[@]}"; do echo " ${f}" >&2; done
exit 1
fi
echo "Test selection: ${#FILTERED[@]} of ${#ALL_FILES[@]} test files selected."
if [[ ${#FILTERED[@]} -eq 0 ]]; then
echo "Selection is empty — writing ${SHARDS} empty shard lists."
if [[ $DRY_RUN -eq 0 ]]; then
for ((s=0; s < SHARDS; s++)); do
: > "${TEST_TYPE}_shard_${s}.list"
done
fi
exit 0
fi
ALL_FILES=("${FILTERED[@]}")
fi

# ------------------------------
# FILE_TIMES (seconds), unknown files default 15
# ------------------------------
Expand Down
20 changes: 10 additions & 10 deletions .github/workflows/aiter-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,7 @@ jobs:
contents: read
steps:
- name: Download all wheel artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8.0.1
with:
pattern: ${{ env.AITER_WHEEL_ARTIFACT_NAME }}-py*
path: all-wheels
Expand Down Expand Up @@ -704,7 +704,7 @@ jobs:

- name: Download test shard lists
id: download_aiter_shards
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8.0.1
timeout-minutes: 15
with:
name: aiter_shards
Expand Down Expand Up @@ -732,7 +732,7 @@ jobs:
- name: Download Aiter wheel artifact
if: steps.restore_aiter_wheel.outputs.cache-hit != 'true'
id: download_aiter_wheel
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8.0.1
timeout-minutes: 30
continue-on-error: true
with:
Expand All @@ -742,7 +742,7 @@ jobs:
- name: Retry Download Aiter wheel artifact
if: steps.restore_aiter_wheel.outputs.cache-hit != 'true' && steps.download_aiter_wheel.outcome == 'failure'
id: retry_aiter_wheel
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8.0.1
timeout-minutes: 30
with:
name: ${{ env.AITER_WHEEL_ARTIFACT_NAME }}-py3.12
Expand All @@ -765,7 +765,7 @@ jobs:
- name: Download Triton wheel artifact
if: steps.restore_triton_wheel.outputs.cache-hit != 'true'
id: download_triton_wheel
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8.0.1
timeout-minutes: 30
continue-on-error: true
with:
Expand Down Expand Up @@ -988,7 +988,7 @@ jobs:
needs: [detect_aiter_test_scope, standard]
steps:
- name: Download all test logs
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8.0.1
timeout-minutes: 15
with:
pattern: standard-test-log-*-shard-*
Expand Down Expand Up @@ -1053,7 +1053,7 @@ jobs:
- name: Download Aiter wheel artifact
if: steps.restore_aiter_wheel.outputs.cache-hit != 'true'
id: download_aiter_wheel
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8.0.1
timeout-minutes: 30
continue-on-error: true
with:
Expand All @@ -1062,7 +1062,7 @@ jobs:

- name: Retry Download Aiter wheel artifact
if: steps.restore_aiter_wheel.outputs.cache-hit != 'true' && steps.download_aiter_wheel.outcome == 'failure'
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8.0.1
timeout-minutes: 30
with:
name: ${{ env.AITER_WHEEL_ARTIFACT_NAME }}-py3.12
Expand All @@ -1084,7 +1084,7 @@ jobs:

- name: Download Triton wheel artifact
if: steps.restore_triton_wheel.outputs.cache-hit != 'true'
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8.0.1
timeout-minutes: 30
continue-on-error: true
with:
Expand Down Expand Up @@ -1295,7 +1295,7 @@ jobs:
- uses: actions/checkout@v4

- name: Download standard test logs (mi35x only)
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8.0.1
timeout-minutes: 15
continue-on-error: true
with:
Expand Down
25 changes: 21 additions & 4 deletions .github/workflows/pr-title-tags.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ name: PR Title Tags & Labels
# component namespace ([fix], [Perf], [MLA], [gfx1250], ...) are never
# touched. The same rule applies to labels: only the component labels listed
# in COMPONENT_LABELS are ever added or removed — human labels (ci:*, ...)
# are left alone, while hand-toggling a managed component label is corrected
# are left alone, except gfx942 config changes add ci:triton-300x.
# Hand-toggling a managed component label is corrected
# on the spot. To keep a PR's title untouched, add the 'no-auto-title' label —
# it takes effect immediately, and removing it re-syncs the title on the spot.
# Component labels are synced regardless of the opt-out: the AITER-triton
Expand Down Expand Up @@ -50,7 +51,8 @@ jobs:
script: |
// The component labels this workflow owns (name -> color). Only
// these are ever added or removed; anything else on the PR
// (ci:*, no-auto-title, ...) belongs to humans.
// (ci:*, no-auto-title, ...) belongs to humans, except the
// add-only ci:triton-300x label for gfx942 config changes below.
const COMPONENT_LABELS = {
'Triton/Gluon': '1d76db',
'ASM': '5319e7',
Expand Down Expand Up @@ -86,12 +88,17 @@ jobs:
const optedOut = pr.labels.some(l => l.name === 'no-auto-title');

// ---- changed files (paginated) ----
const files = (await github.paginate(github.rest.pulls.listFiles, {
const changedFiles = await github.paginate(github.rest.pulls.listFiles, {
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr.number,
per_page: 100,
})).map(f => f.filename);
});
if (changedFiles.length !== pr.changed_files) {
throw new Error(`Incomplete PR file list: ${changedFiles.length}/${pr.changed_files}`);
}
const files = changedFiles.map(f => f.filename);
const changedPaths = changedFiles.flatMap(f => [f.filename, f.previous_filename].filter(Boolean));

// ---- path predicates ----
const isDoc = f => f.startsWith('docs/') || f.endsWith('.md');
Expand Down Expand Up @@ -218,3 +225,13 @@ jobs:
} else {
core.info('Labels already in sync.');
}

if (changedPaths.some(f => f.startsWith('aiter/ops/triton/configs/gfx942/') && !isDoc(f))
&& !pr.labels.some(l => l.name === 'ci:triton-300x')) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
labels: ['ci:triton-300x'],
});
}
3 changes: 2 additions & 1 deletion .github/workflows/pr-welcome-comment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ jobs:
| Label | Tests |
|-------|-------|
| \`ci:gfx1250-ffm-triton\` | Run the five-shard gfx1250 FFM Triton test suite |
| \`ci:triton-300x\` | Run an additional Triton test job on MI300X in PRs; main branch always runs both MI35X and MI300X |
| \`ci:triton-300x\` | Run an additional Triton test job on MI300X in PRs (added automatically when gfx942 configs change); main branch always runs both MI35X and MI300X |
| \`ci:triton-355\` | Run the full Triton test suite on MI35X, not only the tests the change affects |
| \`multigpu\` | Aiter multi-GPU tests on the 8-GPU runner |
| \`ci:sglang\` | SGLang integration tests: DeepSeek-R1-MXFP4 accuracy, Qwen 3.5 accuracy |
| \`ci:atom\` | ATOM benchmark: DeepSeek-R1-0528, GPT-OSS-120B |
Expand Down
Loading