When One GPU Isn’t Enough: Serving GLM-5.3 Across Two NVIDIA DGX Stations with vLLM NVIDIA published a tutorial showing how to serve its GLM-5.3 NVFP4 model, a quantized version of Z.ai's 753-billion-parameter mixture-of-experts model with 40 billion parameters activated per token, across two GB300 DGX Stations using vLLM with tensor parallelism (TP=2) over ConnectX-8 RDMA. The roughly 464 GB checkpoint exceeds the 252 GB of HBM3e on a single GB300 GPU, so the setup keeps all weights in GPU memory with CPU offload disabled, splitting tensors across both GPUs while Station A (rank 0) exposes a single OpenAI-compatible API endpoint and Station B (rank 1) runs only a worker. The tutorial also walks through prerequisites — including 464 GB of free disk per Station and acceptance of the NVIDIA Open Model Agreement — and measures behavior under concurrent load using SPEED-Bench prompts from the gated cais/hle dataset. Running a frontier-scale model locally means keeping all its weights in GPU memory; the largest models no longer fit on one machine. Two NVIDIA DGX Stations connected over ConnectX-8 RDMA serve one model through a single endpoint, with tensor parallelism splitting the model weights and computation across both GPUs. The NVIDIA GLM-5.3 NVFP4 https://huggingface.co/nvidia/GLM-5.3-NVFP4 model, a quantized version of Z.ai http://z.ai ’s mixture-of-experts MoE model, has 753 billion parameters, with 40 billion activated per token. Sparse activation reduces computation, but all model weights still need to remain available because each token can be routed to different experts. At about 464 GB, the checkpoint exceeds the 252 GB of HBM3e on a single GB300 GPU. This tutorial uses two DGX Stations to keep the weights in GPU memory, with CPU weight offload disabled. Before starting, connect the two Stations with the Connect Two DGX Stations playbook https://build.nvidia.com/station/connect-two-stations . This post shows how to serve GLM-5.3 locally across two NVIDIA DGX Stations with vLLM, send a request, and measure behavior under concurrent load. Tensor parallelism TP=2 splits the model’s tensors across the two GB300 GPUs. Both Stations compute every request, and Station A returns the answer through one OpenAI-compatible API. By the end, you’ll have a working endpoint and a baseline for how it behaves under load. Prerequisites - Two GB300 DGX Stations running Linux, connected and validated with the Connect Two DGX Stations playbook https://build.nvidia.com/station/connect-two-stations , including its GPU-memory RDMA test on both rails. - SSH and sudo access on both Stations with the same Linux username. Docker and the NVIDIA Container Toolkit come preinstalled with the DGX Station software stack https://docs.nvidia.com/dgx/dgx-station-development-guide/porting/software-requirements.html . Allow outbound access to the container registry, Hugging Face, and package repositories. - At least 464 GB of free disk space on each Station for its copy of the checkpoint, plus room for the vLLM container image and temporary files. - Acceptance of the NVIDIA Open Model Agreement and the original GLM-5.3 license terms, listed on the model card https://huggingface.co/nvidia/GLM-5.3-NVFP4 licenseterms-of-use . SPEED-Bench is governed by the NVIDIA Evaluation Dataset License Agreement https://huggingface.co/datasets/nvidia/SPEED-Bench/blob/main/License.pdf . - A Hugging Face account and read access token, with access to the gated cais/hle https://huggingface.co/datasets/cais/hle dataset: sign in, open its page, and select Agree and access repository . Step 5 downloads SPEED-Bench prompts from this dataset. The companion video follows the same workflow. Step 1. Prepare the two Stations This tutorial uses a separate computer, such as your laptop, to manage both Stations. Start by opening an SSH session to each Station from that computer. Alternatively, work from a local terminal on each Station. Run every command in this step on both Stations unless it starts with “On A.” The two Stations run the same container and checkpoint in different roles: Station A rank 0 hosts the API, and Station B rank 1 runs only a worker, with no API server. First, check Docker access and collect the network values you’ll use later: docker version ibdev2netdev ip -br addr | Note: If the docker version output has no Server section, the client cannot reach the Docker daemon. If the error is permission denied , follow the Docker post-installation procedure https://docs.docker.com/engine/install/linux-postinstall/ : add your user to the docker group with sudo usermod -aG docker "$USER" , run exit , then reconnect and rerun docker version . The docker group grants root-level privileges. | |---| The ibdev2netdev output lists the two direct rails, cx8r0 and cx8r1 . Pick one for serving traffic, for example cx8r1 , and note two things for it on each Station: - Its RDMA device , on the ibdev2netdev line that ends with the rail’s name. In mlx5 1 port 1 == cx8r1 Up , the device is mlx5 1 . - Its IPv4 address , on the ip -br addr line that starts with the rail’s name. In cx8r1 UP 192.168.101.1/24 , the address is 192.168.101.1 . The rail name and device are the same on both Stations; only the IPv4 address differs. Next, create ~/glm53.env on each Station. This file stores the values that later commands use: nano ~/glm53.env Paste the following block and replace each <... placeholder, keeping the quotes, with the values you noted. RANK="