【问题标题】:Python, VTK and GIL releasePython、VTK 和 GIL 发布
【发布时间】:2021-01-29 03:06:13
【问题描述】:

我正在尝试使用其 Python 接口并行处理 VTK 中的大型数据集。为此,我想使用 joblib,因为我有(大量)独立快照,我想处理并收集在一个大型 numpy 矩阵中,例如:

import vtk
from vtk.numpy_interface import dataset_adapter as dsa
for i,snap in enumerate(snapshot_list):
   myVtkFilter.SetInputData(snap)
   result = myVtkFilter.GetOutput()
   output[i, :] = dsa.WrapDataObject(result).CellData['myArray']

但是,我遇到了一些问题:

  1. 如果我使用默认的 loky 后端,Python 会抱怨输出矩阵不可写(这是一个非常大的数据集,像 (100, 1000000, 3) 这样的矩阵)。无论如何,它需要由 loky 序列化这一事实将是一项重大开销;
  2. 如果我想使用 Python 线程,代码运行正常,但在我看来,VTK 大部分时间都不会释放 GIL(大部分时间只使用一个内核)。 我希望像 numpy 一样,VTK 调用应该释放 GIL(根据此发行说明 http://vtk.1045678.n5.nabble.com/Announce-vtk-7-0-0-release-candidate-1-is-ready-td5735575.html),但似乎并非如此。

我正在使用 Python 3.7.3 和 VTK 8.1.2。有什么建议吗?

【问题讨论】:

  • VTK 确实发布了 GIL,所以我不确定这里有什么问题。
  • vtk.org/pipermail/vtk-developers/2018-November/036543.html 这个帖子似乎在讨论类似的事情。也许它可能与一些 VTK 构建标志有关?我只是使用标准的 pip3 install vtk,不确定是否必须从头开始编译 VTK 并添加一些我不知道的选项。
  • 是的,它是相关的,确保使用 VTK_PYTHON_FULL_THREADSAFE。
  • 仅供参考,此功能的最后修复在这里:gitlab.kitware.com/vtk/vtk/-/merge_requests/6064 并且存在于 VTK9 中,您应该使用它。

标签: python vtk joblib


【解决方案1】:

VTK 8.2.0 中的 GIL 存在一些问题,已在此处修复:https://gitlab.kitware.com/paraview/paraview/-/issues/14169 并且修复程序存在于 VTK 9.0.1 中。

更新到 VTK 9.0.1 并使用 VTK_PYTHON_FULL_THREADSAFE=ON CMake 选项来解决您的问题。

【讨论】:

  • 这解决了问题,谢谢。一个小建议:默认 CMakeLists.txt 中不存在 VTK_PYTHON_FULL_THREADSAFE=ON,我在文件末尾手动添加它,然后运行 ​​ccmake。对于未来的版本,最好将它放在列表中,即使在默认情况下设置为 OFF。
  • 在 cmake-gui 或 ccmake 中可见。不知道你在说什么。
  • 如果VTK是自己构建的,没有Paraview这个选项不存在,需要手动添加。
猜你喜欢
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多