Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
6a8b3b4
Add other files required for simplep2p flow model
sanjaychari Jul 7, 2026
01d4198
Add initial switch and terminal flow model
sanjaychari Jul 7, 2026
c52aede
Revert "Add other files required for simplep2p flow model"
sanjaychari Jul 7, 2026
a402355
Improve fluid switch validation logs
sanjaychari Jul 8, 2026
0463d26
Replace per switch queue buffer with shared buffer
sanjaychari Jul 8, 2026
78a2faf
Add reverse handler for switch-terminal fluid flow model
sanjaychari Jul 8, 2026
d36bb2f
Optimizations for fluid flow simn efficiency
sanjaychari Jul 8, 2026
bcc10fe
Add ROSS commit handler and csv logging for fluid simn
sanjaychari Jul 8, 2026
7d4aa05
Clean up fluid switch logging
sanjaychari Jul 9, 2026
8bc3b5f
Add topology generator script for fluid flow simn
sanjaychari Jul 9, 2026
50d1724
Replace max_min_fair with round robin for fluid flow simn
sanjaychari Jul 9, 2026
037ec3b
Add fluid flow wan tests for CI
sanjaychari Jul 9, 2026
8f59063
Fix clang format errors
sanjaychari Jul 9, 2026
e57cd03
Fix MPI EXEC handler for fluid flow wan simn tests
sanjaychari Jul 9, 2026
ecb43ab
Fix yaml loading issue in fluid flow simn test
sanjaychari Jul 9, 2026
a8d94aa
Make fluid flow wan simn tests use sync instead of synch
sanjaychari Jul 9, 2026
c02153f
Fix Ubuntu 24.04 mpich tests
sanjaychari Jul 9, 2026
a8451c2
Revert MPI launcher workflow override
sanjaychari Jul 9, 2026
1127d8f
Use matching MPI launcher for CTest
sanjaychari Jul 9, 2026
9b29061
Add diagnostics for MPI used in CI
sanjaychari Jul 9, 2026
eb4748f
Ignore known MPICH optimistic failures for now
sanjaychari Jul 10, 2026
00d424c
Revert "Ignore known MPICH optimistic failures for now"
sanjaychari Jul 10, 2026
6423bc3
Revert "Add diagnostics for MPI used in CI"
sanjaychari Jul 10, 2026
98fdd38
Revert "Use matching MPI launcher for CTest"
sanjaychari Jul 10, 2026
00b7bbe
Remove Python dependency from fluid WAN CI
sanjaychari Jul 10, 2026
e082e4c
Add ML model for fluid flow wan simn
sanjaychari Jul 13, 2026
dae2550
Add tests for fluid flow wan ml simn
sanjaychari Jul 13, 2026
6f7eb23
Fix clang format issue
sanjaychari Jul 13, 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
3 changes: 0 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -409,9 +409,6 @@ jobs:
ref: ${{ github.event_name == 'schedule' && 'master' || env.ROSS_REF }}
path: ross

# No dependency-install step: the codes-ci-ubuntu24-mpich container already ships
# the toolchain, cmake/ninja, flex/bison, lcov, and our source-built mpich.

- name: Configure ROSS
run: >
cmake -S ross -B ross/build -G Ninja
Expand Down
103 changes: 55 additions & 48 deletions .github/workflows/zmqml-hybrid.yml → .github/workflows/director.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: ZMQML Hybrid
name: Director

on:
pull_request:
Expand All @@ -10,11 +10,11 @@ on:

env:
ROSS_REF: 9b6ccb18f9b9db438bf41b5b221d0ef16a4dac48
ZMQML_IMAGE: ghcr.io/codes-org/codes-ci-full:latest
DIRECTOR_IMAGE: ghcr.io/codes-org/codes-ci-full:latest

jobs:
zmqml-hybrid:
name: zmqml hybrid workflows
director:
name: director model workflows
runs-on: ubuntu-24.04

steps:
Expand All @@ -31,47 +31,48 @@ jobs:
path: ross

- name: Pull full dependency image
run: docker pull "$ZMQML_IMAGE"
run: docker pull "$DIRECTOR_IMAGE"

- name: Create Docker network
run: docker network create codes-zmqml-ci
run: docker network create codes-director-ci

- name: Start ZMQML server container
- name: Start ZeroMQ server
run: |
mkdir -p "$PWD/zmqml-artifacts"
mkdir -p "$PWD/director-artifacts"

