PyVista用Jupyterバックエンドをtrame化する#

PyVistaは, Trame を使用して,Jupyter環境内で完全な機能を持つプロットを表示する機能を備えています.私たちは,PyVistaとTrameをペアリングするメカニズムを提供し,PyVistaプロッタを,サーバーサイドとクライアントサイドの両方のレンダリングでWebコンテキストで使用できるようにします.

Trameバックエンドのサーバーサイドレンダリングモードは,現在のレンダーウィンドウをJupyter内のcanvasにストリーミングし,canvasからのユーザーアクションをVTKレンダーウィンドウに戻すことで動作します(これは, trame-vtkvtkRemoteView がアンダーグラウンドで行います.

たとえば,コードの両方のセクションは,Jupyter内に対話型キャンバスを表示します.

import pyvista as pv

sphere = pv.Sphere()

# short example
sphere.plot(jupyter_backend='trame')

# long example
plotter = pv.Plotter(notebook=True)
plotter.add_mesh(sphere)
plotter.show(jupyter_backend='trame')

便宜上, trame をデフォルトで有効にするには,次のコマンドを使用します.

import pyvista as pv

pv.set_jupyter_backend('trame')

Trame Jupyterのモード#

PyVista Trameのjupyterバックエンドは,3つの動作モード(厳密には3つの別々のバックエンドの選択肢として)を提供します.

  • 'trame': クライアントとサーバーのレンダリングモードを切り替えることができるビューを使用します.

  • 'server': 純粋なサーバーレンダリングであるビューを使用します.

  • 'client': 純粋なクライアントレンダリングを行うビューを使用します (仮想フレームバッファがなくても一般的に安全です)

バックエンドは set_jupyter_backend() を使用するか, show() のコールで jupyter_backend を渡すことによって選択することができます.

import pyvista as pv

pv.set_jupyter_backend('client')

pv.Cone().plot()
import pyvista as pv

pv.set_jupyter_backend('trame')

pl = pv.Plotter()
pl.add_mesh(pv.Cone())
pl.show(jupyter_backend='client')

インストール#

pipを使って,次のようにしてjupyter環境をセットアップすることができます.

pip install 'jupyterlab>=3' ipywidgets 'pyvista[all,trame]'

リモートJupyterホスト#

リモートでホストされているJupyter (docker, cloud JupyterHub, binder, 若しくはその他)でPyVistaを使用する場合,Trameバックエンドと jupyter-server-proxytrame-jupyter-extension いずれもペアリングする必要があります.

Jupyter サーバープロキシ#

Jupyter Server Proxy は,ノートブックと一緒にPyVistaプロッタのビューをホストするTrameサーバにアクセスし,Jupyterから直接認証されたウェブアクセスを提供することができます.

リモート環境で jupyter-server-proxy を使って動作するように PyVista と Trame を設定するには,PyVista のグローバルテーマでいくつかのオプションを設定する必要があります.

server_proxy_prefix のデフォルトは '/proxy/' で,ほとんどのリモートJupyter環境とDocker内での使用にはこれで十分でしょう.

これは,環境変数で設定することもできます:

export PYVISTA_TRAME_SERVER_PROXY_PREFIX='/proxy/'

JupyterHubにデプロイする場合は,プレフィックスを修正する必要があります.

これにより,プレフィックスにユーザIDがURLに含まれるようになります.PyVistaでは,この変数があるかどうかを自動的にチェックし, server_proxy_prefix の前に追加します.

Trame Jupyterエクステンション#

Trame Jupyter Extension は, WebSocket接続を個別に作成する代わりに,既存の Jupyter Comms インフラストラクチャ上でtrameサーバーとクライアントの通信を可能にします.

この拡張機能を使用すると,2次ウェブサーバーとした jupyter-server-proxy の必要性がなくなります.

pipを使って,拡張機能をインストールすることができます:

pip install trame_jupyter_extension

Jupyter Lab 3.x を使用する場合は,拡張機能のバージョン 1.x をインストールしてください.

pip install "trame_jupyter_extension<2"

拡張機能がインストールされたら,次のフラグを``True`` または False に設定することで,PyVistaがそれを使用するかどうかを選択できます.

環境変数によるリモートJupyterホストの設定#

リモートJupyterホストを上記で説明したフラグを使って手動で設定することもできますが、これらはJupyterカーネルが再起動するたびに設定する必要があります。環境変数でリモートJupyterホストを設定する方が効率的な場合もあります。もし設定されていれば、 PYVISTA_TRAME_JUPYTER_MODE の値がこれら2つのフラグの値を決定します。

設定されている場合、 PYVISTA_TRAME_JUPYTER_MODE に指定できる値は 'extension' , 'proxy' , 'native' です。以下の表は、それぞれの値が2つのフラグにどのような影響を与えるか、またその値を適用するために真でなければならない前提条件を示しています。

PYVISTA_TRAME_JUPYTER_MODE

説明

状態

server_proxy_enabled

jupyter_extension_enabled

"extension"

Trame Jupyterエクステンションを使用する

拡張が利用可能であること 。

False

True

"proxy"

Jupyter サーバープロキシを使用する

プロキシが利用可能であること 。

True

False

"native"

エクステンションもプロキシも使わない

None

False

False

その他の考慮事項#

GPUアクセラレーションを使用する価値があるかもしれません. オフスクリーンプロットのGPUサポート を参照してください.

GPUアクセラレーションがない場合は、OSMesaライブラリと vtk-osmesa を使用したオフスクリーンバージョンもあります:

pip uninstall vtk -y
pip install --no-cache-dir --extra-index-url https://wheels.vtk.org vtk-osmesa