Skip to content

ci(mlx): materialize A on sorted gather_mm + A-characterize + v9 #30

ci(mlx): materialize A on sorted gather_mm + A-characterize + v9

ci(mlx): materialize A on sorted gather_mm + A-characterize + v9 #30

name: MLX PR check (fork)
# CAMPAGNE v9 — caractériser A pour le rapport amont, ET valider le
# correctif sur la suite complète.
#
# Acquis (v8.2) : synth_on_delegate_stream ~0 (contexte/stream innocent),
# materialized A~0 B=33 idx=33 ALL~0 -> le chemin trié de MLX lit mal `a`
# quand `a` est une vue sur mémoire externe (entrées ET zero-copy).
# Rappel : copy() ne ré-alloue pas (copyBrc=0), d'où le faux négatif de
# v7 sur la provenance.
#
# Étape 1 (sondes) : caractérisation de A (shape/strides/flags) +
# A_add / A_flat / sq_mat_ed. sq_mat_ed est le discriminant :
# ~0 -> le déclencheur est le buffer externe (provenance)
# >>0 -> le déclencheur est la structure de vue expand_dims
# A_add valide la forme retenue par le correctif ; A_flat dit si un
# simple flatten aurait suffi (gratuit si A est déjà contigu).
#
# Étape 2 (validation) : suite COMPLÈTE, sans ET_MLX_GMM_PROBE, avec le
# correctif en place. Les deux configs *_sorted doivent passer au vert
# et rien d'autre ne doit régresser. C'est cette étape qui décide si
# le correctif part sur la PR.
#
# Prérequis branche ci-mlx-check : sondes v1..v3 + runner-t (+fix) +
# sweep + contig + ctx-prov, puis probe-A-characterize.patch, puis
# fix-materialize-A.patch.
on:
workflow_dispatch:
push:
branches:
- ci-mlx-check
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
characterize-and-validate:
runs-on: macos-14
timeout-minutes: 300
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Preuve — commit, sonde + correctif présents
run: |
set -eux
git log --oneline -3
grep -c "GMM-PROBE" backends/mlx/runtime/MLXInterpreter.h
grep -n "array a_in = sorted" backends/mlx/runtime/MLXInterpreter.h
- name: Install ExecuTorch
run: |
set -eux
python -m pip install --upgrade pip
python install_executorch.py
- name: Configure + build op_test_runner
id: build
run: |
set -eux
cmake --preset mlx-release \
-DEXECUTORCH_BUILD_TESTS=ON \
-DEXECUTORCH_MLX_ENABLE_SANITIZERS=OFF
cmake --build cmake-out --target op_test_runner -j2
df -h /
# ÉTAPE 1 — caractérisation (le correctif s'applique APRÈS le bloc
# sonde, donc la sonde mesure toujours le A brut).
- name: SONDE — caractérisation de A
if: steps.build.outcome == 'success'
continue-on-error: true
run: |
set -eux
export ET_MLX_GMM_PROBE=1
python -m executorch.backends.mlx.test.run_all_tests gather_mm -v \
2>&1 | tee /tmp/probe.log
echo "=== caractérisation ==="
grep -nE 'GMM-PROBE\] A |A_add=|materialized|synth_on' /tmp/probe.log \
|| echo "AUCUNE"
# ÉTAPE 2 — validation propre, suite complète, sans sonde.
- name: VALIDATION — suite complète avec le correctif
if: steps.build.outcome == 'success'
continue-on-error: true
run: |
set -eux
unset ET_MLX_GMM_PROBE
python -m executorch.backends.mlx.test.run_all_tests -v \
2>&1 | tee /tmp/full.log
echo "=== configs sorted ==="
grep -nE 'sorted' /tmp/full.log | tail -20
echo "=== bilan ==="
grep -nE 'PASSED|FAILED|passed|failed' /tmp/full.log | tail -20
- name: Diagnostics finaux
if: always()
run: df -h /