7. リモートおよび並列の可視化

ParaView アプリケーションの目標の1つは、大規模なデータセットのデータ分析と可視化を可能にします。 ParaView は、1台のデスクトップマシンでは処理できないことが多いスーパーコンピューティングリソースで実行されたシミュレーションからのシミュレーション結果を可視化する必要性から生まれました。 このようなデータセットのインタラクティブな可視化を可能にするには、ParaView リモートおよび/または並列データ処理を使用します。 基本的な概念は、メモリやその他の制限のためにデータセットがデスクトップマシンに収まらない場合、デスクトップから駆動されるマシンのクラスター間でデータセットを分割できるということです。 この章では、ParaView を使用したリモートおよび並列データ処理の基本について説明します。 クラスタの設定については、ParaView Wiki [ThePCommunity] を参照してください。

Did you know?

リモート処理と並列処理は一緒に使用されることが多いですが、それらは異なる概念を参照しており、一方だけを使用することも可能です。

ParaViewの場合、リモート処理とは、クライアント (通常は paraview または pvpython ) が pvserver に接続され、別のリモートマシンで実行されるという概念です。すべてのデータ処理と、場合によってはレンダリングは pvserver で実行できます。クライアントは、可視化パイプラインを構築し、生成された結果を表示することによって、可視化プロセスを駆動します。

並列処理とは、データセット全体を処理するために rank ---と呼ぶ単一のコア---の代わりに、データセットを複数のランクに分割する概念です。通常、 pvserver のインスタンスは複数のランクで並列に実行されます。クライアントが並列に動作するサーバーに接続されている場合は、リモート処理と並列処理の両方を使用します。

pvbatch の場合、並列に動作するがクライアント接続を持たないアプリケーションがあります。これは遠隔処理なしの並列処理の場合です。

7.1. リモート処理を理解する

簡単な使用例を考えてみましょう。2台のコンピュータがあり、1台はオフィスにあり、もう1台は自宅にあるとします。オフィスにあるマシンは、家庭にあるマシンよりも、メモリとコンピューティング能力が大きく、より優れたマシンです。その場合、オフィスマシンでシミュレーションを実行し、結果のファイルをオフィスマシンに接続されたディスクに保存することがよくあります。作業中にこれらの結果を表示するには、 paraview を起動してデータファイルを開くだけです。では、自宅で可視化とデータ分析を行う必要がある場合はどうすればよいでしょうか。いくつかのオプションがあります。

  • データファイルをホームマシンにコピーし、paraview を使用して可視化することができます。しかし、これは退屈な作業です。ファイルを常に手動でコピー/更新しなければならないだけでなく、マシンの計算能力と利用可能なメモリが減少しているため、マシンのパフォーマンスが低下しています。

  • Remote DesktopVNC のようなデスクトップ共有システムを使うこともできますが、ネットワークの接続状況によってはうまくいかないことがあります。

Alternatively, you can use ParaView's remote processing capabilities. The concept is fairly simple. You have two separate processes: pvserver (which runs on your work machine) and a paraview client (which runs on your home machine). They communicate with each other over sockets (over an SSH tunnel, if needed). As far as using paraview in this mode, it's no different than how we have been using it so far -- you create pipelines and then look at the data produced by those pipelines in views and so on. The pipelines themselves, however, are created remotely on the pvserver process. Thus, the pipelines have access to the disks on your work machine. The Open File dialog will in fact browse the file system on your work machine, i.e., the machine on which pvserver is running. Any filters that you create in your visualization pipeline execute on the pvserver.

すべてのデータ処理は pvserver で実行されますが、レンダリングに関しては、paraview はサーバプロセスでレンダリングを実行してイメージのみをクライアントに配信するように構成することも(リモートレンダリング)、クライアントにレンダリングするジオメトリを配信してローカルでレンダリングするように構成することもできます(ローカルレンダリング)。リモートレンダリングでは、作業マシンのグラフィックス機能を使用します( pvserver を実行しているマシン)。新しいレンダリングを取得する必要があるたびに(たとえば、パイプラインパラメータを変更したり、カメラを操作する場合などです。)、pvserver プロセスは新しいイメージを再レンダリングしてクライアントに配信します。ローカルレンダリングでは、レンダリングされるジオメトリがクライアントに配信され、クライアントがそれらをローカルにレンダリングします。したがって、すべてのインタラクションがサーバー側の処理を必要とするわけではありません。可視化パイプラインが更新されたときのみ、サーバーは更新された形状をクライアントに配信する必要があります。

7.2. paraview でのリモート可視化

7.2.1. リモートサーバーの起動

リモートデータ処理および可視化に ParaView を使用するには、まずリモートシステムでサーバーアプリケーション pvserver を起動する必要があります。これを行うには、シェルを使用してリモートシステムに接続し、次のコマンドを実行します。

> pvserver

端末に次の起動メッセージが表示されます。

Waiting for client...
Connection URL: cs://myhost:11111
Accepting connection(s): myhost:11111

これは、サーバーが起動し、クライアントからの接続を待機していることを意味します。

7.2.2. サーバー接続の構成

paraview を使用してこのサーバーに接続するには クライアントで、 File > Connect を選択するか、pqConnect をクリックします ツールバーのアイコンをクリックして、Choose Server Configuration ダイアログを表示します。

../_images/Server_connect_dialog.png

図 7.12 Choose Server Configuration ダイアログはサーバに接続するために使用されます。

Common Errors

サーバーがファイアウォールの内側にあり、ファイアウォールの外側から接続しようとしている場合は、接続が正常に確立されていない可能性があります。逆方向の接続も試してみてください ( 7.4 章)。ファイアウォールの回避策として使用します。ネットワーク接続に問題がある場合は、ネットワークマネージャに問い合わせてください。

図 7.12 は、リモートサーバー用の多数のエントリを含む Choose Server Configuration ダイアログを示しています。この図では、いくつかのサーバーがすでに構成されていますが、このダイアログを最初に開いたときには、このリストは空になります。リモートサーバーに接続する前に、Add Server ボタンをクリックしてリストにエントリを追加する必要があります。これを行うと、図 7.13 のように Edit Server Configuration ダイアログが表示されます。

../_images/ParaView_UsersGuide_ConfigureNewServerDialog.png

図 7.13 Edit Server Configuration ダイアログは、リモートサーバに接続するための設定を行うために使用します。

接続の名前、サーバーの種類、サーバーを起動したホストのDNS名、およびポートを設定する必要があります。デフォルトの Server Type はClient/Serverに設定されています。これは、サーバーがクライアントからの着信接続を待機していることを意味します。この設定には、後で説明するその他のオプションがいくつかあります。

完了したら、 Configure ボタンをクリックします。図 7.14 に示すように、サーバーの起動方法を指定する別のダイアログが表示されます。サーバーを手動で起動したため、 Startup Type はデフォルトの Manual 設定のままにします。オプションで、 Startup TypeCommand に設定し、外部シェルコマンドを指定してサーバープロセスを起動できます。

../_images/ParaView_UsersGuide_ConfigureServerManualDialog.png

図 7.14 サーバを手動で設定します。ParaViewの外部で起動する必要があります。

Save ボタンをクリックすると、この特定のサーバ構成が保存され、後で使用できるようになります。サーバのリストからエントリを選択し、 Choose Server Configuration ダイアログの Edit Server ボタンをクリックすると、サーバ構成を編集できます。削除するには、 Delete ボタンをクリックします。

サーバ構成は、 Choose Server Configuration ダイアログからインポートおよびエクスポートできます。 Load Servers ボタンを使用してサーバ構成ファイルをロードし、 Save Servers ボタンを使用してサーバ構成ファイルを保存します。同じリモートサーバーにアクセスするために、他のユーザーとファイルを交換できます。

Did you know?

Visualization Centerでは、システム全体のサーバ構成をWebサーバ上で提供できるため、専門家でなくても構成済みの ParaView サーバを簡単に選択できます。これらのサイト全体の設定は、Fetch Servers ボタンでロードできます。上級者は、自分のサーバーをより詳細に指定することもできます。これらの機能は、ParaView Server Configuration file (7.5 章)によって提供されます。

7.2.3. リモートサーバーの接続

サーバに接続するには、設定リストから設定したサーバ構成を選択し、、必要に応じてタイムアウトのコンボボックスでタイムアウトを変更し、 Connect をクリックします。ParaViewは、成功するかタイムアウトに達するまで、サーバーへの接続を試みます。その場合は、必要に応じて再試行すればよいでしょう。接続ステップが成功すると、接続が完了し、可視化パイプラインを構築する準備が整います。

Common Errors

ParaViewは、クライアントがサーバーに接続しようとしたときに認証を行いません。そのため、外部に公開されているコンピュータリソースでは pvserver を実行しないことをお勧めします。

ParaViewでは、クライアントとサーバー間で送信されるデータも暗号化されません。データが機密性の高いものである場合は、適切なネットワークセキュリティ対策が講じられていることを確認してください。一般的なアプローチは、ネイティブのSSHサポートを使用して、サーバーの設定ファイル内でSSHトンネルを使用することです (7.5.16 章)。

7.2.4. 複数のクライアント管理

pvserver は、同時に複数のクライアントからの接続を受け付けるように構成できます。 この場合、マスターと呼ばれる1つだけがパイプラインと対話できます。他のクライアントはデータを可視化することしかできません。Collaboration Panel は、接続されているクライアント間で情報を共有します。

このモードを有効にするには、pvserver--multi-clients フラグで起動する必要があります。

pvserver --multi-clients

リモートサーバーに多数のユーザーがアクセスできる場合は、アクセスを制限できます。 これは、接続IDを使用して実行できます。 クライアントに接続先のサーバと同じconnect-idがない場合は、 connect-idの入力を求められます。 マスターの場合は、 Collaboration Panel でconnect-idを変更できます。

connect-idの初期値は、例えば --connect-id フラグで pvserver (とそれぞれ paraview )を起動することで設定できます。

pvserver --connect-id=147

また、たとえば単独で作業できるように、 Collaboration Panel で以降の接続を無効にすることもできます。準備ができたら、他のユーザが pvserver に接続してビジュアル化を共有できるようにします。これは、pvserver--multi-clients--disable-further-connections で起動されたときのデフォルトの機能です。

