1
0

Intel iGPUをパススルーして利用する - vSphere VM編

Posted at

この記事は vExperts Advent Calendar 2023 の12月21日分の投稿記事です。

はじめに

Intel NUC 13ではモバイル向け第13世代Coreプロセッサ(Raptor Lake)がCPUとして利用されています。第12世代Coreプロセッサ(Alder Lake)から、高性能コア(P-Core)と高効率コア(E-Core)の2種類のCPUを搭載するPerformance Hybrid Architectureで構成されており、内蔵GPU(iGPU)としてIris Xe Graphicsが搭載されています。
Intel NUC 13(IntelCore i7-1360P)にESXiをインストールし、パススルーしたIris XeをGPUを仮想マシンから使って、OpenVINOによりStable DiffusionでText-to-Imageを試してみます。

VMware ESXiはIntel コンシューマー向けCPUのPerformance Hybrid Architectureをサポートしていません。本記事の内容はVMwareがサポートする内容ではありません。

本記事は仮想マシンとしてIntel iGPUを利用する方法を説明しています。仮想マシン上のKubernetes Podから利用する場合はこちらの記事を参照してください。

VMware ESXiのインストール

Raptor LakeにESXiをインストールしようとすると、ESXiがAlder Lakeから実装されたPerformance Hybrid Architectureに対応していないため、インストーラー起動時のチェックでPSODになってしまいます。

image.png

カーネルオプションでE-Coreに対するチェックを無視するか、BIOSでE-Coreを無効化するか、どちらかでインストーラーの起動が可能です。ESXiとしてはコンシューマー向けCPUをサポートする予定はないようなので、E-Coreを無効化するのが推奨のようです。

参考 : Intel 12/13世代のCPUへの対応に関して

オプション1 : 起動オプションの修正

  • ESXiインストーラー起動時のカーネルオプションを指定して、インストール後にカーネルオプションを変更する。
    kernelopt=weaselInstalled autoPartition=FALSE cpuUniformityHardCheckPanic=FALSE
    
  • インストール完了後、インストールしたESXiで以下の設定が必要。
    esxcli system settings kernel set -s cpuUniformityHardCheckPanic -v FALSE
    

オプション2 : E-Coreの無効化

ESXi上のIris Xeの認識

ESXi 8.0u1をインストールすると、Iris Xeは「Intel Corporation VGE compatible Controller」として認識されます。このままでもパススルーデバイスとして構成し、仮想マシンに接続することが可能です。

image.png

2023年10月リリースされたESXi 8.0u2以降、「Intel Corporation Raptor Lake-P [Iris Xe Graphics]」として認識されるようになっています。

image.png

仮想マシンへのIris Xeの接続

ESXiでデバイスをパススルーデバイスとして設定すると、仮想マシン(4vCPU/16GB RAM)にPCIデバイスとして接続することが可能です。パススルーを利用するには仮想マシンの割当メモリーの「すべてのゲスト メモリを予約 (すべてロック)」をチェックする必要があります。

image.png

ゲストOSの設定

Ubuntu 22.04.3 LTSのデフォルトのカーネルとして 5.15 (5.15.0-89-generic) が利用されていますが、Raptor Lake-PのiGPUをカーネルが認識するには、カーネル 5.19 以降であるためそのままでは利用できませんでした。HWE(Hardware Enablement)カーネルをインストールすることでカーネルとして 6.2(6.2.0-37-generic) の利用が可能になり、カーネルモジュールとしてi915が読み込まれます。

HWEカーネルインストール前はデバイスID 0xa7a0を「VGE compatible controller」として認識していますが、カーネルモジュールとして、i915がロードされていません。

root@ubuntu:~# uname -r
5.15.0-89-generic
root@ubuntu:~# lspci -k -s 02:05.0
02:05.0 VGA compatible controller: Intel Corporation Device a7a0 (rev 04)
        DeviceName: pciPassthru0
        Subsystem: Intel Corporation Device 3037
root@ubuntu:~# lsmod | grep i915

HWEカーネルをインストールして再起動します。

sudo apt-get install -y linux-image-generic-hwe-22.04 && sudo reboot

再起動後に確認するとカーネルとして 6.2.0-37-generic が利用されていて、デバイスID 0xa7a0をGPU(i915)として認識されてカーネルモジュールがロードされています。

root@ubuntu:~# uname -r
6.2.0-37-generic
root@ubuntu:~# lspci -k -s 02:05.0
02:05.0 VGA compatible controller: Intel Corporation Device a7a0 (rev 04)
        DeviceName: pciPassthru0
        Subsystem: Intel Corporation Device 3037
        Kernel driver in use: i915
        Kernel modules: i915
