sporco.cupy package¶
This subpackage provides GPU acceleration for selected SPORCO modules via copies of these modules that are patched to replace NumPy arrays and operations with the equivalent ones provided by CuPy [38]. The boolean value of attribute sporco.cupy.have_cupy indicates whether CuPy is installed and a GPU device is available. The modules within the sporco.cupy subpackage can still be used when sporco.cupy.have_cupy is False, but they will not be GPU accelerated.
Note that the sporco.cupy subpackage is not supported under versions of Python, such as Python 2.7.x, that do not have the importlib.util module.
See also
- NumPy/CuPy compatibility
Table of NumPy functions that are implemented in CuPy
Installation and Configuration¶
To use CuPy, first install CUDA and then install CuPy. Note that it may be necessary to set the environment variables as in
export CUDAHOME=/usr/local/cuda-10.2
export PATH=${CUDAHOME}/bin:${PATH}
(substitute the appropriate path to the CUDA installation) to avoid a
cupy.cuda.compiler.CompileException when using CuPy. If this does not rectify the problem,
the following may also be necessary:
export LD_LIBRARY_PATH=${CUDAHOME}/lib64:$LD_LIBRARY_PATH
Supported Modules¶
The sporco.cupy subpackage currently provides CuPy acceleration of the following standard sporco modules:
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Usage¶
To use the CuPy accelerated version of a SPORCO module:
import the module from
sporco.cupyinstead ofsporcobefore calling functions/methods within the
sporco.cupymodule, convert NumPy arrays to CuPy arrays usingnp2cp.after calling functions/methods within the
sporco.cupymodule, convert CuPy arrays to NumPy arrays usingcp2np.
Usage examples are available for sporco.cupy.admm.tvl1, sporco.cupy.dictlrn.onlinecdl and sporco.cupy.admm.cbpdn.
Utility Functions¶
Since it is necessary to explicitly convert between NumPy arrays and CuPy arrays, a number of utility functions in sporco.cupy support this conversion in a way that behaves correctly independent of the value of sporco.cupy.have_cupy, in that conversion is performed when the value is True, and no conversion is perfomed when it is False.
- sporco.cupy.array_module(*args)¶
Get the array module (
numpyorcupy) of the array argument. This function is an alias forcupy.get_array_module.
- sporco.cupy.np2cp(u)¶
Convert a
numpyndarray to acupyarray. This function is an alias forcupy.asarray
- sporco.cupy.cp2np(u)¶
Convert a
cupyarray to anumpyndarray. This function is an alias forcupy.asnumpy
- sporco.cupy.cupy_wrapper(func)¶
A wrapper function that converts
numpyndarray arguments tocupyarrays, and convert anycupyarrays returned by the wrapped function intonumpyndarrays.
Some additional utility functions provide useful functionality when package GPUtil is installed, and return fixed default return values when it is not installed:
- sporco.cupy.gpu_info()¶
Return a list of namedtuples representing attributes of each GPU device. Returns an empty list if GPUtil is not installed.
- sporco.cupy.gpu_load(wproc=0.5, wmem=0.5)¶
Return a list of namedtuples representing the current load for each GPU device. The processor and memory loads are fractions between 0 and 1. The weighted load represents a weighted average of processor and memory loads using the parameters wproc and wmem respectively. Returns an empty list if GPUtil is not installed.
- sporco.cupy.device_by_load(wproc=0.5, wmem=0.5)¶
Get a list of GPU device ids ordered by increasing weighted average of processor and memory load. Returns an empty list if GPUtil is not installed.
- sporco.cupy.select_device_by_load(wproc=0.5, wmem=0.5)¶
Set the current device for cupy as the device with the lowest weighted average of processor and memory load. Returns 0 if GPUtil is not installed.
- sporco.cupy.available_gpu(*args, **kwargs)¶
Get the device id for an available GPU when multiple GPUs are installed. This function is an alias for
GPUtil.getAvailable. Returns 0 if GPUtil is not installed.
The current GPU device can be also selected using cupy.cuda.Device.use, e.g. to select device id 1
cp.cuda.Device(1).use()
CuPy also provides a context manager for GPU device selection.