7.2.5. クライアント/サーバー可視化パイプラインのセットアップ

paraview を使用する リモートサーバーに接続している場合は、デフォルトのスタンドアロンモードで使用している場合と何ら変わりはありません。 ユーザーインターフェイスに関する唯一の違いは、 Pipeline Browser が接続しているサーバーの名前を反映していることです。 pqServer の隣のサーバー接続のアドレス アイコンが builtin から cs://myhost:11111 に変わります。

データ処理パイプラインはサーバー側で実行されるため、すべてのファイル入出力はサーバー側でも行われます。したがって、 Open File ダイアログは、新しいデータファイルを開くときに、paraview クライアントではなく、pvserver 実行ファイルに対してローカルなファイルシステムを参照します。

7.3. pvpython でのリモート可視化

pvpython 実行ファイルは、ローカルデータを可視化するために単独で使用できますが、リモートの pvserver に接続するクライアントとしても機能します。pvpython でパイプラインを作成する前に、Connect 関数を使用します。

# Connect to remote server "myhost" on the default port, 11111
>>> Connect("myhost") # Connect to remote server "myhost" on a
                      # specified port
>>> Connect("myhost", 11111)

これで、新しいソースが作成されると、ソースによって生成されるデータはサーバ上に置かれます。pvpython の場合、すべてのデータはサーバー上に残り、イメージもサーバー上で生成されます。イメージは、表示またはローカル・ファイル・システムへの保存のためにクライアントに送信されます。

7.4. 逆方向接続

リモートコンピューティングリソースがネットワークファイアウォールの内側に配置されている場合が多く、ファイアウォールの外側にあるクライアントをその内側にあるサーバに接続することが困難になります。ParaView では、接続の確立時に通常のクライアントサーバの役割を逆にする逆方向接続(reverse connection)を設定できます。

リモート接続を使用するには、2つの手順を実行する必要があります。まず、paraview で、新しい接続を逆に設定された接続タイプで構成する必要があります。これを行うには、File > Connect メニュー項目から Choose Server Configuration ダイアログを開きます。新しい接続を追加し、 Namemyhost (reverse) に設定し、 Server TypeClient / Server (reverse connection) を選択します。 Configure をクリックします。表示される Edit Server Launch Configuration ダイアログで、 Startup TypeManual に設定します。構成を保存します。次に、この構成を選択し、 Connect をクリックします。クライアントがサーバーからの接続を待っていることを示すメッセージウィンドウが表示されます。

../_images/WaitingForServerConnection.png

図 7.15 クライアントがサーバーからの接続を待っていることを示すメッセージ・ウィンドウ

2番目に、pvserver--reverse-connection (-rc ) フラグで起動しなければなりません。pvserver にクライアントの名前を伝えるには、コマンドライン引数 --client-host (-ch ) を\paraview クライアントが実行されているマシンのホスト名に設定します。--server-port (-sp ) コマンドライン引数でポートを指定できます。

pvserver -rc --client-host=mylocalhost --server-port=11111

サーバーが起動すると、クライアントへの接続の成功または失敗を示すメッセージが出力されます。接続に成功すると、シェルに次のテキストが表示されます。

Connecting to client (reverse connection requested)...
Connection URL: csrc://mylocalhost:11111
Client connected.

pvpythonpvserver からの逆接続を待つには、Connect ではなく ReverseConnect を使います。

# To wait for connections from a 'pvserver' on the default port 11111
>>> ReverseConnect()

# Optionally, you can specify the port number as the argument.
>>> ReverseConnect(11111)

7.5. ParaView Server 設定ファイル

Choose Server Configuration ダイアログでは、専用ボタンを使用して Load ServersSave Servers を行うことができます。 サーバー構成は、ParViewサーバー構成ファイル(.pvsc)に保存されます。

