11# iris all-reduce reproducer
22
3- Correctness and performance numbers for the iris one-shot collectives on
4- Llama-3.3-70B-FP8 at TP=8. Each arm is a baked image (vllm, aiter, iris pinned);
5- the scripts only run the workload.
3+ Correctness and performance for the iris one-shot collectives on
4+ Llama-3.3-70B-FP8 at TP=8. Two arms, each a baked image (vllm, aiter, iris pinned):
5+
6+ - ** baseline** (` Dockerfile.baseline ` ) - AMD production config: broad aiter off,
7+ the all-reduce is QuickReduce INT4.
8+ - ** exp** (` Dockerfile.exp ` ) - the iris one-shot all-reduce (` AITER_COMMS_BACKEND=iris ` ).
9+
10+ The A/B isolates the all-reduce path. All vLLM behavior env is baked into the images;
11+ the scripts only run the workload against the server.
612
713## Requirements
814
@@ -17,21 +23,47 @@ RUN="docker run --rm -it \
1723 -v $( pwd) :/repro -w /repro"
1824```
1925
20- ## Baseline
26+ ## Run
27+
28+ Build each image once, then run the commands you need against it. The A/B is the
29+ baseline image vs the exp image; compare their outputs.
2130
2231``` sh
2332docker build -f Dockerfile.baseline -t iris-repro:baseline .
24- $RUN iris-repro:baseline ./bench.sh # performance
25- $RUN iris-repro:baseline ./test.sh # correctness
33+ docker build -f Dockerfile.exp -t iris-repro:exp .
34+
35+ $RUN iris-repro:baseline ./bench.sh # perf: serving metrics (TTFT/TPOT/E2EL/throughput)
36+ $RUN iris-repro:exp ./bench.sh
37+
38+ $RUN iris-repro:baseline ./profile.sh # traces + per-kernel tables (what data.csv needs)
39+ $RUN iris-repro:exp ./profile.sh
40+
41+ $RUN iris-repro:baseline ./eval.sh # gsm8k accuracy gate (correctness)
42+ $RUN iris-repro:exp ./eval.sh
43+
44+ $RUN iris-repro:exp ./test.sh # iris collective correctness (exp stack, no server)
2645```
2746
28- ## Experiment
47+ The four commands share one server config (` _serve.sh ` ) so perf, traces, and the
48+ correctness gate all describe the same server. Each writes RAW artifacts under
49+ ` output/<arm>/ ` : ` results/ ` (the workload result JSON), ` profile/{summary,traces,ir}/ `
50+ (profiling run), and ` arm.json ` (the resolved operating point + installed code SHAs).
51+
52+ Default operating point is ` decode64 ` (8192 in / 1024 out, concurrency 64), warm
53+ (` WARMUP=64 ` , warmup requests excluded from the metrics). Knobs: ` WORKLOAD=confluence `
54+ (the guide's 1024/1024/conc-4 example), ` WARMUP=0 ` (cold), ` DATA=real ` (ShareGPT).
55+
56+ ## Analysis
57+
58+ ` data.csv ` is the flat, long-format extract of every arm's raw artifacts (one row per
59+ fact: e2e metrics, profiler-table per-kernel times, trace per-kernel times). ` report.ipynb `
60+ renders the A/B from it (pandas + matplotlib only). It ships pre-built, so you can open the
61+ notebook directly.
62+
63+ To rebuild it from arms you ran yourself, point ` preprocess.py ` at their output dirs (each
64+ ` output/<arm>-<command>/ ` holds ` arm.json ` + ` results/ ` + ` profile/ ` ):
2965
3066``` sh
31- docker build -f Dockerfile.exp -t iris-repro:exp .
32- $RUN iris-repro:exp ./bench.sh # performance
33- $RUN iris-repro:exp ./test.sh # correctness
67+ python preprocess.py output/* # parses each arm dir -> data.csv (reads arm.json for the labels)
68+ jupyter nbconvert --to notebook --execute report.ipynb # or just open report.ipynb
3469```
35-
36- ` bench.sh ` writes serving metrics (TTFT/TPOT/E2EL/throughput) to ` ./output/ ` ;
37- add ` EVAL=1 ` for a gsm8k accuracy pass or ` PROFILE=1 ` for profiler traces.
0 commit comments