CS 179 LECTURE 15 INTRODUCTION TO CUDNN CUDA

  • Slides: 34
Download presentation
CS 179: LECTURE 15 INTRODUCTION TO CUDNN (CUDA DEEP NEURAL NETS)

CS 179: LECTURE 15 INTRODUCTION TO CUDNN (CUDA DEEP NEURAL NETS)

LAST TIME

LAST TIME

TODAY Using cu. DNN to do deep neural networks

TODAY Using cu. DNN to do deep neural networks

SETTING UP CUDNN cudnn. Handle_t Like cu. BLAS, you need to maintain cu. DNN

SETTING UP CUDNN cudnn. Handle_t Like cu. BLAS, you need to maintain cu. DNN library context Call cudnn. Create(cudnn. Handle_t *handle) to initialize the context Call cudnn. Destroy(cudnn. Handle_t handle) to clean up the context

HANDLING ERRORS Almost every function we will talk about today returns a cudnn. Status_t

HANDLING ERRORS Almost every function we will talk about today returns a cudnn. Status_t (an enum saying whether a cu. DNN call was successful or how it failed) Like standard CUDA, we will provide you with a check. CUDNN(cudnn. Status_t status) wrapper function that parses any error statuses for you Make sure you wrap every function call with this function so you know where and how your code breaks!

