Pourquoi l’accélération GPU est logique#
Dans ce notebook, nous démontrons l’accélération obtenue grâce à l’accélération GPU en utilisant un filtre de flou gaussien. Nous utiliserons la bibliothèque clEsperanto qui utilise OpenCL et est compatible avec une large gamme de GPU Intel, AMD et NVidia. N’hésitez pas à l’exécuter sur votre GPU et à mesurer l’accélération !
Voir aussi
Note : les résultats des benchmarks varient considérablement en fonction de la taille de l’image, de la taille du noyau, des opérations utilisées, des paramètres et du matériel utilisé. Utilisez ce notebook pour l’adapter à votre scénario d’utilisation et effectuer des benchmarks sur votre matériel cible. Si vous avez différents scénarios ou cas d’utilisation, vous êtes très bienvenus pour soumettre votre notebook sous forme de pull-request !
import pyclesperanto_prototype as cle
from skimage import filters
import time
# pour mesurer correctement la durée d'exécution du noyau, nous devons définir ce drapeau. Cela ralentira un peu l'exécution des flux de travail cependant
cle.set_wait_for_kernel_finish(True)
# sélectionner un GPU avec le nom suivant. Cela se repliera sur n'importe quel autre GPU si aucun avec ce nom n'est trouvé
cle.select_device('RTX')
<GeForce RTX 2080 Ti on Platform: NVIDIA CUDA (1 refs)>
# données de test
import numpy as np
from skimage.io import imread
test_image = imread('Lund_000500_resampled-cropped.tif')
sigma = 10
# convolution avec 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("Durée du Gaussien 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
# convolution avec 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("Durée du Gaussien 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
Vérifions simplement si les résultats sont similaires
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)