PyVista用Jupyterバックエンドをtrame化する#
PyVistaは, Trame を使用して,Jupyter環境内で完全な機能を持つプロットを表示する機能を備えています.私たちは,PyVistaとTrameをペアリングするメカニズムを提供し,PyVistaプロッタを,サーバーサイドとクライアントサイドの両方のレンダリングでWebコンテキストで使用できるようにします.
Trameバックエンドのサーバーサイドレンダリングモードは,現在のレンダーウィンドウをJupyter内のcanvasにストリーミングし,canvasからのユーザーアクションをVTKレンダーウィンドウに戻すことで動作します(これは, trame-vtk
の vtkRemoteView
がアンダーグラウンドで行います.
たとえば,コードの両方のセクションは,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-proxy
と trame-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つのフラグにどのような影響を与えるか、またその値を適用するために真でなければならない前提条件を示しています。
|
説明 |
状態 |
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