Prerequisites
The MLX runtime requires Apple Silicon with macOS 14 or newer, stable PyTorch 2.13.x, and stable MLX 0.32.0 or newer. Thesrt_mps extra installs PyTorch
2.13.0 and MLX 0.32.0 or newer; startup accepts stable PyTorch 2.13 patch
releases and newer stable MLX releases.
With SGLANG_USE_MLX=1, SGLang validates both framework versions and Metal
availability during argument initialization and stops before resolving or
downloading a model when the runtime is incompatible.
Building the optional native Metal kernels in sgl-kernel requires the Metal
shader compiler from the full Xcode application. The standalone Xcode Command
Line Tools are not sufficient. After installing Xcode, select it with:
xcrun -sdk macosx metal --version.
Install SGLang
You can install SGLang using one of the methods below.Install from Source
Launch of the Serving Engine
Launch the server with:SGLANG_USE_MLX=1- Enables the use of MLX as the SGLang runtime backend (if disabled, SGLang will fall back totorch.mps, which has less support)--disable-cuda-graph- Disables usage of CUDA graph, which is not relevant for Apple Metal.--disable-overlap-schedule- Disables overlap scheduling (enabled/not present by default) achieved using MLX’sasync_eval()SGLANG_MLX_USE_CUSTOM_ROPE=1- Enables the optional custom Metal RoPE kernel. It is disabled by default, so the MLX backend uses the standard RoPE path unless you opt in for A/B testing.SGLANG_MLX_FUSE_SWIGLU=1- Enables the use of fused Swish-Gated Linear Unit kernel (disabled by default)SGLANG_MLX_CLEAR_CACHE_STEPS=256- Sets the number of decode steps before clearing the MLX cache (256 by default)
Quantization
The MLX backend supports two quantization paths on Apple Silicon:- Pre-quantized HF repos. Any
mlx-community/<model>-4bit(or-8bit) repo loads directly throughmlx_lm.load(...)— no extra flag needed. - On-the-fly quantization. For any fp16 model, pass
--quantization mlx_q4or--quantization mlx_q8to have sglang quantize the weights at load time viamlx_lm.utils.quantize_model(group size 64, the mlx-community default). The quantized weights stay in process memory; the on-disk model is untouched.Expected log line:The MLX backend silently ignores--quantization mlx_q4when the model is already quantized in its HF config (path 1), so the same flag is safe to pass either way.
Benchmarking with Requests
sglang.benchmark.one_batch calls the synchronous prefill/decode methods directly without going through the scheduler and the overlap code path.
sglang.benchmark.offline_throughput can toggle overlap scheduling as it uses the scheduler and the overlap code path by using the flag --disable-overlap-schedule.
