外付け GPU

提供: ArchWiki
2023年8月24日 (木) 18:40時点におけるAshMyzk (トーク | 投稿記録)による版 (同期 & 翻訳)
ナビゲーションに移動 検索に移動

関連記事

Thunderbolt 3 以上を搭載したコンピュータは、GPU エンクロージャを使用して、デスクトップグレードの外付けグラフィックカード (eGPU) を接続できます。eGPU.io は購入者ガイドとコミュニティフォーラムのある優れたリソースです。ほとんどの操作モードでは、いくつかの手動設定 (以下に記載) が必要ですが、eGPU の Linux サポートは一般的に良好です。

インストール

Thunderbolt

eGPU エンクロージャの Thunderbolt デバイスは、挿入した後にまず (BIOS/UEFI のファームウェア設定に基づいて) 認証する必要があるかもしれません。Thunderbolt#ユーザーデバイス認証 の指示に従ってください。それができたら、外付け GPU が lspci に表示されるはずです:

$ lspci | grep -E 'VGA|3D'
00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 620 (rev 07)             # 内部 GPU
1a:10.3 VGA compatible controller: NVIDIA Corporation GP107 [GeForce GTX 1050] (rev a1)    # 外付け GPU

あなたのコンピュータ、コンピュータのファームウェア、そしてエンクロージャのファームウェアによっては、PCIe のレーン数と OPI のモードにより、Thunderbolt によってホスト <-> eGPU 間の帯域幅がある程度制限されます:

# dmesg | grep PCIe
[19888.928225] pci 0000:1a:10.3: 8.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s PCIe x4 link at 0000:05:01.0 (capable of 126.016 Gb/s with 8.0 GT/s PCIe x16 link)

ドライバ

GPU モデルと互換性のあるドライバをインストールする必要があります:

  • AMDGPU
  • NVIDIA プロプライエタリな Nvidia ドライバ
  • Nouveau オープンソースな Nvidia ドライバ

インストールに成功しているならば、lspci -k の出力でドライバとカードが関連付けられているはずです:

$ lspci -k
1a:10.3 VGA compatible controller: NVIDIA Corporation GP107 [GeForce GTX 1050] (rev a1)
        Subsystem: NVIDIA Corporation GP107 [GeForce GTX 1050]
        Kernel driver in use: nvidia
        Kernel modules: nouveau, nvidia_drm, nvidia

コンピューティングのみのワークロード

インストール作業を完了したら、何も描画する必要のない GPGPU#CUDA のようなコンピューティングのみのワークロードは追加の設定無しで機能するはずです。nvidia-smi ユーティリティはプロプライエタリな NVIDIA ドライバで動作するはずです。プロプライエタリな Nvidia NVENC/NVDEC も動作するはずです (OpenGL interop 無しで)。

このようなユースケースではホットプラグも完全にサポートされているはずです。また、ホットアンプラグも可能なはずです (おそらく、使用するドライバに依ります)。Nvidia では、nvidia-persistenced をアクティブ化していると、クリーンなホットアンプラグが妨害されると予想されます。

Xorg

内部 カード (iGPU) と外付けカード (eGPU) を組み合わせたセットアップには複数のバリエーションがあり、それぞれに長所と短所があります。

eGPU で Xorg を描画し、iGPU に PRIME ディスプレイオフロード

  • GPU を使用するプログラムのほとんどは設定せずとも eGPU 上で動作します: glxinfo/glxgearseglinfo/eglgears_x11NVENC/NVDEC (OpenGL interop を含む)。
  • Xorg は、eGPU が挿入された状態でのみ起動します。
  • eGPU に接続されているモニターは設定せずとも動作します。iGPU に接続されているモニター (つまり、ノート PC の画面) に対しては PRIME ディスプレイオフロードを使用できます。

主な記事は PRIME#ディスクリートカードをプライマリ GPU にするPRIME#Reverse PRIME です。また、NVIDIA ドライバのドキュメントの Chapter 33. Offloading Graphics Display with RandR 1.4 でも文書化されています。

以下のような Xorg の設定スニペットを使ってください:

/etc/X11/xorg.conf.d/80-egpu-primary-igpu-offload.conf
Section "Device"
    Identifier "Device0"
    Driver     "nvidia"
    BusID      "PCI:26:16:3"                 # lspci の出力に応じて書き換えてください。また、16進数から10進数に変換してください。
    Option     "AllowExternalGpus" "True"    # プロプライエタリな NVIDIA ドライバで必要です。
EndSection

Section "Module"
    # iGPU 用の modesetting モジュールをロードします。modesetting は XrandR 1.4 でプロバイダとして表示されるはずです。
    Load "modesetting"
EndSection
ノート: Xorg は10進数のバス ID を使用しますが、他のほとんどのツールは16進数を使用します。なので、xorg.conf スニペットでは 1a:10.326:16:3 に変換しなければならなかったのです。
ヒント: 最近の Xorg では、ServerLayout セクションと Screen セクションを指定する必要はもうありません。これらは自動的に推測されます。最初に定義された Device がプライマリとみなされます。

このセットアップを検証するには、xrandr --listproviders を使ってください。以下のように表示されるはずです:

Providers: number : 2
Provider 0: id: 0x1b8 cap: 0x1, Source Output crtcs: 4 outputs: 4 associated providers: 0 name:NVIDIA-0
Provider 1: id: 0x1f3 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 3 outputs: 5 associated providers: 0 name:modesetting

RandR 1.4 PRIME ディスプレイオフロードを使用することにより、iGPU に接続されているノート PC の内蔵ディスプレイと、同じく iGPU に接続されている他のモニタの一方/両方に出力することができます。上記の xrandr --listproviders で出力されている名前を使用して、以下のようなコマンドを実行してください:

