MORI network configuration file reference for Cluster Validation Suite (CVS)#
2026-10-29
8 min read time
MORI (Memory-Oriented RDMA Interface) benchmarks run from mori_dir through the orchestrator. The shipped file is input/config_file/mori/mi35x_mori_config.json.
The suite checks:
Container or bare-metal launch, from
orchestratorandcontainerThat every name in
env.MORI_RDMA_DEVICESappears inibv_devinfoThe fixed I/O matrix
Bandwidth and latency against
expected_results, for the keys the checker understandsHost dmesg over the suite window, gated on the head node’s passwordless sudo probe
Note
{user-id}is replaced with the cluster fileusername, then$USER, thenroot.{user},{home},{home-mount-dir},{node-dir-name}, and{run_dir}are replaced in the same pass.Any string that still contains
<changeme>stops the run withUnresolved placeholder found in test config.A key whose name starts with
_is not a setting._example_envis not merged intoenv.
mi35x_mori_config.json#
The block below is the shipped file with the _example_* notes removed. Those notes are still in the file on disk and are not applied.
mi35x_mori_config.json
{
"gpu_name": "mi35x",
"no_of_nodes": "2",
"orchestrator": "container",
"container": {
"image": "<changeme>",
"name": "mori_container",
"lifetime": "per_run",
"runtime": {
"name": "docker",
"args": {
"devices": [ "/dev/dri", "/dev/kfd" ],
"volumes": [ "/home/{user-id}:/home/{user-id}" ]
}
}
},
"env": {
"NCCL_SOCKET_IFNAME": "<changeme>",
"GLOO_SOCKET_IFNAME": "<changeme>",
"MORI_RDMA_DEVICES": "<changeme>",
"LD_LIBRARY_PATH": "/usr/local/lib/python3.12/dist-packages/torch/lib:$LD_LIBRARY_PATH"
},
"mori_dir": "<changeme>",
"master_addr": "<changeme>",
"master_port": "1234",
"log_dir": "/home/{user-id}/LOGS/mori",
"expected_results": {
"ibgda_write": {
"PROCS:2,CTAS:2,THREADS:256,QP_COUNT:4": {
"2097152": { "max_bw": "46.0", "avg_lat": "24.4" },
"4194304": { "max_bw": "46.0", "avg_lat": "48.8" }
}
},
"io_read": {
"BUFF_SIZE:4194304,TRANSFER_SIZE:128,QP_COUNT:1": {
"524288": { "max_bw": "45.0", "avg_lat": "1500" },
"1048576": { "max_bw": "46.0", "avg_lat": "2920" }
},
"BUFF_SIZE:4194304,TRANSFER_SIZE:128,QP_COUNT:8": {
"524288": { "max_bw": "45.0", "avg_lat": "1500" },
"1048576": { "max_bw": "46.0", "avg_lat": "2920" }
}
},
"io_write": {
"BUFF_SIZE:4194304,TRANSFER_SIZE:128,QP_COUNT:1": {
"524288": { "max_bw": "45.0", "avg_lat": "1500" },
"1048576": { "max_bw": "46.0", "avg_lat": "2920" }
},
"BUFF_SIZE:4194304,TRANSFER_SIZE:128,QP_COUNT:8": {
"524288": { "max_bw": "45.0", "avg_lat": "1500" },
"1048576": { "max_bw": "46.0", "avg_lat": "2920" }
}
}
}
}
Parameters the run uses#
The MORI config’s container object is deep-merged over the cluster file’s container. orchestrator in this file overrides the cluster file when it is set.
Parameter |
Shipped value |
What it changes |
|---|---|---|
|
|
|
|
|
Image to launch. Empty image fails |
|
|
Container name. A |
|
|
|
|
|
Container runtime. Omitted, the runtime is Docker. |
|
|
Extra devices, merged with the orchestrator defaults |
|
|
Extra |
|
See the sample |
Exported on every benchmark command. This is separate from |
|
|
Working directory. I/O runs |
|
|
Torchrun node rank 0 and the I/O initiator. It must be one of the cluster hosts. Omitted, the cluster head node is used. |
|
|
Torchrun rendezvous port. Required. |
|
|
Parent of the per-run log directory |
|
See below |
Thresholds. Required once a benchmark test builds |
|
|
Shown on the HTML run card only. It does not change binaries, devices, or thresholds. |
Shipped keys the checker does not read#
no_of_nodesis in the shipped file and is not read. The node list is the cluster file.expected_results.ibgda_writeis in the shipped file and is not read. The IBGDA write test does not run.gpu_nameis not used as a threshold or a device filter._example_options_orchestrator,_example_env, and_example_mori_dirare not applied._example_mori_dir(/sgl-workspace/mori) is an illustration in the file, not the path the suite opens.There is no
nic_type,oob_port,mori_device_list,torchlib_dir, orcontainer_configkey. Devices areenv.MORI_RDMA_DEVICES. The out-of-band interface is whatever you export inenv.
expected_results#
The checker looks up two top-level names: io_read and io_write. A missing case key does not fail the test. That case runs and is not gated.
I/O#
The case key is one string:
BUFF_SIZE:<buffer bytes>,TRANSFER_SIZE:<batch>,QP_COUNT:<qp>
TRANSFER_SIZE is the transfer batch count, not a byte size. Under that key, each message size in bytes maps to max_bw and avg_lat.
For a printed table row whose byte size matches a key:
Bandwidth fails when
Avg Bw (GB/s)is lower thanmax_bw. The column is the average. The checker compares that average to the value stored undermax_bw. An equal value passes. Units are GB/s.Latency fails when
Avg Lat (us)is higher thanavg_lat. Units are microseconds.
The failure lines are BW is lower than expected and Latency is higher than expected, with the rank, message size, and the case key.
The I/O matrix is fixed. Each case sweeps 8 bytes, doubling, up to the buffer size, with session mode, 8 initiator devices, and 8 target devices. Those device counts are not config keys.
Pytest id |
Case key the checker builds |
Shipped sample |
|---|---|---|
|
|
No entry. The sample does not gate these cases. |
|
|
No entry. The sample does not gate these cases. |
|
|
Gates 524288 and 1048576 bytes only. |
|
|
Gates 524288 and 1048576 bytes only. |
A size that is in expected_results but never appears in the table is not a failure. Only a printed row is compared. The shipped numbers are what the checker uses for those keys. Replace them for your fabric. The suite has no second threshold table.
Current behavior#
test_cleanup_stale_containersalways skips. Aper_runlaunch removes a same-named container itself.test_verify_dmesgscans host dmesg from orchestrator creation to the end of that test (second resolution, closed window) withverify_dmesg_for_errors. The test skips only whenorch.sudo_prefix()is empty (taken from the head node’ssudo -n trueprobe).A Docker launch also applies orchestrator defaults:
privilegedtrue,networkhost,ipchost, capabilitiesSYS_PTRACE,IPC_LOCK, andSYS_ADMIN, groupvideo, ulimitmemlock=-1, security optionsseccomp=unconfinedandapparmor=unconfined, and container environmentGPUS=8andMULTINODE=true.container.runtime.args.network,ipc, andprivilegedreplace those three.cap_add,security_opt,group_add, andulimitare appended to the defaults.container.envupdates the container environment. The top-levelenvobject is only the benchmark command prefix.A failed container launch sets the rest of the benchmark tests to skip (
mori container launch failed).test_teardownstill runs.I/O waits up to 600 seconds for
MORI_IO_EXIT_CODE=on every host, then kills leftoverbenchmark.pyand torchrun processes.