From 9a4ee8a41db3cb48f5eda1d1ab5ea083c7aadba9 Mon Sep 17 00:00:00 2001 From: Dmitry Rogozhkin Date: Tue, 10 Jun 2025 17:43:54 -0700 Subject: [PATCH 1/2] doc: improve readme Fixes: #1731 Signed-off-by: Dmitry Rogozhkin Co-authored-by: Gajanan Choudhary --- README.md | 94 ++++++++++++++++++++++++++++++++++++----- docs/torch_xpu_ops.jpg | Bin 39067 -> 56359 bytes 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 64dbc43219..113de44bfc 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,24 @@ # Torch XPU Operators* -Torch XPU Operators* implements PyTorch ATen operators for Intel GPU devices, aiming to agilely support PyTorch ATen operations and buffer these operations for Intel GPU upstreaming . For more details, refer to [SYCL kernels for ATen Operators RFC](https://github.com/pytorch/pytorch/issues/114835) for more details. +Torch XPU Operators* project is an integral part of [PyTorch](https://github.com/pytorch/pytorch) to support XPU acceleration backend. The PyTorch build system automatically clones this repository at the pin pointed commit, branch, or tag specified in the following file of the [PyTorch repository](https://github.com/pytorch/pytorch): -## Overview +* https://github.com/pytorch/pytorch/blob/main/third_party/xpu.txt -

- -

+Cloned copy becomes available at `./third_party/torch-xpu-ops/` relative to the root of the checked out PyTorch tree. - * SYCL Implementation for XPU Operators: The Operators in this staging branch will finally be upstreamed to PyTorch for Intel GPU. +Torch XPU Operators* implements some of the operators for Intel GPU devices accessible via PyTorch XPU acceleration backend: + +* PyTorch ATen operators +* Torchvision operators + +

+ +