xrandr --setprovideroutputsource modesetting NVIDIA-0 && xrandr --auto
ノート: xrandr --auto は任意であり、他の RandR ベースのディスプレイ設定ツールに置き換えても良いです。このコマンドがあることにより、全ての画面が真っ暗になってしまう状況を回避できます。

ディスプレイマネージャがログインプロンプトを表示する前や、デスクトップ環境が開始する前にこのコマンドを実行したい場合があるでしょう。これに関しては Xrandr#設定Xinit を見てください。

Vulkan は Xorg とは独立して GPU を列挙する場合があります。なので、この環境で vkcube などを実行するには、--gpu_number 1 オプションを渡す必要があるかもしれません。または、__NV_PRIME_RENDER_OFFLOAD=1 vkcube かそれと等価な prime-run vkcube を使って、列挙中に GPU を並べ替えるレイヤーをアクティブ化しても、同じ効果があります。

ヒント: ノート PC 上で optimus-manager を使っている場合、モードとグラフィックスカードに対応する /etc/optimus-manager/xorg/ 内の適切なファイルに eGPU の BusId を追加することで、eGPU でレンダリングすることができます。

iGPU で Xorg を描画し、eGPU に PRIME レンダーオフロード

  • プログラムはデフォルトで iGPU 上で描画されますが、PRIME レンダーオフロードを使って eGPU 上で描画することもできます。
  • Xorg は eGPU が接続されていなくても開始しますが、再起動しない限りレンダー/ディスプレイオフロードは機能しません。
  • iGPU に接続されているモニタ (つまり、ノート PC の内蔵ディスプレイ) は設定せずとも動作します。eGPU に接続されているモニタに対しては PRIME ディスプレイオフロードを使用できます。

主な記事は PRIME#PRIME GPU オフロード です。また、NVIDIA ドライバのドキュメントの Chapter 34. PRIME Render Offload でも文書化されています。

多くのディスクリート GPU ドライバで、Xorg が手動で設定されていない場合はこのモードがデフォルトになっているはずです。動作しない場合や、プロプライエタリな NVIDIA ドライバを使用している場合は、以下の設定を使用してください:

/etc/X11/xorg.conf.d/80-igpu-primary-egpu-offload.conf
Section "Device"
    Identifier "Device0"
    Driver     "modesetting"
EndSection

Section "Device"
    Identifier "Device1"
    Driver     "nvidia"
    BusID      "PCI:26:16:3"                 # lspci の出力に応じて書き換えてください。また、16進数から10進数に変換してください。
    Option     "AllowExternalGpus" "True"    # プロプライエタリな NVIDIA ドライバで必要です。
EndSection

このセットアップを検証するには、xrandr --listproviders を使ってください。以下のように表示されるはずです:

$ xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x47 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 3 outputs: 5 associated providers: 0 name:modesetting
Provider 1: id: 0x24a cap: 0x2, Sink Output crtcs: 4 outputs: 4 associated providers: 0 name:NVIDIA-G0

PRIME レンダーオフロードを使えば、some_programeGPU 上レンダリングすることができます:

  • プロプライエタリな NVIDIA ドライバの場合:
    $ __NV_PRIME_RENDER_OFFLOAD=1 __VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia some_program
  • プロプライエタリな NVIDIA ドライバの場合 (便利なラッパー):
    $ prime-run some_program
  • オープンソースなドライバの場合:
    $ DRI_PRIME=1 some_program

RandR 1.4 PRIME ディスプレイオフロードを使えば、eGPU に接続されたモニタに出力することができます:

$ xrandr --setprovideroutputsource NVIDIA-G0 modesetting && xrandr --auto
ヒント: この場合、プロバイダの順番が異なり、Nvidia の名前も若干異なります。

NVIDIA drivers 460.27.04+ では、レンダーオフロードとディスプレイオフロードを組み合わせた特殊なケースにおける最適化が実装されています:

“Reverse PRIME Bypass” のサポートを追加しました。これは、レンダーオフロードされたアプリケーションがフルスクリーンで、リダイレクトされておらず、NVIDIA 駆動の PRIME ディスプレイオフロードされた出力でしか表示されない条件で発生する、PRIME レンダーオフロードと PRIME ディスプレイオフロードの帯域幅のオーバーヘッドを回避する最適化です。この最適化が使用されていることは、X サーバの verbose ログが有効化されている場合に X のログで報告されます。

eGPU に対しては別の Xorg インスタンスを使う

主な記事は Nvidia-xrun#External GPU setup[リンク切れ: セクションが存在しません] です。

Xorg 上での eGPUs の既知の問題

  • ホットプラグは、ほとんどのディスクリート GPU Xorg ドライバでサポートされていません: eGPU は Xorg の開始時に挿入されている必要があります。Xorg を再起動するには、一旦ログアウトして、再びログインし直すだけで十分なはずです。
  • ホットアンプラグは全くサポートされていません: 動作中に外付け GPU を抜くとシステムが不安定になったり、完全にフリーズしたりします (Nvidia のドキュメントで確認されています)。

Wayland

eGPU (一般には複数 GPU) に対する Wayland のサポートはあまりテストされていませんが、少ない手動設定で動作するはずです。

注意点として、Wayland コンポジタによる明示的な GPU ホットプラグのサポートが必要です。しかし、ほとんどのコンポジタには既にある程度のサポートがあります:

オープンソースなドライバの場合は、DRI オフロードが動作するはずです:

$ DRI_PRIME=1 some_program

一部のプロジェクト (all-ways-egpu など) では、Wayland で GPU を選択するためのより効率的な方法を提供する試みが進んでいます。

翻訳ステータス: このページは en:External GPU の翻訳バージョンです。最後の翻訳日は 2023-08-24 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。