Por qué tiene sentido la aceleración por GPU#
En este cuaderno demostramos la aceleración a través de GPU utilizando un filtro de desenfoque gaussiano. Utilizaremos la biblioteca clEsperanto que usa OpenCL y es compatible con una amplia gama de GPUs de Intel, AMD y NVidia. ¡Siéntete libre de ejecutarlo en tu GPU y medir la aceleración!
Ver también
Nota: los resultados de las pruebas de rendimiento varían mucho dependiendo del tamaño de la imagen, el tamaño del kernel, las operaciones utilizadas, los parámetros y el hardware utilizado. Utiliza este cuaderno para adaptarlo a tu escenario de uso y realizar pruebas de rendimiento en tu hardware objetivo. Si tienes diferentes escenarios o casos de uso, ¡eres bienvenido a enviar tu cuaderno como una solicitud de extracción!
import pyclesperanto_prototype as cle
from skimage import filters
import time
# para medir correctamente la duración de la ejecución del kernel, necesitamos establecer esta bandera. Sin embargo, ralentizará un poco la ejecución de los flujos de trabajo
cle.set_wait_for_kernel_finish(True)
# selecciona una GPU con el siguiente nombre. Esto recurrirá a cualquier otra GPU si no se encuentra ninguna con este nombre
cle.select_device('RTX')
<GeForce RTX 2080 Ti on Platform: NVIDIA CUDA (1 refs)>
# datos de prueba
import numpy as np
from skimage.io import imread
test_image = imread('Lund_000500_resampled-cropped.tif')
sigma = 10
# convolución con scikit-image
result_image = None
for i in range(0, 10):
start_time = time.time()
result_image = filters.gaussian(test_image, output=result_image, sigma=sigma)
print("Duración del Gaussiano de skimage: " + str(time.time() - start_time))
skimage Gaussian duration: 0.644662618637085
skimage Gaussian duration: 0.63631272315979
skimage Gaussian duration: 0.6193966865539551
skimage Gaussian duration: 0.6499156951904297
skimage Gaussian duration: 0.6301307678222656
skimage Gaussian duration: 0.6531178951263428
skimage Gaussian duration: 0.6489198207855225
skimage Gaussian duration: 0.6308994293212891
skimage Gaussian duration: 0.7410404682159424
skimage Gaussian duration: 0.8148434162139893
# convolución con pyclesperanto
result_image_gpu = None
test_image_gpu = cle.push(test_image)
for i in range(0, 10):
start_time = time.time()
result_image_gpu = cle.gaussian_blur(test_image_gpu, result_image_gpu, sigma_x=sigma, sigma_y=sigma, sigma_z=sigma)
print("Duración del Gaussiano de pyclesperanto: " + str(time.time() - start_time))
pyclesperanto Gaussian duration: 0.026170730590820312
pyclesperanto Gaussian duration: 0.002056121826171875
pyclesperanto Gaussian duration: 0.015659093856811523
pyclesperanto Gaussian duration: 0.019225597381591797
pyclesperanto Gaussian duration: 0.01566314697265625
pyclesperanto Gaussian duration: 0.015616178512573242
pyclesperanto Gaussian duration: 0.01566910743713379
pyclesperanto Gaussian duration: 0.015576839447021484
pyclesperanto Gaussian duration: 0.01562190055847168
pyclesperanto Gaussian duration: 0.023794889450073242
Comprobemos si los resultados se ven similares
import napari
viewer = napari.Viewer()
napari.run()
viewer.add_image(test_image)
viewer.add_image(result_image)
viewer.add_image(result_image_gpu)
<Image layer 'result_image_gpu' at 0x1d3b659c460>
napari.utils.nbscreenshot(viewer)