diff --git a/docker/xpu.Dockerfile b/docker/xpu.Dockerfile index b6819e534..67fc21b4d 100644 --- a/docker/xpu.Dockerfile +++ b/docker/xpu.Dockerfile @@ -1,7 +1,7 @@ # docker build -t sglang:xpu -f xpu.Dockerfile --build-arg http_proxy=${http_proxy} --build-arg https_proxy=${https_proxy} --build-arg no_proxy=${no_proxy} --no-cache . # Use Intel deep learning essentials base image with Ubuntu 24.04 -FROM intel/deep-learning-essentials:2025.3.2-0-devel-ubuntu24.04 +FROM intel/deep-learning-essentials:2026.0.0-devel-ubuntu24.04 # Avoid interactive prompts during package install ENV DEBIAN_FRONTEND=noninteractive @@ -19,9 +19,10 @@ USER root # Pin Level-Zero UMD + IGC (rolling PPA once faulted libze on B580; see sgl-kernel-xpu#296). # Keep in lockstep with the host xe KMD; override via --build-arg. -ARG COMPUTE_RUNTIME_VERSION=26.05.37020.3 -ARG IGC_VERSION=2.28.4+20760 -ARG GMM_VERSION=22.9.0 +ARG COMPUTE_RUNTIME_VERSION=26.18.38308.1 +ARG IGC_VERSION=2.34.4+21428 +ARG GMM_VERSION=22.10.0 + RUN apt-get update && apt-get install -y software-properties-common curl && \ add-apt-repository -y ppa:kobuk-team/intel-graphics && \ apt-get update && \ @@ -68,14 +69,14 @@ ENV PATH="$VIRTUAL_ENV/bin:$PATH" WORKDIR /sgl-workspace -RUN pip install --no-cache-dir msgspec blake3 py-cpuinfo compressed_tensors gguf partial_json_parser einops tabulate --root-user-action=ignore && \ - pip install --no-cache-dir torch==2.12.0+xpu torchvision==0.27.0+xpu torchaudio==2.11.0+xpu --index-url https://download.pytorch.org/whl/xpu +RUN pip install --no-cache-dir torch==2.13.0+xpu torchvision==0.28.0+xpu torchaudio==2.11.0+xpu --index-url https://download.pytorch.org/whl/xpu && \ + pip install --no-cache-dir msgspec blake3 py-cpuinfo compressed_tensors gguf partial_json_parser einops tabulate --root-user-action=ignore RUN echo "Cloning ${SG_LANG_BRANCH} from ${SG_LANG_REPO}" && \ git clone --branch ${SG_LANG_BRANCH} --single-branch ${SG_LANG_REPO} sglang && \ cd sglang && cd python && \ cp pyproject_xpu.toml pyproject.toml && \ - pip install --no-cache-dir . --extra-index-url https://download.pytorch.org/whl/xpu && \ + pip install --no-cache-dir ".[dev,diffusion]" --extra-index-url https://download.pytorch.org/whl/xpu && \ pip install --no-cache-dir --no-deps xgrammar==0.1.33 CMD ["bash", "-c", "source /opt/intel/oneapi/setvars.sh --force && exec bash"] diff --git a/docs/docs/hardware-platforms/xpu.mdx b/docs/docs/hardware-platforms/xpu.mdx index 6a7300e77..a01775150 100644 --- a/docs/docs/hardware-platforms/xpu.mdx +++ b/docs/docs/hardware-platforms/xpu.mdx @@ -53,7 +53,7 @@ conda create -n sgl-xpu python=3.12 -y conda activate sgl-xpu # Set PyTorch XPU as primary pip install channel to avoid installing the larger CUDA-enabled version and prevent potential runtime issues. -pip3 install torch==2.12.0+xpu torchvision==0.27.0+xpu torchaudio==2.11.0+xpu --index-url https://download.pytorch.org/whl/xpu +pip3 install torch==2.13.0+xpu torchvision==0.28.0+xpu torchaudio==2.11.0+xpu --index-url https://download.pytorch.org/whl/xpu pip3 install xgrammar --no-deps # xgrammar will introduce CUDA-enabled triton which might conflict with XPU pip3 install apache-tvm-ffi # xgrammar requires apache-tvm-ffi diff --git a/docs/docs/sglang-diffusion/installation.mdx b/docs/docs/sglang-diffusion/installation.mdx index 19c4abec1..d949256b8 100644 --- a/docs/docs/sglang-diffusion/installation.mdx +++ b/docs/docs/sglang-diffusion/installation.mdx @@ -87,11 +87,7 @@ pip install -e "python[all_musa]" ## Platform-Specific: Intel XPU -For Intel Data Center GPU Max or Arc GPUs, follow the [XPU installation guide](../hardware-platforms/xpu) to set up the base environment, then install diffusion dependencies: - -```bash Command -pip install -e "python[diffusion]" -``` +For Intel Data Center GPU Max or Arc GPUs, follow the installation with docker in [XPU installation guide](../hardware-platforms/xpu). The dockerfile already include diffusion dependencies: ## Platform-Specific: Ascend NPU diff --git a/python/pyproject_xpu.toml b/python/pyproject_xpu.toml index 705001003..41cab79ec 100644 --- a/python/pyproject_xpu.toml +++ b/python/pyproject_xpu.toml @@ -59,10 +59,10 @@ dependencies = [ "soundfile==0.13.1", "tiktoken", "timm==1.0.16", - "torch==2.12.0+xpu", + "torch==2.13.0+xpu", "torchaudio==2.11.0+xpu", - "torchcodec==0.12.0 ; sys_platform != 'linux' or (sys_platform == 'linux' and platform_machine != 'aarch64' and platform_machine != 'arm64' and platform_machine != 'armv7l')", # torch==2.12.0 on XPU uses torchcodec 0.12.0 - "torchvision==0.27.0+xpu", + "torchcodec==0.13.0 ; sys_platform != 'linux' or (sys_platform == 'linux' and platform_machine != 'aarch64' and platform_machine != 'arm64' and platform_machine != 'armv7l')", # torch==2.13.0 on XPU uses torchcodec 0.13.0 + "torchvision==0.28.0+xpu", "tqdm", "transformers==5.12.1", "uvicorn", diff --git a/test/registered/xpu/test_topk.py b/test/registered/xpu/test_topk.py index c10e54cc3..ba4f6abc0 100644 --- a/test/registered/xpu/test_topk.py +++ b/test/registered/xpu/test_topk.py @@ -1,7 +1,10 @@ import unittest +from typing import Optional import torch +torch.use_deterministic_algorithms(True) + from sglang.srt.layers.moe.topk import ( biased_grouped_topk_gpu, ) @@ -33,6 +36,39 @@ def _scatter_by_expert( return dense +def assert_equal( + score: torch.Tensor, + indices_ref: torch.Tensor, + indices_our: torch.Tensor, + bs: int, + k: int, + seq_len: int, + topk_indices_offset: Optional[torch.Tensor] = None, + max_permit_error: int = 0, +): + indices_our_cpu = indices_our.cpu().tolist() + indices_ref_cpu = indices_ref.cpu().tolist() + + wrong_values = 0 + for i in range(bs): + indices_ref_set_i = set(indices_ref_cpu[i]) + indices_our_set_i = set(indices_our_cpu[i]) + more = indices_our_set_i - indices_ref_set_i + less = indices_ref_set_i - indices_our_set_i + offset = topk_indices_offset[i].item() if topk_indices_offset is not None else 0 + if len(more) > 0 or len(less) > 0: + # check whether more values are the same with less values + # if so, either one is acceptable, since their values are the same + more_values = sorted(score[i, idx - offset].item() for idx in more) + less_values = sorted(score[i, idx - offset].item() for idx in less) + if more_values != less_values: + wrong_values += len(more) + print( + f"{bs=}, {k=}, {seq_len=}, {i=}, {more=}, {less=} failed, with {more_values=}, {less_values=}" + ) + assert wrong_values <= max_permit_error, f"{wrong_values=}, {max_permit_error=}" + + # Nemotron-3 uses biased_grouped_topk class TestBiasedGroupedTopK(CustomTestCase): def _run_single_test( @@ -226,15 +262,13 @@ class TestBiasedGroupedTopK(CustomTestCase): routed_scaling_factor, ) - torch.testing.assert_close( - _scatter_by_expert( - topk_weights[:, :topk_routed], topk_ids[:, :topk_routed], E_num - ), - _scatter_by_expert( - ref_topk_weights[:, :topk_routed], - ref_topk_ids[:, :topk_routed], - E_num, - ), + assert_equal( + gating_output, + ref_topk_ids[:, :topk_routed], + topk_ids[:, :topk_routed], + bs=len(bs), + k=topk_value, + seq_len=seq_len, )