Light LLM Simulator produces visualization assets from generated CSV results and exposes them in two ways:
- CLI scripts under
src/visualization/ - The browser Visualizations tab served by FastAPI
The visualizations are static PNG images generated from simulator output. There is no interactive charting layer in the current implementation.
Generated images are written under data/images/:
data/images/throughput/data/images/pipeline/mbn2/data/images/pipeline/mbn3/data/images/pipeline/deepep/
Generated CSV inputs are read from:
data/afd/mbn2/best/data/afd/mbn3/best/data/deepep/
CSV filenames follow:
{DeviceType.name}-{ModelType.name}-tpot{tpot}-kv_len{kv_len}.csv
Example:
ASCENDA3_Pod-DEEPSEEK_V3-tpot50-kv_len4096.csv
Script: src/visualization/throughput.py
This script generates two families of throughput charts:
- throughput vs. total dies for a specific
(device, model, tpot, kv_len) - AFD-over-DeepEP improvement vs.
kv_lenandtpotfor a fixedtotal_die
python src/visualization/throughput.py \
--model_type deepseek-ai/DeepSeek-V3 \
--device_type Ascend_A3Pod \
--tpot_list 20 50 70 100 150 \
--kv_len_list 2048 4096 8192 16384 131072 \
--micro_batch_num 2 3 \
--total_die 128 \
--min_die 16 \
--max_die 768data/images/throughput/{DeviceType.name}-{ModelType.name}-mbn{micro_batch_num}-total_die{total_die}.pngdata/images/throughput/{DeviceType.name}-{ModelType.name}-tpot{tpot}-kv_len{kv_len}.png
throughput_vs_dies()expects all three CSVs to exist for the same file name:data/deepep/data/afd/mbn2/best/data/afd/mbn3/best/
- If one of those files is missing, the script raises
FileNotFoundErrorfor that chart.
Script: src/visualization/pipeline.py
This script generates Gantt-style pipeline charts for the available serving modes by reading one CSV filename across:
data/deepep/data/afd/mbn2/best/data/afd/mbn3/best/
python src/visualization/pipeline.py \
--file_name ASCENDA3_Pod-DEEPSEEK_V3-tpot50-kv_len4096.csvdata/images/pipeline/deepep/{file_stem}-total_die{total_die}.pngdata/images/pipeline/mbn2/{file_stem}-total_die{total_die}.pngdata/images/pipeline/mbn3/{file_stem}-total_die{total_die}.png
- The script skips missing CSV inputs per serving mode instead of failing the whole run.
- One image is produced per matching
total_dierow in the source CSV.
The browser UI includes a Visualizations tab implemented in ThroughputCharts.vue.
- The user selects or seeds:
device_typemodel_typetotal_dietpotkv_len
- The frontend calls:
GET /api/results
- The backend returns lists of image URLs under
/data/images/... - The UI renders those PNGs directly
The tab is seeded from shared app state, so using View Charts from the Results table carries the first selected row's total_die into the visualization view.
- The UI is static-image based only. There is no zoom, pan, or export flow.
webapp/backend/main.pyfilters/api/resultsto return only image files that actually exist on disk.- Some parameter combinations legitimately return fewer images than others if only part of the visualization set has been generated.
Typical visualization workflow:
- Run a simulation from the CLI or web UI
- Confirm CSV outputs exist under
data/afd/...ordata/deepep/ - Generate images with:
- Open the web UI and use the Visualizations tab, or inspect the PNG files directly
- Visualizations are pre-generated assets, not live chart computations
- Missing CSV inputs lead to missing charts
- Some chart families depend on both AFD and DeepEP results existing for the same parameter set
- The web UI does not offer chart export beyond the static PNG files already saved under
data/images/