MORI UMBP Single-Node Smoke Test
This guide documents how to run the single-node UMBP + SGLang correctness smoke test that ships with Mori. The flow mirrors the umbp-single-node-launcher skill and launches the run_umbp_single_node_hicache.sh helper script inside a ROCm container.
Use the placeholders in this document to map the workflow to any target node. Every environment-dependent value is surfaced as an argument or environment variable; update those inputs and the script can run unchanged.
For the underlying architecture see
src/umbp/doc/design-master-control-plane.md;
for the full env-var inventory see
src/umbp/doc/runtime-env-vars.md.
Overview
The script spins up the Docker image, rebuilds Mori with UMBP enabled, launches a single-node SGLang server backed by UMBP hierarchical cache, issues a probe completion, and collects logs under ~/umbp_single_node_results. It is intended as a fast health check for DP+EP configurations.
Prerequisites
Access to the target node (for example
<node-name>), including an active reservation if required by the cluster scheduler.Mori and SGLang checkouts on the node.
Access to a checkpoint directory when running with real weights.
Docker privileges on the node.
Configuration Inputs
Script constants
The script declares a few host-specific defaults near the top. Update them before running if your environment differs.
Variable |
Purpose |
Typical override |
|---|---|---|
|
Home directory mounted into the container. |
Set to your |
|
Base path containing the repositories. |
Point to the shared filesystem path that holds Mori and SGLang. |
|
Additional |
Remove entries that do not exist or add the host paths you require. |
|
ROCm container tag. |
Change if you need a different toolchain. |
Runtime environment variables
Export the variables below to adapt the run to your environment. The script reads these values at launch time.
Variable |
Default in script |
When to change |
Example |
|---|---|---|---|
|
|
Real checkpoint location. |
|
|
|
Local SGLang checkout. |
|
|
|
Local Mori checkout. |
|
|
|
Where to store logs. |
|
|
|
Enable DP+EP mode. |
|
|
|
Data parallel group size. |
|
|
|
Expert parallel group size. |
|
|
|
Tensor parallel group size. |
|
|
|
Disable if you already manage the master. |
|
|
|
Master listener address. |
|
|
|
IP advertised to clients. |
|
|
|
Hicache IO engine port. |
|
|
|
Peer service port. |
|
|
|
Size of the dedicated remote-SSD read staging buffer. Allocated only when SSD is enabled (DRAM-only runs allocate nothing and are unaffected). Raise for large-KV models so each read slot fits one key’s value. |
|
|
|
Skip checkpoint validation. |
|
|
|
Fraction reserved for static allocations. |
|
|
|
Timeout for probe request in seconds. |
|
The script also respects MORI_BRANCH, SGLANG_BRANCH, and MORI_PIP_FLAGS if they are supplied.
Launch Steps
SSH to the target node:
ssh -o StrictHostKeyChecking=no <node-name>
Review script constants:
sed -n '1,120p' run_umbp_single_node_hicache.sh
Update
USER_HOME,NFS_BASE,EXTRA_MOUNTS, andDOCKER_IMAGEif the defaults do not match your environment.Export runtime variables (fill placeholders with your values):
export MODEL_PATH=<path-to-model-checkpoints> export SGLANG_REPO=<path-to-sglang> export MORI_REPO=<path-to-mori> export RESULTS_DIR=<path-for-results> export ENABLE_DP=<true|false> export DP_SIZE=<dp-size> export EP_SIZE=<ep-size> export TP_SIZE=<tp-size> export START_UMBP_MASTER=true export UMBP_NODE_ADDRESS=$(hostname -I | awk '{print $1}') export USE_DUMMY_WEIGHTS=false
Add any other overrides from the table above as needed.
Run the script with the desired weight mode:
bash run_umbp_single_node_hicache.sh --real-weights # or bash run_umbp_single_node_hicache.sh --use-dummy-weights
The script will:
Start or recycle the
umbp-single-nodecontainer.Rebuild Mori with
BUILD_UMBP=ONviapip install.Compute network interface settings for NCCL/Gloo.
Launch the SGLang server with the configured parallelism values and hicache settings.
Monitor the probe and cleanup:
The script waits up to one hour for
http://127.0.0.1:30000/healthto report ready.It issues a probe request and stores the output in
${RESULTS_DIR}/probe_response.json.On success, the script terminates the SGLang server and UMBP master, leaving artifacts in
${RESULTS_DIR}.
Core Dumps
By default the container routes crashes through Apport (/usr/share/apport/apport). If raw core files are required, disable Apport inside the container and set:
sysctl -w kernel.core_pattern=/nfs/users/<user>/cores/core.%e.%p
ulimit -c unlimited
Make sure the directory exists and has enough space.
Troubleshooting
Container launch:
docker psshould showumbp-single-node. If it exits immediately, checkdocker logs.Server logs: Available under
${RESULTS_DIR}/server_*.log.UMBP master logs: Saved alongside server logs when
START_UMBP_MASTER=true.Model validation: The script validates that
MODEL_PATHcontainsmodel-*.safetensorswhen running with real weights.Probe failures: Inspect the tail of the server log; the script prints it automatically on errors.
Remote SSD reads silently recompute (
size_too_large): A remote SSD read must fit a key’s whole value into one slot, whereper_slot = ssd_staging_buffer_size / ssd_staging_buffer_slots(defaults 256 MiB / 16 = 16 MiB). The single-key page KV for an MLA model ≈page_size × (kv_lora_rank + qk_rope_head_dim) × dtype_bytes × num_layers(DeepSeek-V3 5-layer ≈ 360 KB; full R1/V3 61-layer ≈ 4.5 MB). Ifper_slotis smaller, the read is dropped and the block is recomputed — requests don’t error, butmori_umbp_ssd_read_total{status="size_too_large"}climbs and hit rate/throughput fall. Fix: raiseUMBP_SSD_STAGING_BYTESor lowerssd_staging_buffer_slotssoper_slot ≥the single-key page KV. (ssd_staging_buffer_sizeis allocated only when SSD is enabled, separate from the generalstaging_buffer_size.)
Refer back to this document whenever the single-node smoke test needs to be run or automated. For the original skill instructions see /home/ditian12/.codex/skills/umbp-single-node-launcher/SKILL.md.