docker run -d \
--name zmqml-server \
--network codes-zmqml-ci \
--name director-server \
--network codes-director-ci \
-v "$PWD/codes:/work/codes" \
-v "$PWD/zmqml-artifacts:/work/zmqml-artifacts" \
-v "$PWD/director-artifacts:/work/director-artifacts" \
-w /work/codes/src/surrogate/zmqml \
-e ZMQML_ITERATION_HISTORY_LEN=2 \
-e ZMQML_ITERATION_HORIZON=3 \
-e ZMQML_ITERATION_TRAIN_STRIDE=1 \
-e ZMQML_EVENT_TIME_MIN_ROWS=4 \
-e ZMQML_EVENT_TIME_EPOCHS=2 \
-e ZMQML_RECORD_LOG_PATH=/work/zmqml-artifacts/iteration-records.csv \
-e ZMQML_EVENT_TIME_RECORD_LOG_PATH=/work/zmqml-artifacts/event-time-records.csv \
"$ZMQML_IMAGE" \
-e ZMQML_FLUID_FLOW_WAN_EPOCHS=2 \
-e ZMQML_RECORD_LOG_PATH=/work/director-artifacts/iteration-records.csv \
-e ZMQML_EVENT_TIME_RECORD_LOG_PATH=/work/director-artifacts/event-time-records.csv \
"$DIRECTOR_IMAGE" \
bash -euxo pipefail -c '
exec python3 -u zmqmlserver.py
'

sleep 5
docker ps --filter name=zmqml-server
docker logs zmqml-server
docker ps --filter name=director-server
docker logs director-server

- name: Build ROSS and CODES with ZMQML
- name: Build ROSS and CODES with Director support
run: |
docker run --rm \
--name codes-zmqml-build \
--network codes-zmqml-ci \
--name codes-director-build \
--network codes-director-ci \
-v "$PWD/codes:/work/codes" \
-v "$PWD/ross:/work/ross" \
-v "$PWD/ross-install:/work/ross-install" \
-w /work \
"$ZMQML_IMAGE" \
"$DIRECTOR_IMAGE" \
bash -euxo pipefail -c '
cmake -S ross -B ross/build -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
Expand All @@ -89,7 +90,7 @@ jobs:
-DCODES_USE_SWM=ON \
-DCODES_USE_TORCH=ON \
-DCODES_USE_ZEROMQ=ON \
-DCODES_ENABLE_ZMQML_HYBRID_TESTS=ON \
-DCODES_ENABLE_DIRECTOR_TESTS=ON \
-DCMAKE_C_COMPILER=mpicc \
-DCMAKE_CXX_COMPILER=mpicxx \
-DCMAKE_PREFIX_PATH="/work/ross-install;/opt/swm;/opt/argobots" \
Expand All @@ -98,44 +99,47 @@ jobs:
cmake --build build -j
'

- name: Run ZMQML hybrid tests
- name: Run Director tests
run: |
docker run --rm \
--name codes-zmqml-tests \
--network codes-zmqml-ci \
--name codes-director-tests \
--network codes-director-ci \
-v "$PWD/codes:/work/codes" \
-v "$PWD/zmqml-artifacts:/work/zmqml-artifacts" \
-v "$PWD/director-artifacts:/work/director-artifacts" \
-w /work/codes \
-e ZMQML_ENDPOINT=tcp://zmqml-server:5555 \
-e ZMQML_ENDPOINT=tcp://director-server:5555 \
-e ZMQML_TEST_NP=1 \
-e ZMQML_CTL_TIMEOUT=30 \
"$ZMQML_IMAGE" \
"$DIRECTOR_IMAGE" \
bash -euxo pipefail -c '
ctest --test-dir build -N \
-R "zmqml-(iteration-time|event-time)-hybrid-workflow.sh" \
| tee /tmp/zmqml-ctest-list.txt
ctest --test-dir build -N -L director \
| tee /tmp/director-ctest-list.txt

grep -E "Test #[0-9]+: zmqml-(iteration-time|event-time)-hybrid-workflow.sh" \
/tmp/zmqml-ctest-list.txt
grep -F "zmqml-iteration-time-hybrid-workflow.sh" \
/tmp/director-ctest-list.txt
grep -F "zmqml-event-time-hybrid-workflow.sh" \
/tmp/director-ctest-list.txt
grep -F "zmqml-fluid-flow-wan-hybrid-workflow.sh" \
/tmp/director-ctest-list.txt

ctest --test-dir build \
-R "zmqml-(iteration-time|event-time)-hybrid-workflow.sh" \
-L director \
--output-on-failure \
--timeout 1200 \
-VV
'

- name: Validate ZMQML server logs
- name: Validate ZeroMQ server logs
run: |
mkdir -p "$PWD/zmqml-artifacts"
docker logs zmqml-server 2>&1 | tee "$PWD/zmqml-artifacts/zmqml-server.log"
mkdir -p "$PWD/director-artifacts"
docker logs director-server 2>&1 | tee "$PWD/director-artifacts/director-server.log"

