InsightSoftwareConsortium / InsightSoftwareConsortium/ITK

GPU filters fail when invoked from Python

Open
#4,846 1 comment 0 reactions 0 assignees View on GitHub
type:Bug
Dominant language
C++
Stars
1.7k
Forks
748
Avg merge
1d 1h
Merged PRs (30d)
64

Description

Creating this to track the remaining issue after #4842. See the description there for details.

### Description

Python-wrapped GPU filters fail with `OpenCL Error : CL_INVALID_MEM_OBJECT`; they work correctly from C++.

### Steps to Reproduce

Build ITK with GPU and Python wrapping; run existing `itkGPU*` test suite.

```
cmake -DITK_WRAP_PYTHON=ON -DITK_USE_GPU=ON ...
cmake --build ...
ctest -R itkGPU
```

```
Test project ...
Start 959: itkGPUGradientAnisotropicDiffusionImageFilterTest2D
1/24 Test #959: itkGPUGradientAnisotropicDiffusionImageFilterTest2D ......... Passed 0.15 sec
Start 960: itkGPUGradientAnisotropicDiffusionImageFilterTest3D
2/24 Test #960: itkGPUGradientAnisotropicDiffusionImageFilterTest3D ......... Passed 0.42 sec
...
Start 3151: itkGPUGradientAnisotropicDiffusionImageFilterPythonTest2D
20/24 Test #3151: itkGPUGradientAnisotropicDiffusionImageFilterPythonTest2D ... Passed 4.43 sec
Start 3152: itkGPUGradientAnisotropicDiffusionImageFilterPythonTest3D
21/24 Test #3152: itkGPUGradientAnisotropicDiffusionImageFilterPythonTest3D ...***Failed 0.81 sec
...
The following tests FAILED:
3152 - itkGPUGradientAnisotropicDiffusionImageFilterPythonTest3D (Failed)
3157 - itkGPUMeanImageFilterPythonTest2D (Failed)
```

There are also filters which do not currently have Python wrapping tests; the issue also affects these. For example `itkGPUDiscreteGaussianImageFilter`:

```py
>>> import numpy as np
>>> import itk
>>> im = itk.GetImageFromArray(np.random.normal(size=(50,50,50)).astype('f'))
>>> gpu_im = itk.cast_image_filter(im, ttype=(itk.Image[itk.F, 3], itk.GPUImage[itk.F, 3]))
Platform : NVIDIA CUDA
...
>>> gpu_im.UpdateBuffers()
>>> blur = itk.gpu_discrete_gaussian_image_filter(gpu_im, variance=2)
Platform : NVIDIA CUDA
...
Traceback (most recent call last):
...
File ".../Wrapping/Generators/Python/itk/ITKCommonBasePython.py", line 3100, in UpdateLargestPossibleRegion
return _ITKCommonBasePython.itkProcessObject_UpdateLargestPossibleRegion(self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: .../ITK/Modules/Core/GPUCommon/include/itkGPUKernelManager.h:130:
OpenCL Error : CL_INVALID_MEM_OBJECT
```

___Note the cast to `GPUImage` succeeds and the first `UpdateBuffers()` succeeds. The cast outputs OpenCL platform information.___ The failure occurs only in filter `Update()`.

### Versions

Checked ITK 5.4 and current (as of #4842) master f8d8cf94c9c316cc6a7c4a28d86105951b5ecb06.

Python 3.9.19, 3.12.4

### Environment

- Ubuntu 22.04
- CMake 3.28.1
- g++ 11.4.0
- nvidia-driver-550 (RTX 4090)

---

cc @jcfr since you mentioned interest.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.