+ +Most operators are implemented as SYCL kernels, the sources of which are available in this repository. Some operators (linear algebra) +are implemented through calls to the [Intel® oneAPI Math Kernel Library (oneMKL)](https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.html). + +Note that a few operators (convolution and matrix-matrix multiplication (`gemm`)) for the PyTorch XPU backend are implemented directly in PyTorch sources through calls to the [oneAPI Deep Neural Network Library (oneDNN)](https://github.com/uxlfoundation/oneDNN). These sources can be found in the PyTorch repository at https://github.com/pytorch/pytorch/tree/main/aten/src/ATen/native/mkldnn/xpu. ## Requirements @@ -17,14 +27,78 @@ For the hardware and software prerequiste, please refer to [PyTorch Prerequisite * Intel GPU Driver: Install Intel GPU drivers along with compute and media runtimes and development packages. * Intel® Deep Learning Essentials: Install a subset of Intel® oneAPI components needed for building and running PyTorch. -## Build +## Build and install + +This project cannot be built or installed as a stand-alone. This project gets built when PyTorch is built with XPU backend support. -Need to built this project as a submodule of PyTorch, after install Intel GPU Driver and Intel Deep Learning Essentials. +**To install PyTorch with XPU backend from pre-built binary packages**, use one of the available distribution channels: + +* For release builds: + +``` +pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/xpu +``` + +* For nightly builds + +``` +pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/xpu +``` + +**To build PyTorch with XPU backend from sources**, refer to the [Intel GPU Support](https://github.com/pytorch/pytorch/blob/main/README.md#intel-gpu-support) section of the [PyTorch documentation](https://github.com/pytorch/pytorch/blob/main/README.md#from-source). In summary, the PyTorch build for XPU backend can be triggered as follows: ```bash -# Setup PyTorch source project. torch-xpu-ops is included by default. -python setup.py install +git clone https://github.com/pytorch/pytorch.git && cd pytorch +pip install -r requirements.txt +python setup.py install >log.txt 2>&1 +``` + +Look for the following lines in the log file indicating that XPU backend is being built: + ``` +$ cat log.txt | grep -E "(USE_XPU|USE_XCCL)\s*:" +-- USE_XPU : 1 +-- USE_XCCL : ON +``` + +If building from sources, note the following environment variables which control the PyTorch XPU backend build: + +| Environment variable | Default | Notes | +| --- | --- | --- | +| `USE_XPU` | `ON` | Enables XPU backend support | +| `USE_XCCL` | `ON` (>= PT2.8) | Enables XCCL distributed backend support | +| `TORCH_XPU_ARCH_LIST` | depends on the PT and OS versions | Build SYCL kernels for specified platform(s) | + +The `TORCH_XPU_ARCH_LIST` allows to specify a comma separated list of platforms for which SYCL kernels will be built. This helps to reduce the build time. This option does not affect oneDNN- or oneMKL-based operators. Note that if PyTorch is executed on a platform that the SYCL kernels were not built for, then they are compiled just-in-time (JIT). + +## Verification + +Once PyTorch is built or installed, verify that PyTorch XPU backend is available as follows: + +``` +$ python3 -c "import torch; print(torch.xpu.is_available())" +True +python3 -c "import torch; print(torch.distributed.distributed_c10d.is_xccl_available())" +True +``` + +# FAQ + +Some confusion might arise about relationship of this repostory and PyTorch XPU backend in general with [Intel® Extension for PyTorch (IPEX)](https://github.com/intel/intel-extension-for-pytorch). See answers on that below. + +**Does the PyTorch XPU backend implementation use IPEX?** + +No. PyTorch XPU backend implementation does not use IPEX and can be used without IPEX levaraging: + +- Standard PyTorch API to access eager mode operators, compile modules (including Triton kernels), profiling, etc. +- SYCL kernels to enhance applications with custom operators via PyTorch CPP Extension API + +**Does IPEX depend on this repository through the PyTorch XPU backend implementation?** + +Yes. IPEX relies on the PyTorch XPU backend implementation (which includes this repository) and augments it with additional features and operators. +Moreover, IPEX implements select features and operators outside of standard PyTorch API that are required in popular AI frameworks such as vLLM, Huggingface TGI, SGLang, and others. +The ultimate long term goal is to upstream or substitute with better upstream implementations as much of IPEX code as possible. +Each subsequent IPEX release is a step toward that goal as fewer features are being implemented in IPEX and more are instead taken from other upstream projects. ## Security See Intel's [Security Center](https://www.intel.com/content/www/us/en/security-center/default.html) for information on how to report a potential security issue or vulnerability. diff --git a/docs/torch_xpu_ops.jpg b/docs/torch_xpu_ops.jpg index e4bb1dfcab7d46aa112867603aad8d652f8d9609..354be8808b5861331d5081998752ed76c14bb00b 100644 GIT binary patch literal 56359 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 T9*SQ{{CzR(|KY#n&g7o~0$)N2 literal 39067 zcmeEv2UrvB(&!=}9YjES5fG3ny%RxcB30>4=^@fvs8K8^RX{+Iq97nO(mN69A|hR> z(tB?KLUPwrzVpc`|9AfX-us+;AETRHcHcJh&dfVIGw%fV755!Db4^WC4Zy?01K{94 z05^GRMHLQp003=mfFA$=Vt@co9ykSFkpTeSwJ<0^0AAyP|BX^of1H7H0C4K_5(_{C z-XjP9Rss)zWeNQH@$}aRxDNFZBx+Ixb?Abg7dCv4J!SbOu7;J53lxY$2k?bbl=IJORDl021 za!E`?OiTzYA>`%n>U|q7Z98#MAvx2u-ii#?ToG7Ot@&g&a8|eSuk^doVDJj_5%Gv%HyPM~qyT4)Y@jsjGJ5Z&+36np= z2;Tbh1=u)9c_btx3L?Mn_wNz$r#m3wf%SePQ?Mq-|Ao(gawmUdb$eHkzx_Z)#*F}1 z03t%d(}V;>rwLCJ6A=-UQj>u=CZ(e~Lr%>=$Hd4$$3V}_#(SQb^#UtB1E({ zf&xq&BH|+aV!ZqU{68AOBO)dyB_X9HBctVKVPN6^w?DY|05vh5?5TBpJWk*gH6A`S z9P#*3RC+(FyA8}hol5Afpy3p|M@*{{ z`?|Q1giG9DgU-gYhx8n`#N>s|AE5mSvOfk`=zj~c-vIj?T*Cl4J{~xE_|yOdI8+Pg zdv)sn<>OtD9}eK2Z%*GMt-%33+U5iIr%?yIO58Z$o#7BR-1+U=gFU6d-XQkZmQEGo z-L^HRF4KN)vaOnWnv;1GnDcCGIN%ims~(R7!V4*gu&Q0s*m_PJ@P*JC8Ce+B!e4Uj zO=Ym@KCL_4QAemRx-;VvWRiGe{}>+!Y$>E;4B0mxzyq=OaKHhZE|$M?p`f8Y90#PA z98DY~A8V1}0Hx`DE`02n7%IdU2oB)tzyU4#IDl9^47I?H17c@zz*K%nxYBR6!usE# zw$~t@|3yEU%U_WPMO zRCBbfRTBpDjUrPurIE%VVO?`O(B6DHor};O^W1t>TI09yNmW`sydQ^&k~|KG^P18< zBD6#-WEU1BGtMZ9YD$~;VRUUEjAh3|5f4#RXz&aCdnar##Up5&;M zJ*lBe1F?vRp{ca;tV zY31@;TD%7$0?6Io&*Nk94+lCabaY55hl~RP#@1(xQ#=egv*(bG_Q^azOOn>{Akkw!Y=QWCeB?y6oH{^G_L0ub)icQlHRkrbbU?Fqrgv z%p^uHyCfU0S!{Y{XLYk0rX6Lk)<^S)FRj+;A0rFDwiRZT`BGmu;nSg?J+G|vqQzoU zaGW!Ic-1wtvZjv*QX5OH5#`m$FvFIT5^imD|9*}|m465ncS6Bx+8B}m zY}m(nL~B^ilAFFN-AdXSeN|fE$6-VjjRR&<(DB$tW9!3<`2i|Oq2y)TFvi$271ugEcAc!*{KU+_%$GTixTW@+rc8Xsu$qB!Pe^D14nW{F4INd6`6^(e{v2M{qSKwiIR&yD) z{%tMN{z3K#Ol!n-*}?lzCqHYkbcxBXq*Eyg{`%^q`$v!cVl*~1zw`FwbIxSdL1E#S z(5;N<(bwH~5*Z*_xAe7^DcTZRpT(P8QXcUFUV^G$Vy zMb9y72922Te+2!L|&}#C@}Q+CkXtWDb>GBC^V^PUgR8=$$%P`K6{T;bwgA z@PZGQey_LC*|ib%nz+NY-Jr_n&9*nK0`R+4oae)^A41s2i*o149O{O<*vC~=Zlmxm z44qU9EL2~0y~$Ib(dJ8de!q%Mj%AviZ`JbVrcuI7LL5{$Ii=h^s

;O|x=HcliqJ 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 From e5f58db5347b6ec885e3ff24bb99f2233f57c60b Mon Sep 17 00:00:00 2001 From: Dmitry Rogozhkin Date: Tue, 17 Jun 2025 08:13:12 -0700 Subject: [PATCH 2/2] Address code review comments Signed-off-by: Dmitry Rogozhkin --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 113de44bfc..40df701684 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # Torch XPU Operators* -Torch XPU Operators* project is an integral part of [PyTorch](https://github.com/pytorch/pytorch) to support XPU acceleration backend. The PyTorch build system automatically clones this repository at the pin pointed commit, branch, or tag specified in the following file of the [PyTorch repository](https://github.com/pytorch/pytorch): +Torch XPU Operators* project is an integral part of [PyTorch](https://github.com/pytorch/pytorch) to support Intel GPUs (the device backend name of Intel GPUs in PyTorch is XPU). The PyTorch build system automatically clones this repository at the pin pointed commit, branch, or tag specified in the following file of the [PyTorch repository](https://github.com/pytorch/pytorch): * https://github.com/pytorch/pytorch/blob/main/third_party/xpu.txt Cloned copy becomes available at `./third_party/torch-xpu-ops/` relative to the root of the checked out PyTorch tree. -Torch XPU Operators* implements some of the operators for Intel GPU devices accessible via PyTorch XPU acceleration backend: +Torch XPU Operators* implements most of the operators for Intel GPU devices accessible via PyTorch XPU acceleration backend: * PyTorch ATen operators * Torchvision operators @@ -96,9 +96,6 @@ No. PyTorch XPU backend implementation does not use IPEX and can be used without **Does IPEX depend on this repository through the PyTorch XPU backend implementation?** Yes. IPEX relies on the PyTorch XPU backend implementation (which includes this repository) and augments it with additional features and operators. -Moreover, IPEX implements select features and operators outside of standard PyTorch API that are required in popular AI frameworks such as vLLM, Huggingface TGI, SGLang, and others. -The ultimate long term goal is to upstream or substitute with better upstream implementations as much of IPEX code as possible. -Each subsequent IPEX release is a step toward that goal as fewer features are being implemented in IPEX and more are instead taken from other upstream projects. ## Security See Intel's [Security Center](https://www.intel.com/content/www/us/en/security-center/default.html) for information on how to report a potential security issue or vulnerability.