REMINDERS ABOUT CUDA Pattern of allocate initialize free (reiterate here for students who may

REMINDERS ABOUT CUDA Pattern of allocate initialize free (reiterate here for students who may not be as comfortable with C++)

DATA REPRESENTATION cudnn. Tensor_t For the purposes of cu. DNN (and much of machine

DATA REPRESENTATION cudnn. Tensor_t For the purposes of cu. DNN (and much of machine learning), a tensor is just a multidimensional array A wrapper around a “flattened” 3 -8 dimensional array Used to represent minibatches of data For now, we will be using “flattened” 4 D arrays to represent each minibatch X

DATA REPRESENTATION

DATA REPRESENTATION

DATA REPRESENTATION

DATA REPRESENTATION

DATA REPRESENTATION cudnn. Tensor. Descriptor_t Allocate by calling cudnn. Create. Tensor. Descriptor( cudnn. Tensor.

DATA REPRESENTATION cudnn. Tensor. Descriptor_t Allocate by calling cudnn. Create. Tensor. Descriptor( cudnn. Tensor. Descriptor_t *desc) The ordering of array axes is defined by an enum called a cudnn. Tensor. Format_t (since we are indexing as X[n, c, h, w], we will use CUDNN_TENSOR_NCHW) A cudnn. Data. Type_t specifies the data type of the tensor (we will use CUDNN_DATA_FLOAT)

DATA REPRESENTATION cudnn. Tensor. Descriptor_t Initialize by calling cudnn. Set. Tensor 4 d. Descriptor(

DATA REPRESENTATION cudnn. Tensor. Descriptor_t Initialize by calling cudnn. Set. Tensor 4 d. Descriptor( cudnn. Tensor. Descriptor_t desc, cudnn. Tensor. Format_t format, cudnn. Data. Type_t data. Type, int n, int c, int h, int w) Free by calling cudnn. Destroy. Tensor. Descriptor( cudnn. Tensor. Descriptor_t desc)

DATA REPRESENTATION cudnn. Tensor. Descriptor_t Get the contents by calling cudnn. Get. Tensor 4

DATA REPRESENTATION cudnn. Tensor. Descriptor_t Get the contents by calling cudnn. Get. Tensor 4 d. Descriptor( cudnn. Tensor. Descriptor_t desc, cudnn. Data. Type_t data. Type, int *n, int *c, int *h, int *w, int *n. Str, int *c. Str, int *h. Str, int *w. Str) Standard trick of returning by setting output parameters Don’t worry about the strides n. Str, c. Str, h. Str, w. Str

RELATION TO ASSIGNMENT 5

RELATION TO ASSIGNMENT 5

RELATION TO ASSIGNMENT 5

RELATION TO ASSIGNMENT 5

RELATION TO ASSIGNMENT 5

RELATION TO ASSIGNMENT 5

RELATION TO ASSIGNMENT 5

RELATION TO ASSIGNMENT 5

RELATION TO ASSIGNMENT 5

RELATION TO ASSIGNMENT 5

ACTIVATION FUNCTIONS cudnn. Activation. Descriptor_t Allocate with cudnn. Create. Activation. Descriptor( cudnn. Activation. Descriptor_t

ACTIVATION FUNCTIONS cudnn. Activation. Descriptor_t Allocate with cudnn. Create. Activation. Descriptor( cudnn. Activation. Descriptor_t *desc) Destroy with cudnn. Destroy. Activation. Descriptor( cudnn. Activation. Descriptor_t desc)

ACTIVATION FUNCTIONS cudnn. Activation. Mode_t An enum that specifies the type of activation we

ACTIVATION FUNCTIONS cudnn. Activation. Mode_t An enum that specifies the type of activation we should apply after any given layer Specify as CUDNN_ACTIVATION_<type> can be SIGMOID, RELU, TANH, CLIPPED_RELU, or ELU (the last 2 are fancier activations that address some of the issues with Re. LU); use RELU for this assignment

ACTIVATION FUNCTIONS Graphs of activations as a reminder

ACTIVATION FUNCTIONS Graphs of activations as a reminder

ACTIVATION FUNCTIONS cudnn. Nan. Propagation_t An enum that specifies whether to propagate NAN’s Use

ACTIVATION FUNCTIONS cudnn. Nan. Propagation_t An enum that specifies whether to propagate NAN’s Use CUDNN_PROPAGATE_NAN for this assignment

ACTIVATION FUNCTIONS cudnn. Activation. Descriptor_t Set with cudnn. Set. Activation. Descriptor( cudnn. Activation. Descriptor_t

ACTIVATION FUNCTIONS cudnn. Activation. Descriptor_t Set with cudnn. Set. Activation. Descriptor( cudnn. Activation. Descriptor_t desc, cudnn. Activation. Mode_t mode, cudnn. Nan. Propagation_t relu. Nan. Opt, double coef) coef is relevant only for clipped Re. LU and ELU activations, so just use 0. 0 for this assignment

ACTIVATION FUNCTIONS cudnn. Activation. Descriptor_t Get contents with cudnn. Get. Activation. Descriptor( cudnn. Activation.

ACTIVATION FUNCTIONS cudnn. Activation. Descriptor_t Get contents with cudnn. Get. Activation. Descriptor( cudnn. Activation. Descriptor_t desc, cudnn. Activation. Mode_t *mode, cudnn. Nan. Propagation_t *relu. Nan. Opt, double *coef) coef is relevant only for clipped Re. LU and ELU activations, so just give it a reference to a double for throwaway values

ACTIVATION FUNCTIONS

ACTIVATION FUNCTIONS

ACTIVATION FUNCTIONS

ACTIVATION FUNCTIONS

ACTIVATION FUNCTIONS

ACTIVATION FUNCTIONS

SOFTMAX/CROSS-ENTROPY LOSS

SOFTMAX/CROSS-ENTROPY LOSS

SOFTMAX/CROSS-ENTROPY LOSS Forward pass Computes tensor x = alpha[0] * softmax(z) + beta[0] *

SOFTMAX/CROSS-ENTROPY LOSS Forward pass Computes tensor x = alpha[0] * softmax(z) + beta[0] * x cudnn. Softmax. Forward(cudnn. Handle_t handle, cudnn. Softmax. Algorithm_t alg, cudnn. Softmax. Mode_t mode, void *alpha, cudnn. Tensor. Descriptor_t z. Desc, void *z, void *beta, cudnn. Tensor. Descriptor_t x. Desc, void *x)

SOFTMAX/CROSS-ENTROPY LOSS

SOFTMAX/CROSS-ENTROPY LOSS

SOFTMAX/CROSS-ENTROPY LOSS

SOFTMAX/CROSS-ENTROPY LOSS

SOFTMAX/CROSS-ENTROPY LOSS

SOFTMAX/CROSS-ENTROPY LOSS

SOFTMAX WITH OTHER LOSSES Backward pass For different losses, use the following function: cudnn.

SOFTMAX WITH OTHER LOSSES Backward pass For different losses, use the following function: cudnn. Softmax. Backward(cudnn. Handle_t handle, cudnn. Softmax. Algorithm_t alg, cudnn. Softmax. Mode_t mode, void *alpha, cudnn. Tensor. Descriptor_t x. Desc, void *x, cudnn. Tensor. Descriptor_t dx. Desc, void *dx, void *beta, cudnn. Tensor. Descriptor_t dz. Desc, void *dz)

SOFTMAX WITH OTHER LOSSES

SOFTMAX WITH OTHER LOSSES

SUMMARY Defining data in terms of tensors Using those tensors as arguments to cu.

SUMMARY Defining data in terms of tensors Using those tensors as arguments to cu. DNN’s built-in functions for both the forwards and backwards passes through a neural network You can find more details about everything we discussed in NVIDIA’s official cu. DNN developer guide Next week: convolutional neural nets