fix: make automatic NUMA binding configurable (#30394)

This commit is contained in:
Lukas Humbel
2026-08-12 17:40:28 -07:00
committed by GitHub
parent aefe2d0207
commit 40eaf34428
4 changed files with 30 additions and 5 deletions
+24 -1
View File
@@ -4,6 +4,7 @@ import unittest
from contextlib import ExitStack
from unittest.mock import MagicMock, patch
from sglang.srt.environ import envs
from sglang.srt.utils.numa_utils import (
_handle_numa_bind_failure,
_is_numa_available,
@@ -178,13 +179,34 @@ class TestGetNumaNodeIfAvailable(unittest.TestCase):
args.numa_node = numa_node
return args
def test_returns_explicit_numa_node_from_server_args(self):
def test_auto_numa_bind_enabled_by_default(self):
with patch.dict(os.environ, {}, clear=True):
self.assertTrue(envs.SGLANG_AUTO_NUMA_BIND.get())
@patch.dict(os.environ, {"SGLANG_AUTO_NUMA_BIND": "0"})
def test_returns_explicit_numa_node_when_auto_bind_disabled(self):
args = self._make_server_args(numa_node=[2, 3, 0, 1])
self.assertEqual(get_numa_node_if_available(args, 0), 2)
self.assertEqual(get_numa_node_if_available(args, 1), 3)
self.assertEqual(get_numa_node_if_available(args, 2), 0)
self.assertEqual(get_numa_node_if_available(args, 3), 1)
@patch("sglang.srt.utils.numa_utils._query_numa_node_for_gpu")
@patch("sglang.srt.utils.numa_utils._is_numa_available")
def test_auto_bind_disabled_skips_numa_detection(self, mock_avail, mock_query):
args = self._make_server_args(numa_node=None)
for bind_v2 in ("0", "1"):
with self.subTest(bind_v2=bind_v2), patch.dict(
os.environ,
{
"SGLANG_AUTO_NUMA_BIND": "0",
"SGLANG_NUMA_BIND_V2": bind_v2,
},
):
self.assertIsNone(get_numa_node_if_available(args, 0))
mock_avail.assert_not_called()
mock_query.assert_not_called()
@patch("sglang.srt.utils.numa_utils._is_numa_available", return_value=False)
def test_returns_none_when_numa_not_available(self, _mock_avail):
args = self._make_server_args(numa_node=None)
@@ -196,6 +218,7 @@ class TestGetNumaNodeIfAvailable(unittest.TestCase):
args = self._make_server_args(numa_node=None)
self.assertIsNone(get_numa_node_if_available(args, 0))
@patch.dict(os.environ, {"SGLANG_AUTO_NUMA_BIND": "1"})
@patch("sglang.srt.utils.numa_utils._query_numa_node_for_gpu", return_value=[1])
@patch("sglang.srt.utils.numa_utils._is_numa_available", return_value=True)
def test_returns_queried_single_node(self, _mock_avail, _mock_gpu):