require_log() {
local pattern="$1"
local description="$2"

if ! grep -nE "$pattern" "$PWD/zmqml-artifacts/zmqml-server.log"; then
echo "::error::Missing server-side ZMQML evidence: $description"
if ! grep -nE "$pattern" "$PWD/director-artifacts/director-server.log"; then
echo "::error::Missing server-side Director evidence: $description"
exit 1
fi
}
Expand All @@ -155,28 +159,31 @@ jobs:
require_log '\[event-time inference\].*predictions=' \
'event-time inference reached the server and returned predictions'

test -s "$PWD/zmqml-artifacts/iteration-records.csv"
test -s "$PWD/zmqml-artifacts/event-time-records.csv"
require_log '\[fluid-flow-wan inference\].*switch=' \
'fluid-flow-WAN inference reached the server and returned allocations'

- name: Dump ZMQML server logs
test -s "$PWD/director-artifacts/iteration-records.csv"
test -s "$PWD/director-artifacts/event-time-records.csv"

- name: Dump ZeroMQ server logs
if: always()
run: docker logs zmqml-server || true
run: docker logs director-server || true

- name: Stop ZMQML server
- name: Stop ZeroMQ server
if: always()
run: |
docker rm -f zmqml-server || true
docker network rm codes-zmqml-ci || true
docker rm -f director-server || true
docker network rm codes-director-ci || true

