@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 9dd5ee0117
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 5, 06:00 UTC

[XPU]Enhance environment collection for Intel XPU and optimize layout (#35698)

Signed-off-by: sihao.li <sihao.li@intel.com> Co-authored-by: Kunshang Ji <kunshang.ji@intel.com>

sihao_li committed Apr 13, 2026 at 12:51 UTC 9dd5ee0117be1b891d1ddc4e5cd7d03071ec11ae
1 file changed +248 -16
vllm/collect_env.py
+248 -16
@@ -46,6 +46,17 @@ SystemEnv = namedtuple(
46 "nvidia_driver_version",
47 "nvidia_gpu_models",
48 "cudnn_version",
49 + "xpu_available",
50 + "xpu_runtime_version",
51 + "intel_graphics_compiler_version",
52 + "intel_gpu_models",
53 + "oneapi_compiler_version",
54 + "level_zero_loader_version",
55 + "level_zero_driver_version",
56 + "oneccl_version",
57 + "libigdgmm_version",
58 + "vllm_xpu_kernels_version",
59 + "sycl_version",
60 "pip_version", # 'pip' or 'pip3'
61 "pip_packages",
62 "conda_packages",
@@ -277,6 +288,134 @@ def get_rocm_version(run_lambda):
288 )
289
290
291 +def get_xpu_available():
292 + if TORCH_AVAILABLE and hasattr(torch, "xpu") and torch.xpu.is_available():
293 + return True
294 + return False
295 +
296 +
297 +def get_xpu_runtime_version():
298 + if TORCH_AVAILABLE and hasattr(torch.version, "xpu"):
299 + return torch.version.xpu
300 + return None
301 +
302 +
303 +def get_pkg_version(run_lambda, pkg):
304 + assert get_platform() == "linux"
305 +
306 + if pkg == "vllm_xpu_kernels":
307 + rc, out, _ = run_lambda("pip show vllm-xpu-kernels")
308 + if rc == 0:
309 + match = re.search(r"Version: (.*)", out)
310 + return match.group(1).strip() if match else None
311 + return None
312 +
313 + pkg_map = {
314 + "igc": ["intel-igc-core", "libigc2", "libigc1"],
315 + "level_zero_loader": ["level-zero", "libze1"],
316 + "level_zero_driver": ["libze-intel-gpu1", "intel-level-zero-gpu"],
317 + "oneccl": ["intel-oneapi-ccl", "oneccl"],
318 + "libigdgmm": ["libigdgmm12", "libigdgmm"],
319 + }
320 +
321 + pkg_candidates = pkg_map.get(pkg, [])
322 + if not pkg_candidates:
323 + return None
324 +
325 + mgr_name = None
326 + for mgr in ["dpkg", "dnf", "yum", "zypper"]:
327 + rc, _, _ = run_lambda(f"which {mgr}")
328 + if rc == 0:
329 + mgr_name = mgr
330 + break
331 +
332 + if not mgr_name:
333 + return None
334 +
335 + ret = ""
336 + index = -1
337 +
338 + for pkg_name in pkg_candidates:
339 + if not pkg_name:
340 + continue
341 +
342 + cmd = ""
343 + if mgr_name in ["dnf", "yum"]:
344 + index = 1
345 + cmd = f"{mgr_name} list | grep -w {pkg_name}"
346 + elif mgr_name == "zypper":
347 + index = 2
348 + cmd = f"{mgr_name} info {pkg_name} | grep Version"
349 + elif mgr_name == "dpkg":
350 + index = 2
351 + cmd = f"{mgr_name} -l | grep -w {pkg_name}"
352 +
353 + if cmd:
354 + out = run_and_read_all(run_lambda, cmd)
355 + if out:
356 + ret = out.splitlines()[0]
357 + break
358 +
359 + if not ret or index == -1:
360 + return None
361 +
362 + lst = re.sub(" +", " ", ret).strip().split(" ")
363 + if len(lst) > index:
364 + return lst[index]
365 +
366 + return None
367 +
368 +
369 +def get_intel_graphics_compiler_version(run_lambda):
370 + """Return Intel Graphics Compiler (IGC) version."""
371 + return get_pkg_version(run_lambda, "igc")
372 +
373 +
374 +def get_level_zero_loader_version(run_lambda):
375 + """Return Level Zero loader runtime version."""
376 + return get_pkg_version(run_lambda, "level_zero_loader")
377 +
378 +
379 +def get_level_zero_driver_version(run_lambda):
380 + """Return Level Zero driver version."""
381 + return get_pkg_version(run_lambda, "level_zero_driver")
382 +
383 +
384 +def get_oneapi_ccl_version(run_lambda):
385 + """Return oneAPI Collective Communications Library (oneCCL) version."""
386 + return get_pkg_version(run_lambda, "oneccl")
387 +
388 +
389 +def get_libigdgmm_version(run_lambda):
390 + return get_pkg_version(run_lambda, "libigdgmm")
391 +
392 +
393 +def get_vllm_xpu_kernels_version(run_lambda):
394 + return get_pkg_version(run_lambda, "vllm_xpu_kernels")
395 +
396 +
397 +def get_intel_gpu_models():
398 + if TORCH_AVAILABLE and hasattr(torch, "xpu") and torch.xpu.is_available():
399 + device_count = torch.xpu.device_count()
400 + return "\n".join(
401 + "GPU {}: {}".format(i, torch.xpu.get_device_name(i))
402 + for i in range(device_count)
403 + )
404 + return None
405 +
406 +
407 +def get_oneapi_compiler_version(run_lambda):
408 + """Return Intel oneAPI DPC++/C++ Compiler version via icpx."""
409 + return run_and_parse_first_match(
410 + run_lambda, "icpx --version", r"oneAPI DPC\+\+/C\+\+ Compiler (\S+)"
411 + )
412 +
413 +
414 +def get_sycl_version(run_lambda):
415 + """Return SYCL/DPC++ compiler build version."""
416 + return run_and_parse_first_match(run_lambda, "icpx --version", r"\((\d[\d.]+)\)")
417 +
418 +
419 def get_vllm_version():
420 from vllm import __version__, __version_tuple__
421
@@ -298,11 +437,12 @@ def get_vllm_version():
437
438
439 def summarize_vllm_build_flags():
301 - # This could be a static method if the flags are constant, or dynamic if you need to check environment variables, etc.
302 - return "CUDA Archs: {}; ROCm: {}".format(
440 + flags = "CUDA Archs: {}; ROCm: {}; XPU: {}".format(
441 os.environ.get("TORCH_CUDA_ARCH_LIST", "Not Set"),
442 "Enabled" if os.environ.get("ROCM_HOME") else "Disabled",
443 + "Enabled" if get_xpu_available() else "Disabled",
444 )
445 + return flags
446
447
448 def get_gpu_topo(run_lambda):
@@ -574,6 +714,13 @@ def get_env_vars():
714 "OMP_",
715 "MKL_",
716 "NVIDIA",
717 + "ZE_",
718 + "ONEAPI_",
719 + "SYCL_",
720 + "NEOReadDebugKeys",
721 + "IGC_",
722 + "CCL_",
723 + "I_MPI_",
724 )
725 for k, v in os.environ.items():
726 if any(term in k.lower() for term in secret_terms):
@@ -637,6 +784,17 @@ def get_env_info():
784 nvidia_gpu_models=get_gpu_info(run_lambda),
785 nvidia_driver_version=get_nvidia_driver_version(run_lambda),
786 cudnn_version=get_cudnn_version(run_lambda),
787 + xpu_available=str(get_xpu_available()),
788 + xpu_runtime_version=get_xpu_runtime_version(),
789 + intel_graphics_compiler_version=get_intel_graphics_compiler_version(run_lambda),
790 + intel_gpu_models=get_intel_gpu_models(),
791 + oneapi_compiler_version=get_oneapi_compiler_version(run_lambda),
792 + level_zero_loader_version=get_level_zero_loader_version(run_lambda),
793 + level_zero_driver_version=get_level_zero_driver_version(run_lambda),
794 + oneccl_version=get_oneapi_ccl_version(run_lambda),
795 + libigdgmm_version=get_libigdgmm_version(run_lambda),
796 + vllm_xpu_kernels_version=get_vllm_xpu_kernels_version(run_lambda),
797 + sycl_version=get_sycl_version(run_lambda),
798 hip_compiled_version=hip_compiled_version,
799 hip_runtime_version=hip_runtime_version,
800 miopen_runtime_version=miopen_runtime_version,
@@ -676,26 +834,15 @@ PyTorch version : {torch_version}
834 Is debug build : {is_debug_build}
835 CUDA used to build PyTorch : {cuda_compiled_version}
836 ROCM used to build PyTorch : {hip_compiled_version}
837 +XPU used to build PyTorch : {xpu_runtime_version}
838
839 ==============================
840 Python Environment
841 ==============================
842 Python version : {python_version}
843 Python platform : {python_platform}
685 -
686 -==============================
687 - CUDA / GPU Info
688 -==============================
689 -Is CUDA available : {is_cuda_available}
690 -CUDA runtime version : {cuda_runtime_version}
691 -CUDA_MODULE_LOADING set to : {cuda_module_loading}
692 -GPU models and configuration : {nvidia_gpu_models}
693 -Nvidia driver version : {nvidia_driver_version}
694 -cuDNN version : {cudnn_version}
695 -HIP runtime version : {hip_runtime_version}
696 -MIOpen runtime version : {miopen_runtime_version}
697 -Is XNNPACK available : {is_xnnpack_available}
698 -
844 +
845 +{gpu_info}
846 ==============================
847 CPU Info
848 ==============================
@@ -790,6 +937,35 @@ def pretty_str(envinfo):
937 if envinfo.cuda_compiled_version is None:
938 mutable_dict["cuda_compiled_version"] = "None"
939
940 + # If the machine doesn't have XPU, report XPU fields as 'No XPU'
941 + dynamic_xpu_fields = [
942 + "intel_graphics_compiler_version",
943 + "intel_gpu_models",
944 + "level_zero_loader_version",
945 + "level_zero_driver_version",
946 + "oneccl_version",
947 + "libigdgmm_version",
948 + "vllm_xpu_kernels_version",
949 + ]
950 + all_xpu_fields = dynamic_xpu_fields + [
951 + "oneapi_compiler_version",
952 + "sycl_version",
953 + ]
954 + all_dynamic_xpu_fields_missing = all(
955 + mutable_dict[field] is None for field in dynamic_xpu_fields
956 + )
957 + xpu_available = mutable_dict.get("xpu_available") == "True"
958 + if not xpu_available and all_dynamic_xpu_fields_missing:
959 + for field in all_xpu_fields:
960 + mutable_dict[field] = "No XPU"
961 + if envinfo.xpu_runtime_version is None or envinfo.xpu_runtime_version == "N/A":
962 + mutable_dict["xpu_runtime_version"] = "N/A"
963 +
964 + # If intel_gpu_models is multiline, start on the next line
965 + mutable_dict["intel_gpu_models"] = maybe_start_on_next_line(
966 + mutable_dict.get("intel_gpu_models")
967 + )
968 +
969 # Replace True with Yes, False with No
970 mutable_dict = replace_bools(mutable_dict)
971
@@ -811,6 +987,62 @@ def pretty_str(envinfo):
987 mutable_dict["conda_packages"], "[conda] "
988 )
989 mutable_dict["cpu_info"] = envinfo.cpu_info
990 +
991 + CUDA_FMT = """
992 +==============================
993 + CUDA / GPU Info
994 +==============================
995 +Is CUDA available : {is_cuda_available}
996 +CUDA runtime version : {cuda_runtime_version}
997 +CUDA_MODULE_LOADING set to : {cuda_module_loading}
998 +GPU models and configuration : {nvidia_gpu_models}
999 +Nvidia driver version : {nvidia_driver_version}
1000 +cuDNN version : {cudnn_version}
1001 +HIP runtime version : {hip_runtime_version}
1002 +MIOpen runtime version : {miopen_runtime_version}
1003 +Is XNNPACK available : {is_xnnpack_available}
1004 +""".strip()
1005 +
1006 + XPU_FMT = """
1007 +==============================
1008 + Intel XPU / GPU Info
1009 +==============================
1010 +Is XPU available : {xpu_available}
1011 +XPU runtime version : {xpu_runtime_version}
1012 +Intel GPU models : {intel_gpu_models}
1013 +
1014 +--Compile time--
1015 +oneAPI compiler version : {oneapi_compiler_version}
1016 +SYCL compiler build : {sycl_version}
1017 +oneCCL version : {oneccl_version}
1018 +
1019 +--Runtime--
1020 +Intel Graphics Compiler (IGC): {intel_graphics_compiler_version}
1021 +Intel GMM (libigdgmm) : {libigdgmm_version}
1022 +Level Zero loader version : {level_zero_loader_version}
1023 +Level Zero driver version : {level_zero_driver_version}
1024 +vLLM XPU kernels version : {vllm_xpu_kernels_version}
1025 +""".strip()
1026 +
1027 + invalid_vers = {"N/A", "Could not collect", "None"}
1028 + sections = []
1029 +
1030 + if (
1031 + mutable_dict.get("is_cuda_available") in ("True", "Yes")
1032 + or mutable_dict.get("cuda_compiled_version") not in invalid_vers
1033 + ):
1034 + sections.append(CUDA_FMT)
1035 +
1036 + if (
1037 + mutable_dict.get("xpu_available") in ("True", "Yes")
1038 + or mutable_dict.get("xpu_runtime_version") not in invalid_vers
1039 + ):
1040 + sections.append(XPU_FMT)
1041 +
1042 + mutable_dict["gpu_info"] = (
1043 + ("\n\n".join(sections) + "\n").format(**mutable_dict) if sections else ""
1044 + )
1045 +
1046 return env_info_fmt.format(**mutable_dict)
1047
1048