def test_update_diff(self): """ Test update diff for blobs """ import scikits.cuda.cublas as cublas import pycuda.gpuarray as gpuarray import copy import caffe_facade from caffe_facade import pycuda_util import numpy as np blobs = list() for (blob_name, blob) in self.net.params.items(): blobs.append(blob[0]) blobs.append(blob[1]) mult = 0.0001 blobs_update_cpu = [np.random.rand(*blob.diff.shape).astype(np.float32) * mult for blob in blobs] initial_params_diff = copy.deepcopy(self.net.params_diff) with pycuda_util.caffe_cuda_context(): h = caffe_facade.cublas_handle() blobs_gpu = [blob.diff_as_pycuda_gpuarray() for blob in blobs] blobs_update_gpu = [gpuarray.to_gpu(blob_update_cpu) for blob_update_cpu in blobs_update_cpu] for (blob_gpu, blob_update_gpu) in zip(blobs_gpu, blobs_update_gpu): cublas.cublasSaxpy(h, blob_gpu.size, 1.0, blob_update_gpu.gpudata, 1, blob_gpu.gpudata, 1) for (blob_gpu, initial_param_diff, blob_update_cpu) in zip(blobs_gpu, initial_params_diff, blobs_update_cpu): assert np.allclose(blob_gpu.get(), initial_param_diff.reshape(blob_gpu.shape) + blob_update_cpu) params_diff = self.net.params_diff for (blob_gpu, param_diff) in zip(blobs_gpu, params_diff): assert np.allclose(blob_gpu.get(), param_diff.reshape(blob_gpu.shape))
def test_blob_diff_to_gpuarray(self): """ Test diff_as_pycuda_gpuarray works for all blobs """ from caffe_facade import pycuda_util with pycuda_util.caffe_cuda_context(): for (blob_name, blob) in self.net.params.items(): blob[0].diff_as_pycuda_gpuarray() blob[1].diff_as_pycuda_gpuarray()
def test_axpy(self): """ Test axpy function from scikits.cuda.cublas """ import caffe_facade import scikits.cuda.cublas as cublas import numpy as np import pycuda.gpuarray as gpuarray from caffe_facade import pycuda_util caffe_facade.set_mode_gpu() caffe_facade.set_device(0) x = np.random.randn(5, 4, 3, 2).astype(np.float32) y = np.random.randn(5, 4, 3, 2).astype(np.float32) with pycuda_util.caffe_cuda_context(): h = caffe_facade.cublas_handle() x_gpu = gpuarray.to_gpu(x) y_gpu = gpuarray.to_gpu(y) cublas.cublasSaxpy(h, x.size, 1.0, x_gpu.gpudata, 1, y_gpu.gpudata, 1) y = x + y assert np.allclose(y_gpu.get(), y)
def test_average(self): """ Test average function on GPU """ import caffe_facade import scikits.cuda.cublas as cublas import numpy as np import pycuda.gpuarray as gpuarray from caffe_facade import pycuda_util shape = (64, 32, 5, 5) num_elements = np.prod(shape) num_samples = 10 data_cpu = np.zeros(shape, np.float32) data_cpu_received = [ np.random.rand(*shape).astype(np.float32) for i in range(num_samples) ] with pycuda_util.caffe_cuda_context(): #GPU average data_gpu = gpuarray.to_gpu(np.zeros(shape, np.float32)) h = caffe_facade.cublas_handle() data_gpu_temp = gpuarray.to_gpu(data_cpu_received[0]) cublas.cublasScopy(h, num_elements, data_gpu_temp.gpudata, 1, data_gpu.gpudata, 1) for i in range(1, len(data_cpu_received)): data_gpu_temp = gpuarray.to_gpu(data_cpu_received[i]) cublas.cublasSaxpy(h, num_elements, 1.0, data_gpu_temp.gpudata, 1, data_gpu.gpudata, 1) cublas.cublasSscal(h, num_elements, 1.0 / num_samples, data_gpu.gpudata, 1) #CPU average data_cpu = data_cpu_received[0] / num_samples for i in range(1, len(data_cpu_received)): data_cpu += data_cpu_received[i] / num_samples assert np.allclose(data_cpu, data_gpu.get())