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がそれを使用するかどうかを選択できます.

その他の考慮事項#

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

GPUアクセラレーションを使用していない場合は,必ず Xvfb を使用して仮想フレームバッファを起動してください.bashを使用して起動するには,次のようにします.

export DISPLAY=:99.0
export PYVISTA_OFF_SCREEN=true
which Xvfb
Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
sleep 3
set +x
exec "$@"

または,組み込みの pyvista.start_xvfb() を使用して起動することもできます. xvfblibgl1-mesa-glx は必ず次のようにインストールしてください.

sudo apt-get install libgl1-mesa-dev xvfb