{ "cells": [ { "cell_type": "markdown", "id": "0d6fecdf-48c0-4745-b802-2117fb3137cf", "metadata": {}, "source": [ "# Introduction" ] }, { "cell_type": "markdown", "id": "15a05d43-0bf5-48d3-9c88-6074eed82a04", "metadata": {}, "source": [ "## Overview\n", "### In this tutorial, you learn:\n", "\n", "* Basics of Cupy-Xarray\n", "* Creating and handling Xarray DataArrays on GPUs\n", "* Data Transfer Between Host and Device\n", "\n", "## Prerequisites\n", "\n", "| Concepts | Importance | Notes |\n", "| --- | --- | --- |\n", "| [Familiarity with NumPy](https://foundations.projectpythia.org/core/numpy.html) | Necessary | |\n", "| [Basics of Cupy](Notebook0_Introduction) | Necessary | |\n", "| [Familiarity with Xarray](https://foundations.projectpythia.org/core/xarray.html) | Necessary | |\n", "\n", "- **Time to learn**: 10 minutes\n", "\n", "\n", "## Introduction " ] }, { "cell_type": "markdown", "id": "8cfcfa1f-f74a-405b-957d-3c925aca7eb4", "metadata": {}, "source": [ "Xarray is a powerful library for working with labeled multi-dimensional arrays in Python. It provides a convenient and intuitive way to manipulate large and complex datasets, and is built on top of NumPy. CuPy, on the other hand, is a library that allows for GPU-accelerated computing with Python and is compatible with NumPy.\n", "\n", "When used together, Xarray and CuPy can provide an easy way to take advantage of GPU acceleration for scientific computing tasks.\n", "\n", "Xarray can wrap custom duck array objects (i.e. NumPy-like arrays) that follow specific protocols. \n", "\n", "CuPy-Xarray provides an interface for using CuPy in Xarray, providing [accessors](https://docs.xarray.dev/en/stable/internals/extending-xarray.html) on the Xarray objects. \n", "\n", "This tutorial showcases the use of `cupy-xarray`, which offers a `cupy` accessor that allows access to cupy-specific features." ] }, { "cell_type": "markdown", "id": "77343efb-de6d-423c-b1cd-934c5d6d68e1", "metadata": {}, "source": [ "First, let's import our packages\n", "\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "55c72b7d-8899-4e2f-9432-e9cf1531cbdf", "metadata": {}, "outputs": [], "source": [ "## Import NumPy and CuPy\n", "import cupy as cp\n", "import numpy as np\n", "import xarray as xr\n", "import cupy_xarray # Adds .cupy to Xarray objects" ] }, { "cell_type": "markdown", "id": "4ed42841-264a-4eb6-9f82-be9a463be816", "metadata": {}, "source": [ "### Creating Xarray DataArray with CuPy" ] }, { "cell_type": "markdown", "id": "573bb115-0e77-4f86-be9f-9ee6ac1c6f9b", "metadata": {}, "source": [ "In the previous tutorial, we learned how to create a NumPy and CuPy array:" ] }, { "cell_type": "code", "execution_count": 2, "id": "4b91fc01-9e99-4b01-b700-9b4802b7ef14", "metadata": {}, "outputs": [], "source": [ "arr_cpu = np.random.rand(10, 10, 10)\n", "arr_gpu = cp.random.rand(10, 10, 10)" ] }, { "cell_type": "markdown", "id": "2136402a-0224-4a2d-828f-99d571c4524b", "metadata": {}, "source": [ "We can create the Xarray DataArray using the CuPy array or NumPy array as the data source in a similar fashion:" ] }, { "cell_type": "code", "execution_count": 3, "id": "67e76867-373b-4011-b7c6-cb9b737e54c7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (x: 10, y: 10, time: 10)>\n",
       "array([[[9.86345808e-01, 4.17660665e-01, 1.88327552e-01, 8.90280942e-01,\n",
       "         2.21689274e-01, 3.17943609e-01, 5.00880587e-01, 7.53337533e-01,\n",
       "         3.59031996e-01, 1.91030893e-01],\n",
       "        [1.33144043e-02, 5.02596284e-01, 5.42913172e-01, 5.23846968e-01,\n",
       "         4.05313585e-01, 9.46118837e-01, 1.06548298e-01, 3.47524404e-01,\n",
       "         1.52843324e-01, 8.48253778e-01],\n",
       "        [4.33649929e-01, 6.23728979e-01, 6.47445402e-01, 9.03623126e-01,\n",
       "         9.05012105e-01, 4.06989322e-03, 4.19896664e-01, 8.60406673e-02,\n",
       "         7.41788571e-01, 6.22665340e-01],\n",
       "        [1.74267952e-01, 6.14897148e-01, 5.01242328e-01, 6.66759345e-01,\n",
       "         8.44182632e-01, 3.19620076e-01, 7.90701915e-01, 2.43897985e-01,\n",
       "         8.25956047e-01, 6.06534832e-01],\n",
       "        [5.28111326e-01, 7.42343565e-01, 8.05094324e-02, 8.84691476e-01,\n",
       "         1.69856723e-02, 3.32512453e-01, 6.67738160e-01, 7.06905069e-01,\n",
       "         5.16369945e-01, 2.71965903e-01],\n",
       "        [2.81638568e-01, 2.89389278e-01, 8.19006807e-01, 3.53878654e-01,\n",
       "         9.21084664e-02, 5.69411698e-01, 8.56797393e-01, 3.24107223e-01,\n",
       "         8.15087813e-01, 4.70350855e-01],\n",
       "        [5.70124339e-01, 7.92088214e-01, 9.33540441e-01, 9.88027072e-01,\n",
       "         9.05585677e-01, 5.28417548e-01, 4.40169554e-01, 1.40924601e-01,\n",
       "...\n",
       "         5.29797743e-01, 9.87589722e-01, 9.18635655e-01, 8.68580278e-01,\n",
       "         4.71548324e-01, 3.64257635e-01],\n",
       "        [6.42229124e-01, 2.33643023e-02, 5.85033551e-01, 8.80436137e-02,\n",
       "         7.07996956e-01, 4.40586920e-01, 3.10391741e-01, 1.22763638e-02,\n",
       "         8.02412664e-01, 4.33761051e-01],\n",
       "        [1.24780820e-01, 3.53875474e-01, 8.36031716e-01, 2.84138174e-02,\n",
       "         3.57476794e-01, 2.44890794e-02, 1.47504786e-02, 3.19465404e-01,\n",
       "         2.91984584e-01, 3.39490525e-01],\n",
       "        [2.04021642e-01, 4.71267303e-01, 9.03187717e-02, 3.83928128e-01,\n",
       "         5.96265409e-01, 3.17287239e-01, 3.22413673e-01, 8.38235070e-01,\n",
       "         9.58316554e-01, 9.73589612e-01],\n",
       "        [6.13802208e-01, 8.70356525e-01, 5.17350919e-01, 7.72374828e-03,\n",
       "         5.35340510e-01, 8.89268388e-01, 6.93943330e-01, 6.29953006e-01,\n",
       "         1.70230716e-01, 7.16573680e-01],\n",
       "        [8.44214598e-01, 3.35186917e-01, 8.78891352e-01, 1.98027834e-01,\n",
       "         6.36005433e-01, 1.21753118e-01, 6.48103717e-01, 8.68341345e-01,\n",
       "         7.81023406e-01, 4.45064620e-01],\n",
       "        [3.85731750e-01, 8.02230895e-01, 6.41415045e-01, 7.60886886e-01,\n",
       "         2.00746550e-01, 3.76787007e-01, 6.68073723e-01, 7.87222270e-01,\n",
       "         6.75273015e-01, 8.63705777e-01]]])\n",
       "Dimensions without coordinates: x, y, time
" ], "text/plain": [ "\n", "array([[[9.86345808e-01, 4.17660665e-01, 1.88327552e-01, 8.90280942e-01,\n", " 2.21689274e-01, 3.17943609e-01, 5.00880587e-01, 7.53337533e-01,\n", " 3.59031996e-01, 1.91030893e-01],\n", " [1.33144043e-02, 5.02596284e-01, 5.42913172e-01, 5.23846968e-01,\n", " 4.05313585e-01, 9.46118837e-01, 1.06548298e-01, 3.47524404e-01,\n", " 1.52843324e-01, 8.48253778e-01],\n", " [4.33649929e-01, 6.23728979e-01, 6.47445402e-01, 9.03623126e-01,\n", " 9.05012105e-01, 4.06989322e-03, 4.19896664e-01, 8.60406673e-02,\n", " 7.41788571e-01, 6.22665340e-01],\n", " [1.74267952e-01, 6.14897148e-01, 5.01242328e-01, 6.66759345e-01,\n", " 8.44182632e-01, 3.19620076e-01, 7.90701915e-01, 2.43897985e-01,\n", " 8.25956047e-01, 6.06534832e-01],\n", " [5.28111326e-01, 7.42343565e-01, 8.05094324e-02, 8.84691476e-01,\n", " 1.69856723e-02, 3.32512453e-01, 6.67738160e-01, 7.06905069e-01,\n", " 5.16369945e-01, 2.71965903e-01],\n", " [2.81638568e-01, 2.89389278e-01, 8.19006807e-01, 3.53878654e-01,\n", " 9.21084664e-02, 5.69411698e-01, 8.56797393e-01, 3.24107223e-01,\n", " 8.15087813e-01, 4.70350855e-01],\n", " [5.70124339e-01, 7.92088214e-01, 9.33540441e-01, 9.88027072e-01,\n", " 9.05585677e-01, 5.28417548e-01, 4.40169554e-01, 1.40924601e-01,\n", "...\n", " 5.29797743e-01, 9.87589722e-01, 9.18635655e-01, 8.68580278e-01,\n", " 4.71548324e-01, 3.64257635e-01],\n", " [6.42229124e-01, 2.33643023e-02, 5.85033551e-01, 8.80436137e-02,\n", " 7.07996956e-01, 4.40586920e-01, 3.10391741e-01, 1.22763638e-02,\n", " 8.02412664e-01, 4.33761051e-01],\n", " [1.24780820e-01, 3.53875474e-01, 8.36031716e-01, 2.84138174e-02,\n", " 3.57476794e-01, 2.44890794e-02, 1.47504786e-02, 3.19465404e-01,\n", " 2.91984584e-01, 3.39490525e-01],\n", " [2.04021642e-01, 4.71267303e-01, 9.03187717e-02, 3.83928128e-01,\n", " 5.96265409e-01, 3.17287239e-01, 3.22413673e-01, 8.38235070e-01,\n", " 9.58316554e-01, 9.73589612e-01],\n", " [6.13802208e-01, 8.70356525e-01, 5.17350919e-01, 7.72374828e-03,\n", " 5.35340510e-01, 8.89268388e-01, 6.93943330e-01, 6.29953006e-01,\n", " 1.70230716e-01, 7.16573680e-01],\n", " [8.44214598e-01, 3.35186917e-01, 8.78891352e-01, 1.98027834e-01,\n", " 6.36005433e-01, 1.21753118e-01, 6.48103717e-01, 8.68341345e-01,\n", " 7.81023406e-01, 4.45064620e-01],\n", " [3.85731750e-01, 8.02230895e-01, 6.41415045e-01, 7.60886886e-01,\n", " 2.00746550e-01, 3.76787007e-01, 6.68073723e-01, 7.87222270e-01,\n", " 6.75273015e-01, 8.63705777e-01]]])\n", "Dimensions without coordinates: x, y, time" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create a DataArray using CuPy array with three dimensions and 10 elements along each dimension\n", "da_np = xr.DataArray(arr_cpu, dims=[\"x\", \"y\", \"time\"])\n", "\n", "da_np" ] }, { "cell_type": "code", "execution_count": 4, "id": "431edeb0-661f-4929-a83d-e39a6e753a60", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (x: 10, y: 10, time: 10)>\n",
       "array([[[2.88196731e-01, 3.71102840e-01, 8.22413516e-01, 7.61603373e-01,\n",
       "         2.14247694e-01, 6.08972260e-01, 6.35605124e-01, 4.51735394e-02,\n",
       "         3.56580833e-01, 3.33245593e-01],\n",
       "        [9.56686233e-02, 3.09634487e-01, 5.72034429e-01, 8.64203361e-01,\n",
       "         5.44551902e-01, 4.54445926e-01, 1.21606888e-01, 2.30160410e-01,\n",
       "         6.14639953e-01, 7.73246535e-01],\n",
       "        [8.03011705e-01, 2.69969912e-01, 2.03781951e-01, 6.64806547e-01,\n",
       "         4.93709552e-01, 2.60248353e-01, 6.82195033e-01, 6.75837492e-01,\n",
       "         5.07293067e-01, 6.45924343e-01],\n",
       "        [1.03968071e-01, 1.31787260e-01, 2.31666523e-02, 2.90727455e-01,\n",
       "         6.22514068e-02, 9.54996781e-01, 1.38868633e-01, 3.18043546e-01,\n",
       "         9.94141764e-01, 6.52825114e-01],\n",
       "        [6.72144360e-01, 9.25109790e-01, 9.24907616e-01, 9.97835547e-01,\n",
       "         1.30089788e-01, 3.28381980e-01, 9.47761645e-01, 2.15451004e-01,\n",
       "         1.55072912e-01, 2.84564825e-01],\n",
       "        [5.32157180e-01, 4.05812774e-01, 6.65152077e-01, 1.62793186e-01,\n",
       "         8.38375837e-01, 4.38498164e-01, 3.93970103e-01, 3.25181026e-01,\n",
       "         8.43314943e-01, 6.37218468e-01],\n",
       "        [9.47935236e-01, 1.39071514e-01, 3.34994498e-01, 7.42907508e-01,\n",
       "         1.13865457e-01, 3.69531071e-01, 6.58907523e-01, 4.10997683e-01,\n",
       "...\n",
       "         5.01101857e-01, 6.76530919e-01, 6.01550513e-01, 1.91761020e-01,\n",
       "         2.01591335e-01, 3.73443454e-01],\n",
       "        [8.72935075e-01, 9.28175014e-01, 7.03819938e-01, 4.25757273e-01,\n",
       "         6.80355431e-01, 1.22351044e-01, 8.22086635e-03, 9.23118431e-01,\n",
       "         8.00040998e-02, 3.51963004e-01],\n",
       "        [5.30917733e-01, 1.73025731e-03, 5.46551386e-01, 3.41904305e-01,\n",
       "         6.11276326e-01, 7.83903426e-01, 7.67650251e-01, 9.27383669e-02,\n",
       "         5.99146336e-01, 1.44674661e-02],\n",
       "        [9.32478257e-02, 6.51279678e-01, 3.40032365e-01, 6.66761485e-02,\n",
       "         3.88243075e-01, 3.06181721e-02, 5.58666002e-01, 3.10356676e-01,\n",
       "         6.46523629e-01, 1.19013418e-01],\n",
       "        [1.81940990e-01, 3.89650142e-01, 9.98204973e-01, 4.39178186e-02,\n",
       "         6.88137446e-02, 7.61541679e-02, 6.26075251e-01, 9.14708720e-01,\n",
       "         4.45414011e-01, 5.16678456e-01],\n",
       "        [8.51618677e-01, 6.81900815e-01, 6.66821786e-01, 8.75685884e-01,\n",
       "         2.90499242e-01, 3.25977864e-01, 3.67627054e-01, 3.93770674e-01,\n",
       "         7.40898577e-01, 3.50451112e-02],\n",
       "        [7.06374026e-01, 7.19519511e-01, 1.79160522e-01, 8.81425785e-01,\n",
       "         3.51431945e-01, 4.11507382e-01, 6.86088790e-01, 3.04671156e-01,\n",
       "         5.70729870e-01, 7.76584760e-01]]])\n",
       "Dimensions without coordinates: x, y, time
" ], "text/plain": [ "\n", "array([[[2.88196731e-01, 3.71102840e-01, 8.22413516e-01, 7.61603373e-01,\n", " 2.14247694e-01, 6.08972260e-01, 6.35605124e-01, 4.51735394e-02,\n", " 3.56580833e-01, 3.33245593e-01],\n", " [9.56686233e-02, 3.09634487e-01, 5.72034429e-01, 8.64203361e-01,\n", " 5.44551902e-01, 4.54445926e-01, 1.21606888e-01, 2.30160410e-01,\n", " 6.14639953e-01, 7.73246535e-01],\n", " [8.03011705e-01, 2.69969912e-01, 2.03781951e-01, 6.64806547e-01,\n", " 4.93709552e-01, 2.60248353e-01, 6.82195033e-01, 6.75837492e-01,\n", " 5.07293067e-01, 6.45924343e-01],\n", " [1.03968071e-01, 1.31787260e-01, 2.31666523e-02, 2.90727455e-01,\n", " 6.22514068e-02, 9.54996781e-01, 1.38868633e-01, 3.18043546e-01,\n", " 9.94141764e-01, 6.52825114e-01],\n", " [6.72144360e-01, 9.25109790e-01, 9.24907616e-01, 9.97835547e-01,\n", " 1.30089788e-01, 3.28381980e-01, 9.47761645e-01, 2.15451004e-01,\n", " 1.55072912e-01, 2.84564825e-01],\n", " [5.32157180e-01, 4.05812774e-01, 6.65152077e-01, 1.62793186e-01,\n", " 8.38375837e-01, 4.38498164e-01, 3.93970103e-01, 3.25181026e-01,\n", " 8.43314943e-01, 6.37218468e-01],\n", " [9.47935236e-01, 1.39071514e-01, 3.34994498e-01, 7.42907508e-01,\n", " 1.13865457e-01, 3.69531071e-01, 6.58907523e-01, 4.10997683e-01,\n", "...\n", " 5.01101857e-01, 6.76530919e-01, 6.01550513e-01, 1.91761020e-01,\n", " 2.01591335e-01, 3.73443454e-01],\n", " [8.72935075e-01, 9.28175014e-01, 7.03819938e-01, 4.25757273e-01,\n", " 6.80355431e-01, 1.22351044e-01, 8.22086635e-03, 9.23118431e-01,\n", " 8.00040998e-02, 3.51963004e-01],\n", " [5.30917733e-01, 1.73025731e-03, 5.46551386e-01, 3.41904305e-01,\n", " 6.11276326e-01, 7.83903426e-01, 7.67650251e-01, 9.27383669e-02,\n", " 5.99146336e-01, 1.44674661e-02],\n", " [9.32478257e-02, 6.51279678e-01, 3.40032365e-01, 6.66761485e-02,\n", " 3.88243075e-01, 3.06181721e-02, 5.58666002e-01, 3.10356676e-01,\n", " 6.46523629e-01, 1.19013418e-01],\n", " [1.81940990e-01, 3.89650142e-01, 9.98204973e-01, 4.39178186e-02,\n", " 6.88137446e-02, 7.61541679e-02, 6.26075251e-01, 9.14708720e-01,\n", " 4.45414011e-01, 5.16678456e-01],\n", " [8.51618677e-01, 6.81900815e-01, 6.66821786e-01, 8.75685884e-01,\n", " 2.90499242e-01, 3.25977864e-01, 3.67627054e-01, 3.93770674e-01,\n", " 7.40898577e-01, 3.50451112e-02],\n", " [7.06374026e-01, 7.19519511e-01, 1.79160522e-01, 8.81425785e-01,\n", " 3.51431945e-01, 4.11507382e-01, 6.86088790e-01, 3.04671156e-01,\n", " 5.70729870e-01, 7.76584760e-01]]])\n", "Dimensions without coordinates: x, y, time" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create a DataArray using NumPy array with three dimensions and 10 elements along each dimension\n", "da_cp = xr.DataArray(arr_gpu, dims=[\"x\", \"y\", \"time\"])\n", "\n", "da_cp" ] }, { "cell_type": "markdown", "id": "aa9a4672-f11a-460b-b5d8-18eb071ef932", "metadata": {}, "source": [ "But how are these two DataArrays different from each other? How do we know which array is on CPU vs. GPU?" ] }, { "cell_type": "markdown", "id": "8eb97bee-48da-494e-b24d-46ad9f9658c9", "metadata": {}, "source": [ "### Checking for CuPy Arrays\n", "\n", "The `cupy` accessor provides the `is_cupy` method to check if these arrays are on the host or device. For example:" ] }, { "cell_type": "code", "execution_count": 5, "id": "f0b43b25-b0d9-4809-9b11-729077b81d4e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "da_np.cupy.is_cupy" ] }, { "cell_type": "code", "execution_count": 6, "id": "883128df-fdca-4603-9797-52e6d53ced7f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "da_cp.cupy.is_cupy" ] }, { "cell_type": "markdown", "id": "fa0f35af-52a6-439c-ad8e-b95d4d82c085", "metadata": {}, "source": [ "### Accessing Device Information of the DataArray" ] }, { "cell_type": "markdown", "id": "a3190b98-85d2-431f-90bc-2fb6775d7998", "metadata": {}, "source": [ "To access the underlying CuPy array, use the `data` property of the DataArray. It returns the CuPy array:" ] }, { "cell_type": "code", "execution_count": 7, "id": "ea95ef0d-d7b2-4ee0-9ebf-761461b3e044", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "cupy.ndarray" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cupy_array = da_cp.data\n", "type(cupy_array)" ] }, { "cell_type": "markdown", "id": "1e0bf47d-491e-448c-8662-6e7d24149016", "metadata": {}, "source": [ "In the previous tutorial, we learned about CuPy's introduction of the notion of a current device. We also learned that to identify the device assigned to a CuPy array, the `cupy.ndarray.device` attribute can be used. Similar concept can be applied to a DataArray:" ] }, { "cell_type": "code", "execution_count": 8, "id": "b70eb4b1-42ce-499a-bb15-1831351edd8b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "da_cp.data.device" ] }, { "cell_type": "markdown", "id": "dc466f07-b0ef-4f02-bca6-9f25fc810b0e", "metadata": {}, "source": [ "### Data Transfer\n", "\n", "#### Transferring DataArrays to another Device\n", "\n", "In the previous lesson we learned that by default, code execution is carried out on Device 0. However, with CuPy, we have the ability to transfer arrays to other devices using cp.cuda.Device(). This feature becomes particularly valuable when your code is designed to leverage the capabilities of multiple GPUs. Similar concept applies to DataArrays that include Cupy Arrays:\n", "\n", "``` python \n", "with cp.cuda.Device(1):\n", " x_on_gpu1 = cp.array([5, 7, 8, 5, 5])\n", " da_cp1 = xr.DataArray(x_on_gpu1, dims=['time'])\n", "\n", "da_cp1.data.device # 1\n", "```" ] }, { "cell_type": "markdown", "id": "367f9364-f31e-44b9-ae59-784d9361d509", "metadata": {}, "source": [ "#### Transferring Data between Host and Device\n", "Xarray provides `DataArray.as_numpy` to convert all kinds of arrays to NumPy arrays.\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "4cf26810-e889-47e9-8750-860841f5876c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (x: 10, y: 10, time: 10)>\n",
       "array([[[2.88196731e-01, 3.71102840e-01, 8.22413516e-01, 7.61603373e-01,\n",
       "         2.14247694e-01, 6.08972260e-01, 6.35605124e-01, 4.51735394e-02,\n",
       "         3.56580833e-01, 3.33245593e-01],\n",
       "        [9.56686233e-02, 3.09634487e-01, 5.72034429e-01, 8.64203361e-01,\n",
       "         5.44551902e-01, 4.54445926e-01, 1.21606888e-01, 2.30160410e-01,\n",
       "         6.14639953e-01, 7.73246535e-01],\n",
       "        [8.03011705e-01, 2.69969912e-01, 2.03781951e-01, 6.64806547e-01,\n",
       "         4.93709552e-01, 2.60248353e-01, 6.82195033e-01, 6.75837492e-01,\n",
       "         5.07293067e-01, 6.45924343e-01],\n",
       "        [1.03968071e-01, 1.31787260e-01, 2.31666523e-02, 2.90727455e-01,\n",
       "         6.22514068e-02, 9.54996781e-01, 1.38868633e-01, 3.18043546e-01,\n",
       "         9.94141764e-01, 6.52825114e-01],\n",
       "        [6.72144360e-01, 9.25109790e-01, 9.24907616e-01, 9.97835547e-01,\n",
       "         1.30089788e-01, 3.28381980e-01, 9.47761645e-01, 2.15451004e-01,\n",
       "         1.55072912e-01, 2.84564825e-01],\n",
       "        [5.32157180e-01, 4.05812774e-01, 6.65152077e-01, 1.62793186e-01,\n",
       "         8.38375837e-01, 4.38498164e-01, 3.93970103e-01, 3.25181026e-01,\n",
       "         8.43314943e-01, 6.37218468e-01],\n",
       "        [9.47935236e-01, 1.39071514e-01, 3.34994498e-01, 7.42907508e-01,\n",
       "         1.13865457e-01, 3.69531071e-01, 6.58907523e-01, 4.10997683e-01,\n",
       "...\n",
       "         5.01101857e-01, 6.76530919e-01, 6.01550513e-01, 1.91761020e-01,\n",
       "         2.01591335e-01, 3.73443454e-01],\n",
       "        [8.72935075e-01, 9.28175014e-01, 7.03819938e-01, 4.25757273e-01,\n",
       "         6.80355431e-01, 1.22351044e-01, 8.22086635e-03, 9.23118431e-01,\n",
       "         8.00040998e-02, 3.51963004e-01],\n",
       "        [5.30917733e-01, 1.73025731e-03, 5.46551386e-01, 3.41904305e-01,\n",
       "         6.11276326e-01, 7.83903426e-01, 7.67650251e-01, 9.27383669e-02,\n",
       "         5.99146336e-01, 1.44674661e-02],\n",
       "        [9.32478257e-02, 6.51279678e-01, 3.40032365e-01, 6.66761485e-02,\n",
       "         3.88243075e-01, 3.06181721e-02, 5.58666002e-01, 3.10356676e-01,\n",
       "         6.46523629e-01, 1.19013418e-01],\n",
       "        [1.81940990e-01, 3.89650142e-01, 9.98204973e-01, 4.39178186e-02,\n",
       "         6.88137446e-02, 7.61541679e-02, 6.26075251e-01, 9.14708720e-01,\n",
       "         4.45414011e-01, 5.16678456e-01],\n",
       "        [8.51618677e-01, 6.81900815e-01, 6.66821786e-01, 8.75685884e-01,\n",
       "         2.90499242e-01, 3.25977864e-01, 3.67627054e-01, 3.93770674e-01,\n",
       "         7.40898577e-01, 3.50451112e-02],\n",
       "        [7.06374026e-01, 7.19519511e-01, 1.79160522e-01, 8.81425785e-01,\n",
       "         3.51431945e-01, 4.11507382e-01, 6.86088790e-01, 3.04671156e-01,\n",
       "         5.70729870e-01, 7.76584760e-01]]])\n",
       "Dimensions without coordinates: x, y, time
" ], "text/plain": [ "\n", "array([[[2.88196731e-01, 3.71102840e-01, 8.22413516e-01, 7.61603373e-01,\n", " 2.14247694e-01, 6.08972260e-01, 6.35605124e-01, 4.51735394e-02,\n", " 3.56580833e-01, 3.33245593e-01],\n", " [9.56686233e-02, 3.09634487e-01, 5.72034429e-01, 8.64203361e-01,\n", " 5.44551902e-01, 4.54445926e-01, 1.21606888e-01, 2.30160410e-01,\n", " 6.14639953e-01, 7.73246535e-01],\n", " [8.03011705e-01, 2.69969912e-01, 2.03781951e-01, 6.64806547e-01,\n", " 4.93709552e-01, 2.60248353e-01, 6.82195033e-01, 6.75837492e-01,\n", " 5.07293067e-01, 6.45924343e-01],\n", " [1.03968071e-01, 1.31787260e-01, 2.31666523e-02, 2.90727455e-01,\n", " 6.22514068e-02, 9.54996781e-01, 1.38868633e-01, 3.18043546e-01,\n", " 9.94141764e-01, 6.52825114e-01],\n", " [6.72144360e-01, 9.25109790e-01, 9.24907616e-01, 9.97835547e-01,\n", " 1.30089788e-01, 3.28381980e-01, 9.47761645e-01, 2.15451004e-01,\n", " 1.55072912e-01, 2.84564825e-01],\n", " [5.32157180e-01, 4.05812774e-01, 6.65152077e-01, 1.62793186e-01,\n", " 8.38375837e-01, 4.38498164e-01, 3.93970103e-01, 3.25181026e-01,\n", " 8.43314943e-01, 6.37218468e-01],\n", " [9.47935236e-01, 1.39071514e-01, 3.34994498e-01, 7.42907508e-01,\n", " 1.13865457e-01, 3.69531071e-01, 6.58907523e-01, 4.10997683e-01,\n", "...\n", " 5.01101857e-01, 6.76530919e-01, 6.01550513e-01, 1.91761020e-01,\n", " 2.01591335e-01, 3.73443454e-01],\n", " [8.72935075e-01, 9.28175014e-01, 7.03819938e-01, 4.25757273e-01,\n", " 6.80355431e-01, 1.22351044e-01, 8.22086635e-03, 9.23118431e-01,\n", " 8.00040998e-02, 3.51963004e-01],\n", " [5.30917733e-01, 1.73025731e-03, 5.46551386e-01, 3.41904305e-01,\n", " 6.11276326e-01, 7.83903426e-01, 7.67650251e-01, 9.27383669e-02,\n", " 5.99146336e-01, 1.44674661e-02],\n", " [9.32478257e-02, 6.51279678e-01, 3.40032365e-01, 6.66761485e-02,\n", " 3.88243075e-01, 3.06181721e-02, 5.58666002e-01, 3.10356676e-01,\n", " 6.46523629e-01, 1.19013418e-01],\n", " [1.81940990e-01, 3.89650142e-01, 9.98204973e-01, 4.39178186e-02,\n", " 6.88137446e-02, 7.61541679e-02, 6.26075251e-01, 9.14708720e-01,\n", " 4.45414011e-01, 5.16678456e-01],\n", " [8.51618677e-01, 6.81900815e-01, 6.66821786e-01, 8.75685884e-01,\n", " 2.90499242e-01, 3.25977864e-01, 3.67627054e-01, 3.93770674e-01,\n", " 7.40898577e-01, 3.50451112e-02],\n", " [7.06374026e-01, 7.19519511e-01, 1.79160522e-01, 8.81425785e-01,\n", " 3.51431945e-01, 4.11507382e-01, 6.86088790e-01, 3.04671156e-01,\n", " 5.70729870e-01, 7.76584760e-01]]])\n", "Dimensions without coordinates: x, y, time" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Move data to host\n", "da_np = da_cp.as_numpy()\n", "da_np" ] }, { "cell_type": "markdown", "id": "fd1f4133-310b-4780-a71e-0599518eefeb", "metadata": {}, "source": [ "Let’s confirm this isn’t a CuPy array anymore:" ] }, { "cell_type": "code", "execution_count": 10, "id": "b071bc93-e5dc-4185-b905-1842da06a45f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "da_np.cupy.is_cupy" ] }, { "cell_type": "markdown", "id": "305c68f4-bdf8-4be4-be95-3a8bf005d122", "metadata": {}, "source": [ "We also can convert an Xarray DataArray that include NumPy array to a CuPy array (move data to Device) use `cupy.as_cupy()`:" ] }, { "cell_type": "code", "execution_count": 11, "id": "7dccf500-b6ac-498b-a869-2db52b90a083", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Move data to GPU\n", "da_cp = da_np.cupy.as_cupy()\n", "da_cp.as_cupy().cupy.is_cupy" ] }, { "cell_type": "markdown", "id": "0888781c-d9dd-4d1e-9014-72beb3bfcc56", "metadata": {}, "source": [ "### Plotting\n", "\n", "Plotting DataArrays with underlying data as CuPy arrays work in the same way as DataArrays with Numpy Arrays; however, data is first transferred to CPU before being plotted. " ] }, { "cell_type": "code", "execution_count": 12, "id": "95552a84-ca06-4483-9db8-31459c10edd3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([111., 93., 96., 112., 88., 93., 115., 88., 98., 106.]),\n", " array([5.01237631e-05, 9.98656087e-02, 1.99681094e-01, 2.99496578e-01,\n", " 3.99312063e-01, 4.99127548e-01, 5.98943033e-01, 6.98758518e-01,\n", " 7.98574003e-01, 8.98389488e-01, 9.98204973e-01]),\n", " )" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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qq6uDttfXV2t3NzcnhgJAAAY0mO/4pk3b56uueYajR49Wueff76WLl2qDz/8ULNnz+6pkQAAgBE9FihXXXWVPvnkE917773avXu3RowYoeeff15Dhw7tqZEkffHrpHvuuafLr5QQXaxz92Gtuwfr3D1Y5+7T02vtcd/ksz4AAADdiO/iAQAA5hAoAADAHAIFAACYQ6AAAABzCBQAAGDOcRkoixcvVlZWlvr376+cnBytW7fua4+vqalRTk6O+vfvr+HDh+uRRx7ppknjWyTr/PTTT2vChAn6zne+o9TUVJ1//vl66aWXunHa+BXpz3On1157TQkJCTrrrLNiO2AvEulat7e3q7i4WEOHDpXX69V3v/td/f73v++maeNXpOv8xBNPaNSoUUpOTlZGRoauu+46ffLJJ900bXxau3atJk2apEAgII/Ho2eeeeaoj+n210J3nFm5cqVLTEx0y5Ytc9u2bXNz5851AwYMcDt37jzi8Tt27HDJyclu7ty5btu2bW7ZsmUuMTHRPfXUU908eXyJdJ3nzp3r7r//fvfGG2+47du3u6KiIpeYmOg2bdrUzZPHl0jXudNnn33mhg8f7vLz892oUaO6Z9g4dyxrPXnyZDdmzBhXXV3t6uvr3b/+9S/32muvdePU8SfSdV63bp3r06eP+93vfud27Njh1q1b58444wx3xRVXdPPk8eX55593xcXF7s9//rOT5FavXv21x/fEa+FxFyjnnXeemz17dti+U0891RUWFh7x+Pnz57tTTz01bN+sWbPc97///ZjN2BtEus5Hcvrpp7sFCxZEe7Re5VjX+aqrrnJ33nmnu+eeewiUbyjStX7hhRdcWlqa++STT7pjvF4j0nV+4IEH3PDhw8P2PfTQQ27IkCExm7G3+SaB0hOvhcfVr3g6OjpUV1en/Pz8sP35+fmqra094mNef/31Lsdfcskl2rhxow4cOBCzWePZsazzlx0+fFitra0aOHBgLEbsFY51nZcvX673339f99xzT6xH7DWOZa2fffZZjR49WgsXLtRJJ52kU045Rbfddpva2tq6Y+S4dCzrnJubq127dun555+Xc07//e9/9dRTT2nixIndMfJxoydeC3vsT933hD179ujQoUNdvjHZ5/N1+WblTo2NjUc8/uDBg9qzZ48yMjJiNm+8OpZ1/rIHH3xQ+/bt09SpU2MxYq9wLOv87rvvqrCwUOvWrVNCwnH1X/9v5VjWeseOHVq/fr369++v1atXa8+ePZozZ44+/fRT3ofyFY5lnXNzc/XEE0/oqquu0ueff66DBw9q8uTJWrRoUXeMfNzoidfC4+oKSiePxxN22znXZd/Rjj/SfoSLdJ07PfnkkyopKdGqVas0ePDgWI3Xa3zTdT506JCmTZumBQsW6JRTTumu8XqVSH6mDx8+LI/HoyeeeELnnXeeLrvsMpWXl+uxxx7jKspRRLLO27Zt080336y7775bdXV1evHFF1VfX88Xz8ZAd78WHlf/F2rQoEHq27dvlxJvamrqUoad/H7/EY9PSEhQenp6zGaNZ8eyzp1WrVqlmTNn6k9/+pPGjx8fyzHjXqTr3Nraqo0bN2rz5s268cYbJX3xIuqcU0JCgtasWaMf/vCH3TJ7vDmWn+mMjAyddNJJSktLC+077bTT5JzTrl27lJ2dHdOZ49GxrHNZWZnGjh2r22+/XZJ05plnasCAAbrwwgv1q1/9iqvcUdITr4XH1RWUfv36KScnR9XV1WH7q6urlZube8THnH/++V2OX7NmjUaPHq3ExMSYzRrPjmWdpS+unFx77bWqqqri98ffQKTrnJqaqjfffFNbtmwJbbNnz9b3vvc9bdmyRWPGjOmu0ePOsfxMjx07Vh9//LH27t0b2rd9+3b16dNHQ4YMiem88epY1nn//v3q0yf8paxv376S/u//4ePb65HXwpi9/daozo+wPfroo27btm2uoKDADRgwwH3wwQfOOecKCwvdNddcEzq+86NVt9xyi9u2bZt79NFH+ZjxNxDpOldVVbmEhAT38MMPu927d4e2zz77rKeeQlyIdJ2/jE/xfHORrnVra6sbMmSIu/LKK93WrVtdTU2Ny87Odtdff31PPYW4EOk6L1++3CUkJLjFixe7999/361fv96NHj3anXfeeT31FOJCa2ur27x5s9u8ebOT5MrLy93mzZtDH+e28Fp43AWKc849/PDDbujQoa5fv37unHPOcTU1NaH7ZsyY4caNGxd2/KuvvurOPvts169fPzds2DC3ZMmSbp44PkWyzuPGjXOSumwzZszo/sHjTKQ/z/8fgRKZSNf67bffduPHj3dJSUluyJAhbt68eW7//v3dPHX8iXSdH3roIXf66ae7pKQkl5GR4aZPn+527drVzVPHl1deeeVr/zfXwmuhxzmugQEAAFuOq/egAACA+ECgAAAAcwgUAABgDoECAADMIVAAAIA5BAoAADCHQAEAAOYQKAAAwBwCBQAAmEOgAAAAcwgUAABgzv8Aj/AJlq+rLaIAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "da_cp.plot()" ] }, { "cell_type": "markdown", "id": "4cb39238-124e-4282-a7f9-314667cc87d2", "metadata": {}, "source": [ "## Summary\n", "\n", "In this notebook, we have learned about:\n", "\n", "* CuPy-Xarray Basics\n", "* Data Transfer between Device to Host \n", "\n", "```{seealso}\n", "[CuPy User Guide](https://docs.cupy.dev/en/stable/user_guide/index.html) \n", "[Xarray User Guide](https://docs.xarray.dev/en/stable/user-guide/index.html) \n", "[Cupy-Xarray Github](https://github.com/xarray-contrib/cupy-xarray.git)\n", "```" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }