{"id":1795,"date":"2026-08-19T13:08:31","date_gmt":"2026-08-19T13:08:31","guid":{"rendered":"https:\/\/blog.openzeka.com\/en\/?p=1795"},"modified":"2026-08-19T13:12:33","modified_gmt":"2026-08-19T13:12:33","slug":"local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun","status":"publish","type":"post","link":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/","title":{"rendered":"Local GPT-OSS 120B Serving on DGX Spark with sparkrun"},"content":{"rendered":"<div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1331.2px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:20px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-1\"><p>In this tutorial, you will run a large language model on a single or multiple DGX Sparks using sparkrun.<\/p>\n<p>Spark can be used directly as a computer by connecting a monitor and keyboard, or as a server accessed remotely from another computer. In this tutorial, we will connect to the Spark remotely, install the necessary software, and run the model.<\/p>\n<p>We will use GPT-OSS 120B as the language model (a Mixture-of-Experts model with 117 billion parameters, 5.1 billion active parameters, mxfp4 quantization), vLLM as the inference engine, and sparkrun as the management tool. vLLM will load the model&#8217;s trained weights into GPU memory and run them, serving an API that accepts external requests. sparkrun will manage Docker containers and model distribution across Sparks via the command line. This automates image synchronization, model transfer, and cluster configuration. Both will run on the Main Spark, inside Docker containers.<\/p>\n<p>This tutorial consists of three parts:<\/p>\n<ul>\n<li><strong>Setup:<\/strong> sparkrun installation, Docker image build, cluster configuration, and recipe creation<\/li>\n<li><strong>Running with a Single Spark:<\/strong> Starting, monitoring, and testing the model on a single Spark<\/li>\n<li><strong>Running with Two Sparks:<\/strong> Running the model split across multiple Sparks (tensor parallelism) and comparing performance<\/li>\n<\/ul>\n<p>If you have a single Spark, review the &#8220;Setup&#8221; and &#8220;Running with a Single Spark&#8221; sections. If you are using multiple Sparks, you can proceed directly to the &#8220;Running with Two Sparks&#8221; section after &#8220;Setup&#8221;.<\/p>\n<p>If you are using multiple Sparks, note that throughout the tutorial the primary device will be referred to as the Main Spark, and the other devices as Worker Sparks.<\/p>\n<hr \/>\n<h2>Setup<\/h2>\n<h3>1. Connecting to the Spark<\/h3>\n<p>If you are connecting to the Spark remotely for the first time, you need to find its IP address. Connect a monitor and keyboard to the Spark, log in, and run the following command from the terminal:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-1 > .CodeMirror, .fusion-syntax-highlighter-1 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-1 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_1\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_1\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_1\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">ip route get 1.1.1.1 | grep -oP &#8216;src KS+&#8217;<\/textarea><\/div><div class=\"fusion-text fusion-text-2\"><p>&nbsp;<\/p>\n<p>The command returns the IP address of the Spark&#8217;s default network interface:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-2 > .CodeMirror, .fusion-syntax-highlighter-2 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-2 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_2\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_2\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_2\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">192.168.1.148<\/textarea><\/div><div class=\"fusion-text fusion-text-3\"><p>&nbsp;<\/p>\n<p>Note this address; throughout the tutorial you will use it in place of <code><\/code>. Alternatively, you can find the IP address by checking the NVIDIA Sync application.<\/p>\n<blockquote>\n<p><strong>If you are using multiple Sparks,<\/strong> repeat this step for every other device and note the addresses. You will use them in place of <code><\/code> throughout the tutorial.<\/p>\n<\/blockquote>\n<blockquote>\n<p><strong>If you are using multiple Sparks,<\/strong> ensure the same username is used on all Sparks. sparkrun requires matching usernames when setting up passwordless SSH between devices. The default DGX OS username is <code>nvidia<\/code>. Check your username on each Spark:<\/p>\n<\/blockquote>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-3 > .CodeMirror, .fusion-syntax-highlighter-3 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-3 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_3\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_3\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_3\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">whoami<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-4 > .CodeMirror, .fusion-syntax-highlighter-4 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-4 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_4\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_4\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_4\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">nvidia<\/textarea><\/div><div class=\"fusion-text fusion-text-4\"><blockquote>\n<p>If the username is not <code>nvidia<\/code>, create this user on all Sparks:<\/p>\n<\/blockquote>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-5 > .CodeMirror, .fusion-syntax-highlighter-5 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-5 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_5\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_5\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_5\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sudo useradd -m nvidia\nsudo usermod -aG sudo nvidia\nsudo passwd nvidia\nsu &#8211; nvidia<\/textarea><\/div><div class=\"fusion-text fusion-text-5\"><blockquote>\n<p>These commands: create the user, add them to the sudo group, set a password, and switch to the new user. Ensure the same username exists on all Sparks.<\/p>\n<\/blockquote>\n<blockquote>\n<p><strong>If you are using multiple Sparks,<\/strong> connect the devices to each other with QSFP cables. The cable can be plugged into any of the CX-7 ports on each Spark. To verify the connection, log in to each device with a monitor and keyboard and run the following command:<\/p>\n<\/blockquote>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-6 > .CodeMirror, .fusion-syntax-highlighter-6 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-6 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_6\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_6\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_6\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">??^?i\u07b5\u05ef<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-7 > .CodeMirror, .fusion-syntax-highlighter-7 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-7 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_7\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_7\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_7\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">rocep1s0f0 port 1 ==&gt; enp1s0f0np0 (Down)\nrocep1s0f1 port 1 ==&gt; enp1s0f1np1 (Up)\nroceP2p1s0f0 port 1 ==&gt; enP2p1s0f0np0 (Down)\nroceP2p1s0f1 port 1 ==&gt; enP2p1s0f1np1 (Up)<\/textarea><\/div><div class=\"fusion-text fusion-text-6\"><blockquote>\n<p>Those shown as <code>(Up)<\/code> are the ports where the cable is connected. Those shown as <code>(Down)<\/code> are unused ports. If no interface shows as <code>(Up)<\/code>, check the QSFP cable and restart the Sparks.<\/p>\n<\/blockquote>\n<p>Ensure your computer is connected to the same network as the Spark. Then, open a terminal on your computer and connect to the Spark via SSH:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-8 > .CodeMirror, .fusion-syntax-highlighter-8 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-8 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_8\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_8\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_8\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">ssh nvidia@<\/textarea><\/div><div class=\"fusion-text fusion-text-7\"><p>&nbsp;<\/p>\n<p>On the first connection you will see a fingerprint warning. Type <code>yes<\/code> and press Enter. Then, when prompted for a password, enter the Spark&#8217;s password:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-9 > .CodeMirror, .fusion-syntax-highlighter-9 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-9 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_9\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_9\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_9\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">The authenticity of host &#8216;192.168.1.148 (192.168.1.148)&#8217; can&#8217;t be established.\nED25519 key fingerprint is SHA256:S6EECYc6Pw2aLoLmhblFZ0QEoeVtJP41jJ5IYsdOmMM.\nThis key is not known by any other names\nAre you sure you want to continue connecting (yes\/no\/[fingerprint])? yes\nWarning: Permanently added &#8216;192.168.1.148&#8217; (ED25519) to the list of known hosts.\nnvidia@192.168.1.148&#8217;s password:\nWelcome to NVIDIA DGX Spark Version 7.5.0 (GNU\/Linux 6.17.0-1026-nvidia aarch64)<\/p>\n<p>System information as of Fri Jul 17 01:26:03 PM UTC 2026<\/p>\n<p>System load: 1.68 Temperature: 50.0 C\nUsage of \/: 60.6% of 3.67TB Processes: 575\nMemory usage: 3% Users logged in: 1\nSwap usage: 7% IPv4 address for enP7s7: 192.168.1.148<\/p>\n<p>2 devices have a firmware upgrade available.\nRun `fwupdmgr get-upgrades` for more information.<\/p>\n<p>Last login: Fri Jul 17 13:16:30 2026 from 192.168.1.77<\/textarea><\/div><div class=\"fusion-text fusion-text-8\"><p>&nbsp;<\/p>\n<p>Once connected, the Spark will begin accepting commands sent from this terminal. Throughout the tutorial, you will enter all commands you encounter into this terminal on your computer.<\/p>\n<hr \/>\n<h3>2. Installing sparkrun<\/h3>\n<p>First, download the uv package manager:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-10 > .CodeMirror, .fusion-syntax-highlighter-10 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-10 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_10\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_10\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_10\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">curl -LsSf https:\/\/astral.sh\/uv\/install.sh | sh<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-11 > .CodeMirror, .fusion-syntax-highlighter-11 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-11 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_11\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_11\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_11\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">downloading uv 0.11.29 aarch64-unknown-linux-gnu\ninstalling to \/home\/nvidia\/.local\/bin\nuv\nuvx\neverything&#8217;s installed!<\/textarea><\/div><div class=\"fusion-text fusion-text-9\"><p>&nbsp;<\/p>\n<p>Add uv to your PATH:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-12 > .CodeMirror, .fusion-syntax-highlighter-12 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-12 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_12\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_12\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_12\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">echo &#8216;export PATH=&#8221;$HOME\/.local\/bin:$PATH&#8221;&#8216; &gt;&gt; ~\/.bashrc\nsource ~\/.bashrc<\/textarea><\/div><div class=\"fusion-text fusion-text-10\"><p>&nbsp;<\/p>\n<p>PATH updated. The <code>~\/.local\/bin<\/code> directory (where uv and sparkrun are installed) is now available and has been added to the PATH for all future terminal sessions. Now install sparkrun:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-13 > .CodeMirror, .fusion-syntax-highlighter-13 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-13 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_13\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_13\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_13\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">uv tool install sparkrun<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-14 > .CodeMirror, .fusion-syntax-highlighter-14 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-14 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_14\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_14\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_14\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Resolved 33 packages in 640ms\nInstalled 33 packages in 23ms\n+ annotated-doc==0.0.4\n+ anyio==4.14.2\n+ botwinick-utils==0.0.20\n+ certifi==2026.6.17\n+ click==8.3.3\n+ filelock==3.30.2\n+ fsspec==2026.6.0\n+ h11==0.16.0\n+ hf-xet==1.5.2\n+ httpcore==1.0.9\n+ httpx==0.28.1\n+ huggingface-hub==1.8.0\n+ idna==3.18\n+ linkify-it-py==2.1.0\n+ markdown-it-py==4.2.0\n+ mdit-py-plugins==0.6.1\n+ mdurl==0.1.2\n+ packaging==26.2\n+ platformdirs==4.10.0\n+ pygments==2.20.0\n+ python-json-logger==4.1.0\n+ pyyaml==6.0.3\n+ rich==15.0.0\n+ scitrera-app-framework==0.0.69\n+ shellingham==1.5.4\n+ six==1.17.0\n+ sparkrun==0.2.40\n+ textual==8.2.5\n+ tqdm==4.68.4\n+ typer==0.27.0\n+ typing-extensions==4.16.0\n+ uc-micro-py==2.0.0\n+ vpd==0.9.13\nInstalled 1 executable: sparkrun<\/textarea><\/div><div class=\"fusion-text fusion-text-11\"><p>&nbsp;<\/p>\n<p>Let&#8217;s verify the installation:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-15 > .CodeMirror, .fusion-syntax-highlighter-15 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-15 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_15\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_15\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_15\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sparkrun &#8211;version<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-16 > .CodeMirror, .fusion-syntax-highlighter-16 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-16 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_16\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_16\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_16\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">sparkrun, version 0.2.40<\/textarea><\/div><div class=\"fusion-text fusion-text-12\"><p>&nbsp;<\/p>\n<p>sparkrun v0.2.40 is installed and accessible.<\/p>\n<hr \/>\n<h3>3. Building the Docker Image<\/h3>\n<p>To get the best performance from GPT-OSS 120B, we will build a Docker image that contains CUTLASS MoE and FlashInfer attention kernels compiled specifically for the Spark&#8217;s GPU architecture. This image also includes the <code>--mxfp4-backend<\/code>, <code>--mxfp4-layers<\/code> flags and GPT-OSS&#8217;s tiktoken encoding files.<\/p>\n<p>We will build this image using the build-and-copy.sh script from the eugr community project. First, clone the eugr repository:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-17 > .CodeMirror, .fusion-syntax-highlighter-17 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-17 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_17\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_17\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_17\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">cd ~\ngit clone https:\/\/github.com\/eugr\/spark-vllm-docker.git\ncd spark-vllm-docker<\/textarea><\/div><div class=\"fusion-text fusion-text-13\"><p>&nbsp;<\/p>\n<p>The <code>Dockerfile.mxfp4<\/code> file in the repository determines the version of the source code that build-and-copy.sh will compile. Before starting the build, we must ensure this version is up to date. Therefore, let&#8217;s query the latest commit hash of the mxfp4_v2 branch in christopherowen&#8217;s community project vLLM fork:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-18 > .CodeMirror, .fusion-syntax-highlighter-18 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-18 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_18\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_18\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_18\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">git ls-remote https:\/\/github.com\/christopherowen\/vllm.git refs\/heads\/mxfp4_v2 | cut -f1<\/textarea><\/div><div class=\"fusion-text fusion-text-14\"><p>&nbsp;<\/p>\n<p>This hash returned by the command will direct build-and-copy.sh to the latest version of the vLLM source code we want. Copy or note it. Then open the Dockerfile.mxfp4 file with nano:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-19 > .CodeMirror, .fusion-syntax-highlighter-19 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-19 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_19\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_19\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_19\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">nano Dockerfile.mxfp4<\/textarea><\/div><div class=\"fusion-text fusion-text-15\"><p>&nbsp;<\/p>\n<p>Once the file is open, press Ctrl+W to search within the file, type VLLM_SHA and press Enter. The cursor will land on a line similar to:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-20 > .CodeMirror, .fusion-syntax-highlighter-20 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-20 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_20\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_20\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_20\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">ARG VLLM_SHA=045293d82b832229560ac4a13152a095af603b6e<\/textarea><\/div><div class=\"fusion-text fusion-text-16\"><p>&nbsp;<\/p>\n<p>Delete the old hash value and paste the updated hash you noted above. Then press Ctrl+O to save the file, confirm with Enter, and exit nano with Ctrl+X.<\/p>\n<p>Let&#8217;s verify the change we made to the Dockerfile.mxfp4 file:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-21 > .CodeMirror, .fusion-syntax-highlighter-21 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-21 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_21\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_21\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_21\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">grep VLLM_SHA Dockerfile.mxfp4<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-22 > .CodeMirror, .fusion-syntax-highlighter-22 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-22 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_22\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_22\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_22\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">ARG VLLM_SHA=04f641e537e80a67db464c6e65b928dbfab5d647<\/textarea><\/div><div class=\"fusion-text fusion-text-17\"><p>&nbsp;<\/p>\n<p>The returned hash value should be the updated hash you copied in the previous step.<\/p>\n<p><strong>Fallback:<\/strong> If you experience issues with the latest commit, you can use the hash 04f641e537e80a67db464c6e65b928dbfab5d647 (January 28, 2026), which we have tested and confirmed. You can also check for newer commits in the <strong><a style=\"color: #47d600;\" href=\"https:\/\/github.com\/christopherowen\/vllm\/commits\/mxfp4_v2\">commit history<\/a> <\/strong>.<\/p>\n<p>Now build the image:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-23 > .CodeMirror, .fusion-syntax-highlighter-23 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-23 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_23\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_23\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_23\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">DOCKER_BUILDKIT=1 .\/build-and-copy.sh &#8211;exp-mxfp4<\/textarea><\/div><div class=\"fusion-text fusion-text-18\"><p>&nbsp;<\/p>\n<p>The first build takes approximately 50 minutes; subsequent builds complete in about 5 minutes thanks to caching. When the build completes, you will see the following output:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-24 > .CodeMirror, .fusion-syntax-highlighter-24 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-24 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_24\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_24\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_24\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">=========================================\nTIMING STATISTICS\n=========================================\nRunner Build: 00:50:00\nTotal Time: 00:50:00\n=========================================\nDone preparing vllm-node-mxfp4.<\/textarea><\/div><div class=\"fusion-text fusion-text-19\"><p>&nbsp;<\/p>\n<p>Verify the image:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-25 > .CodeMirror, .fusion-syntax-highlighter-25 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-25 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_25\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_25\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_25\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">docker run &#8211;rm &#8211;entrypoint cat vllm-node-mxfp4:latest \/workspace\/build-metadata.yaml<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-26 > .CodeMirror, .fusion-syntax-highlighter-26 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-26 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_26\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_26\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_26\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/yaml\">vllm_commit: 04f641e537e80a67db464c6e65b928dbfab5d647\nflashinfer_commit: f349e52496a72a00d8c4ac02c7a1e38523ff7194\ngpu_arch: 12.1a\nbase_image: nvcr.io\/nvidia\/pytorch:26.01-py3<\/textarea><\/div><div class=\"fusion-text fusion-text-20\"><p>&nbsp;<\/p>\n<p>Verify the image&#8217;s vLLM version:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-27 > .CodeMirror, .fusion-syntax-highlighter-27 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-27 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_27\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_27\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_27\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">docker run &#8211;rm &#8211;entrypoint python3 vllm-node-mxfp4:latest -c &#8220;import vllm; print(vllm.__version__)&#8221;<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-28 > .CodeMirror, .fusion-syntax-highlighter-28 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-28 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_28\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_28\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_28\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">0.1.dev12774+g04f641e53.d20260720<\/textarea><\/div><div class=\"fusion-text fusion-text-21\"><p>&nbsp;<\/p>\n<p><strong>If you are using multiple Sparks,<\/strong> building the image only on the Main Spark is sufficient. sparkrun will automatically synchronize the image to the Workers over the CX-7 network on first launch. No additional step is needed.<\/p>\n<hr \/>\n<h3>4. Setup Wizard<\/h3>\n<p>The sparkrun setup wizard configures all the infrastructure needed to run the Spark with a single interactive command:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-29 > .CodeMirror, .fusion-syntax-highlighter-29 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-29 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_29\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_29\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_29\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sparkrun setup wizard<\/textarea><\/div><div class=\"fusion-text fusion-text-22\"><p>&nbsp;<\/p>\n<p>Six phases run sequentially, and the phases are interactive. In the first phase, enter <code><\/code> in the &#8216;Enter host IPs\/hostnames&#8217; field and press Enter. For the subsequent prompts, you can simply press Enter (confirming the default options) to continue:<\/p>\n<p><strong>If you are using multiple Sparks,<\/strong> enter all the Sparks&#8217; IP addresses separated by commas in the &#8216;Enter host IPs\/hostnames&#8217; field .<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-30 > .CodeMirror, .fusion-syntax-highlighter-30 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-30 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_30\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_30\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_30\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Welcome to sparkrun 0.2.40 setup wizard!\n================================================<\/p>\n<p>Phase 1: Cluster Setup\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\nDetecting CX7 interfaces on this machine&#8230;\nCX7 detected! This machine is a DGX Spark.\nEnter host IPs\/hostnames (comma-separated) [192.168.1.148]: 192.168.1.148,192.168.1.163\nCluster name [default]: dualspark\nSSH username [nvidia]:\nCreated cluster &#8216;dualspark&#8217; with 2 host(s), set as default.<\/textarea><\/div><div class=\"fusion-text fusion-text-23\"><p>&nbsp;<\/p>\n<p>The second phase sets up passwordless SSH. Type <code>Y<\/code> and press Enter:<\/p>\n<p><strong>If you are using multiple Sparks,<\/strong> the wizard connects to the Worker Sparks via SSH during this phase and asks for the password. Enter the password \u2014 this step is done once; after the wizard distributes the passwordless SSH keys, no password will be asked for in subsequent connections.<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-31 > .CodeMirror, .fusion-syntax-highlighter-31 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-31 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_31\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_31\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_31\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Phase 2: SSH Mesh\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\nSet up SSH mesh across 2 host(s) + this machine? [Y\/n]: Y\n=== Phase 1: Connectivity check ===[*] Checking SSH connectivity to nvidia@192.168.1.148 &#8230;[*] Checking SSH connectivity to nvidia@192.168.1.163 &#8230;<\/p>\n<p>=== Phase 4: Install keys so every host trusts every other host ===[*] Installing key from 192.168.1.148 onto all other hosts &#8230;\n&#8211; 192.168.1.148 -&gt; 192.168.1.163[*] Installing key from 192.168.1.163 onto all other hosts &#8230;\n&#8211; 192.168.1.163 -&gt; 192.168.1.148<\/p>\n<p>=== Done ===\nAll hosts should now be able to SSH to each other as &#8216;nvidia&#8217; without passwords.<\/p>\n<p>Detecting management IPs on cluster hosts&#8230;\nUpdating cluster hosts to management IPs:\n192.168.1.148 -&gt; 127.0.0.1 (local)\nCluster &#8216;dualspark&#8217; updated.<\/textarea><\/div><div class=\"fusion-text fusion-text-24\"><p>&nbsp;<\/p>\n<p>The third phase configures the CX-7 high-speed network interfaces. It is automatically skipped if a single Spark is used. Type <code>Y<\/code> and press Enter:<\/p>\n<p><strong>If you are using multiple Sparks,<\/strong> the wizard automatically detects CX-7 interfaces, selects non-overlapping subnets, assigns a static IP to each Spark, sets MTU 9000 (jumbo frame), and writes the <code>\/etc\/netplan\/40-cx7.yaml<\/code> file and applies it with <code>netplan apply<\/code>. This operation requires root privileges \u2014 enter the sudo password.<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-32 > .CodeMirror, .fusion-syntax-highlighter-32 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-32 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_32\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_32\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_32\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Phase 3: CX7 Network Configuration\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\nConfigures high-speed CX7 networking between hosts.\nConfigure CX7 networking? [Y\/n]: Y\nTopology: switch\nSubnets: 192.168.0.0\/24, 192.168.2.0\/24[sudo] password for nvidia: <\/textarea><\/div><div class=\"fusion-text fusion-text-25\"><p>&nbsp;<\/p>\n<p>After CX-7 configuration, the wizard automatically refreshes the SSH network with the new IPs. This phase requires no additional input.<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-33 > .CodeMirror, .fusion-syntax-highlighter-33 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-33 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_33\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_33\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_33\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Phase 3b: Re-meshing SSH after CX7 IP changes\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\nCX7 configuration changed network IPs. Re-running SSH mesh\nto ensure full connectivity across all interfaces.<\/p>\n<p>Verifying SSH connectivity to cluster hosts&#8230;\nAll 2 host(s) reachable.<\/p>\n<p>Checking reachability from control machine&#8230;\nReachable: 127.0.0.1, 192.168.1.163, 192.168.0.148, 192.168.2.148, 192.168.0.163, 192.168.2.163<\/textarea><\/div><div class=\"fusion-text fusion-text-26\"><p>&nbsp;<\/p>\n<p>The fourth phase verifies that the user is in the docker group. Type <code>Y<\/code> and press Enter:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-34 > .CodeMirror, .fusion-syntax-highlighter-34 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-34 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_34\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_34\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_34\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Phase 4: Docker Group Membership\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\nEnsures user can run Docker commands without sudo.\nAdd &#8216;nvidia&#8217; to the docker group on all hosts? [Y\/n]: Y\n127.0.0.1: &#8216;nvidia&#8217; already a member\n192.168.1.163: &#8216;nvidia&#8217; already a member<\/textarea><\/div><div class=\"fusion-text fusion-text-27\"><p>&nbsp;<\/p>\n<p>The fifth phase installs restricted sudoers rules. The installed rules are for passwordlessly fixing HuggingFace cache ownership and passwordlessly clearing the Linux page cache. Broad sudo privileges are not granted. Type <code>Y<\/code> and press Enter:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-35 > .CodeMirror, .fusion-syntax-highlighter-35 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-35 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_35\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_35\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_35\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Phase 5: Sudoers Entries\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\nScoped sudoers for fix-permissions + clear-cache (no broad sudo).\nInstall sudoers entries? [Y\/n]: Y\nfix-permissions: 2\/2 host(s)\nclear-cache: 2\/2 host(s)<\/textarea><\/div><div class=\"fusion-text fusion-text-28\"><p>&nbsp;<\/p>\n<p>The sixth phase installs earlyoom OOM protection. earlyoom terminates inference processes instead of locking up the system when memory limits are approached in the DGX Spark&#8217;s unified memory architecture. Type<strong> <code>Y<\/code><\/strong> and press Enter:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-36 > .CodeMirror, .fusion-syntax-highlighter-36 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-36 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_36\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_36\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_36\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Phase 6: earlyoom OOM Protection\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\nPrevents system hangs by proactively managing memory pressure.\nInstall earlyoom? [Y\/n]: Y\nearlyoom configured on 2\/2 host(s).<\/p>\n<p>Setup Complete!\n================================================<\/p>\n<p>Cluster: dualspark (2 hosts, set as default)\nSSH mesh: OK\nCX7: configured (switch)\nSSH remesh: OK\nDocker: OK (2\/2)\nSudoers: installed (fix-permissions, clear-cache)\nearlyoom: installed<\/textarea><\/div><div class=\"fusion-text fusion-text-29\"><hr \/>\n<h3>5. Creating the Recipe<\/h3>\n<p>A recipe is a YAML file that defines how sparkrun runs the model. The model, Docker image, vLLM flags, and memory settings are consolidated in a single file. This recipe can be used for both a single Spark (TP=1) and multiple Sparks (TP&gt;1) \u2014 the only difference is that the <code>--tp<\/code> value in the launch command is adjusted according to the number of Sparks.<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-37 > .CodeMirror, .fusion-syntax-highlighter-37 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-37 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_37\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_37\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_37\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">cat &gt; ~\/gpt-oss-120b-eugr-mxfp4.yaml &lt;&lt; &#8216;RECIPE&#8217;\n# GPT-OSS 120B MXFP4 \u2014 eugr &#8211;exp-mxfp4 build, CUTLASS MoE, FLASHINFER attention\n# Usage:\n# sparkrun run ~\/gpt-oss-120b-eugr-mxfp4.yaml &#8211;rootful # single node (TP=1)\n# sparkrun run ~\/gpt-oss-120b-eugr-mxfp4.yaml &#8211;rootful &#8211;tp 2 # dual node (TP=2)\nrecipe_version: &#8220;2&#8221;\nmodel: openai\/gpt-oss-120b\nruntime: vllm\ncontainer: vllm-node-mxfp4<\/p>\n<p>metadata:\ndescription: GPT-OSS 120B MXFP4 \u2014 CUTLASS MoE, FLASHINFER attention, eugr &#8211;exp-mxfp4 build<\/p>\n<p>defaults:\nport: 8000\nhost: 0.0.0.0\ntensor_parallel: 1\ngpu_memory_utilization: 0.7\nmax_num_batched_tokens: 8192<\/p>\n<p>env:\nVLLM_USE_FLASHINFER_MOE_MXFP4_MXFP8: &#8220;1&#8221;<\/p>\n<p>command: |\nvllm serve {model}\n&#8211;tool-call-parser openai\n&#8211;reasoning-parser openai_gptoss\n&#8211;enable-auto-tool-choice\n&#8211;tensor-parallel-size {tensor_parallel}\n&#8211;distributed-executor-backend ray\n&#8211;gpu-memory-utilization {gpu_memory_utilization}\n&#8211;enable-prefix-caching\n&#8211;load-format fastsafetensors\n&#8211;quantization mxfp4\n&#8211;mxfp4-backend CUTLASS\n&#8211;mxfp4-layers moe,qkv,o,lm_head\n&#8211;attention-backend FLASHINFER\n&#8211;kv-cache-dtype fp8\n&#8211;max-num-batched-tokens {max_num_batched_tokens}\n&#8211;host {host}\n&#8211;port {port}\nRECIPE<\/textarea><\/div><div class=\"fusion-text fusion-text-30\"><p>&nbsp;<\/p>\n<p>Verify the file:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-38 > .CodeMirror, .fusion-syntax-highlighter-38 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-38 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_38\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_38\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_38\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">cat ~\/gpt-oss-120b-eugr-mxfp4.yaml<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-39 > .CodeMirror, .fusion-syntax-highlighter-39 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-39 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_39\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_39\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_39\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/yaml\"># GPT-OSS 120B MXFP4 \u2014 eugr &#8211;exp-mxfp4 build, CUTLASS MoE, FLASHINFER attention\n# Usage:\n# sparkrun run ~\/gpt-oss-120b-eugr-mxfp4.yaml &#8211;rootful # single node (TP=1)\n# sparkrun run ~\/gpt-oss-120b-eugr-mxfp4.yaml &#8211;rootful &#8211;tp 2 # dual node (TP=2)\nrecipe_version: &#8220;2&#8221;\nmodel: openai\/gpt-oss-120b\nruntime: vllm\ncontainer: vllm-node-mxfp4<\/p>\n<p>metadata:\ndescription: GPT-OSS 120B MXFP4 \u2014 CUTLASS MoE, FLASHINFER attention, eugr &#8211;exp-mxfp4 build<\/p>\n<p>defaults:\nport: 8000\nhost: 0.0.0.0\ntensor_parallel: 1\ngpu_memory_utilization: 0.7\nmax_num_batched_tokens: 8192<\/p>\n<p>env:\nVLLM_USE_FLASHINFER_MOE_MXFP4_MXFP8: &#8220;1&#8221;<\/p>\n<p>command: |\nvllm serve {model}\n&#8211;tool-call-parser openai\n&#8211;reasoning-parser openai_gptoss\n&#8211;enable-auto-tool-choice\n&#8211;tensor-parallel-size {tensor_parallel}\n&#8211;distributed-executor-backend ray\n&#8211;gpu-memory-utilization {gpu_memory_utilization}\n&#8211;enable-prefix-caching\n&#8211;load-format fastsafetensors\n&#8211;quantization mxfp4\n&#8211;mxfp4-backend CUTLASS\n&#8211;mxfp4-layers moe,qkv,o,lm_head\n&#8211;attention-backend FLASHINFER\n&#8211;kv-cache-dtype fp8\n&#8211;max-num-batched-tokens {max_num_batched_tokens}\n&#8211;host {host}\n&#8211;port {port}<\/textarea><\/div><div class=\"fusion-text fusion-text-31\"><p>&nbsp;<\/p>\n<p>Key fields in the recipe and the reasons they were selected:<\/p>\n<ul>\n<li><strong><code>container<\/code><\/strong>\n<ul>\n<li><strong>Value:<\/strong> <code>vllm-node-mxfp4<\/code><\/li>\n<li><strong>Why:<\/strong> Image built in step 3 \u2014 includes the CUTLASS\/FlashInfer forks<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>tensor_parallel<\/code><\/strong>\n<ul>\n<li><strong>Value:<\/strong> <code>1<\/code> (default)<\/li>\n<li><strong>Why:<\/strong> Default for a single Spark; overridden with the <code>--tp<\/code> value when using multiple Sparks<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>gpu_memory_utilization<\/code><\/strong>\n<ul>\n<li><strong>Value:<\/strong> <code>0.7<\/code><\/li>\n<li><strong>Why:<\/strong> Safe value for DGX Spark UMA<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>--distributed-executor-backend ray<\/code><\/strong>\n<ul>\n<li><strong>Value:<\/strong> Ray<\/li>\n<li><strong>Why:<\/strong> sparkrun automatically detects Ray and sets up the Ray cluster. For TP=1, Ray runs on a single node.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>--mxfp4-backend CUTLASS<\/code><\/strong>\n<ul>\n<li><strong>Value:<\/strong> CUTLASS<\/li>\n<li><strong>Why:<\/strong> Custom CUTLASS MXFP4 MoE GEMM kernel<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>--mxfp4-layers moe,qkv,o,lm_head<\/code><\/strong>\n<ul>\n<li><strong>Value:<\/strong> Full<\/li>\n<li><strong>Why:<\/strong> All layers are quantized to FP4<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>--attention-backend FLASHINFER<\/code><\/strong>\n<ul>\n<li><strong>Value:<\/strong> FlashInfer<\/li>\n<li><strong>Why:<\/strong> Custom FlashInfer kernel supporting GPT-OSS attention architecture<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>--kv-cache-dtype fp8<\/code><\/strong>\n<ul>\n<li><strong>Value:<\/strong> FP8<\/li>\n<li><strong>Why:<\/strong> Reduced memory usage for the KV cache<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>--load-format fastsafetensors<\/code><\/strong>\n<ul>\n<li><strong>Value:<\/strong> Fast loader<\/li>\n<li><strong>Why:<\/strong> ~41-second model loading time<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>--reasoning-parser openai_gptoss<\/code><\/strong>\n<ul>\n<li><strong>Value:<\/strong> Harmony<\/li>\n<li><strong>Why:<\/strong> Separates the reasoning process into the <code>reasoning<\/code> field<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>--tool-call-parser openai<\/code><\/strong>\n<ul>\n<li><strong>Value:<\/strong> Tool usage<\/li>\n<li><strong>Why:<\/strong> Required for <code>--enable-auto-tool-choice<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>Important:<\/strong><br \/>The <code>--rootful<\/code> flag is not specified in the recipe; it is passed in the launch command.<br \/>FlashInfer compiles CUTLASS attention kernels at runtime, and this compilation requires root privileges.<br \/>The launch commands are shown in the \u201cLaunch the Model\u201d step of the relevant section.<\/p>\n<\/div><div class=\"fusion-text fusion-text-32\"><h3>6. Pre-Launch Checks<\/h3>\n<p>Verify that `sparkrun` correctly parses the recipe and that the memory budget is appropriate:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-40 > .CodeMirror, .fusion-syntax-highlighter-40 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-40 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_40\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_40\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_40\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sparkrun show ~\/gpt-oss-120b-eugr-mxfp4.yaml<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-41 > .CodeMirror, .fusion-syntax-highlighter-41 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-41 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_41\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_41\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_41\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Name: \/home\/nvidia\/gpt-oss-120b-eugr-mxfp4.yaml\nDescription: GPT-OSS 120B MXFP4 \u2014 CUTLASS MoE, FLASHINFER attention, eugr &#8211;exp-mxfp4 build\nRuntime: vllm-ray\nModel: openai\/gpt-oss-120b\nContainer: vllm-node-mxfp4\nNodes: 1 &#8211; unlimited<\/p>\n<p>Defaults:\ngpu_memory_utilization: 0.7\nhost: 0.0.0.0\nmax_num_batched_tokens: 8192\nport: 8000\ntensor_parallel: 1<\/p>\n<p>Environment:\nVLLM_USE_FLASHINFER_MOE_MXFP4_MXFP8=1<\/p>\n<p>Command:\nvllm serve {model}\n&#8211;tool-call-parser openai\n&#8211;reasoning-parser openai_gptoss\n&#8211;enable-auto-tool-choice\n&#8211;tensor-parallel-size {tensor_parallel}\n&#8211;distributed-executor-backend ray\n&#8211;gpu-memory-utilization {gpu_memory_utilization}\n&#8211;enable-prefix-caching\n&#8211;load-format fastsafetensors\n&#8211;quantization mxfp4\n&#8211;mxfp4-backend CUTLASS\n&#8211;mxfp4-layers moe,qkv,o,lm_head\n&#8211;attention-backend FLASHINFER\n&#8211;kv-cache-dtype fp8\n&#8211;max-num-batched-tokens {max_num_batched_tokens}\n&#8211;host {host}\n&#8211;port {port}\nWarning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.\nWarning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.<\/p>\n<p>VRAM Estimation:\nModel dtype: mxfp4\nKV cache dtype: bfloat16\nArchitecture: 36 layers, 8 KV heads, 64 head_dim\nModel weights: 60.77 GB\nTensor parallel: 1\nPer-GPU total: 60.77 GB\nDGX Spark fit: YES<\/p>\n<p>GPU Memory Budget:\ngpu_memory_utilization: 70%\nUsable GPU memory: 84.7 GB (121 GB x 70%)\nAvailable for KV: 23.9 GB\nMax context tokens: 348,538<\/textarea><\/div><div class=\"fusion-text fusion-text-33\"><p>&nbsp;<\/p>\n<p>sparkrun correctly parsed the recipe, selected vllm-ray, and gave the &#8216;DGX Spark fit: YES&#8217; confirmation.<\/p>\n<p>Now preview the launch plan:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-42 > .CodeMirror, .fusion-syntax-highlighter-42 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-42 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_42\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_42\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_42\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sparkrun run ~\/gpt-oss-120b-eugr-mxfp4.yaml &#8211;rootful &#8211;dry-run<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-43 > .CodeMirror, .fusion-syntax-highlighter-43 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-43 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_43\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_43\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_43\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">sparkrun v0.2.40<\/p>\n<p>Runtime: vllm-ray\nImage: vllm-node-mxfp4\nModel: openai\/gpt-oss-120b\nMode: solo\nWarning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.\nWarning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.<\/p>\n<p>VRAM Estimation:\nModel dtype: mxfp4\nKV cache dtype: bfloat16\nArchitecture: 36 layers, 8 KV heads, 64 head_dim\nModel weights: 60.77 GB\nTensor parallel: 1\nPer-GPU total: 60.77 GB\nDGX Spark fit: YES<\/p>\n<p>GPU Memory Budget:\ngpu_memory_utilization: 70%\nUsable GPU memory: 84.7 GB (121 GB x 70%)\nAvailable for KV: 23.9 GB\nMax context tokens: 348,538<\/p>\n<p>Hosts: default cluster &#8216;dualspark&#8217;\nTarget: 127.0.0.1<\/p>\n[1\/6] Preparing\ndone (0.0s)[2\/6] Building image \u2014 skipped (no builder)[3\/6] Distributing resources\ndone (0.1s)[4\/6] Syncing tuning configs\ndone (0.0s)[5\/6] Launching vllm runtime\nStep 1\/3: Detecting InfiniBand\nStep 2\/3: Launching container\nStep 3\/3: Executing serve command\ndone (0.0s)\nCluster: sparkrun_531d9a939d23<\/p>\n<p>Serve command:\nvllm serve openai\/gpt-oss-120b\n&#8211;tool-call-parser openai\n&#8211;reasoning-parser openai_gptoss\n&#8211;enable-auto-tool-choice\n&#8211;tensor-parallel-size 1\n&#8211;distributed-executor-backend ray\n&#8211;gpu-memory-utilization 0.7\n&#8211;enable-prefix-caching\n&#8211;load-format fastsafetensors\n&#8211;quantization mxfp4\n&#8211;mxfp4-backend CUTLASS\n&#8211;mxfp4-layers moe,qkv,o,lm_head\n&#8211;attention-backend FLASHINFER\n&#8211;kv-cache-dtype fp8\n&#8211;max-num-batched-tokens 8192\n&#8211;host 0.0.0.0\n&#8211;port 8000<\/p>\n[6\/6] Post-launch hooks \u2014 skipped<\/textarea><\/div><div class=\"fusion-text fusion-text-34\"><p>&nbsp;<\/p>\n<p>Dry run successful. The recipe is valid, the serve command includes the flags we added, and it is ready to launch. If the model is not installed on the Spark, sparkrun will automatically download it from Hugging Face on first launch. The GPT-OSS 120B model is approximately 183 GB; download time depends on your internet speed. The dry run does not trigger this download \u2014 downloading only happens on the actual launch.<\/p>\n<p><strong>If you are using multiple Sparks,<\/strong> set the <code>--tp<\/code> value according to the number of Sparks for the TP dry-run (for example, <code>--tp 2<\/code> for two Sparks). You will see <code>--tensor-parallel-size 2<\/code> in the serve command, and the mode will appear as <code>cluster (2 nodes)<\/code> instead of <code>solo<\/code>:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-44 > .CodeMirror, .fusion-syntax-highlighter-44 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-44 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_44\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_44\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_44\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sparkrun run ~\/gpt-oss-120b-eugr-mxfp4.yaml &#8211;rootful &#8211;tp 2 &#8211;dry-run<\/textarea><\/div><div class=\"fusion-text fusion-text-35\"><hr \/>\n<h2>Running with a Single Spark<\/h2>\n<h3>1. Clearing the Cache<\/h3>\n<p>Before starting vLLM, clear the filesystem cache:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-45 > .CodeMirror, .fusion-syntax-highlighter-45 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-45 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_45\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_45\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_45\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sudo sh -c &#8216;sync; echo 3 &gt; \/proc\/sys\/vm\/drop_caches&#8217;<\/textarea><\/div><div class=\"fusion-text fusion-text-36\"><p>&nbsp;<\/p>\n<p>The main reason for doing this is the DGX Spark&#8217;s unified memory architecture: The operating system caches the model files it reads from disk in RAM. vLLM loads the model weights from here into GPU memory. After loading is complete, the data remaining in the cache is not used again but is not cleaned up immediately. In systems with separate memory, this is not significant. Since inference runs in GPU memory, RAM fullness does not affect performance. On the Spark, however, since the CPU and GPU share the same RAM, the cache reduces the space available to the GPU. The command clears this cache, providing maximum memory for vLLM.<\/p>\n<p>When prompted for a password, enter the Spark&#8217;s password. The command produces no output; it completes silently:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-46 > .CodeMirror, .fusion-syntax-highlighter-46 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-46 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_46\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_46\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_46\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">[sudo] password for nvidia:<\/textarea><\/div><div class=\"fusion-text fusion-text-37\"><hr \/>\n<h3>2. Launching the Model<\/h3>\n<p>Now let&#8217;s launch the model:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-47 > .CodeMirror, .fusion-syntax-highlighter-47 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-47 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_47\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_47\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_47\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sparkrun run ~\/gpt-oss-120b-eugr-mxfp4.yaml &#8211;rootful &#8211;no-follow<\/textarea><\/div><div class=\"fusion-text fusion-text-38\"><p>&nbsp;<\/p>\n<p>The <code>--rootful<\/code> flag runs the container with root privileges. FlashInfer compiles CUTLASS attention kernels at runtime and requires root privileges for this compilation. The <code>--no-follow<\/code> flag causes sparkrun to return to the command line after launching the containers.<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-48 > .CodeMirror, .fusion-syntax-highlighter-48 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-48 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_48\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_48\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_48\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Note: 1 nodes required, using 1 of 2 hosts\nsparkrun v0.2.40<\/p>\n<p>Runtime: vllm-ray\nImage: vllm-node-mxfp4\nModel: openai\/gpt-oss-120b\nMode: solo<\/p>\n<p>VRAM Estimation:\nModel dtype: mxfp4\nKV cache dtype: bfloat16\nArchitecture: 36 layers, 8 KV heads, 64 head_dim\nModel weights: 60.77 GB\nTensor parallel: 1\nPer-GPU total: 60.77 GB\nDGX Spark fit: YES<\/p>\n<p>GPU Memory Budget:\ngpu_memory_utilization: 70%\nUsable GPU memory: 84.7 GB (121 GB x 70%)\nAvailable for KV: 23.9 GB\nMax context tokens: 348,538<\/p>\n<p>Hosts: default cluster &#8216;dualspark&#8217;\nTarget: 127.0.0.1<\/p>\n[1\/6] Preparing\ndone (0.0s)[2\/6] Building image \u2014 skipped (no builder)[3\/6] Distributing resources\nFetching 37 files: 100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 37\/37 [00:00&lt;00:00, 10007.69it\/s]\ndone (0.6s)[4\/6] Syncing tuning configs\ndone (0.0s)[5\/6] Launching vllm runtime\nStep 1\/3: Detecting InfiniBand\nStep 2\/3: Launching container\nStep 3\/3: Executing serve command\ndone (7.0s)\nCluster: sparkrun_531d9a939d23<\/p>\n<p>Serve command:\nvllm serve openai\/gpt-oss-120b\n&#8211;tool-call-parser openai\n&#8211;reasoning-parser openai_gptoss\n&#8211;enable-auto-tool-choice\n&#8211;tensor-parallel-size 1\n&#8211;distributed-executor-backend ray\n&#8211;gpu-memory-utilization 0.7\n&#8211;enable-prefix-caching\n&#8211;load-format fastsafetensors\n&#8211;quantization mxfp4\n&#8211;mxfp4-backend CUTLASS\n&#8211;mxfp4-layers moe,qkv,o,lm_head\n&#8211;attention-backend FLASHINFER\n&#8211;kv-cache-dtype fp8\n&#8211;max-num-batched-tokens 8192\n&#8211;host 0.0.0.0\n&#8211;port 8000<\/p>\n<p>Runtime versions:\ncuda: 13.1\nnccl: (2, 29, 2)\npython: 3.12.3\ntorch: 2.10.0a0+a36e1d39eb.nv26.01.42222806\nvllm: 0.1.dev12774+g04f641e53.d20260720<\/p>\n[6\/6] Post-launch hooks \u2014 skipped<\/textarea><\/div><div class=\"fusion-text fusion-text-39\"><p>&nbsp;<\/p>\n<p>sparkrun successfully completed all 6 steps. Image building was skipped, and the image we built during setup was used. Since the model files were already on disk, distribution completed quickly. All flags were correctly resolved within the serve command.<\/p>\n<hr \/>\n<h3>3. Monitoring the Startup Process<\/h3>\n<p>After the model download completes, it may take a few minutes for vLLM to become ready to serve. During this process, vLLM loads the model weights into GPU memory, compiles GPU kernels, and allocates memory for inference.<\/p>\n<p>To monitor the vLLM logs:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-49 > .CodeMirror, .fusion-syntax-highlighter-49 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-49 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_49\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_49\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_49\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sparkrun logs ~\/gpt-oss-120b-eugr-mxfp4.yaml<\/textarea><\/div><div class=\"fusion-text fusion-text-40\"><p>&nbsp;<\/p>\n<p>You will see the following in the logs:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-50 > .CodeMirror, .fusion-syntax-highlighter-50 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-50 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_50\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_50\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_50\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">(APIServer pid=107) vLLM API server version 0.1.dev12774+g04f641e53.d20260720\n(APIServer pid=107) non-default args: {&#8216;quantization&#8217;: &#8216;mxfp4&#8217;, &#8216;mxfp4_backend&#8217;: &#8216;CUTLASS&#8217;,\n&#8216;mxfp4_layers&#8217;: &#8216;moe,qkv,o,lm_head&#8217;, &#8216;attention_backend&#8217;: &#8216;FLASHINFER&#8217;,\n&#8216;distributed_executor_backend&#8217;: &#8216;ray&#8217;, &#8216;tensor_parallel_size&#8217;: 1, &#8230;}<\/p>\n<p>(EngineCore_DP0 pid=512) Started a local Ray instance.<\/p>\n<p>(RayWorkerWrapper pid=1347) SM12x detected &#8211; using native FlashInfer CUTLASS attention\ninstead of TRT-LLM attention (cubins not available for SM12x)\n(RayWorkerWrapper pid=1347) Using AttentionBackendEnum.FLASHINFER backend.\n(RayWorkerWrapper pid=1347) [MXFP4] Using backend: CUTLASS (&#8211;mxfp4-backend)\n(RayWorkerWrapper pid=1347) Loading safetensors: 100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 15\/15 [00:41&lt;00:00] (RayWorkerWrapper pid=1347) Loading weights took 41.43 seconds (RayWorkerWrapper pid=1347) [MXFP4] lm_head quantized: torch.Size([201088, 2880]) BF16 -&gt; torch.Size([201088, 1440]) FP4 (4x smaller)\n(RayWorkerWrapper pid=1347) Model loading took 61.33 GiB memory<\/p>\n<p>(RayWorkerWrapper pid=1347) torch.compile takes 112.10 s in total\n(RayWorkerWrapper pid=1347) Available KV cache memory: 8.460000 GiB\n(EngineCore_DP0 pid=512) GPU KV cache size: 246,416 tokens\n(EngineCore_DP0 pid=512) Maximum concurrency for 131,072 tokens per request: 3.54x<\/p>\n<p>(APIServer pid=107) Application startup complete.<\/textarea><\/div><div class=\"fusion-text fusion-text-41\"><p>&nbsp;<\/p>\n<p>If you see the <code>Application startup complete.<\/code> line, the model server is ready. Press <code>Ctrl+C<\/code> to stop watching the logs. The server will continue running in the background.<\/p>\n<hr \/>\n<h3>4. Testing the Model<\/h3>\n<p>First, verify that the server is running:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-51 > .CodeMirror, .fusion-syntax-highlighter-51 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-51 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_51\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_51\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_51\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">curl -s -o \/dev\/null -w &#8220;HTTP %{http_code}&#8221; http:\/\/:8000\/health<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-52 > .CodeMirror, .fusion-syntax-highlighter-52 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-52 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_52\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_52\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_52\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">HTTP 200<\/textarea><\/div><div class=\"fusion-text fusion-text-42\"><p>&nbsp;<\/p>\n<p>An &#8216;HTTP 200&#8217; response indicates the server is healthy. Now check the sparkrun container status:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-53 > .CodeMirror, .fusion-syntax-highlighter-53 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-53 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_53\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_53\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_53\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sparkrun status<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-54 > .CodeMirror, .fusion-syntax-highlighter-54 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-54 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_54\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_54\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_54\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Job: \/home\/nvidia\/gpt-oss-120b-eugr-mxfp4.yaml (tp=1) [531d9a939d23] (1 container(s))\nnode_0 127.0.0.1 Up 2 minutes vllm-node-mxfp4<\/p>\n<p>Total: 1 container(s) across 1 host(s)<\/textarea><\/div><div class=\"fusion-text fusion-text-43\"><p>&nbsp;<\/p>\n<p>List the registered models:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-55 > .CodeMirror, .fusion-syntax-highlighter-55 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-55 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_55\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_55\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_55\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">curl -s http:\/\/localhost:8000\/v1\/models | python3 -m json.tool<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-56 > .CodeMirror, .fusion-syntax-highlighter-56 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-56 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_56\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_56\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_56\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"application\/json\">{\n&#8220;object&#8221;: &#8220;list&#8221;,\n&#8220;data&#8221;: [\n{\n&#8220;id&#8221;: &#8220;openai\/gpt-oss-120b&#8221;,\n&#8220;object&#8221;: &#8220;model&#8221;,\n&#8220;created&#8221;: 1784286672,\n&#8220;owned_by&#8221;: &#8220;vllm&#8221;,\n&#8220;root&#8221;: &#8220;openai\/gpt-oss-120b&#8221;,\n&#8220;parent&#8221;: null,\n&#8220;max_model_len&#8221;: 131072\n}\n]\n}<\/textarea><\/div><div class=\"fusion-text fusion-text-44\"><p>&nbsp;<\/p>\n<p>The model <code>openai\/gpt-oss-120b<\/code> is registered.<\/p>\n<p>Now test the model with the prompt &#8220;What is 12*17?&#8221;:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-57 > .CodeMirror, .fusion-syntax-highlighter-57 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-57 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_57\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_57\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_57\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">curl -s http:\/\/localhost:8000\/v1\/chat\/completions\n-H &#8220;Content-Type: application\/json&#8221;\n-d &#8216;{\n&#8220;model&#8221;: &#8220;openai\/gpt-oss-120b&#8221;,\n&#8220;messages&#8221;: [{&#8220;role&#8221;: &#8220;user&#8221;, &#8220;content&#8221;: &#8220;What is 12*17?&#8221;}],\n&#8220;max_tokens&#8221;: 200\n}&#8217; | python3 -m json.tool<\/textarea><\/div><div class=\"fusion-text fusion-text-45\"><p>&nbsp;<\/p>\n<p>A simplified version of the response is below. In the <code>content<\/code> field (the model&#8217;s answer) you will see <code>204<\/code>. From this, you can tell the model performed the multiplication correctly. Additionally, the response has a <code>reasoning<\/code> field. This field contains the model&#8217;s reasoning process. GPT-OSS&#8217;s Harmony format is working: the reasoning process and the final answer are presented in separate fields:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-58 > .CodeMirror, .fusion-syntax-highlighter-58 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-58 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_58\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_58\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_58\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"application\/json\">{\n&#8220;id&#8221;: &#8220;chatcmpl-b863d6c512722c38&#8221;,\n&#8220;model&#8221;: &#8220;openai\/gpt-oss-120b&#8221;,\n&#8220;choices&#8221;: [\n{\n&#8220;index&#8221;: 0,\n&#8220;message&#8221;: {\n&#8220;role&#8221;: &#8220;assistant&#8221;,\n&#8220;content&#8221;: &#8220;(12 times 17 = 204)&#8221;,\n&#8220;reasoning&#8221;: &#8220;User asks a simple multiplication: 12*17 = 204. Provide answer.&#8221;,\n&#8220;reasoning_content&#8221;: &#8220;User asks a simple multiplication: 12*17 = 204. Provide answer.&#8221;\n},\n&#8220;finish_reason&#8221;: &#8220;stop&#8221;\n}\n],\n&#8220;usage&#8221;: {\n&#8220;prompt_tokens&#8221;: 72,\n&#8220;total_tokens&#8221;: 110,\n&#8220;completion_tokens&#8221;: 38\n}\n}<\/textarea><\/div><div class=\"fusion-text fusion-text-46\"><p>&nbsp;<\/p>\n<p>vLLM is now running and serving on the Spark&#8217;s port 8000. We can ask GPT-OSS 120B questions and get answers.<\/p>\n<hr \/>\n<h3>5. Shutdown<\/h3>\n<p>When you are done, stop the model:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-59 > .CodeMirror, .fusion-syntax-highlighter-59 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-59 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_59\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_59\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_59\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sparkrun stop ~\/gpt-oss-120b-eugr-mxfp4.yaml<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-60 > .CodeMirror, .fusion-syntax-highlighter-60 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-60 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_60\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_60\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_60\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Workload stopped on 1 host(s).<\/textarea><\/div><div class=\"fusion-text fusion-text-47\"><p>&nbsp;<\/p>\n<p>This command stops the container and frees up memory. However, the container, the Docker image, and the model files remain on disk. This means you don&#8217;t need to re-download to start again. Simply re-run the <code>sparkrun run<\/code> command from step 2.<\/p>\n<hr \/>\n<h2>Running with Two Sparks<\/h2>\n<h3>1. Clearing the Cache<\/h3>\n<p>Before starting vLLM, clear the filesystem cache on both Sparks. The main reason for doing this is the DGX Spark&#8217;s unified memory architecture (UMA): The operating system caches the model files it reads from disk in RAM. vLLM loads the model weights from here into GPU memory. After loading is complete, the data remaining in the cache is not used again but is not cleaned up immediately. In systems with separate memory, this is not significant. Since inference runs in GPU memory, RAM fullness does not affect performance. On the Spark, however, since the CPU and GPU share the same RAM, the cache reduces the space available to the GPU. The command clears this cache, providing maximum memory for vLLM.<\/p>\n<p>Clear the cache on the Main Spark:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-61 > .CodeMirror, .fusion-syntax-highlighter-61 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-61 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_61\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_61\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_61\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sudo sh -c &#8216;sync; echo 3 &gt; \/proc\/sys\/vm\/drop_caches&#8217;<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-62 > .CodeMirror, .fusion-syntax-highlighter-62 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-62 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_62\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_62\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_62\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">[sudo] password for nvidia:<\/textarea><\/div><div class=\"fusion-text fusion-text-48\"><p>&nbsp;<\/p>\n<p>Apply the same cleanup on the Worker Spark via SSH from the Main Spark:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-63 > .CodeMirror, .fusion-syntax-highlighter-63 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-63 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_63\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_63\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_63\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">ssh nvidia@ &#8220;sudo sh -c &#8216;sync; echo 3 &gt; \/proc\/sys\/vm\/drop_caches'&#8221;<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-64 > .CodeMirror, .fusion-syntax-highlighter-64 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-64 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_64\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_64\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_64\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">[sudo] password for nvidia:<\/textarea><\/div><div class=\"fusion-text fusion-text-49\"><hr \/>\n<h3>2. Launching the Model<\/h3>\n<p>Now, let&#8217;s launch the model on two Sparks:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-65 > .CodeMirror, .fusion-syntax-highlighter-65 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-65 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_65\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_65\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_65\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sparkrun run ~\/gpt-oss-120b-eugr-mxfp4.yaml &#8211;rootful &#8211;tp 2 &#8211;no-follow<\/textarea><\/div><div class=\"fusion-text fusion-text-50\"><p>&nbsp;<\/p>\n<p>The <code>--tp 2<\/code> flag tells sparkrun to run the model split (tensor parallel) across two Sparks. The <code>--rootful<\/code> flag runs the container with root privileges \u2014 FlashInfer compiles CUTLASS attention kernels at runtime and requires root privileges for this compilation. The <code>--no-follow<\/code> flag causes sparkrun to return to the command line after launching the containers. sparkrun automatically synchronizes the image to the Worker (skips if the same ID), copies the model to the Worker (skips if already present), sets up the Ray cluster, configures NCCL for the CX-7 interfaces, and launches containers on both Sparks.<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-66 > .CodeMirror, .fusion-syntax-highlighter-66 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-66 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_66\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_66\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_66\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/yaml\">sparkrun v0.2.40&lt;\/p&gt;\n&lt;p&gt;Runtime: vllm-ray&lt;br \/&gt;\nImage: vllm-node-mxfp4&lt;br \/&gt;\nModel: openai\/gpt-oss-120b&lt;br \/&gt;\nMode: cluster (2 nodes)&lt;br \/&gt;\nWarning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.&lt;br \/&gt;\nWarning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.&lt;\/p&gt;\n&lt;p&gt;VRAM Estimation:&lt;br \/&gt;\nModel dtype: mxfp4&lt;br \/&gt;\nKV cache dtype: bfloat16&lt;br \/&gt;\nArchitecture: 36 layers, 8 KV heads, 64 head_dim&lt;br \/&gt;\nModel weights: 60.77 GB&lt;br \/&gt;\nTensor parallel: 2&lt;br \/&gt;\nPer-GPU total: 30.38 GB&lt;br \/&gt;\nDGX Spark fit: YES&lt;\/p&gt;\n&lt;p&gt;GPU Memory Budget:&lt;br \/&gt;\ngpu_memory_utilization: 70%&lt;br \/&gt;\nUsable GPU memory: 84.7 GB (121 GB x 70%)&lt;br \/&gt;\nAvailable for KV: 54.3 GB&lt;br \/&gt;\nMax context tokens: 1,582,071&lt;\/p&gt;\n&lt;p&gt;Hosts: default cluster &#8216;dualspark'&lt;br \/&gt;\nHead: 127.0.0.1&lt;br \/&gt;\nWorkers: 192.168.1.163&lt;\/p&gt;[1\/6] Preparing&lt;br \/&gt;\ndone (0.0s)[2\/6] Building image \u2014 skipped (no builder)[3\/6] Distributing resources&lt;br \/&gt;\nDistributing image vllm-node-mxfp4 to 2 host(s)&lt;br \/&gt;\nContainer image stale on 1 of 2 host(s), syncing&lt;br \/&gt;\nDistributing model openai\/gpt-oss-120b to 2 host(s)&lt;br \/&gt;\nFetching 37 files: 100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 37\/37 [00:00&amp;lt;00:00, 7261.00it\/s]\nModel synced to 2 host(s)&lt;br \/&gt;\ndone (187.3s)[4\/6] Syncing tuning configs&lt;br \/&gt;\ndone (0.0s)[5\/6] Launching vllm runtime&lt;br \/&gt;\nStep 1\/5: Cleaning up existing containers&lt;br \/&gt;\nStep 2\/5: Detecting InfiniBand&lt;br \/&gt;\nStep 3\/5: Launching Ray head&lt;br \/&gt;\nStep 4\/5: Launching Ray workers&lt;br \/&gt;\nStep 5\/5: Executing serve command on head&lt;br \/&gt;\ndone (17.9s)&lt;br \/&gt;\nCluster: sparkrun_631038688bb2&lt;\/p&gt;\n&lt;p&gt;Serve command:&lt;br \/&gt;\nvllm serve openai\/gpt-oss-120b &lt;br \/&gt;\n&#8211;tool-call-parser openai &lt;br \/&gt;\n&#8211;reasoning-parser openai_gptoss &lt;br \/&gt;\n&#8211;enable-auto-tool-choice &lt;br \/&gt;\n&#8211;tensor-parallel-size 2 &lt;br \/&gt;\n&#8211;distributed-executor-backend ray &lt;br \/&gt;\n&#8211;gpu-memory-utilization 0.7 &lt;br \/&gt;\n&#8211;enable-prefix-caching &lt;br \/&gt;\n&#8211;load-format fastsafetensors &lt;br \/&gt;\n&#8211;quantization mxfp4 &lt;br \/&gt;\n&#8211;mxfp4-backend CUTLASS &lt;br \/&gt;\n&#8211;mxfp4-layers moe,qkv,o,lm_head &lt;br \/&gt;\n&#8211;attention-backend FLASHINFER &lt;br \/&gt;\n&#8211;kv-cache-dtype fp8 &lt;br \/&gt;\n&#8211;max-num-batched-tokens 8192 &lt;br \/&gt;\n&#8211;host 0.0.0.0 &lt;br \/&gt;\n&#8211;port 8000&lt;\/p&gt;\n&lt;p&gt;Runtime versions:&lt;br \/&gt;\ncuda: 13.1&lt;br \/&gt;\nnccl: (2, 29, 2)&lt;br \/&gt;\npython: 3.12.3&lt;br \/&gt;\ntorch: 2.10.0a0+a36e1d39eb.nv26.01.42222806&lt;br \/&gt;\nvllm: 0.1.dev12774+g04f641e53.d20260720&lt;\/p&gt;[6\/6] Post-launch hooks \u2014 skipped<\/textarea><\/div><div class=\"fusion-text fusion-text-51\"><p>&nbsp;<\/p>\n<p>sparkrun successfully completed all 6 steps. The &#8216;Mode: cluster (2 nodes)&#8217; section was seen. The image was synchronized to the Worker over CX-7. <code>--tensor-parallel-size 2<\/code> appears in the serve command. sparkrun detected the <code>--distributed-executor-backend ray<\/code> flag, selected the <code>vllm-ray<\/code> runtime, and automatically set up the Ray cluster.<\/p>\n<p>At TP=2, the model weights are split in two \u2014 each Spark loads ~30 GB (vs. 61 GB at TP=1). This leaves 35.97 GiB of memory for KV cache on each Spark (vs. 8.46 GiB at TP=1) \u2014 meaning more concurrent requests.<\/p>\n<hr \/>\n<h3>3. Monitoring the Startup Process<\/h3>\n<p>After the model download completes, it may take a few minutes for vLLM to become ready to serve. During this process, vLLM loads the model weights into GPU memory, compiles GPU kernels, and allocates memory for inference.<\/p>\n<p>Monitor the logs:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-67 > .CodeMirror, .fusion-syntax-highlighter-67 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-67 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_67\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_67\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_67\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sparkrun logs ~\/gpt-oss-120b-eugr-mxfp4.yaml &#8211;tp 2<\/textarea><\/div><div class=\"fusion-text fusion-text-52\"><p>&nbsp;<\/p>\n<p>You will see the following in the logs:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-68 > .CodeMirror, .fusion-syntax-highlighter-68 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-68 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_68\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_68\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_68\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/yaml\">(APIServer pid=1093) vLLM API server version 0.1.dev12774+g04f641e53.d20260720\n(APIServer pid=1093) non-default args: {&#8216;quantization&#8217;: &#8216;mxfp4&#8217;, &#8216;mxfp4_backend&#8217;: &#8216;CUTLASS&#8217;,\n&#8216;mxfp4_layers&#8217;: &#8216;moe,qkv,o,lm_head&#8217;, &#8216;attention_backend&#8217;: &#8216;FLASHINFER&#8217;,\n&#8216;distributed_executor_backend&#8217;: &#8216;ray&#8217;, &#8216;tensor_parallel_size&#8217;: 2, &#8230;}<\/p>\n<p>(EngineCore_DP0 pid=1407) Connecting to existing Ray cluster at address: 192.168.1.148:46379&#8230;\n(EngineCore_DP0 pid=1407) Connected to Ray cluster.\n(EngineCore_DP0 pid=1407) Creating a new placement group.<\/p>\n<p>(RayWorkerWrapper pid=1510) Loading safetensors using Fastsafetensor loader: 100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 8\/8 [00:24&lt;00:00]\n(RayWorkerWrapper pid=372, ip=192.168.1.163) Loading safetensors using Fastsafetensor loader: 100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 8\/8 [00:23&lt;00:00] (RayWorkerWrapper pid=372, ip=192.168.1.163) [MXFP4] lm_head quantized: torch.Size([100608, 2880]) BF16 -&gt; torch.Size([100608, 1440]) FP4 (4x smaller)\n(RayWorkerWrapper pid=372, ip=192.168.1.163) Model loading took 31.99 GiB memory and 38.80 seconds<\/p>\n<p>(RayWorkerWrapper pid=1510) torch.compile takes 116.55 s in total\n(RayWorkerWrapper pid=372, ip=192.168.1.163) Available KV cache memory: 35.97 GiB\n(EngineCore_DP0 pid=1407) GPU KV cache size: 2,095,472 tokens\n(EngineCore_DP0 pid=1407) Maximum concurrency for 131,072 tokens per request: 30.06x<\/p>\n<p>(APIServer pid=1093) Application startup complete.<\/textarea><\/div><div class=\"fusion-text fusion-text-53\"><p>&nbsp;<\/p>\n<p>If you see the <code>Application startup complete.<\/code> line, the model server is ready. Press <code>Ctrl+C<\/code> to stop watching the logs. The server will continue running in the background.<\/p>\n<hr \/>\n<h3>4. Testing the Model<\/h3>\n<p>Check the container status. Containers should be running on both Sparks:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-69 > .CodeMirror, .fusion-syntax-highlighter-69 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-69 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_69\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_69\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_69\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sparkrun status<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-70 > .CodeMirror, .fusion-syntax-highlighter-70 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-70 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_70\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_70\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_70\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Job: \/home\/nvidia\/gpt-oss-120b-eugr-mxfp4.yaml (tp=2) [631038688bb2] (2 container(s))\nhead 127.0.0.1 Up 4 minutes vllm-node-mxfp4\nworker 192.168.1.163 Up 4 minutes vllm-node-mxfp4<\/p>\n<p>Total: 2 container(s) across 2 host(s)<\/textarea><\/div><div class=\"fusion-text fusion-text-54\"><p>&nbsp;<\/p>\n<p>Both containers are running.<\/p>\n<p>Let&#8217;s run a health check on the model:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-71 > .CodeMirror, .fusion-syntax-highlighter-71 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-71 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_71\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_71\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_71\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">curl -s -o \/dev\/null -w &#8220;HTTP %{http_code}&#8221; http:\/\/:8000\/health<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-72 > .CodeMirror, .fusion-syntax-highlighter-72 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-72 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_72\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_72\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_72\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">HTTP 200<\/textarea><\/div><div class=\"fusion-text fusion-text-55\"><p>&nbsp;<\/p>\n<p>The model is healthy. Now let&#8217;s test the model with a prompt:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-73 > .CodeMirror, .fusion-syntax-highlighter-73 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-73 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_73\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_73\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_73\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">curl -s http:\/\/:8000\/v1\/chat\/completions\n-H &#8220;Content-Type: application\/json&#8221;\n-d &#8216;{\n&#8220;model&#8221;: &#8220;openai\/gpt-oss-120b&#8221;,\n&#8220;messages&#8221;: [{&#8220;role&#8221;: &#8220;user&#8221;, &#8220;content&#8221;: &#8220;What is 12*17?&#8221;}],\n&#8220;max_tokens&#8221;: 200\n}&#8217; | python3 -m json.tool<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-74 > .CodeMirror, .fusion-syntax-highlighter-74 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-74 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_74\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_74\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_74\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"application\/json\">{\n&#8220;id&#8221;: &#8220;chatcmpl-a2bdd35cbf300d46&#8221;,\n&#8220;model&#8221;: &#8220;openai\/gpt-oss-120b&#8221;,\n&#8220;choices&#8221;: [\n{\n&#8220;index&#8221;: 0,\n&#8220;message&#8221;: {\n&#8220;role&#8221;: &#8220;assistant&#8221;,\n&#8220;content&#8221;: &#8220;(12 times 17 = 204)&#8221;,\n&#8220;reasoning&#8221;: &#8220;User asks a simple multiplication: 12*17 = 204. Provide answer.&#8221;,\n&#8220;reasoning_content&#8221;: &#8220;User asks a simple multiplication: 12*17 = 204. Provide answer.&#8221;\n},\n&#8220;finish_reason&#8221;: &#8220;stop&#8221;\n}\n],\n&#8220;usage&#8221;: {\n&#8220;prompt_tokens&#8221;: 72,\n&#8220;total_tokens&#8221;: 110,\n&#8220;completion_tokens&#8221;: 38\n}\n}<\/textarea><\/div><div class=\"fusion-text fusion-text-56\"><p>&nbsp;<\/p>\n<p>The model answered <code>12 \u00d7 17 = 204<\/code>. Additionally, the <code>reasoning<\/code> and <code>reasoning_content<\/code> fields contain the model&#8217;s reasoning processes.<\/p>\n<p>The API is served only through the head node (Main Spark). That is, we communicate with the model via the Main Spark. The Worker Spark only participates in the inference computation.<\/p>\n<hr \/>\n<h3>5. Shutdown<\/h3>\n<p>When you are done, stop the model. Since you used <code>--tp 2<\/code> when launching, you need to specify <code>--tp 2<\/code> when stopping as well:<\/p>\n<\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-75 > .CodeMirror, .fusion-syntax-highlighter-75 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-75 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_75\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_75\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_75\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/x-sh\">sparkrun stop ~\/gpt-oss-120b-eugr-mxfp4.yaml &#8211;tp 2<\/textarea><\/div><style type=\"text\/css\" scopped=\"scopped\">.fusion-syntax-highlighter-76 > .CodeMirror, .fusion-syntax-highlighter-76 > .CodeMirror .CodeMirror-gutters {background-color:#000000;}<\/style><div class=\"fusion-syntax-highlighter-container fusion-syntax-highlighter-76 fusion-syntax-highlighter-theme-dark\" style=\"opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:rgba(242,243,245,0);\"><div class=\"syntax-highlighter-copy-code\"><span class=\"syntax-highlighter-copy-code-title\" data-id=\"fusion_syntax_highlighter_76\" style=\"font-size:14px;\">Copy to Clipboard<\/span><\/div><label for=\"fusion_syntax_highlighter_76\" class=\"screen-reader-text\">Syntax Highlighter<\/label><textarea class=\"fusion-syntax-highlighter-textarea\" id=\"fusion_syntax_highlighter_76\" data-readOnly=\"nocursor\" data-lineNumbers=\"\" data-lineWrapping=\"\" data-theme=\"oceanic-next\" data-mode=\"text\/txt\">Workload stopped on 2 host(s).<\/textarea><\/div><div class=\"fusion-text fusion-text-57\"><p>&nbsp;<\/p>\n<p>This command stops the container and frees up memory. However, the container, the Docker image, and the model files remain on disk. This means you don&#8217;t need to re-download to start again. Simply re-run the <code>sparkrun run<\/code> command from step 2.<\/p>\n<hr \/>\n<h2>Using with Open WebUI<\/h2>\n<p>In the previous tutorial (<a href=\"tutorial-vllm-openwebui-spark.md\">Local LLM Serving with vLLM on DGX Spark<\/a>), we set up Open WebUI and connected it to vLLM&#8217;s port 8000. The GPT-OSS 120B model is also served from the same port 8000. If Open WebUI is running, it automatically detects the model and lists it as <code>openai\/gpt-oss-120b<\/code> in the model selection menu on the chat screen. You can select the model and start using it from the browser.<\/p>\n<hr \/>\n<h2>Single vs Dual Spark Performance Comparison<\/h2>\n<p>We compared the single Spark (TP=1) and dual Spark (TP=2) configurations at different concurrency levels. The measurements recorded average TTFT (Time to First Token \u2014 the time until the first token starts being generated) and TPS (Tokens Per Second \u2014 the number of tokens generated per second) values.<\/p>\n<p>&nbsp;<\/p>\n<table>\n<thead>\n<tr>\n<th>Concurrency<\/th>\n<th>Single Spark TTFT (ms)<\/th>\n<th>Dual Spark TTFT (ms)<\/th>\n<th>Single Spark TPS (tok\/s)<\/th>\n<th>Dual Spark TPS (tok\/s)<\/th>\n<th>TPS Improvement<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>219.57<\/td>\n<td>167.69<\/td>\n<td>55.65<\/td>\n<td>69.86<\/td>\n<td>+26%<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>294.41<\/td>\n<td>227.76<\/td>\n<td>37.05<\/td>\n<td>51.52<\/td>\n<td>+39%<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>320.61<\/td>\n<td>255.41<\/td>\n<td>25.20<\/td>\n<td>37.14<\/td>\n<td>+47%<\/td>\n<\/tr>\n<tr>\n<td>8<\/td>\n<td>395.31<\/td>\n<td>291.94<\/td>\n<td>16.88<\/td>\n<td>26.92<\/td>\n<td>+59%<\/td>\n<\/tr>\n<tr>\n<td>16<\/td>\n<td>444.10<\/td>\n<td>319.99<\/td>\n<td>11.67<\/td>\n<td>19.08<\/td>\n<td>+63%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>The dual Spark setup provides 26% higher token throughput at concurrency 1 (single user), and as concurrency increases, this gap grows, exceeding 60% at concurrency 16, as shown.<\/p>\n<p>The measurements were taken using the <a href=\"https:\/\/github.com\/CordatusAI\/llm-benchmark\">CordatusAI LLM Benchmark Tool<\/a>. This tool is a benchmarking application developed by CordatusAI that tests LLM servers with OpenAI-compatible APIs. Below are screenshots of the benchmark results the application produced for our model. As can be seen, the application can test at concurrency levels from 1 to 64, and at each level it measures TTFT, ITL, TPS, latency, and throughput metrics, presenting the results as tables and graphs. It also calculates the recommended number of users the system can support. This calculation is a general estimate based on certain assumptions and does not reflect all usage scenarios. As seen in the image, the tool calculated a recommended user count of 55 for a single Spark and 120 for dual Sparks.<\/p>\n<p><strong>Single Spark benchmark results:<\/strong><\/p>\n<p>&nbsp;<\/p>\n<\/div><div class=\"fusion-image-element \" style=\"--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-1 hover-type-none\"><img decoding=\"async\" width=\"1024\" height=\"579\" title=\"oss_single_final_benchmark_1\" src=\"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-1024x579.webp\" alt class=\"img-responsive wp-image-1811\" srcset=\"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-200x113.webp 200w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-300x170.webp 300w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-400x226.webp 400w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-600x339.webp 600w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-768x434.webp 768w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-800x452.webp 800w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-1024x579.webp 1024w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-1200x678.webp 1200w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-1536x868.webp 1536w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1.webp 1850w\" sizes=\"(max-width: 640px) 100vw, 1024px\" \/><\/span><\/div><div class=\"fusion-image-element \" style=\"--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-2 hover-type-none\"><img decoding=\"async\" width=\"1024\" height=\"579\" title=\"oss_single_final_benchmark_2\" src=\"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-1024x579.webp\" alt class=\"img-responsive wp-image-1812\" srcset=\"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-200x113.webp 200w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-300x170.webp 300w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-400x226.webp 400w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-600x339.webp 600w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-768x434.webp 768w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-800x452.webp 800w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-1024x579.webp 1024w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-1200x678.webp 1200w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-1536x868.webp 1536w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2.webp 1850w\" sizes=\"(max-width: 640px) 100vw, 1024px\" \/><\/span><\/div><div class=\"fusion-text fusion-text-58\"><p>&nbsp;<\/p>\n<p><strong>Double Spark benchmark results:<\/strong><\/p>\n<\/div><div class=\"fusion-image-element \" style=\"--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-3 hover-type-none\"><img decoding=\"async\" width=\"1024\" height=\"579\" title=\"oss_single_final_benchmark_1\" src=\"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-1024x579.webp\" alt class=\"img-responsive wp-image-1811\" srcset=\"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-200x113.webp 200w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-300x170.webp 300w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-400x226.webp 400w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-600x339.webp 600w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-768x434.webp 768w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-800x452.webp 800w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-1024x579.webp 1024w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-1200x678.webp 1200w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1-1536x868.webp 1536w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_1.webp 1850w\" sizes=\"(max-width: 640px) 100vw, 1024px\" \/><\/span><\/div><div class=\"fusion-image-element \" style=\"--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-4 hover-type-none\"><img decoding=\"async\" width=\"1024\" height=\"579\" title=\"oss_single_final_benchmark_2\" src=\"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-1024x579.webp\" alt class=\"img-responsive wp-image-1812\" srcset=\"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-200x113.webp 200w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-300x170.webp 300w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-400x226.webp 400w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-600x339.webp 600w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-768x434.webp 768w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-800x452.webp 800w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-1024x579.webp 1024w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-1200x678.webp 1200w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2-1536x868.webp 1536w, https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/oss_single_final_benchmark_2.webp 1850w\" sizes=\"(max-width: 640px) 100vw, 1024px\" \/><\/span><\/div><\/div><\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":3,"featured_media":1930,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[60,17],"tags":[],"class_list":["post-1795","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-cluster","category-generative-ai"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.3.1 (Yoast SEO v28.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Local GPT-OSS 120B Serving on DGX Spark with sparkrun - OpenZeka EN Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Local GPT-OSS 120B Serving on DGX Spark with sparkrun\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/\" \/>\n<meta property=\"og:site_name\" content=\"OpenZeka EN Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=61576911356211\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-19T13:08:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-19T13:12:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/Local-GPT-OSS-120B-Serving-on-Single-or-Double-DGX-Spark-with-sparkrun.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Enhar\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Aetherixnl\" \/>\n<meta name=\"twitter:site\" content=\"@Aetherixnl\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Enhar\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\\\/\"},\"author\":{\"name\":\"Enhar\",\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/#\\\/schema\\\/person\\\/62c964376839cf2c4b2eb682bf14d3cb\"},\"headline\":\"Local GPT-OSS 120B Serving on DGX Spark with sparkrun\",\"datePublished\":\"2026-08-19T13:08:31+00:00\",\"dateModified\":\"2026-08-19T13:12:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\\\/\"},\"wordCount\":8494,\"publisher\":{\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/Local-GPT-OSS-120B-Serving-on-Single-or-Double-DGX-Spark-with-sparkrun.webp\",\"articleSection\":[\"AI Cluster\",\"Generative AI\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\\\/\",\"url\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\\\/\",\"name\":\"Local GPT-OSS 120B Serving on DGX Spark with sparkrun - OpenZeka EN Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/Local-GPT-OSS-120B-Serving-on-Single-or-Double-DGX-Spark-with-sparkrun.webp\",\"datePublished\":\"2026-08-19T13:08:31+00:00\",\"dateModified\":\"2026-08-19T13:12:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/Local-GPT-OSS-120B-Serving-on-Single-or-Double-DGX-Spark-with-sparkrun.webp\",\"contentUrl\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/Local-GPT-OSS-120B-Serving-on-Single-or-Double-DGX-Spark-with-sparkrun.webp\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Local GPT-OSS 120B Serving on DGX Spark with sparkrun\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/\",\"name\":\"Aetherix B.V.\",\"description\":\"NVIDIA Jetson Developer Kits &amp;Edge Devices\",\"publisher\":{\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/#organization\",\"name\":\"Aetherix B.V.\",\"url\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/aetherix-site-icon.webp\",\"contentUrl\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/aetherix-site-icon.webp\",\"width\":421,\"height\":398,\"caption\":\"Aetherix B.V.\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=61576911356211\",\"https:\\\/\\\/x.com\\\/Aetherixnl\",\"https:\\\/\\\/www.instagram.com\\\/aetherixnl\\\/\",\"https:\\\/\\\/www.tiktok.com\\\/@aetherixnl\"],\"description\":\"Aetherix provides a full range of NVIDIA Jetson-based edge AI solutions\u2014including Developer Kits, AI Kits, industrial-grade Carrier Boards, and fully integrated Boxed AI Systems.\",\"email\":\"info@aetherix.com\",\"legalName\":\"Aetherix B.V.\",\"vatID\":\"NL867727688B01\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blog.openzeka.com\\\/en\\\/#\\\/schema\\\/person\\\/62c964376839cf2c4b2eb682bf14d3cb\",\"name\":\"Enhar\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/189d567adce3bb0c8d438b4586bf861ec04980f2e451003975e3cf871781d0f4?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/189d567adce3bb0c8d438b4586bf861ec04980f2e451003975e3cf871781d0f4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/189d567adce3bb0c8d438b4586bf861ec04980f2e451003975e3cf871781d0f4?s=96&d=mm&r=g\",\"caption\":\"Enhar\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Local GPT-OSS 120B Serving on DGX Spark with sparkrun - OpenZeka EN Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/","og_locale":"en_US","og_type":"article","og_title":"Local GPT-OSS 120B Serving on DGX Spark with sparkrun","og_url":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/","og_site_name":"OpenZeka EN Blog","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=61576911356211","article_published_time":"2026-08-19T13:08:31+00:00","article_modified_time":"2026-08-19T13:12:33+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/Local-GPT-OSS-120B-Serving-on-Single-or-Double-DGX-Spark-with-sparkrun.webp","type":"image\/webp"}],"author":"Enhar","twitter_card":"summary_large_image","twitter_creator":"@Aetherixnl","twitter_site":"@Aetherixnl","twitter_misc":{"Written by":"Enhar"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/#article","isPartOf":{"@id":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/"},"author":{"name":"Enhar","@id":"https:\/\/blog.openzeka.com\/en\/#\/schema\/person\/62c964376839cf2c4b2eb682bf14d3cb"},"headline":"Local GPT-OSS 120B Serving on DGX Spark with sparkrun","datePublished":"2026-08-19T13:08:31+00:00","dateModified":"2026-08-19T13:12:33+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/"},"wordCount":8494,"publisher":{"@id":"https:\/\/blog.openzeka.com\/en\/#organization"},"image":{"@id":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/Local-GPT-OSS-120B-Serving-on-Single-or-Double-DGX-Spark-with-sparkrun.webp","articleSection":["AI Cluster","Generative AI"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/","url":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/","name":"Local GPT-OSS 120B Serving on DGX Spark with sparkrun - OpenZeka EN Blog","isPartOf":{"@id":"https:\/\/blog.openzeka.com\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/#primaryimage"},"image":{"@id":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/Local-GPT-OSS-120B-Serving-on-Single-or-Double-DGX-Spark-with-sparkrun.webp","datePublished":"2026-08-19T13:08:31+00:00","dateModified":"2026-08-19T13:12:33+00:00","breadcrumb":{"@id":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/#primaryimage","url":"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/Local-GPT-OSS-120B-Serving-on-Single-or-Double-DGX-Spark-with-sparkrun.webp","contentUrl":"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2026\/08\/Local-GPT-OSS-120B-Serving-on-Single-or-Double-DGX-Spark-with-sparkrun.webp","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/blog.openzeka.com\/en\/local-gpt-oss-120b-serving-on-dgx-spark-with-sparkrun\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.openzeka.com\/en\/"},{"@type":"ListItem","position":2,"name":"Local GPT-OSS 120B Serving on DGX Spark with sparkrun"}]},{"@type":"WebSite","@id":"https:\/\/blog.openzeka.com\/en\/#website","url":"https:\/\/blog.openzeka.com\/en\/","name":"Aetherix B.V.","description":"NVIDIA Jetson Developer Kits &amp;Edge Devices","publisher":{"@id":"https:\/\/blog.openzeka.com\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.openzeka.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/blog.openzeka.com\/en\/#organization","name":"Aetherix B.V.","url":"https:\/\/blog.openzeka.com\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.openzeka.com\/en\/#\/schema\/logo\/image\/","url":"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2025\/06\/aetherix-site-icon.webp","contentUrl":"https:\/\/blog.openzeka.com\/en\/wp-content\/uploads\/2025\/06\/aetherix-site-icon.webp","width":421,"height":398,"caption":"Aetherix B.V."},"image":{"@id":"https:\/\/blog.openzeka.com\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=61576911356211","https:\/\/x.com\/Aetherixnl","https:\/\/www.instagram.com\/aetherixnl\/","https:\/\/www.tiktok.com\/@aetherixnl"],"description":"Aetherix provides a full range of NVIDIA Jetson-based edge AI solutions\u2014including Developer Kits, AI Kits, industrial-grade Carrier Boards, and fully integrated Boxed AI Systems.","email":"info@aetherix.com","legalName":"Aetherix B.V.","vatID":"NL867727688B01"},{"@type":"Person","@id":"https:\/\/blog.openzeka.com\/en\/#\/schema\/person\/62c964376839cf2c4b2eb682bf14d3cb","name":"Enhar","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/189d567adce3bb0c8d438b4586bf861ec04980f2e451003975e3cf871781d0f4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/189d567adce3bb0c8d438b4586bf861ec04980f2e451003975e3cf871781d0f4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/189d567adce3bb0c8d438b4586bf861ec04980f2e451003975e3cf871781d0f4?s=96&d=mm&r=g","caption":"Enhar"}}]}},"_links":{"self":[{"href":"https:\/\/blog.openzeka.com\/en\/wp-json\/wp\/v2\/posts\/1795","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.openzeka.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.openzeka.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.openzeka.com\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.openzeka.com\/en\/wp-json\/wp\/v2\/comments?post=1795"}],"version-history":[{"count":15,"href":"https:\/\/blog.openzeka.com\/en\/wp-json\/wp\/v2\/posts\/1795\/revisions"}],"predecessor-version":[{"id":1938,"href":"https:\/\/blog.openzeka.com\/en\/wp-json\/wp\/v2\/posts\/1795\/revisions\/1938"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.openzeka.com\/en\/wp-json\/wp\/v2\/media\/1930"}],"wp:attachment":[{"href":"https:\/\/blog.openzeka.com\/en\/wp-json\/wp\/v2\/media?parent=1795"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.openzeka.com\/en\/wp-json\/wp\/v2\/categories?post=1795"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.openzeka.com\/en\/wp-json\/wp\/v2\/tags?post=1795"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}