Pytorch 使用內顯加速

將CPU的性能榨的一滴不剩 - 安裝 Pytorch 並且進行在 Intel CPU 的內顯上性能優化。

由於買不起 GPU,只好將手上的 CPU 性能榨的一滴不剩。
這篇文章將介紹如何安裝 Pytorch 並且進行在 Intel CPU 的內顯上性能優化。


02/20 更新:

後來發現不用手動編譯就有支援iGPU。

1
2
3
4
5
6
7
8
9
mamba create -n intel intelpython3_full python=3.12 -c https://software.repos.intel.com/python/conda -c conda-forge --override-channels

mamba activate intel

pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 intel_extension_for_pytorch==2.5.10 numpy==1.26.4 --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/

conda install pkg-config libuv

python -c "import torch; import intel_extension_for_pytorch as ipex; print(torch.__version__); print(ipex.__version__); [print(f'[{i}]: {torch.xpu.get_device_properties(i)}') for i in range(torch.xpu.device_count())];"

雖然在 training 的時候 loss.backward() 直接卡住,但在 inference 的時候有確實占用GPU。


工具與環境:

  • Windows 11
  • Intel i5-1145G7(Intergrated Intel Iris Xe Graphics)
  • Microsoft Visual Studio Community 2022
    • Workloads: Desktop development with C++
    • Separate options: MSVC and Windows SDK
  • Mamba with python==3.11.11

安裝開發套件與驅動

由於我們要直接從源碼編譯,所以需要安裝開發套件。

  • Intel Deep Learning Essentials
  • PyTorch dev support package

還有 Intel 顯示卡的驅動。

  • Intel & Iris Xe Graphics - Windows Drivers

開始編譯

注意:以下步驟必須一氣呵成,不可中斷。

  1. 下載腳本 https://github.com/intel/intel-extension-for-pytorch/raw/v2.5.10%2Bxpu/scripts/compile_bundle.bat
  2. 由於該腳本是 LF 格式,所以需要轉換成 Windows 需要 CRLF 格式(可以用 vscode 轉換)
  3. 接著打開 Intel oneAPI command prompt for Intel 64 for Visual Studio 2022 並執行以下指令:
1
2
3
"C:\Program Files (x86)\Intel\oneAPI\pytorch-gpu-dev-0.5\oneapi-vars.bat"
"C:\Program Files (x86)\Intel\oneAPI\ocloc\2024.2\env\vars.bat"
set "_GLIBCXX_USE_CXX11_ABI=1"
  1. 切換到腳本所在目錄,執行腳本
1
./compile_bundle.bat "c:\program files (x86)\intel\oneapi\compiler\latest" "c:\program files (x86)\intel\oneapi\mkl\latest" tgllp

接著就是漫長的等待時間,等待編譯完成以我的破筆電大概要 6 小時。

如果順利的話,此時虛擬環境內應該已經有 pytorch, torchvision 和 torchaudio。

Intel Extension for PyTorch

沒意外的話,編譯階段會在編譯 Intel Extension for PyTorch 時失敗,這是因為 Intel Extension for PyTorch v2.5.10+XPU 並不支援 Tiger Lake 的 CPU,我們需要到 intel-extension-for-pytorch\csrc\gpu\aten\operators\xetla\kernels\CMakeLists.txt 的第 18 行手動加上 tgllp(如果不是用第 11 代 CPU,請參考表格)。

1
2
3
set(AOT_REGEX_XE_HPC "(xe-hpc.*|pvc|bmg-.*|lnl-.*|xe2-.*)")
set(AOT_REGEX_XE_HPG "(xe-hpg.*|ats-m150|acm-.*|dg2-.*)")
set(AOT_REGEX_XE_LPG "(xe-lpg.*|mtl-.*|0x7d55|0x7dd5|0x7d57|0x7dd7|tgllp)") # Add tgllp

接著我們需要修改 compile_bundle.bat,把已經安裝好的部分拿掉,只編譯 Intel Extension for PyTorch。(我可不想再等 6 小時) 且為了避免後面的鬼問題,我們要安裝最新版的 cmake 與 ninja。並把 compile_bundle.bat 的 pip cmake 指令移除。

1
conda upgrade cmake ninja

修改完成後,總算可以開始編譯 Intel Extension for PyTorch 了。只是此時的指令要改成:

1
./compile_bundle.bat "c:\program files (x86)\intel\oneapi\compiler\latest" "c:\program files (x86)\intel\oneapi\mkl\latest" mtl-h,tgllp

那個多的 mtl-h 是因為只編譯 tgllp 的話會失敗,所以我隨便加的一個。

等待大約 2 小時後,Intel Extension for PyTorch 就編譯完成了。

測試

1
2
3
4
5
import torch
import intel_extension_for_pytorch as ipex
print(torch.__version__)
print(ipex.__version__)
[print(f'[{i}]: {torch.xpu.get_device_properties(i)}') for i in range(torch.xpu.device_count())]

為了日後更方便使用,將以下指令加入 %CONDA_PREFIX%\etc\conda\activate.d\env_vars.bat 中。

1
2
3
4
@call "C:\Program Files (x86)\Intel\oneAPI\setvars.bat"
@call "C:\Program Files (x86)\Intel\oneAPI\pytorch-gpu-dev-0.5\oneapi-vars.bat"
@call "C:\Program Files (x86)\Intel\oneAPI\ocloc\2024.2\env\vars.bat"
set "OMP_NUM_THREADS=4"

結語

大約一個月後,Intel Extension for PyTorch 就會出 v2.6 版本,到時就能使用 Python v3.13 搭配 PyTorch v2.6 了。其實現在也可以使用 Python v3.12,只是我裝錯又不想重新等 6+2 小時。


參考資料