root@ubuntu:~# lsmod | grep i915
i915                 3899392  0
drm_buddy              20480  1 i915
i2c_algo_bit           16384  1 i915
drm_display_helper    212992  1 i915
cec                    94208  2 drm_display_helper,i915
ttm                   110592  3 vmwgfx,drm_ttm_helper,i915
drm_kms_helper        249856  5 vmwgfx,drm_display_helper,i915
video                  73728  1 i915
drm                   700416  9 vmwgfx,drm_kms_helper,drm_display_helper,drm_buddy,drm_ttm_helper,i915,ttm

OpenCLランタイムのインストール

Intelのリポジトリを追加してGPUを使用するためにOpenCLランタイムをインストールします。

wget -qO - https://repositories.intel.com/gpu/intel-graphics.key | \
  sudo gpg --dearmor --output /usr/share/keyrings/intel-graphics.gpg
echo "deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu jammy client" | \
  sudo tee /etc/apt/sources.list.d/intel-gpu-jammy.list
sudo apt update
sudo apt-get install -y ocl-icd-libopencl1 intel-opencl-icd intel-level-zero-gpu level-zero

OpenVINOのインストール

PyPIでOpenVINOをインストールして、GPUが認識されていることを確認します。

apt-get install -y python3.10-venv
python3 -m venv openvino_env
source openvino_env/bin/activate
python -m pip install --upgrade pip
python -m pip install openvino
python -c "from openvino.runtime import Core; print(Core().available_devices)"

以下のような出力になれば、PythonからGPUが利用可能な状態です。

$ python -c "from openvino.runtime import Core; print(Core().available_devices)"
['CPU', 'GPU']

GPUにアクセスするためのデバイスである/dev/dri/render*のパーミッションが640となっているため、非rootユーザーはGPUを利用することができません。

root@ubuntu:~# ls -l /dev/dri/render*
crw-rw---- 1 root render 226, 128 Dec  7 22:19 /dev/dri/renderD128
crw-rw---- 1 root render 226, 129 Dec  7 22:19 /dev/dri/renderD129

GPUを利用するにはユーザーをrenderグループに追加するか、以下のようなudevルールを追加してデバイスのパーミッションを修正します。

echo 'KERNEL=="render*" GROUP="render", MODE="0666"' > /etc/udev/rules.d/99-render.rules

Notebookの起動

Stable Diffusionの実行はOpenVINO Notebooksとして公開されているので、今回はJupyter Notebookで実行します。

source $HOME/openvino_env/bin/activate
git clone --depth=1 https://github.com/openvinotoolkit/openvino_notebooks.git
cd openvino_notebooks
pip install wheel setuptools
pip install -r requirements.txt
jupyter lab --ip 0.0.0.0 notebooks

起動が完了すると、以下のようにTokenが含まれるURLが表示されるのでコピーしてブラウザで開きます。

[C 2023-12-07 22:43:35.426 ServerApp]

    To access the server, open this file in a browser:
        file:///home/ubuntu/.local/share/jupyter/runtime/jpserver-1343-open.html
    Or copy and paste one of these URLs:
        http://ubuntu:8888/lab?token=f0060167f4abffc3e4a0843c1c8e3b1248a1452b679f23fb
        http://127.0.0.1:8888/lab?token=f0060167f4abffc3e4a0843c1c8e3b1248a1452b679f23fb

ブラウザでアクセスしたら、/236-stable-diffusion-v2/236-stable-diffusion-v2-text-to-image-demo.ipynbを開いて実行します。

image.png

Stable Diffusionによるイメージの生成

  • Step 3.2: Select infrence device部分で推論デバイスをAUTO、GPU、CPUから選択することができます。
    image.png

  • Step 3.3: Run Text-to-Image geenerationでtext_promptを変更して画像を作成することができます。
    image.png

text_prompt = "Shibuya city filled by many cats, epic vista, beautiful landscape, 4k, 8k"

  • 作成された画像はNotebook内に表示されます。
    image.png

GPUの効果測定

推論デバイスとしてGPUを利用した場合に本当に効果があるかどうか、時間を測ってみました。

CPU利用時 GPU利用時
イメージ作成時間 312.26 sec 74.51 sec

GPUを使うことで、イメージ作成時間は1/4以上削減できました。

  • CPU利用時
    image.png

  • GPU利用時
    image.png

まとめ

Intel CPUに統合されたGPUをVMware ESXiでパススルーして、仮想マシン上内のプログラムでGPUを使って画像生成することができました。
仮想マシンでKubernetesクラスターを構成して、コンテナからGPUを利用する方法についてはこちらの記事で説明してます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0