6. Remote and parallel visualization
远程和并行可视化ParaView应用程序的目标之一是实现大型数据集的数据分析和可视化。ParaView的诞生源于对超级计算资源上运行的模拟结果的可视化需求,而超级计算资源往往太大,单台台式机无法处理。为了实现此类数据集的交互式可视化,ParaView使用远程和/或并行数据处理。基本概念是,如果数据集由于内存或其他限制而无法安装在计算机桌面上,我们可以将数据集拆分到一组计算机上,这些计算机由您的桌面驱动。
在本章中,我们将介绍使用ParaView进行远程和并行数据处理的基础知识。有关设置群集的信息,请参阅ParaView Wiki[ThePCommunity]。
通常远程与并行处理一起使用,但他们却是两个完全不同的概念。
对于Paraview,远程处理指的是让客户机(通常是ParaView或pvpython)连接到pvserver的概念,pvserver可以在不同的远程机器上运行。所有的数据处理和渲染都可能发生在pvserver上。客户端通过构建可视化管道和查看生成的结果来驱动可视化过程。
并行处理的概念…
对于pvbatch…
1.理解远程处理
让我们考虑一个简单的用例。假设你有两台电脑,一台在办公室,另一台在家里。办公室里的那台比家里的那台更好,更强大,内存和计算能力都更大。在这种情况下,您经常在办公机器上运行模拟,将生成的文件存储在连接到办公机器的磁盘上。在工作时,要可视化这些结果,只需启动paraview并打开数据文件。现在,如果你需要在家里做可视化和数据分析呢?您有几种选择:
- 1)你可以吧数据拷贝回家,在家里的电脑上使用paraview可视化这些拷贝的数据。
- 2)您可以使用远程桌面或VNC等桌面共享系统,但这些系统可能会因您的网络连接而不好工作。
- 3)使用paraview的远程处理功能。
远程处理的概念非常简单!
这里有两个独立的过程:pvserver(运行在你的办公机器上),paraview客户端(运行在你家里的电脑上)。它们通过套接字(如果需要,通过SHH隧道)相互通信。就在这种模式下使用paraview而言,它与我们目前使用它的方式没有什么不同——您创建管道,然后在视图中查看这些管道生成的数据,等等。
但是,管道本身是在pvserver进程上远程创建的。因此,管道访问的工作机器上的磁盘。【Open File】对话框将浏览远程工作机器上的文件系统,就是pvserver运行的机器。
虽然所有数据处理都在pvserver上进行,但在进行渲染时,可以将paraview配置为在服务器进程上进行渲染并仅将图像传递给客户端(远程渲染),或者将要渲染的几何体传递给客户端并让其在本地进行渲染(本地渲染)。
远程渲染时,将使用工作计算机(运行pvserver的计算机)上的图形功能。
每次需要获得新的渲染时(例如,当管道参数更改或与摄影机交互时,等等),pvserver进程将重新渲染新图像并将其交付给客户端。
本地渲染时,将要渲染的几何体传递给客户端,客户端在本地渲染这些几何体。
因此,并非所有交互都需要服务器端处理。只有当可视化管道更新时,服务器才需要向客户端交付更新的几何图形。
2. 使用paraview远程可视化
2.1 启动一个远程server
开始使用Paraview远程数据处理和可视化,我们必须首先在远程系统的服务程序pvserver。为了启动pvserver,连接到远程系统使用shell并运行:
>pvserver
你可以在终端看到启动信息:
Waiting for client...
Connection URL: cs://myhost:11111
Accepting connection(s): myhost:11111
这就意味着,server已经启动了,正在监听一个来自客服端的连接。
2.2 配置服务器连接
为了使用paraview客户端连接到这个服务器,选择【File->Connect】或者点击工具栏上的【】按钮,打开“选择服务器配置”对话框。
如果你的服务器在防火墙之内,而你尝试在防火墙之外连接服务器,连接并不能成功建立。你也可以尝试reverse connections作为防火墙的一个应变方法。
Host:启动服务器主机的DNS名称
Visualization Center可以在web服务器上提供系统范围的服务器配置,允许非专家简单地选择已配置的ParaView服务器。
这些站点范围的设置可以通过“获取服务器”按钮加载。
高级用户可能还希望更详细地指定自己的服务器。
这些功能的提供得益于ParaView服务器配置文件(第6.5节)。
2.3.连接到远程服务器
当客户端尝试连接到服务器时,ParaView不执行任何类型的身份验证。因此,我们建议您不要在对外开放的计算资源上运行pvserver。
ParaView也不会加密客户端和服务器之间发送的数据。如果您的数据敏感,请确保已采取适当的网络安全措施。典型的方法是使用本机SSH支持在服务器配置文件中使用SSH隧道。
2.4. 管理多个客户端
可以配置pvserver同时接收来自多个客户端的连接。在这种情况下,只有master一个节点可以进行管道交互。其他客户端只允许可视化数据。协作面板在连接的客户端之间共享信息。
想要允许这个模式,pvserver必须使用–multi-clients标志启动:
pvserver --multi-clients
2.5.启动一个客户端/服务器可视化管道
3.使用pvpython远程可视化
pvpython 可执行程序可以用来可视化本地数据,但是也可以作为客户端连接到远程pvserver。在pvpython中创建一个管道之前,使用Conncetion函数:
# 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,所有数据都保留在服务器上,图像也在服务器上生成。图像被发送到客户端以供显示或保存到本地文件系统。
4.反向连接
ParaView提供了一种设置反向连接的方法,该方法在建立连接时会反转通常的客户机-服务器角色。
其次,pvserver必须使用–reverse connection(-rc)标志启动。要告诉pvserver客户端的名称,请将–client host(-ch)命令行参数设置为运行paraview客户端的计算机的主机名。可以使用–server port(-sp)命令行参数指定端口。
pvserver -rc --client-host=mylocalhost --server-port=11111
当服务器启动时,会打印一些消息暗示连接到客户端是成功还是失败。当连接成功时,你可以在shell中看到如下打印信息:
Connecting to client (reverse connection requested)...
Connection URL: csrc://mylocalhost:11111
Client connected.
在pypython中等待一个来之pvserver的方向连接,应当使用ReverseConnect代替Connect.
# 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)
5.Paraview服务器配置文件
在“选择服务器配置”对话框,可以使用专用的按钮【加载服务器】和【保存服务器】。服务器配置存储在Paraview 服务器配置文件(.pvsc)中。
这些文件使广泛定制服务器连接过程成为可能。在启动过程中,ParaView会查看默认情况下要加载的服务器配置的多个位置。
On Unix-based systems and Mac OS X
default_servers.pvsc in the ParaView executable directory (you can do a ls -l /proc/<paraview PID here>/exe to identify the executable directory)
/usr/share/ParaView/servers.pvsc
$HOME/.config/ParaView/servers.pvsc (ParaView will save user defined servers here)
On Windows
default_servers.pvsc in the ParaView executable directory
%COMMON_APPDATA%\\ParaView\\servers.pvsc
%APPDATA%\\ParaView\\servers.pvsc (ParaView will save user defined servers here)
下面是一些常见用例的一些示例。
5.1 案例一:简单命令服务器启动
在这个案例中,我们将连接本地11111端口启动的pvserver(localhost),除了在连接到服务器之前自动调用启动服务器的命令外,我们将在中止连接之前等待超时。
<Server name="case01" resource="cs://localhost:11111" timeout="10">
<CommandStartup>
<Command process_wait="0" delay="5" exec="/path/to/pvserver"/>
</CommandStartup>
</Server>
CommandStartup元素指定在连接到服务器之前将被启动的一个命令。Command元素包括这个被启动命令的具体细节,包括process_wait,以秒为单位的时间:paraview将等待pvserver进程启动;delay,时间单位秒,paraview将在运行命令后等待尝试连接;最后,exec,它是一个将被运行的命令,通常包括到pvserver的路径,也可以包括一个mpi命令启动分布式的pvserver,或者执行本地文件系统的任何脚本。
5.2 案例二:简单远程服务器连接
在这个用例中,我们为一个简单的服务器连接设置一个配置:在一个名为“amber1”节点的20234端口上运行的pvserver进程。这个pvserver进程将由用户手动启动。
<Server name="case02" resource="cs://amber1:20234">
<ManualStartup/>
</Server>
name指定在管道浏览器中的服务器名称,resource标识连接的类型(cs-意味着客服端-服务器)、主机名称和端口号。如果resource中未指定端口号,即:20234 部分,则假定默认端口号(11111)。由于用户手动启动pvserver进程,因此我们使用ManualStartup。
5.3案例三:使用用户指定端口连接服务器
这个用例与案例二相同,只是每一次需要询问连接到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>
5.4 案例四:与数据服务器/渲染服务器的简单连接
这与第二种情况相同,只是我们连接到一个单独的渲染服务器/数据服务器,而不是单个服务器(即pvserver),其中pvdataserver在amber1上的端口20230上运行,pvrenderserver在节点amber2上的端口20233上运行。
<Server name="case04" resource="cdsrs://amber1:20230//amber2:20233">
<ManualStartup />
</Server>
与case 2的唯一区别:是resource的指定。cdsrs表明它是一个客户端-数据服务器-渲染服务器配置。第一个host:port是数据服务器,而第二个是渲染服务器。
5.5 案例五:使用用户指定服务器端口连接到数据服务器/渲染服务器
这是case3和case4的组合,我们需要同时询问数据服务器和渲染服务器的端口号。
<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>
5.6 案例六:反向连接
默认情况下,客户端连接到服务器进程。但是,也有可能告诉paraview客户端等待服务器连接它。这就被称为反向连接。在这样一个案例中,服务器进程必须使用**–reverse-connection或者–rc**标志启动。
-- connect to pvserver on localhost using reverse connection
resource="csrc://localhost"
-- connect to pvdataserver/pvrenderserver using reverse connection.
resource="cdsrsrc://localhost//localhost"
一个简单的本地方向连接服务器配置,与case one相似,如下所示:
<Server name="case06" resource="csrc://localhost:11111">
<CommandStartup>
<Command exec="/path/to/pvserver --reverse-connection --client-host=localhost"/>
</CommandStartup>
</Server>
这里,exec元素中的–client-host=localhost实际上不需要,因为它是默认值。
5.7 案例七:带选项的服务器命令
<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>
5.8 案例8:使用连接id和随机端口号
5.9 案例9:使用ssh启动服务器
5.10 案例10:
6.理解并行处理
简单地说,并行处理意味着并行处理数据,同时使用多个工人。通常,这些工作进程是不同的进程,可以运行在多核机器上,也可以运行在集群的多个节点上。让我们称之为等级。在大多数数据处理和可视化算法中,工作与需要处理的数据量直接相关,即数据集中的单元或点的数量。因此,在列组之间分配工作的直接方法是将输入数据集拆分为多个块,然后让每个列组只操作一组独立的块。方便的是,对于大多数算法,通过分割数据集并单独处理它得到的结果与我们在单个块中处理数据集得到的结果相同。当然,也有例外。让我们通过一个例子来更好地理解这一点。为了演示的目的,考虑这个非常简化的网格。
现在,让我们假设我们想要使用三个进程在这个网格上执行可视化。我们可以使用蓝色、黄色和粉色区域分割网格单元,如下所示。
一旦分区,一些可视化算法将只允许每个进程在其本地单元格集合上独立运行算法。以剪辑为例。假设我们定义了一个剪裁平面,并将该平面赋予每个进程。
每个进程都可以使用此平面独立剪裁其单元。最终的结果与我们连续进行剪辑的结果相同。如果我们将这些单元组合在一起(由于明显的原因,我们永远不会对大数据进行这种组合),我们将看到剪裁操作是正确的。
6.1Ghost levels
不幸的是,盲目地在单元分区上运行可视化算法并不总能得到正确的答案。作为一个简单的例子,考虑外部人脸算法。“外部面”算法将查找仅属于一个单元的所有单元面,从而识别网格的边界。
哎呀!我们看到,当所有进程独立运行外部面算法时,许多内部面被错误地识别为外部面。当一个分区中的一个单元在另一个分区中有一个邻居时,就会发生这种情况。进程无法访问其他分区中的单元,因此无法知道这些相邻单元是否存在。
ParaView和其他并行可视化系统采用的解决方案是使用重影单元。重影细胞是在一个过程中保持的细胞,但实际上属于另一个过程。要使用重影单元,我们首先必须识别每个分区中的所有相邻单元。然后,我们将这些相邻的单元复制到分区中,并将它们标记为重影单元,如下面示例中的灰色单元所示。
当我们使用重影单元运行外部面算法时,我们发现仍然错误地将一些内部面识别为外部面。但是,所有这些错误分类的面都位于重影单元上,并且这些面继承了它来自的单元的重影状态。ParaView然后去掉鬼脸,我们得到了正确的答案。
在本例中,我们展示了一层重影单元:仅那些与分区单元直接相邻的单元。ParaView还能够检索多个重影单元层,其中每个层包含前一层的邻居,而前一层尚未包含在较低的重影层或原始数据本身中。当我们有级联过滤器,每个过滤器都需要自己的鬼细胞层时,这很有用。它们各自从上游请求一层额外的重影单元,然后在将数据发送到下游之前从数据中删除一层。
6.2.数据分区
由于我们正在分解和分发数据,因此谨慎的做法是解决如何划分数据的后果。前一示例中所示的数据具有空间相干分区。也就是说,每个分区的所有单元都位于一个紧凑的空间区域中。还有其他方法可以对数据进行分区。例如,您可以有一个随机分区。
随机分区有一些很好的特性。它易于创建,并且对负载平衡很友好。然而,重影细胞存在一个严重的问题。
在本例中,我们看到单个级别的重影单元几乎在所有进程上复制整个数据集。因此,我们消除了并行处理的任何优势。由于重影单元使用非常频繁,所以在ParaView中不使用随机分区。
6.3 D3过滤器
上一节描述了负载平衡和重影级别对于并行可视化的重要性。本节介绍如何实现这一点。
当您读取结构化数据(图像数据、直线网格和结构化网格)时,ParaView会自动处理负载平衡和重影单元。隐式拓扑可以很容易地将数据分成空间上连贯的块,并确定相邻单元的位置。
7. Ghost Cells Generator
8.Paraview 架构
在我们了解如何使用ParaView进行并行数据处理之前,让我们仔细看看ParaView体系结构。ParaView设计为三层客户机-服务器体系结构。ParaView的三个逻辑单元如下所示。
数据服务器
负责数据读取、过滤和写入的单元。在管道浏览器中看到的所有管道对象都包含在数据服务器中。数据服务器可以是并行的。
渲染服务器
负责渲染的单位。渲染服务器也可以是并行的,在这种情况下,还启用了内置的并行渲染。
客户端
负责建立可视化的单位。客户机控制服务器中对象的创建、执行和销毁,但不包含任何数据(从而允许服务器在不影响客户机的情况下进行扩展)。如果有GUI,它也在客户机中。客户端始终是串行应用程序。
这些逻辑单元不需要物理上分开。逻辑单元通常嵌入在同一个应用程序中,从而消除了它们之间的任何通信需求。有三种模式可以运行ParaView。
您已经熟悉的第一种模式是独立模式。在独立模式下,客户端、数据服务器和渲染服务器都组合到单个串行应用程序中。运行paraview应用程序时,会自动连接到内置服务器,以便准备使用paraview的全部功能。
第二种模式是客户机-服务器模式。在客户机-服务器模式下,在并行计算机上执行pvserver程序,并使用paraview客户机应用程序(或pvpython)连接到该程序。pvserver程序中嵌入了数据服务器和渲染服务器,因此数据处理和渲染都在其中进行。客户端和服务器通过套接字连接,这被认为是一种相对较慢的通信模式,因此通过该套接字的数据传输被最小化。我们在第2节中看到了这种操作模式。
第三种模式是客户端渲染服务器数据服务器模式。在此模式下,所有三个逻辑单元都在单独的程序中运行。与前面一样,客户端通过单个套接字连接连接到渲染服务器。渲染服务器和数据服务器通过许多套接字连接连接,渲染服务器中的每个进程都有一个套接字连接。通过套接字的数据传输被最小化。
尽管支持客户端渲染服务器数据服务器模式,但我们几乎从不建议使用它。这种模式的初衷是利用异构环境,其中可能有一个大型、强大的计算平台和第二台小型并行机,其中包含图形硬件。但是,在实践中,我们发现,将几何体从数据服务器移动到渲染服务器所需的时间几乎总是超过任何好处。如果计算平台比图形集群大得多,则在大型计算平台上使用软件渲染。如果两个平台的大小大致相同,只需在图形集群上执行所有计算。此模式使用的可执行文件是paraview(或pvpython)(充当客户端)、pvdataserver数据服务器和pvrenderserver渲染服务器。
9. 使用paraview和pvpython并行处理
要利用paraview或pvpython中的并行处理功能,必须使用远程可视化,即必须连接到pvserver。连接到此pvserver的处理与我们在第6.2节和第6.3节中所说的相同。唯一改变的是pvserver的启动方式。
您可以使用mpirun启动pvserver在多个处理核心上运行
mpirun -np 4 pvserver
这将在四个处理核心上运行pvserver。它仍将在默认端口上侦听来自客户端的传入连接。以这种方式运行pvserver的最大区别在于,当数据从一个源加载时,如果数据源是并行感知的,并且支持在不同的处理核心之间分布数据,那么数据将分布在四个核心之间。
要查看此数据是如何分布的,请按照上面的命令运行pvserver,并使用paraview连接到它。接下来,使用source>Sphere创建另一个球体源。将数组更改为color by到vtkProcessId。您将看到如图12所示的图像。
图12由vtkProcessId数组着色的球体源,该数组对球体数据所在的处理核心进行编码。在这里,球体数据在命令mpirun-np 4 pvserver调用的四个处理核心之间进行分割
如果数据读取器或数据源不支持并行,您仍然可以通过使用D3过滤器在处理核心之间传播数据。该过滤器将数据集划分为凸区域,并将每个区域传输到不同的处理核心。要查看D3如何划分数据集的示例,请在paraview仍连接到pvserver时创建一个Source>Wavelet。接下来,选择过滤器>字母顺序>D3(Filters > Alphabetical > D3)并单击应用。D3的输出最初不会出现与原始小波源不同的情况。但是,如果按vtkProcessId着色,则会看到已分发到服务器处理核心的四个分区。
图13经D3滤波器处理并经vtkProcessId阵列着色的小波源。请注意,当pvserver使用mpirun-np 4 pvserver命令运行时,图像数据的四个区域是如何在四个处理核心之间平均分割的。
10. 使用pvbatch
在第6.9节中,我们提到要使用并行处理功能,必须使用远程可视化,即必须在客户端-服务器模式下使用ParaView,客户端(ParaView或pvpython)连接到正在使用mpirun并行运行的服务器(pvserver)。但是,有一个例外:pvbatch。pvpython和pvbatch非常相似,因为它们都类似于可用于运行python脚本的python可执行文件。
与标准python相比,这些可执行文件所做的额外工作是它们初始化环境,以便您运行的任何脚本都能够自动定位ParaView python模块和库。pvpython与没有GUI的paraview可执行文件完全相同。您可以将其视为paraview中的GUI被pvpython中的Python解释器所取代。
另一方面,pvbatch可以看作是一个pvserver,在pvbatch中,命令不是从远程客户端(paraview或pvpython)获取控制命令,而是从pvbatch可执行文件本身中执行的Python脚本获取。由于pvbatch类似于pvserver,与pvpython不同,它可以使用mpirun并行运行。在这种情况下,根秩(或第一秩或索引为
0
0
0的秩)充当客户端,解释Python脚本以执行命令。由于pvbatch被设计为在其自己的服务器上运行,因此不能在Python脚本中连接到远程服务器,即不能使用simple连接。此外,pvbatch是为批处理操作而设计的,这意味着您只能将Python脚本指定为命令行参数。与pvpython不同,您不能运行此可执行文件以获得交互式shell来输入Python命令。
# process the sample.py script in single process mode.
> pvbatch sample.py
# process the sample.py script in parallel.
> mpirun -np 4 sample.py
通常,如果要以交互方式使用解释器,则应使用pvpython;如果并行运行,则应使用pvbatch。
11.正在将数据提取到客户端
本节介绍从Python脚本中访问数据的几种方法。ParaView的客户机/服务器特性需要几个步骤来访问原始数据。Python脚本在客户端以pvpython或paraview运行,因此一个步骤涉及将数据从服务器移动到客户端。这可以通过以下方式实现:
from paraview.simple import *
Connect("myhost")
# Create a sphere source on myhost
s = Sphere()
full_sphere = servermanager.Fetch(s)
在这里,完整的数据集从服务器移动到客户端。
。。。。。。
12.渲染
暂无评论内容