InsightSoftwareConsortium / InsightSoftwareConsortium/ITK
GPU filters fail when invoked from Python
- 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
Assessment
This issue has not been assessed yet.