Run CVS MORI RDMA benchmark tests#
2026-10-27
7 min read time
MORI tests measure RDMA I/O throughput using the MORI tree on the nodes. I/O cases run between nodes with torchrun. Run MORI to validate raw RDMA performance before training or inference workloads.
Prerequisites#
A cluster file that lists the nodes for this run. The
no_of_nodesfield in the MORI config is not read. Node count is the number of nodes in the cluster file.For the shipped
orchestratorvaluecontainer: Docker on the hosts, a GPU image that contains the MORI build, and/dev/driplus/dev/kfd. This value overrides the cluster file for this suite. Setorchestratortobaremetalto run on the host instead.Passwordless sudo on the hosts if you want the dmesg scan. The scan reads host
dmesgon every node even when the benchmarks run in a container.test_verify_dmesgskips only whenorch.sudo_prefix()is empty (which uses the head node’ssudo -n trueresult).prettytablewherebenchmark.pyruns. In a container,test_install_container_packagesrunspip3 install prettytable. On bare metal that test is skipped, so the host already needsprettytable.
Set up config#
Copy the MORI configuration file:
cvs config copy mori/mi35x_mori_config.json --output ~/cvs_workspace/mori/mi35x_mori_config.json
Edit
~/cvs_workspace/mori/mi35x_mori_config.jsonand replace every<changeme>before you run:container.image— image that contains the MORI buildenv.NCCL_SOCKET_IFNAMEandenv.GLOO_SOCKET_IFNAME— interface name exported into the benchmarkenv.MORI_RDMA_DEVICES— comma-separated RDMA device names, checked againstibv_devinfomori_dir— directory of the MORI tree (tests/python/io/benchmark.py)master_addr— a host from the cluster file. That host is torchrun node rank 0 and the I/O initiator
{user-id}inlog_dirand in the home volume becomes the cluster fileusername(then$USER, thenroot). A leftover<changeme>exits at startup withUnresolved placeholder found in test config.Keys named
_example_options_orchestrator,_example_env, and_example_mori_dirare notes._example_envis not copied intoenv. Editenvitself.Put the nodes in the cluster file. Changing
no_of_nodesdoes not add or remove nodes.
For the field reference and the expected_results shape, see MORI network configuration file reference for Cluster Validation Suite (CVS).
Run tests#
The I/O cases are fixed in the suite. The config does not add or remove them. cvs list prints every name in alphabetical order, including the bracketed ids:
cvs list mori_benchmark_test \
--cluster_file ~/cvs_workspace/cluster.json \
--config_file ~/cvs_workspace/mori/mi35x_mori_config.json
The suite runs in this order:
test_cleanup_stale_containers (always skipped)
test_launch_mori_container (skipped on bare metal)
test_setup_ibv_devices
test_install_container_packages (skipped on bare metal)
test_setup_env
test_io_read[131072-256-1]
test_io_read[131072-256-8]
test_io_read[4194304-128-1]
test_io_read[4194304-128-8]
test_io_write[131072-256-1]
test_io_write[131072-256-8]
test_io_write[4194304-128-1]
test_io_write[4194304-128-8]
test_verify_dmesg
test_teardown (skipped on bare metal)
The three numbers in an I/O id are the sweep maximum in bytes, the transfer batch size, and the QP count per transfer. Quote the id. Unquoted brackets are shell globs.
Run the suite with the file you edited:
cvs run mori_benchmark_test \
--cluster_file ~/cvs_workspace/cluster.json \
--config_file ~/cvs_workspace/mori/mi35x_mori_config.json \
--workspace ~/cvs_workspace \
--capture=tee-sys -vvv -s
Run one I/O case in the same process as container setup and teardown. Selecting only the bracketed id does not start the container:
cvs run mori_benchmark_test \
test_launch_mori_container \
test_setup_ibv_devices \
test_install_container_packages \
test_setup_env \
'test_io_read[4194304-128-1]' \
test_verify_dmesg \
test_teardown \
--cluster_file ~/cvs_workspace/cluster.json \
--config_file ~/cvs_workspace/mori/mi35x_mori_config.json \
--workspace ~/cvs_workspace \
--capture=tee-sys -vvv
On bare metal, launch, package install, and teardown skip. The I/O id still has to be quoted.
What a pass produces#
cvs run writes these files under <workspace>/cvs_runs/<run_id>/:
mori_benchmark_test.html— pytest pass/fail.mori_benchmark_test_html/mori_benchmark_test_run_deck.htmland.json— bandwidth and latency curves, linked from the pytest report asMori Benchmark Run Deck. The deck does not decide pass/fail.mori_benchmark_test.log— the pytest log.mori_benchmark_test_<timestamp>.zip— the pytest HTML, the run deck, and per-test logs.
MORI does not write a spreadsheet.
Benchmark logs are on the hosts under log_dir, in a new directory named YYYYMMDD_HHMMSS:
io_<op>_<buffer>_<batch>_<qp>_node<rank>.logfor each I/O case. Rank 0 ismaster_addr.
The shipped config mounts /home/{user-id} into the container and sets log_dir under that home, so a per_run container can exit and the logs remain on the host. test_teardown removes a per_run container. persistent and no_launch leave it running.
Troubleshooting#
Search the pytest log for FAIL -. The test then ends with Following FAILURES seen.
What you see |
What it means |
|---|---|
|
A |
|
|
|
Docker did not keep the container up. Teardown still runs as the leak guard if |
|
|
|
That device name is not a substring of |
|
|
|
That host’s log never gained |
|
torchrun exited non-zero. The log path is in the message’s node. |
|
The rank-0 log has no |
|
Average bandwidth ( |
|
Average latency ( |
|
|
|
|
|
Host dmesg matched a known error. The word |
test_cleanup_stale_containers always skips. Stale same-named containers are removed by a per_run launch. SHMEM API, dispatch and combine, concurrent-put, and IBGDA write tests are not in this suite.
Run on managed compute#
Follow Run Cluster Validation Suite (CVS) on managed compute to run MORI on managed compute. Set --workspace to storage shared by the nodes.