- name: Upload ZMQML logs
- name: Upload Director logs
if: always()
uses: actions/upload-artifact@v4
with:
name: zmqml-hybrid-logs
name: director-logs
path: |
codes/build/Testing/Temporary/LastTest.log
codes/build/Testing/Temporary/LastTestsFailed.log
codes/build/testing-output/**
zmqml-artifacts/**
director-artifacts/**
if-no-files-found: ignore
retention-days: 14
5 changes: 5 additions & 0 deletions doc/example/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ configure_file(tutorial-ping-pong-surrogate.conf.in tutorial-ping-pong-surrogate
configure_file(kb.dfdally-72-zeromq-director.conf.in kb.dfdally-72-zeromq-director.template.conf.in @ONLY)
configure_file(kb.dfdally-72-event-time-director.conf.in kb.dfdally-72-event-time-director.template.conf.in @ONLY)
configure_file(kb.dfdally-72-milc-small.workload.conf.in kb.dfdally-72-milc-small.workload.template.conf.in @ONLY)
configure_file(fluid-flow-wan.conf.in fluid-flow-wan.template.conf.in @ONLY)
configure_file(fluid-flow-director.conf.in fluid-flow-director.template.conf.in @ONLY)
configure_file(kb.dfdally-72-zeromq-director.conf.in kb.dfdally-72-zeromq-director.template.conf.in @ONLY)

set(single_quote "'")
Expand Down Expand Up @@ -42,6 +44,9 @@ configure_file(tutorial-ping-pong-surrogate.conf.in tutorial-ping-pong-surrogate
configure_file(kb.dfdally-72-zeromq-director.conf.in kb.dfdally-72-zeromq-director.conf)
configure_file(kb.dfdally-72-event-time-director.conf.in kb.dfdally-72-event-time-director.conf)
configure_file(kb.dfdally-72-milc-small.workload.conf.in kb.dfdally-72-milc-small.workload.conf)
configure_file(fluid-flow-wan.conf.in fluid-flow-wan.conf)
configure_file(fluid-flow-director.conf.in fluid-flow-director.conf)
configure_file(kb.dfdally-72-milc-small.json kb.dfdally-72-milc-small.json COPYONLY)
configure_file(kb.dfdally-72-milc-small.alloc.conf kb.dfdally-72-milc-small.alloc.conf COPYONLY)
configure_file(fluid-flow-wan-topology.yaml fluid-flow-wan-topology.yaml COPYONLY)
configure_file(kb.dfdally-72-zeromq-director.conf.in kb.dfdally-72-zeromq-director.conf)
59 changes: 59 additions & 0 deletions doc/example/fluid-flow-director.conf.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Fluid-flow WAN switch/terminal hybrid Director example.
# Start zmqmlserver.py with one switch-<id>.pt model per logical switch,
# then run from the build directory, for example:
# ZMQML_ENDPOINT=tcp://localhost:5555 mpirun -np 1 \
# ./src/model-net-fluid-flow-wan --synch=1 -- doc/example/fluid-flow-director.conf

LPGROUPS
{
FLUID_FLOW_WAN_GRP
{
repetitions="1";
fluid-flow-wan-switch-lp="3";
fluid-flow-wan-terminal-lp="6";
}
}

PARAMS
{
message_size="32768";
pe_mem_factor="1024";
}

FLUID_FLOW_WAN
{
topology_yaml_file="fluid-flow-wan-topology.yaml";

interval_seconds="1";
num_send_intervals="20";
num_drain_intervals="20";
rng_seed="12345";

terminal_send_every_n_intervals="1";
terminal_send_probability="1.0";
terminal_min_send_mbit="0";
terminal_max_send_fraction_of_link_capacity="1.0";

debug_prints="0";
# Hybrid scheduling. The ZeroMQ server loads one switch-<id>.pt model
# for every logical switch and returns one allocation weight per candidate.
switch_scheduler="ml";

# Used if inference fails or if selected candidates do not fill the port.
director_fallback_scheduler="round_robin";

# Select at most 32 candidates before calling the model.
# Supported policies: fifo, sjf, ljf.
director_candidate_selection_policy="fifo";
director_max_candidate_flowlets="32";
director_inference_timeout_ms="5000";
director_endpoint="tcp://localhost:5555";

round_robin_max_entries_per_egress="8";
round_robin_quantum_mbit="0";

terminal_log_path="../../zmqml_artifacts/fluid-flow-wan/hybrid/terminal-events.csv";
switch_log_path="../../zmqml_artifacts/fluid-flow-wan/hybrid/switch-events.csv";
flowlet_log_path="../../zmqml_artifacts/fluid-flow-wan/hybrid/flowlet-events.csv";
switch_training_log_path="../../zmqml_artifacts/fluid-flow-wan/hybrid/switch-decisions.csv";
}
24 changes: 24 additions & 0 deletions doc/example/fluid-flow-wan-topology.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
topology:
switches:
A:
terminals: 2
terminal_bandwidth: "20 Mbps"
switch_buffer: "1000 Mb"
connections:
B: "15 Mbps"

B:
terminals: 2
terminal_bandwidth: "25 Mbps"
switch_buffer: "1000 Mb"
connections:
A: "15 Mbps"
C: "10 Mbps"

C:
terminals: 2
terminal_bandwidth: "20 Mbps"
switch_buffer: "1000 Mb"
connections:
A: "10 Mbps"
B: "15 Mbps"
45 changes: 45 additions & 0 deletions doc/example/fluid-flow-wan.conf.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Fluid-flow WAN switch/terminal pure-PDES example.
# Run from the build directory, for example:
# mpirun -np 1 ./src/model-net-fluid-flow-wan --synch=1 -- doc/example/fluid-flow-wan.conf

LPGROUPS
{
FLUID_FLOW_WAN_GRP
{
repetitions="1";
fluid-flow-wan-switch-lp="3";
fluid-flow-wan-terminal-lp="6";
}
}

PARAMS
{
message_size="32768";
pe_mem_factor="1024";
}

FLUID_FLOW_WAN
{
topology_yaml_file="fluid-flow-wan-topology.yaml";

interval_seconds="1";
num_send_intervals="20";
num_drain_intervals="20";
rng_seed="12345";

terminal_send_every_n_intervals="1";
terminal_send_probability="1.0";
terminal_min_send_mbit="0";
terminal_max_send_fraction_of_link_capacity="1.0";

debug_prints="1";
# This can be either round_robin or fifo.
switch_scheduler="round_robin";
round_robin_max_entries_per_egress="8";
round_robin_quantum_mbit="0";

terminal_log_path="../../zmqml_artifacts/fluid-flow-wan/terminal-events.csv";
switch_log_path="../../zmqml_artifacts/fluid-flow-wan/switch-events.csv";
flowlet_log_path="../../zmqml_artifacts/fluid-flow-wan/flowlet-events.csv";
switch_training_log_path="../../zmqml_artifacts/fluid-flow-wan/switch-training.csv";
}
2 changes: 2 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ add_executable(model-net-synthetic network-workloads/model-net-synthetic.c)
add_executable(model-net-synthetic-slimfly network-workloads/model-net-synthetic-slimfly.c)
add_executable(model-net-synthetic-fattree network-workloads/model-net-synthetic-fattree.c)
add_executable(model-net-synthetic-dragonfly-all network-workloads/model-net-synthetic-dragonfly-all.c)
add_executable(model-net-fluid-flow-wan network-workloads/model-net-fluid-flow-wan.cxx)

set(CODES_TARGETS
topology-test
Expand All @@ -214,6 +215,7 @@ set(CODES_TARGETS
model-net-synthetic-slimfly
model-net-synthetic-fattree
model-net-synthetic-dragonfly-all
model-net-fluid-flow-wan
)

if(USE_DUMPI)
Expand Down
Loading
Loading