これらのファイルにより、サーバー接続プロセスを大幅にカスタマイズできます。起動時に、ParaViewはデフォルトでロードするサーバー設定をいくつかの場所から探します。

  • On Unix-based systems and macOS
    • ParaViewの実行ディレクトリにある default_servers.pvsc (実行ディレクトリを特定するには、 ls -l /proc//exe を実行してください)

    • /usr/share/ParaView/servers.pvsc

    • $HOME/.config/ParaView/servers.pvsc (ParaViewはユーザー定義のサーバーをここに保存します)

  • Windowsの場合
    • ParaViewの実行ディレクトリにある default_servers.pvsc を参照してください

    • %COMMON_APPDATA%\ParaView\servers.pvsc

    • %APPDATA%\ParaView\servers.pvsc (ParaViewはユーザー定義のサーバーをここに保存します。)

ここでは、一般的な使用例をいくつか紹介します。

7.5.1. ケース1:シンプルなコマンドサーバーの起動

このケースでは、ローカルで起動された pvserver (localhost) に 11111 ポートで接続しています。ただし、サーバーを起動するコマンドは、サーバーに接続する直前に自動的に呼び出されるので、接続を中止する前に timeout 秒間待機します。

<Server name="case01" resource="cs://localhost:11111" timeout="10">
  <CommandStartup>
    <Command process_wait="0" delay="5" exec="/path/to/pvserver"/>
  </CommandStartup>
</Server>

ここで、CommandStartup 要素は、サーバーに接続する前に、あるコマンドを実行することを指定します。これには、 process_wait 、パラビューがプロセスの開始を待つ時間(秒)、 delay 、コマンド実行後にパラビューが接続を試みるまでの時間(秒)、最後に exec が含まれます。

7.5.2. ケース2:シンプルなリモートサーバー接続

このケースでは、"amber1" という名前のノードで実行されているシンプルなサーバー接続( pvserver プロセスへの接続)の設定を、ポート20234で行っています。pvserver プロセスは、ユーザーが手動で起動します。

<Server name="case02" resource="cs://amber1:20234">
  <ManualStartup/>
</Server>

ここで、name は、パイプラインブラウザに表示されるサーバの名前を指定し、resource は、接続のタイプ(cs -- クライアントサーバを意味する)、ホスト名、ポートを指定します。リソースにポート番号(例:20234)が指定されていない場合は、デフォルトのポート番号(例:1111)が使用されます。ユーザーは手動で pvserver プロセスを起動するので、ここでは ManualStartup を使用します。

7.5.3. ケース3:ユーザーが指定したポートでのサーバー接続

これはケース2と同じですが、pvserver に接続するためのポート番号を毎回ユーザーに尋ねることにしています。

<Server name="case03" resource="cs://amber1">
  <ManualStartup>
    <Options>
      <Option name="PV_SERVER_PORT" label="Server Port: ">
        <Range type="int" min="1" max="65535" step="1" default="11111" />
      </Option>
    </Options>
  </ManualStartup>
</Server>

ここでは、唯一の違いは Options 要素です。この要素は、ユーザーがサーバーに接続する際に指定するランタイムオプションを指定するために使用されます。利用可能なランタイムオプションのリストについては、本節を参照してください。この例では、ポート番号を選択するための積分スピンボックスをユーザに表示したいので、オプションのタイプを指定するために Range 要素を使用しています。ユーザーがこのサーバーに接続すると、次の画像のようなダイアログが表示されます。

../_images/Server_connection_pvsc_case03.png

7.5.4. ケース4 :データサーバー/レンダーサーバーへのシンプルな接続

これはケース2と同じですが、単一のサーバー(例: pvserver )の代わりに、 pvdataserver がamber1のポート20230で動作し、 pvrenderserver がノードamber2のポート20233で動作する、別々のレンダーサーバー/データサーバーに接続しています。

<Server name="case04" resource="cdsrs://amber1:20230//amber2:20233">
  <ManualStartup />
</Server>

ケース2との唯一の違いは、 resource の仕様です。cdsrs は、クライアント-データサーバ-レンダーサーバの構成であることを示しています。最初の host:port ペアがデータサーバーで、2番目のものがレンダーサーバーです。

7.5.5. ケース5:ユーザーが指定したサーバーポートを持つデータサーバー/レンダーサーバーへの接続

これは、ケース3とケース4を組み合わせたもので、レンダリングサーバーとデータサーバーの両方のポート番号をユーザーに尋ねるものです。

<Server name="case05" resource="cdsrs://localhost//localhost">
  <ManualStartup>
    <Options>
      <Option name="PV_DATA_SERVER_PORT" label="Data Server Port: ">
        <Range type="int" min="1" max="65535" step="1" default="11111" />
      </Option>
      <Option name="PV_RENDER_SERVER_PORT" label="Render Server Port: ">
        <Range type="int" min="1" max="65535" step="1" default="22222" />
      </Option>
    </Options>
  </ManualStartup>
</Server>

このXMLは、すでに説明したように、非常にわかりやすいものです。このXMLによって生成されるオプションダイアログは次のようになります:

../_images/Server_connection_pvsc_case05.png

7.5.6. ケース6: 逆接続

デフォルトでは、クライアントはサーバープロセスに接続します。しかし、paraviewクライアントに、代わりにサーバーからの接続を待つように指示することができます。これを逆接続と呼びます。このような場合、サーバープロセスは --reverse-connection または --rc フラグを付けて起動しなければなりません。

サーバー構成のxmlで逆接続を示すには、 resource プロトコル部分のサフィックスを rc (reverse connection:逆接続)にするだけです。

resource="csrc://localhost" -- connect to pvserver on localhost using reverse connection
resource="cdsrsrc://localhost//localhost" -- connect to pvdataserver/pvrenderserver using reverse connection.

そのため、ケース1と同様のシンプルなローカル逆接続サーバーの構成は次のようになります。

<Server name="case06" resource="csrc://localhost:11111">
  <CommandStartup>
    <Command exec="/path/to/pvserver --reverse-connection --client-host=localhost"/>
  </CommandStartup>
</Server>

ここでは、 exec の中の --client-host=localhost は、実際には必要ありません。

7.5.7. ケース7:オプション付きサーバーコマンド

事例1で見たように、サーバーは接続時にParaViewが起動しますが、これを事例3で見たように Option 要素と組み合わせることで、動的に生成されるサーバーコマンドを作成することができます。

<Server name="case07" resource="cs://localhost">
  <CommandStartup>
    <Options>
      <!-- The user chooses the port on which to start the server -->
      <Option name="PV_SERVER_PORT" label="Server Port: ">
        <Range type="int" min="1" max="65535" step="1" default="11111" />
      </Option>
    </Options>
    <Command delay="5" exec="/path/to/pvserver">
      <Arguments>
        <Argument value="--server-port=$PV_SERVER_PORT$" />
      </Arguments>
    </Command>
  </CommandStartup>
</Server>

ケース1と同様に、CommandStartupCommand 要素を使用しています。コマンドライン引数は、 Arguments 要素を使って、実行されるコマンドに渡すことができます。$name$ として指定されたすべてのランタイム環境変数は、実際の値に置き換えられます。例えば、この例では、 $PV_SERVER_PORT$ が、オプションダイアログでユーザーが選択したポート番号に置き換えられます。

7.5.8. ケース8:connection-idとランダムポートの使用

多くの場合、サーバクラスタでは、異なるユーザに対して複数のpvserver(またはpvdataserver/pvrenderserver)プロセスを実行していることがあります。そのような場合、サーバーとクライアントの間である程度の認証が必要になります。これは(非常に基本的なレベルではありますが)connect-idオプションで実現できます。サーバプロセスの起動時にコマンドラインで指定された場合( --connect-id を使用)、サーバは同じ接続IDを報告したクライアントだけに接続を許可します。

また、他のユーザーとのポート衝突を避けたいので、サーバー接続にはランダムなポートを使用しています。

以下は、ケース7と同様の例ですが、connect-idオプションとランダムなサーバーポートを使用しています。

<Server name="case08" resource="cs://localhost">
  <CommandStartup>
    <Options>
      <Option name="PV_CONNECT_ID" label="Connect ID" readonly="true">
        <Range type="int" min="1" max="65535" default="random" />
      </Option>
      <Option name="PV_SERVER_PORT" label="Server Port" readonly="true">
        <Range type="int" min="11111" max="65535" default="random" />
      </Option>
    </Options>
    <Command exec="/path/to/pvserver" delay="5">
      <Arguments>
        <Argument value="--connect-id=$PV_CONNECT_ID$" />
        <Argument value="--server-port=$PV_SERVER_PORT$" />
      </Arguments>
    </Command>
  </CommandStartup>
</Server>

この場合、Optionreadonly 属性は、ユーザーが値を変更できないことを示しており、情報としてのみ表示されています。PV_CONNECT_IDPV_SERVER_PORT のデフォルト値はランダムに設定されており、ParaViewが実行時に値を作るようになっています。もちろん、本番環境では、ランダムに生成するのではなく、ユーザーが割り当てるべきです。

../_images/Server_connection_pvsc_case08.png

7.5.9. ケース9:sshによるサーバの起動

この使用例では、特別に細工されたsshコマンドを使用して、あるリモートホスト上でサーバプロセスが生成されます。ユーザーがsshの実行ファイルを指定できるようにします。また、ユーザーが毎回入力しなくてもいいように、ParaViewのセッション全体でssh実行ファイルのパスを保持したいと考えています。

<Server name="case09" resource="cs://localhost:11111">
  <CommandStartup>
    <Options>
      <Option name="SSH_USER" label="SSH Username" save="true">
        <!-- choose the username. Since 'save' is true, this value will
             be maintained across sessions -->
        <String default="user" />
      </Option>
      <Option name="SSH_EXE" label="SSH Executable" save="true">
        <!-- select the SSH executable. Since 'save' is true, this value will
             also be maintinaed across sessions -->
        <File default="ssh" />
      </Option>
    </Options>
    <Command exec="$SSH_EXE$" delay="5">
      <Arguments>
        <Argument value="-L8080:amber5:11111" /> <!-- port forwarding -->
        <Argument value="amber5" />
        <Argument value="-l" />
        <Argument value="$SSH_USER$" />
        <Argument value="/path/to/pvserver" />
      </Arguments>
    </Command>
  </CommandStartup>
</Server>
../_images/Server_connection_pvsc_case09.png

ここで、 exec 属性の値が $SSH_EXE$ に設定されていることに注意してください。そのため、ユーザーが選択した ssh 実行ファイルに置き換えられます。Option``要素のオプション属性 save を使用して、ユーザーが選択した値をParaViewのセッション全体で保存するようにParaViewに指示します。これにより、ユーザーはこのサーバーに接続するたびに、ユーザー名とssh実行ファイルを入力する必要がなくなります。

Did you know?

SSH接続は、コマンドを作成することで開始できますが、ParaViewでは、SSHCommand を指定することで、SSH接続をネイティブにサポートしています。

7.5.10. ケース 10:ユーザーが設定可能なカスタムオプションを持つカスタムスクリプトを使用したサーバーの起動

この例では、サーバー構成の全機能を説明します。例えば、サーバープロセスを開始するために複数の引数を取るカスタムスクリプト "MyServerStarter" があるとします。この設定を使って接続しようとしたときに、ユーザーがこれらの引数の値を設定できるようにしたいとします。例として、MyServerStarterが次のような引数を取るとします。

  • force-offscreen-rendering -- オフスクリーンレンダリングの使用を示す

  • --force-onscreen-rendering -- 画面上でのレンダリングを指示する(--force-offscreen-rendering がないことから推測できるが、ここでは例として使用している)

  • --session-name=<string> -- セッションを識別する何らかの文字列

  • --mpitype=<mpich1.2|mpich2|openmpi> -- 利用可能なMPI実装の中から選択する

  • --num-procs=<num> -- サーバープロセスの数

  • --server-port -- pvserverプロセスに渡されるポート番号

これらはすべて(-server-portを除く)、接続時にユーザーが設定できる必要があります。これは以下のように実現できます:

<Server name="case10" resource="cs://localhost">
  <CommandStartup>
    <Options>
      <Option name="OFFSCREEN" label="Use offscreen rendering">
        <Boolean true="--use-offscreen" false="--use-onscreen" default="false" />
      </Option>
      <Option name="SESSIONID" label="Session Identifier">
        <String default="session01"/>
      </Option>
      <Option name="MPITYPE" label="MPI Implementation">
        <Enumeration default="mpich1.2">
          <Entry value="mpich1.2" label="MPICH Ver. 1.2" />
          <Entry value="mpich2" label="MPICH Ver 2.0" />
          <Entry value="openmpi" label="Open MPI" />
        </Enumeration>
      </Option>
      <Option name="NUMPROC" label="Number Of Processes">
        <Range type="int" min="1" max="256" step="4" default="1" />
      </Option>
    </Options>
    <Command exec="/path/to/MyServerStarter" delay="5">
      <Arguments>
        <Argument value="--server-port=$PV_SERVER_PORT$" />
        <Argument value="--mpitype=$MPITYPE$" />
        <Argument value="--num-procs=$NUMPROC$" />
        <Argument value="$OFFSCREEN$" />
        <Argument value="--session-name=$SESSIONID$" />
      </Arguments>
    </Command>
  </CommandStartup>
</Server>

Option は新しいランタイム変数を定義します。このランタイム変数は Command セクションの ${name}$ としてアクセスすることができます。この設定で接続しようとすると、以下のようなオプションダイアログが表示されます。

../_images/Server_connection_pvsc_case10.png

これは、サーバ管理者の必要に応じて、sshやバッチスケジューラなどを使用してサーバプロセスを開始するように拡張することができます。また、リバース接続を使用するように設定することもできます(リソース属性のプロトコルを変更することで)

7.5.11. ケース11:ケース10+スイッチステートメント

これはケース10と同じですが、1つだけ変更点があります。ユーザーがプロセス数を選択できないようにしました。代わりに、distribution comboboxの値に基づいてプロセス数が自動的に選択されます。

<Server name="case11" resource="cs://localhost">
  <CommandStartup>
    <Options>
      <Option name="OFFSCREEN" label="Use offscreen rendering">
        <Boolean true="--use-offscreen" false="--use-onscreen" default="false" />
      </Option>
      <Option name="SESSIONID" label="Session Identifier">
        <String default="session01"/>
      </Option>
      <Option name="MPITYPE" label="MPI Implementation">
        <Enumeration default="mpich1.2">
          <Entry value="mpich1.2" label="MPICH Ver. 1.2" />
          <Entry value="mpich2" label="MPICH Ver 2.0" />
          <Entry value="openmpi" label="Open MPI" />
        </Enumeration>
      </Option>
      <Option name="DISTRIBUTION" label="Distribution Mode">
        <Enumeration default="notDistributed">
          <Entry value="notDistributed" label="Not Distributed" />
          <Entry value="someDistribution" label="Some Distribution" />
          <Entry value="highDistribution" label="Highly Distributed" />
        </Enumeration>
      </Option>
      <Switch name="DISTRIBUTION">
        <Case value="notDistributed">
          <Set name="NUMPROC" value="1" />
        </Case>
        <Case value="someDistribution">
          <Set name="NUMPROC" value="2" />
        </Case>
        <Case value="highDistribution">
          <Set name="NUMPROC" value="10" />
        </Case>
      </Switch>
    </Options>
    <Command exec="/path/to/MyServerStarter" delay="5">
      <Arguments>
        <Argument value="--server-port=$PV_SERVER_PORT$" />
        <Argument value="--mpitype=$MPITYPE$" />
        <Argument value="--num-procs=$NUMPROC$" />
        <Argument value="$OFFSCREEN$" />
        <Argument value="--session-name=$SESSIONID$" />
      </Arguments>
    </Command>
  </CommandStartup>
</Server>
../_images/Server_connection_pvsc_case11.png

Switch 文は、子として Case 文しか持つことができず、一方、 Case 文は、子として Set 文しか持つことができません。Set ステートメントは、値が固定されていて、ユーザーがその値を設定するように促されないことを除けば、Option とあまり変わりません。

7.5.12. ケース12:シンプルなSSH run serverコマンド

もし、Command 要素でSSHコマンドを作成できるようになったとしても、それは非常に複雑で、ParaViewのパイプラインブラウザでは、sshトンネルを介して接続される可能性があるため、正しいサーバーが表示されないことがあります。

ここでは、ケース1と同様に、ネイティブの ssh サポートを使用して、デフォルトポートで直接接続する前に、amber1上で pvserver プロセスをリモートで起動します。

<Server name="case12" resource="cs://amber1">
  <CommandStartup>
    <SSHCommand exec="/path/to/pvserver" delay="5">
      <SSHConfig user="user"/>
    </SSHCommand>
  </CommandStartup>
</Server>

まず、Command の代わりに SSHCommand 要素が使われ、ParaViewがネイティブのsshサポートを使用することを認識します。次に、ssh接続を設定するために、SSHConfig 要素を使用します。user 属性は、SSHで使用するSSHユーザーです。パスワードが必要な場合は、ParaViewを実行するためのターミナルでパスワードを求められますが、これは場合によっては表示されないことがあります。

7.5.13. Case Thirteen: 複雑な設定のSSH run serverコマンド

ここでは、ケース12と同様に、ネイティブのsshサポートを使用して、amber1上のpvserverプロセスをリモートで起動してから直接接続していますが、使用する構成をより具体的に指定しています。

<Server name="case13" resource="cs://amber1">
  <CommandStartup>
    <Options>
      <!-- The user chooses the port on which to start the server -->
      <Option name="PV_SERVER_PORT" label="Server Port: ">
        <Range type="int" min="1" max="65535" step="1" default="11111" />
      </Option>
    </Options>
    <SSHCommand exec="/path/to/pvserver" delay="5">
      <SSHConfig user="user">
        <Terminal exec="/usr/bin/xterm"/>
        <SSH exec="/usr/bin/ssh"/>
      </SSHConfig>
      <Arguments>
        <Argument value="--server-port=$PV_SERVER_PORT$"/>
      </Arguments>
    </SSHCommand>
  </CommandStartup>
</Server>

SSHConfig 要素の中では、さまざまな要素を使います。ここでは、Terminal 要素を使って、ParaViewがターミナルを開いてユーザーにパスワードの入力を求めることを指定しています。ここでは、ターミナルの実行ファイルを exec 属性で指定しています。これがない場合、ParaViewは自動的に端末を見つけようとします(LinuxおよびWindows)。サーバーの設定をトラブルシューティングする際には、Terminal 要素を使用しないことをお勧めします。なぜなら、コマンドの実行が終わるとすぐにターミナルが閉じてしまうからです。Linuxでは、Terminal 要素を AskPass 要素に置き換えて、ParaViewがSSH_ASKPASSを使うように指定することも可能です。これにより、SSHのパスワードを尋ねるときにask-passバイナリが使われます。最後に、SSH 要素は、その exec 属性によって、使用するSSHバイナリを指定します。

また、ケース7と同様に PV_SERVER_PORT を使用して、ユーザーが接続先のポートを選択できるようにしています。

7.5.14. ケース14:ユーザーが選択したコンフィグを使ったSSHランサーバーコマンド

ここでは、ケース13とケース5と同様に、ネイティブのsshサポートを使用して、amber1上のpvserverプロセスをリモートで起動してから直接接続していますが、ユーザにいくつかのSSHオプションを対話的に選択させています。

<Server name="case14" resource="cs://amber1">
  <CommandStartup>
    <Options>
      <Option label="SSH USER:" name="SSH_USER" save="true">
        <String default="user"/>
      </Option>
      <Option label="SSH Exec:" name="SSH_EXEC" save="true">
        <File default="/usr/bin/ssh" />
      </Option>
      <Option label="Terminal:" name="TERMINAL" save="true">
        <File default="/usr/bin/xterm"/>
      </Option>
    </Options>
    <SSHCommand exec="/path/to/pvserver" delay="5">
      <SSHConfig user="$SSH_USER$">
        <Terminal exec="$TERMINAL$"/>
        <SSH exec="$SSH_EXEC$"/>
      </SSHConfig>
      <Arguments>
        <Argument value="--server-port=$PV_SERVER_PORT$"/>
      </Arguments>
    </SSHCommand>
  </CommandStartup>
</Server>

他のすべてのオプションと同様に、SSH 関連のオプションもユーザが対話的に設定できます。ここでは、ssh で接続する際に使用する SSH ユーザー、SSH 実行ファイル、および Terminal 実行ファイルをユーザーが設定できるようにしています。

../_images/Server_connection_pvsc_case14.png

7.5.15. ケース15:逆接続でのSsh run serverコマンド

ケース12と13と同様に、ネイティブのsshサポートを使用して、amber1上でリモートで逆接続のpvserverプロセスを開始し、そのプロセスがクライアントのホスト名を使用して、静的な非デフォルトポートでParaViewに接続するようにします。

<Server name="case15" resource="csrc://amber1:11112">
  <CommandStartup>
    <SSHCommand exec="/path/to/pvserver" delay="5">
      <SSHConfig user="user">
        <Terminal/>
      </SSHConfig>
      <Arguments>
        <Argument value="--reverse-connection"/>
        <Argument value="--client-host=$PV_CLIENT_HOST$"/>
        <Argument value="--server-port=$PV_SERVER_PORT$"/>
      </Arguments>
    </SSHCommand>
  </CommandStartup>
</Server>

ケース12との唯一の違いは、 ressource に逆接続が含まれるようになったことと、逆接続の引数に $PV_CLIENT_HOST$ が使われるようになったことで、自動的にクライアントのホスト名が設定され、サーバーが接続先のIPに解決できるようになっています。

7.5.16. ケース16:SSHトンネルによるサーバへのセキュアな接続

sshトンネルを使って安全に通信するには、通常、次のような細工をしたコマンドを使います: ssh -L 8080:localhost:port user@remote /path/to/pvserver --sp=port

そして、ParaView内の localhost:8080 のサーバーに接続します。これは、手動で設定したり、Command 要素を使って設定するのは複雑です。また、本当のサーバーとポートは、ParaViewのパイプラインブラウザには表示されません。

しかし、これは SSHCommand 要素でネイティブにサポートされています。ここでは amber1 へのセキュアな SSH トンネルを作成してから 11111 ポートで SSH トンネルを介して接続します。

<Server name="case16" resource="cs://amber1:11111">
  <CommandStartup>
    <SSHCommand exec="/path/to/pvserver" delay="5">
      <SSHConfig user="user">
        <Terminal/>
        <PortForwarding local="8080"/>
      </SSHConfig>
      <Arguments>
        <Argument value="--server-port=$PV_SERVER_PORT$"/>
      </Arguments>
    </SSHCommand>
  </CommandStartup>
</Server>

13のケースと同様に、SSHConfig 要素の中に、PortForwarding 要素を追加して、local 属性のポートを指定するだけで、ParaViewがSSHトンネルを作って接続するようになります。PV_SERVER_PORT$ には、SSHトンネル内で使用するポートの値が自動的に設定されます。ParaViewでは、トンネルはUIにうまく統合され、パイプラインブラウザに正しいポートとホスト名が表示され、サーバーのアイコンは、この接続が安全であることを示す小さなロックが付いているように見えます。:

../_images/Server_connection_pvsc_case16.png

7.5.17. ケース17:SSHトンネルを使ったサーバからのセキュアな逆接続

ケース16と同様に、SSHトンネルを使って逆方向に接続するには、次のようなコマンドを作成する必要があります: ssh -R 8080:localhost:port user@remote /path/to/pvserver --rc --ch=localhost --sp=8080

そして、ParaViewのlocalhost:8080にある逆接続サーバーに接続することになります。これは、手動でも、Command 要素を使っても、設定が複雑です。また、本当のサーバーとポートは、ParaViewのパイプラインブラウザには表示されません。

しかし、これは SSHCommand でネイティブにサポートされています。ここでは、特定のポートでSSHトンネルを介して逆接続する前に、amber1へのリバースセキュアなSSHトンネルを作成します。

<Server name="case17" resource="csrc://amber1:11115">
  <CommandStartup>
    <SSHCommand exec="/path/to/pvserver" delay="5">
      <SSHConfig user="user">
        <Terminal/>
        <PortForwarding local="8080"/>
      </SSHConfig>
      <Arguments>
        <Argument value="--reverse-connection"/>
        <Argument value="--client-host=localhost"/>
        <Argument value="--server-port=$PV_SSH_PF_SERVER_PORT$"/>
      </Arguments>
    </SSHCommand>
  </CommandStartup>
</Server>

また、SSHConfig の中の PortForwarding 要素には、SSH トンネル作成のきっかけとなる local ポートを指定します。最後に、 $PV_SSH_PF_SERVER_PORT$ という変数は、サーバーがSSHトンネルを介してクライアントに接続する際に使用する必要があります。

Did you know?

SSHのネイティブサポートにより、設定ファイルを簡素化することができますが、いくつかのケースはまだカバーされておらず、複雑なカスタムコマンドが必要になります。クライアント/データサーバー/レンダーサーバーのSSHセットアップはネイティブにはサポートされておらず、ネストされたSSHトンネルもネイティブにはサポートされていません。このような設定を行うには、複雑なコマンドを使用する必要があります。

7.5.18. PVSCファイルXMLスキーマ

これが完全なPVSCファイルのXMLスキーマです

  • <Servers> タグはドキュメントのルート要素で、0対多の <Server> タグを含んでいます。

  • <Server> タグは、設定されたサーバーを表します。

  • name 属性は、サーバー構成を一意に識別するためのもので、ユーザーインターフェースに表示されます。

  • timeout 属性は、クライアントがサーバーの起動を待つ最大時間(秒単位)を指定します。-1は永遠を意味し、デフォルトは60です。

  • resource 属性は、サーバー接続の種類、サーバーのホスト、接続用のポート(オプション)を指定します。値は

  • cs://<host>:<port> - クライアント対サーバの構成で、クライアントがサーバに接続するフォワード接続の場合。指定されていない場合、ポートのデフォルトは 11111 です。

  • csrc\://<host>:<port> - クライアントとサーバの間で、サーバがクライアントに接続するという逆接続の設定の場合。指定されていない場合、ポートのデフォルトは 11111 です。

  • cdsrs\://<ds-host>\:<ds-port>//<rs-host>\:<rs-port> - フォワード接続を行うclient-pvdataserver-pvrenderserverの構成の場合。指定されていない場合、ds-port のデフォルトは 11111、rs-port のデフォルトは 22222 です。

  • cdsrsrc\://<ds-host>\:<ds-port>//<rs-host>\:<rs-port> - client-pvdataserver-pvrenderserver の構成で、リバース接続の場合。指定されていない場合、ds-port のデフォルトは 11111、rs-port のデフォルトは 22222 です。

  • <CommandStartup> タグは、外部コマンドを実行してサーバーを起動するために使用します。

  • オプションの <Options> タグを使うと、起動時に必要なオプションをユーザーに促すことができます。

  • <Option> タグは、起動前にユーザーが変更を促されるオプションを表しています。

  • name 属性は、オプションの名前を定義します。この名前は、実行時の環境変数として使われるときには変数名となり、 <Argument> タグ内の文字列置換の目的で使用されます。

  • label 属性は、オプションの人間が読めるラベルを定義するもので、ユーザーインターフェースで使用されます。

  • オプションの readonly 属性は、ユーザーには見えるが、変更できないオプションを指定するのに使用できます。

  • オプションの save 属性は、ユーザーがこのオプションで選択した値を、ParaViewのセッティン グに保存して、ParaViewのセッションを超えて保存することを示すために使用できます。

  • <Range> タグは、ある範囲の値に対してのみ有効な数値オプションを指定します。

  • type 属性は、制御する数値の種類を制御します。有効な値はそれぞれ、整数ならば int 、浮動小数点数ならば double です。

  • min``と ``max 属性は、オプションの許容値の最小値と最大値を指定します(これらを含む)。

  • step 属性は、ユーザーインターフェースで値を増減させる際に必要な量を指定します。

  • default 属性は、オプションの初期値を指定します。

  • 整数の範囲の特殊なケースとして、デフォルト値を random にすると、ユーザーが値の入力を求められるたびに、デフォルトとして乱数を生成します。これは特に PV_CONNECT_ID や PV_SERVER_PORT で有効です。

  • <String> タグは、自由形式のテキストを値として受け入れるオプションを指定します。

  • default 属性は、オプションの初期値を指定します。

  • <File> タグは、自由形式のテキストと、ファイルパスの選択を助けるファイルブラウズボタンを受け付けるオプションを指定します。

  • default 属性は、オプションの初期値を指定します。

  • <Boolean> タグは、on/offまたはtrue/falseのいずれかのオプションを指定します。

  • true 属性は、ユーザーが有効にした場合のオプションの値を指定します。

  • false 属性は、ユーザーが無効にした場合のオプション値を指定します。

  • default 属性は、オプションの初期値を指定するもので、 true または false のいずれかとなります。

  • <Enumeration> タグは、有限の値のセットの一つであるオプションを指定します。

  • default 属性は、オプションの初期値を指定するもので、列挙された値の一つでなければなりません。

  • <Entry> タグは、1つの許容値を記述します。

  • name タグは、その選択肢の値を指定します。

  • label タグは、その選択肢のユーザーインターフェースに表示される、人間が読めるテキストを指定します。

  • <Command> タグを使って、外部コマンドとその起動時の引数を指定します。

  • 実行するコマンドのファイル名を指定するのが exec 属性です。絶対パスが指定されていない場合は、システムのPATHがコマンドの検索に使われます。この属性の値が$STRING$と指定された場合は、事前に定義された変数やユーザー定義(<Option/>を通じて)された変数の値で置き換えられます。

  • process_wait 属性は、ParaViewがexecコマンドの開始を待つ待ち時間(秒単位)を指定します。デフォルトは0です。

  • delay 属性は、起動コマンドが完了してから、クライアントがサーバーへの接続を試みるまでの遅延時間(秒)を指定します。デフォルトは0です。

  • <Argument> タグは、起動コマンドに渡されるコマンドライン引数です。

  • 文字列の置換は各引数に対して行われ、各 $STRING$ を定義済みまたはユーザー定義の変数の値に置き換えます。

  • 値が空の文字列である引数は、起動コマンドに渡されません。

  • <SSHCommand> タグを使って、sshで起動する外部コマンドを指定します。

  • <Command> 関連の属性やタグはすべて適用されます。

  • SSHの設定を行うには、<SSHConfig> タグを使用します。

  • user 属性は、SSHのユーザー名を設定するために使用されます。

  • <Terminal> タグは、ターミナルを使ってsshコマンドを発行し、必要に応じてユーザーにパスワードを尋ねるよう、ParaViewに知らせるために使われます。

  • exec 属性は、使用する端末の実行ファイルを指定します。設定されていない場合、ParaViewは自動的に実行ファイルを見つけようとします(WindowsおよびLinuxの場合のみ)。

  • <AskPass> タグは、<Terminal>タグと一緒に使ってはいけませんが、Linuxのみで、SSH_ASKPASS環境変数を使って、AskPassを使うようにParaViewに知らせるために使うことができます。

  • <SSH> タグで、指定するために使われます。

  • 使用するSSH実行ファイルを指定する exec 属性です。

  • <PortForwarding> タグで、ParaViewにSSHトンネルの作成が必要であることを示します。これは、接続タイプに応じてフォワードまたはリバースのいずれかになります。

  • SSHトンネルを使用するローカルポートを指定する local 属性。

  • <ManualStartup> タグは、ユーザーが接続する前に、指定されたサーバーを手動で起動することを示します。

  • オプションの <Options> タグを使うと、起動時に必要なオプションをユーザーに促すことができます。PV_SERVER_PORT`、PV_DATA_SERVER_PORTPV_RENDER_SERVER_PORT、 および PV_CONNECT_ID は、この文脈で意味を持つ唯一の変数であることに注意してください。

7.5.19. スタートアップコマンド変数

起動コマンドが実行されると、その環境には<Option>タグで指定されたユーザー定義の変数に加えて、以下の定義済みの変数が含まれます:

  • PV_CLIENT_HOST

  • PV_CONNECTION_URI

  • PV_CONNECTION_SCHEME

  • PV_VERSION_MAJOR (e.g. 5)

  • PV_VERSION_MINOR (e.g. 9)

  • PV_VERSION_PATCH (e.g. 1)

  • PV_VERSION (e.g. 5.9)

  • PV_VERSION_FULL (e.g. 5.9.1)

  • PV_SERVER_HOST

  • PV_SERVER_PORT

  • PV_SSH_PF_SERVER_PORT

  • PV_DATA_SERVER_HOST

  • PV_DATA_SERVER_PORT

  • PV_RENDER_SERVER_HOST

  • PV_RENDER_SERVER_PORT

  • PV_CLIENT_PLATFORM (有効な変数: Windows, Apple, Linux, Unix, Unknown)

  • PV_APPLICATION_DIR

  • PV_APPLICATION_NAME

  • PV_CONNECT_ID

これらのオプションは、PVSC ファイルの <Command> または <SSHCommand> 要素の一部で使用することができ、また、コマンドを実行する際に環境変数から抽出することもできます。<Option> 要素が定義済みの変数と同じ名前の変数を定義している場合、<Option> 要素の値が優先されます。これを利用して、通常はユーザーから見えないデフォルトを上書きすることができます。例えば、あるサイトでユーザーがデフォルトのポート番号を上書きできるようにしたい場合、サーバーの設定で<Option>にPV_SERVER_PORTを指定することができます。

7.6. 並列処理を理解する

並列処理とは、簡単に言えば、複数のワーカーを同時に使ってデータを並列に処理することです。通常、これらのワーカーは、マルチコアマシンまたはクラスタの複数のノード上で実行される異なるプロセスです。これをランクと呼びます。ほとんどのデータ処理および可視化アルゴリズムにおいて、作業は、処理される必要があるデータの量、すなわち、データセット内のセルまたは点の数に直接関係します。したがって、作業をランク間で分配する簡単な方法は、入力データセットを複数のチャンク(データの塊)に分割し、各ランクにチャンクの独立したセットのみを動作させることです。便利なことに、ほとんどのアルゴリズムでは、データセットを分割して個別に処理した結果は、データセットを1つのチャンクで処理した場合と同じ結果になります。もちろん例外もあります。例を使って、このことをもっとよく理解しましょう。デモンストレーションのために、この非常に単純化されたメッシュを検討してください。

../_images/ParallelExampleMesh.png

ここで、このメッシュに対して3つのプロセスを使用して可視化を実行するとします。次に示すように、メッシュのセルを青、黄、ピンクの領域で分割できます。

../_images/ParallelExamplePartitions.png

分割されると、いくつかの可視化アルゴリズムは、単に各プロセスがそのローカルなセルの集合上でアルゴリズムを独立して実行することを可能にすることによって機能します。クリッピングを例にとってみましょう。クリップ平面を定義し、その同じ平面を各プロセスに与えるとします。

../_images/ParallelExampleClip1.png

各プロセスは、このプレーンを使用して個別にセルをクリップできます。最終的な結果は、連続してクリッピングを行った場合と同じです。セルを1つにまとめると(これは明らかな理由から、実際には大きなデータに対して行うことはありません)、クリッピング操作が正しく行われたことがわかります。

../_images/ParallelExampleClip2.png

7.6.1. ゴーストレベル

残念ながら、セルのパーティション上で可視化アルゴリズムを盲目的に実行しても、必ずしも正しい答えが得られるとは限りません。簡単な例として、外部面(external faces) アルゴリズムを考えてみましょう。外部面アルゴリズムは、1つのセルのみに属するすべてのセル面を検出し、メッシュの境界を識別します。

../_images/ParallelExampleExternalFaces1.png

おっと!すべてのプロセスが外部面アルゴリズムを独立して実行した場合、内部面の多くが外部であると誤って識別されてしまいます。これは、あるパーティションのセルが別のパーティションに隣接している場合に発生します。プロセスは他のパーティションのセルにアクセスできないため、これらの隣接セルが存在することを知る方法はありません。

ParaViewや他の並列可視化システムで採用されているソリューションは、ゴーストセル(ghost cells) を使用することです。ゴーストセルは、1つのプロセスに保持されていますが、実際には別のプロセスに属するセルです。ゴーストセルを使用するには、まず各パーティションのすべての隣接セルを識別する必要があります。次に、これらの隣接するセルをパーティションにコピーし、次の例で灰色のセルで示すように、ゴーストセルとしてマークします。

../_images/ParallelExampleExternalFaces2.png

ゴーストセルを使用して外部フェースアルゴリズムを実行しても、一部の内部フェースが外部として誤って識別されていることがわかります。 しかし、これらの誤分類された面はすべてゴーストセル上にあり、それらの面は元のセルのゴーストステータスを継承します。ParaViewはゴーストフェースを取り除き、正しい答えを残します。

この例では、ゴーストセルの1つのレイヤ(パーティションのセルに直接隣接するセルのみ)を示しました。ParaViewには、ゴーストセルの複数のレイヤを取得する機能もあります。各レイヤには、下位のゴーストレイヤまたは元のデータ自体にまだ含まれていない、前のレイヤの隣接レイヤが含まれます。これは、ゴーストセルの独自のレイヤを必要とするカスケードフィルタがある場合に便利です。それぞれが上流からゴーストセルの追加レイヤを要求し、下流に送信する前にデータからレイヤを削除します。

7.6.2. データ分割

データを分割して配布しているため、データをどのように分割するかという問題に対処するのが賢明です。前の例で示したデータには、空間的コヒーレント(spatially coherent) パーティションがあります。つまり、各パーティションのすべてのセルは、空間のコンパクトな領域に配置されます。データを分割する方法は他にもあります。たとえば、ランダムなパーティションを作成できます。

../_images/ParallelExampleRandomPartition1.png

ランダム分割にはいくつかの優れた機能があります。作成が容易で、負荷分散に適しています。しかし、ゴーストセルに関して重大な問題が存在します。

../_images/ParallelExampleRandomPartition2.png

この例では、単一レベルのゴーストセルがすべてのプロセスのデータセット全体をほぼ複製することがわかります。このようにして、並列処理の利点を排除してしまいました。ゴーストセルは頻繁に使用されるため、ParaViewではランダムパーティションは使用されません。

7.6.3. D3フィルタ

前節では、負荷分散と並列可視化のゴーストレベルの重要性について説明しました。本節では、その方法について説明します。

負荷分散とゴーストセルは、構造データ(画像データ、直線格子、構造格子)の読み取り時にParaViewによって自動的に処理されます。陰的トポロジーにより、データを空間的にコヒーレントなチャンクに分割し、隣接セルの位置を同定することが容易になります。

非構造データ(ポリゴンデータと非構造格子)を読み取る場合は、まったく別の問題になります。暗黙的なトポロジーや利用可能な近傍情報はありません。ParaViewは、データがどのようにディスクに書き込まれたかに左右されます。したがって、非構造データを読み込む場合、データのロードバランスがどの程度良好であるかは保証されません。また、データにゴーストセルが含まれる可能性も低く、一部のフィルタの出力が正しくない可能性があります。

ParaViewには、非構造データのバランスをとり、ゴーストセルを作成するフィルタがあります。このフィルタはD3と呼ばれ、distributed data decompositionの略です。D3を使うのは簡単です。パーティションを切り直したいデータに( Filters > Alphabetical > D3)にある)フィルタをかけるだけです。

../_images/D3ExampleBefore.png
../_images/D3ExampleAfter.png

D3の最も一般的な仕様例は、非構造格子リーダーにD3を直接接続することです。入力データの負荷バランスがどの程度良好であっても、後続のフィルタが正しいデータを生成するようにゴーストセルを検索できることが重要です。上記の例は、非構造格子上の抽出サーフェスフィルタの切断図を示しています。左側では、ゴーストセルが欠落しているため、不適切に抽出された面が多数あることがわかります。右側では、まずD3フィルタを使用して問題を解決します。

7.7. Ghost Cells Generation

If your unstructured grid data is already partitioned satisfactorily but does not have ghost cells, it is possible to generate them using the Ghost Cells filter. This filter can be attached to a source just like the D3 filter. Unlike D3 , it will not repartition the dataset, it will only generate ghost cells, which is needed for some algorithms to execute correctly.

The Ghost Cells filter has several options. Build If Required tells the filter to generate ghost cells only if required by a downstream filter. Since computing ghost cells is a computationally and communications intensive process, turning this option on can potentially save a lot of processing time. The Minimum Number Of Ghost Levels specifies at least how many ghost levels should be generated if Build If Required is off. Downstream filters may request more ghost levels than this minimum, in which case the Ghost Cells will generate the requested number of ghost levels. The Use Global Ids option makes use of a GlobalIds array if it is present if on. If off, ghost cells are determined by coincident points.

7.8. ParaViewアーキテクチャ

並列データ処理にParaViewを使用する方法を説明する前に、ParaViewのアーキテクチャについて詳しく説明します。ParaViewは、3層のクライアントサーバアーキテクチャとして設計されています。ParaViewの3つの論理ユニットは次のとおりです。

  • Data Server データの読み込み、フィルタリング、書き込みを行うユニット。パイプラインブラウザに表示されるすべてのパイプラインオブジェクトは、データサーバーに含まれます。データサーバーは並列にすることができます。

  • Render Server レンダリングを担当するユニット。レンダーサーバーを並列にすることもできます。この場合、組み込みの並列レンダリングも有効になります。

  • Client 可視化を確立するためのユニット。クライアントは、サーバーでのオブジェクトの作成、実行、および破棄を制御しますが、データは含まれません(これにより、クライアントでボトルネックを発生させることなくサーバーを拡張できます)。GUIがある場合は、それもクライアントにあります。クライアントは常にシリアル・アプリケーションです。

これらの論理ユニットは、物理的に分離されている必要はありません。論理ユニットは同じアプリケーションに組み込まれることが多く、論理ユニット間の通信が不要になります。ParaViewは3つのモードで実行できます。

../_images/RunModeStandalone.png

最初のモードは、すでにお馴染みのものですが、スタンドアロンモード( standalone モード)です。スタンドアロンモードでは、クライアント、データサーバー、レンダーサーバーはすべて1つのシリアルアプリケーションに統合されます。paraview アプリケーションを実行すると、自動的に builtin サーバーに接続され、ParaViewのすべての機能を使用できるようになります。

../_images/RunModeClientServer.png

2番目のモードはクライアントサーバーモード( client-server モード)です。クライアントサーバーモードでは、並列マシン上で pvserver プログラムを実行し、paraview クライアントアプリケーション(又は pvpython )で接続します。pvserver プログラムには、データサーバとレンダーサーバの両方が組み込まれているため、データ処理とレンダリングの両方が行われます。 クライアントとサーバはソケットを介して接続され、これは通信の比較的遅いモードであると想定されるので、このソケットを介したデータ転送は最小限に抑えられます。この操作モードについては、 7.2 章 で説明しました。

../_images/RunModeClientRenderDataServer.png

3番目のモードはクライアントレンダーサーバデータサーバーモード( client-render server-data server モード)です。このモードでは、3つの論理ユニットすべてが別々のプログラムで実行されます。前と同様に、クライアントはシングルソケット接続を介してレンダリングサーバに接続されます。レンダーサーバーとデータサーバーは、レンダーサーバーのプロセスごとに1つずつ、多数のソケット接続によって接続されます。ソケットを介したデータ転送は最小限に抑えられます。

クライアントレンダーサーバデータサーバーモードはサポートされていますが、使用することはほとんどお勧めしません。このモードの本来の目的は、大規模で強力な計算プラットフォームと、グラフィックハードウェアを備えた第2の小型並列マシンを持つ異種環境を利用することです。しかし、実際には、ジオメトリをデータサーバーからレンダーサーバーに移動する時間の方が、ほとんどの場合メリットが少ないことがわかります。計算プラットフォームがグラフィックスクラスタよりもはるかに大きい場合は、大規模な計算プラットフォームでソフトウェアレンダリングを使用します。2つのプラットフォームのサイズがほぼ同じ場合は、グラフィックスクラスタですべての計算を実行します。このモードで使用される実行可能ファイルは、paraview (または pvpython ) (クライアントとして動作)、データサーバー用の pvdataserver 、およびレンダーサーバー用の pvrenderserver です。

7.9. paraviewpvpython での並列処理

paraview または pvpython の並列処理機能を利用するには、リモート可視化を使用する必要があります。つまり、 pvserver に接続する必要があります。この pvserver への接続処理は、 7.2 章7.3 章 で説明した処理と変わりません。変更されるのは、pvserver の起動方法だけです。

mpirun を使用すると、pvserver を起動して複数の処理コアで実行できます。

mpirun -np 4 pvserver

これにより、4つの処理コアで pvserver が実行されます。デフォルトポートのクライアントからの着信接続をリッスンします。この方法で pvserver を実行する場合の大きな違いは、データソースが parallel aware (並列認識)されていて、異なるプロセッシングコア間でのデータの分散をサポートしている場合、データがソースからロードされたときに4つのコア間で分散されることです。

このデータがどのように分散されているかを確認するには、上記のコマンドで pvserver を実行し、paraview を使用して接続します。次に、Source > Sphere を使用して別の Sphere ソースを作成します。配列をcolorから vtkProcessId に変更します。図 7.16 のようなイメージが表示されます。

../_images/SphereColoredByProcessId.png

図 7.16 球体データが存在する処理コアをエンコードする vtkProcessId 配列で色付けされたSphereソース。この例では、球体データは mpirun-np 4 pvserver コマンドで呼び出される4つの処理コアに分割されます。

データリーダーまたはデータソースが parallel aware でない場合でも、 D3 フィルタを使用することで、処理コア間でデータを分散させるメリットを得ることができます。このフィルタはデータセットを凸領域に分割し、各領域を異なる処理コアに転送します。D3がどのようにデータセットを分割するかの例を見るには、paraviewpvserver に接続されたままの状態で Source > Wavelet を作成します。次に、Filters > Alphabetical > D3 を選択し、 Apply をクリックします。 D3 の出力は、最初は元のウェーブレットソースと異なって表示されません。ただし、 vtkProcessId で色付けすると、サーバー処理コアに分配された4つのパーティションが表示されます。

../_images/WaveletColoredByProcessId.png

図 7.17 D3フィルタで処理され、 vtkProcessId 配列で色付けされたウェーブレットソース。pvservermpirun-np 4 pvserver で実行すると、画像データの四つの領域が四つの処理コアに均等に分割されることに注意してください。

7.10. pvbatch の使用

7.9 章 では、並列処理機能を使用するには、リモート可視化を使用する必要があると説明しました。つまり、クライアント( paraview または pvpython )が mpirun を使用して並列実行されているサーバー (pvserver) に接続して、クライアント/サーバーモードでParaViewを使用する必要があります。ただし、1つだけ例外があります。 pvbatch です。pvpythonpvbatch はよく似ていて、どちらも python に似ています。

ただし、pvbatch は例外です。pvpythonpvbatch は、どちらもPythonスクリプトを実行する python executableに似ています。これらの実行可能ファイルを標準の python と比較すると、これらの実行可能ファイルは環境を初期化し、実行するスクリプトがParaView Pythonモジュールとライブラリを自動的に見つけられるようにします。pvpython は、GUIを持たない paraview 実行ファイルとまったく同じです。paraview のGUIが pvpython のPythonインタプリタに置き換えられたと考えることができます。 一方、pvbatchpvserver と考えることができます。pvbatch では、リモートクライアント( paraview または pvpython )から制御コマンドを受け取るのではなく、pvbatch 実行ファイル自体で実行されるPythonスクリプトからコマンドを受け取ります。pvbatchpvpython とは異なり、pvserver に 似ているため、mpirun を使用して並列実行できます。この場合、ルートランク(または最初のランクまたはインデックス 0 のランク)がクライアントとして動作し、Pythonスクリプトを解釈してコマンドを実行します。 pvbatch は独自のサーバとして動作するように設計されているため、Pythonスクリプトでリモートサーバーに接続することはできません。つまり simple.Connect を使用することはできません。 さらに、pvbatch はバッチ操作用に設計されているため、Pythonスクリプトはコマンドライン引数としてしか指定できません。pvpython とは異なり、この実行ファイルを実行してPythonコマンドを入力するための対話型シェルを取得することはできません。

# process the sample.py script in single process mode.
> pvbatch sample.py

# process the sample.py script in parallel.
> mpirun -np 4 pvbatch sample.py

通常、インタプリタを対話的に使用する場合は pvpython を使用し、並列実行する場合は pvbatch を使用します。

7.11. クライアントへのデータの取り込み

3.3 章 では、データオブジェクトに 関する 情報を取得する方法について説明していますが、データオブジェクト自体にアクセスする方法については説明していません。本節では、Pythonスクリプトからデータにアクセスするいくつかの方法について説明します。ParaViewのクライアント/サーバの性質上、生データにアクセスするにはいくつかのステップが必要です。 Pythonスクリプトはクライアント側で pvpython または paraview のいずれかで実行されるため、1つの手順として、サーバーからクライアントにデータを移動します。これは、次の方法で実行できます。

from paraview.simple import *
Connect("myhost")

# Create a sphere source on myhost
s = Sphere()
full_sphere = servermanager.Fetch(s)

ここでは、データセット全体がサーバからクライアントに移動されます。

The second step is required to deal with the fact that data on the remote server may be split across distributed processes. By default, servermanager.Fetch(s) appends all the pieces on the different remote processes and produces the appended dataset on the client. The exact append operation depends on the type of dataset being retrieved. Composite datasets are merged by treating the dataset piece on each distributed process as a block merged into a new multiblock dataset, polygonal datasets are appended into a single polygonal dataset, rectilinear grids are appended into a single rectilinear grid, and other datasets are appended into an unstructured grid. Distributed image datasets cannot currently be fetched to the client. Care must be taken when fetching an entire dataset to the client because the data that fits on many distributed processes on a remote system may not fit in client memory.

もう1つのオプションは、1つのリモート・プロセス上のデータセットの一部だけをクライアントにフェッチすることです。これを行うには、データを取得したいリモートプロセスのランク番号を Fetch 関数に渡します。例えば以下になります。

# Retrieve the piece of the dataset on remote process 2
s = Sphere()
sphere_piece = servermanager.Fetch(s, 2)

最後に、servermanager.Fetch は、2つのステージで実行されるデータセットにヘルパーフィルタを適用する方法を提供します。第1段階のフィルタは各リモートプロセスのデータに適用され、第2段階のフィルタはルートサーバープロセスに収集された後の第1段階の結果に適用されます。 フィルタリングの第2段階の結果は、ルートサーバープロセスからクライアントに転送されます。

次の例では、最初の段階で各プロセスのデータを含むソースに Extract Surface フィルタを適用します。結果は、Append Geometry フィルタでアセンブルされ、クライアントに送信されます。

s = Sphere()
extract = servermanager.filters.ExtractSurface()
append = servermanager.filters.AppendGeometry()
full_surface = servermanager.Fetch(s, extract, append)

2番目のフィルタは、複数の接続を受け入れ、最初のフィルタからの出力データセットタイプを処理できる必要があります。

7.12. レンダリング

レンダリングは、データに基づいて表示されるイメージを合成するプロセスです。データを効果的に操作できるかどうかは、レンダリングの速度に大きく依存します。コンピュータゲーム市場に支えられた3Dハードウェアアクセラレーションの進歩により、中価格のコンピュータでも3Dを素早くレンダリングすることができます。ただし、レンダリングの速度は、レンダリングされるデータの量に比例します。 データが大きくなると、当然ながらレンダリング処理が遅くなります。

可視化セッションをインタラクティブなままにするために、ParaViewは、必要に応じて自動的に反転される2つのレンダリングモードをサポートしています。最初のモード still render では、データは最高レベルの詳細さ(ディテール)でレンダリングされます。このレンダリングモードでは、すべてのデータが正確に表示されます。2番目のモード interactive render では、速度が精度よりも優先されます。このレンダリングモードでは、データサイズに関係なくレンダリング速度が速くなります。

3Dビューを操作している間(例えば、マウスによる回転、パン、ズーム)、ParaViewはインタラクティブレンダリングを使用します。これは、インタラクション時にこれらの機能を使用可能にするために高いフレームレートが必要であり、インタラクションが発生している間は各フレームがすぐに新しいレンダリングに置き換えられるため、このモードでは細部の重要性が低くなるためです。3Dビューの操作が行われていないときはいつでも、ParaViewは静止レンダリングを使用して、データの完全な詳細を確認できるようにします。3Dビューでマウスをドラッグしてデータを移動すると、近似レンダリングが表示される場合があります。 詳細は、マウスボタンを放すとすぐに表示されます。

インタラクティブレンダリングは、速度と精度の妥協点です。そのため、レンダリングパラメータの多くは、詳細レベルが低い場合に、どのように使用されるかに関係します。

7.12.1. 基本レンダリング設定

最も重要なレンダリングオプションには、LODパラメータがあります。 インタラクティブレンダリング中に、ジオメトリは下位の level of detail ( LOD ) 、つまりポリゴン数の少ない近似ジオメトリに置き換えられます。

LODFULL LOD50 LOD10

ジオメトリック近似の解像度を制御できます。次のイメージでは、左のイメージがフル解像度、中央のイメージがインタラクティブレンダリングのデフォルトのデシメーション(間引き)、右のイメージがParaViewの最大デシメーション設定です。

3Dレンダリングパラメータは設定ダイアログボックスにあります。このダイアログボックスには、 Edit > Settings メニュー(MacOSでは( ParaView > Preferences )からアクセスできます。このダイアログボックスのレンダリングオプションは、Render View タブにあります。

../_images/SettingsRendering.png

インタラクティブレンダリングの幾何学的デシメーションに関連するオプションは、 Interactive Rendering Options というラベルの付いたセクションにあります。 これらのオプションの一部は高度と見なされるため、それらにアクセスするには、pqAdvanced を使用して詳細オプションをオンに切り替える必要があります。 ボタンを押すか、ダイアログの上部にある編集ボックスを使用してオプションを検索します。 インタラクティブレンダリングオプションには、次のものがあります。

  • LOD Threshold : インタラクティブレンダリングで間引きされたジオメトリを使用するデータサイズを設定します。ジオメトリサイズがこのしきい値を下回る場合、ParaViewは常にジオメトリ全体をレンダリングします。大容量のデータを処理できる適切なグラフィックスカードを使用している場合は、この値を増やしてください。インタラクティブレンダリングが遅すぎる場合は、この値を小さくしてみてください。

  • LOD Resolution:間引きされたジオメトリの大きさを制御する係数を設定します。 このコントロールは0から1の間の値に設定されます。0は非常に少数の三角形を生成しますが、おそらく多くの歪みがあります。 1は、より詳細なサーフェスを生成しますが、ジオメトリは大きくなります。 pqAdvanced

  • Non Interactive Render Delay:インタラクティブレンダリングと静止レンダリングの間に遅延を追加します。 ParaViewは通常、インタラクティブモーションが終了した直後に静止レンダリングを実行します(たとえば、回転後にマウスボタンを離すなど)。 このオプションは、静止画のレンダリングが開始する前に2番目のインタラクションを開始する時間を与えることができる遅延を追加できます。これは、静止画のレンダリングが完了するまでに長い時間がかかる場合に役立ちます。pqAdvanced

  • Use Outline For LOD Rendering : 縮小されたジオメトリの代わりにアウトラインを使用します。アウトラインは、ジオメトリの縮小に時間がかかりすぎる場合や、作成されるジオメトリが多すぎる場合に使用できます。しかし、アウトラインだけを操作するのはより困難です。

ParaViewには、さらに多くのレンダリング設定が含まれています。ここでは、ParaViewがクライアントサーバーモードで実行されているかどうかに関係なく、レンダリングパフォーマンスに影響するその他の設定の概要を示します。これらのオプションはいくつかのカテゴリに分かれており、いくつかは高度なオプションと見なされます。

  • Translucent Rendering Options
    • Depth Peeling : デプスピーリングを有効または無効にします。 デプスピーリングは、ParaViewが半透明のサーフェスを適切にレンダリングするために使用する手法です。 これを使用すると、上面がレンダリングされてから「剥がされ」、次の下面をレンダリングできるようになります。 サーフェスを透明にすると、処理速度が大幅に低下したり、完全に正しくレンダリングされなかったりする場合は、グラフィックハードウェアがデプスピーリング拡張機能を適切に実装していない可能性があります。 デプスピーリングを止めてみてください。pqAdvanced

    • Depth Peeling for Volumes : ボリュームと半透明ポリゴンを正しく混合するために、ボリュームを深度ピーリングに含めます。

    • Maximum Number Of Peels : デプスピーリングで使用するピールの最大数を設定します。 より多くのピールを使用すると、より複雑な深さが可能になりますが、より少ないピールを許可すると、実行が速くなります。 半透明のジオメトリのレンダリングが遅すぎる場合、または半透明の画像が正しく表示されない場合は、このパラメータを調整してみてください。pqAdvanced

  • Miscellaneous
    • Outline Threshold : 非常に大きなデータセットを作成する場合は、デフォルトでアウトライン表示になります。サーフェス表示では通常、サーフェスのジオメトリを抽出するためにParaViewが必要で、時間とメモリがかかります。このしきい値を超えるサイズのデータには、デフォルトではオーバーヘッドがほとんどないアウトライン表現を使用します。

    • Show Annotation : レンダリングパフォーマンス情報を提供する注釈を表示または非表示にします。 この情報は、パフォーマンスの問題を診断するときに役立ちます。pqAdvanced

ただし、これはParaViewレンダリング設定の完全なリストではありません。レンダリングパフォーマンスに大きく影響しない設定は除外しました。また、 7.12.4 章 で説明されている、並列クライアントサーバーレンダリングにのみ有効な設定も除外しました。

7.12.2. 並列レンダリングの基礎

並列可視化を実行する場合、データがレンダリングプロセスまでのすべてのプロセス間で確実に分割されるように注意します。ParaViewは IceT と呼ばれる並列レンダリングライブラリを使用します。IceTは並列レンダリングに sort-last アルゴリズムを使用します。この並列レンダリングアルゴリズムでは、各プロセスがジオメトリのパーティションを個別にレンダリングしてから、部分イメージを合成(composites)して最終イメージを作成します。

../_images/ParallelRendering.png

上の図は単純化しすぎています。IceTには、binary treebinary swapradix-k などの複数の並列イメージ合成アルゴリズムが含まれており、複数のフェーズを使用するプロセス間で効率的に作業を分割します。

../_images/ParallelRenderingDetail.png

並び替え並列レンダリング(sort-last parallel rendering)の素晴らしい点は、レンダリングされるデータ量にまったく影響されないことです。 これは非常にスケーラブルなアルゴリズムであり、大規模なデータに適しています。 ただし、並列レンダリングのオーバーヘッドは、イメージのピクセル数に比例して増加します。その結果、レンダリングパラメータの一部がイメージサイズを処理します。

../_images/ParallelRenderingTiles.png

IceTはまた、タイル状のディスプレイを駆動する能力も持っています。タイル状のディスプレイは、モニタまたはプロジェクタの配置を構成する大型で高解像度のディスプレイです。タイル状のディスプレイに並び替えアルゴリズムを使用すると、合成するピクセル数が非常に多くなるため、少し直感的ではありません。しかし、 IceTは各プロセスのデータにおける空間的局所性を利用して、必要な合成量を劇的に低減するように設計されています。この空間的な局所性は、データに Filters > Alphabetical > D3 フィルタを適用することで強制できます。

並列レンダリングにはオーバーヘッドが伴うため、ParaViewではいつでも並列レンダリングをオフにすることができます。並列レンダリングをオフにすると、ジオメトリは表示される位置に配置されます。明らかに、これはレンダリングされるデータが小さい場合にのみ発生します。

7.12.3. イメージの詳細レベル

並列レンダリングアルゴリズムによって生じるオーバヘッドは、生成される画像のサイズに比例します。また、サーバ上で生成されたイメージはクライアントに転送する必要があります。このコストもイメージサイズに比例します。インタラクション時のフレームレートを向上させるために、ParaViewにはイメージのサイズを制御する新しいLODパラメータが導入されています。

並列レンダリング中のインタラクションでは、ParaViewでイメージを subsample することもできます。つまり、ParaViewは、インタラクション時に各次元のイメージの解像度を係数で下げます。 縮小されたイメージは、レンダリング、合成、転送されます。クライアントでは、イメージはGUIで使用可能な領域のサイズに拡大されます。

ImageLODFull ImageLOD2 ImageLOD4 ImageLOD8

縮小画像の解像度は、次元を分割する係数によって制御されます。次のイメージでは、左のイメージがフル解像度になっています。次のイメージは、それぞれ2、4、8倍の解像度でレンダリングされています。

ParaViewには、サーバからクライアントに転送する前にイメージを圧縮する機能もあります。圧縮により、転送されるデータ量が削減されるため、使用可能な帯域幅が最大限に活用されます。 ただし、イメージの圧縮と解凍にかかる時間が長くなります。

ParaViewには、クライアント/サーバレンダリング用の複数の異なるイメージ圧縮アルゴリズムが含まれています。1つは、高速圧縮および解凍用に設計されたLZ 4圧縮を使用します。2番目のオプションは Squirt と呼ばれるカスタムアルゴリズムで、Sequential Unified Image Run Transferの略です。 Squirtはランレングス符号化圧縮で、色深度を減らしてランレングスを長くします。3番目のアルゴリズムは、Lempel-Zivアルゴリズムのバリエーションを実装した Zlib 圧縮ライブラリを使用します。Zlibは通常、Squirtよりも優れた圧縮を提供しますが、実行に時間がかかるため、遅延が増加します。paraview WindowsおよびLinuxの実行可能ファイルには、Keplerクラス以上のNVIDIA GPUが使用可能な場合に、ハードウェアアクセラレーションによる圧縮および解凍にNVIDIAのNVIDIAライブラリを使用する圧縮オプションが含まれています。

7.12.4. 並列レンダリングパラメータ

../_images/SettingsServer.png

他の3Dレンダリングパラメータと同様に、並列レンダリングパラメータは Settings ダイアログにあります。このダイアログボックスの並列レンダリングオプションは、Render View タブにあります( 7.12.1 章 で説明されているような他のいくつかのレンダリングオプションと混在しています)。パラレルオプションとクライアントサーバーオプションはいくつかのカテゴリーに分けられ、そのうちのいくつかは高度なものと見なされます。

  • Remote/Parallel Rendering Options

    • Remote Render Threshold : リモートで並列レンダリングする、またはローカルでレンダリングするデータサイズを設定します。ジオメトリがこのしきい値を超える場合(ParaViewがリモートサーバーに接続されている場合)、データはリモートで並列にレンダリングされ、イメージがクライアントに送り返されます。ジオメトリがこのしきい値を下回る場合、ジオメトリはクライアントに送り返され、イメージはクライアント上でローカルにレンダリングされます。

    • Still Render Image Reduction Factor : 静止(非対話型)レンダリングのサブサンプリング係数を設定します。 一部の大型ディスプレイは実際に必要な解像度よりも高い解像度を持っているため、このサブサンプリングにより、表示されるすべての画像の解像度が低下します。pqAdvanced

  • Client/Server Rendering Options

    • Image Reduction Factor : インタラクティブサブサンプリング係数を設定します。 パラレルレンダリングのオーバーヘッドは、生成される画像のサイズに比例します。 したがって、画像のサブサンプリングレートを指定することで、インタラクティブなレンダリングを高速化できます。 このボックスをオンにすると、インタラクティブレンダリングによって小さな画像が作成され、表示時に拡大されます。 このパラメータは、インタラクティブレンダリング中にのみ使用されます。pqAdvanced

  • Image Compression

    • 画像をサーバーからクライアントに送信する前に、オプションで、LZ4、Squirt、またはZlibの3つの利用可能な圧縮アルゴリズムのいずれかを使用して画像を圧縮できます。 圧縮をより効果的にするために、どちらのアルゴリズムでも、圧縮前に画像の色解像度を下げることができます。 スライダーは、保存されるカラービットの量を決定します。 静止画のレンダリング中は、常にフルカラー解像度が使用されます。 pqAdvanced

    • 一般的なネットワークの種類に応じて、推奨される画像圧縮のプリセットが提供されています。最適な画像圧縮オプションを選択する場合は、接続に最も適したプリセットから始めてみてください。pqAdvanced

7.12.5. 大規模データに対するパラメータ

デフォルト値のレンダリングパラメータは、ほとんどのユーザに適しています。ただし、非常に大きなデータを処理する場合は、レンダリングパラメータを調整すると便利です。最適なパラメータは、データとParaViewを実行しているハードウェアによって異なりますが、ここではいくつかのアドバイスを紹介します。

  • 特定のデータセットの最初のインタラクティブレンダリングの前に長い一時停止がある場合、それは間引きされたジオメトリの作成である可能性があります。インタラクションでは、間引きされたジオメトリではなくアウトラインを使用してみてください。また、間引き係数を0に下げて、より小さいジオメトリを作成することもできます。

  • 大きなジオメトリをクライアントに返送しないでください。リモートレンダリングでは、サーバ全体の能力を使用してイメージをレンダリングし、クライアントに送信します。リモートレンダリングがオフの場合、ジオメトリはクライアントに送り返されます。データが大きい場合は、データを送信するよりもイメージを送信する方が常に高速です(ただし、ネットワークの遅延が大きい場合は、インタラクティブなフレームレートで問題が発生する可能性があります)。

  • 必要に応じて、クライアントサーバーレンダリングのインタラクティブイメージサブサンプリングを調整します。イメージ合成の速度が遅い場合、クライアントとサーバー間の接続の帯域幅が低い場合、または非常に大きなイメージをレンダリングする場合は、サブサンプルレートを高くするとインタラクティブレンダリングのパフォーマンスが大幅に向上します。

  • Image Compression がオンになっていることを確認します。これはデスクトップ配信のパフォーマンスに多大な影響を与え、インタラクティブレンダリング中にのみ発生するアーティファクトは最小限に抑えられます。低帯域幅の接続では、Squirt圧縮の代わりにZlibを使用できます。Zlibは圧縮/解凍時間を長くして、より小さな画像を作成します。

  • ネットワーク接続の遅延が大きい場合は、対話中にリモートレンダリングが行われないようにパラメータを調整します。この場合、リモートレンダリングのしきい値を少し上げてみてください。ここでは、インタラクティブレンダリングにアウトラインを使用することが効果的です。

  • 静止(非インタラクティブ)レンダリングが遅い場合は、不要なレンダリングを避けるために、インタラクティブレンダリングと静止レンダリングの間の遅延をオンにしてみてください。