From c639b0d1265f1b90963fa36c26dc5696277178e2 Mon Sep 17 00:00:00 2001 From: Zhenwen Dai Date: Wed, 23 Sep 2015 16:48:24 +0100 Subject: [PATCH] gently fall back if gpu psicomp fail --- GPy/kern/_src/psi_comp/__init__.py | 8 ++++---- GPy/kern/_src/psi_comp/rbf_psi_gpucomp.py | 21 ++++++++++++++++++--- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/GPy/kern/_src/psi_comp/__init__.py b/GPy/kern/_src/psi_comp/__init__.py index 1e0a9b72..5cee363d 100644 --- a/GPy/kern/_src/psi_comp/__init__.py +++ b/GPy/kern/_src/psi_comp/__init__.py @@ -24,7 +24,7 @@ class PSICOMP(Pickleable): from .gaussherm import PSICOMP_GH class PSICOMP_RBF(PSICOMP): - @Cache_this(limit=5, ignore_args=(0,)) + @Cache_this(limit=10, ignore_args=(0,)) def psicomputations(self, kern, Z, variational_posterior, return_psi2_n=False): variance, lengthscale = kern.variance, kern.lengthscale if isinstance(variational_posterior, variational.NormalPosterior): @@ -34,7 +34,7 @@ class PSICOMP_RBF(PSICOMP): else: raise ValueError("unknown distriubtion received for psi-statistics") - @Cache_this(limit=5, ignore_args=(0,2,3,4)) + @Cache_this(limit=10, ignore_args=(0,2,3,4)) def psiDerivativecomputations(self, kern, dL_dpsi0, dL_dpsi1, dL_dpsi2, Z, variational_posterior): variance, lengthscale = kern.variance, kern.lengthscale if isinstance(variational_posterior, variational.NormalPosterior): @@ -46,7 +46,7 @@ class PSICOMP_RBF(PSICOMP): class PSICOMP_Linear(PSICOMP): - @Cache_this(limit=5, ignore_args=(0,)) + @Cache_this(limit=10, ignore_args=(0,)) def psicomputations(self, kern, Z, variational_posterior, return_psi2_n=False): variances = kern.variances if isinstance(variational_posterior, variational.NormalPosterior): @@ -56,7 +56,7 @@ class PSICOMP_Linear(PSICOMP): else: raise ValueError("unknown distriubtion received for psi-statistics") - @Cache_this(limit=2, ignore_args=(0,2,3,4)) + @Cache_this(limit=10, ignore_args=(0,2,3,4)) def psiDerivativecomputations(self, kern, dL_dpsi0, dL_dpsi1, dL_dpsi2, Z, variational_posterior): variances = kern.variances if isinstance(variational_posterior, variational.NormalPosterior): diff --git a/GPy/kern/_src/psi_comp/rbf_psi_gpucomp.py b/GPy/kern/_src/psi_comp/rbf_psi_gpucomp.py index b3de8363..e2a5c7d1 100644 --- a/GPy/kern/_src/psi_comp/rbf_psi_gpucomp.py +++ b/GPy/kern/_src/psi_comp/rbf_psi_gpucomp.py @@ -235,6 +235,9 @@ gpu_code = """ class PSICOMP_RBF_GPU(PSICOMP_RBF): def __init__(self, threadnum=256, blocknum=30, GPU_direct=False): + from . import PSICOMP_RBF + self.fall_back = PSICOMP_RBF() + from pycuda.compiler import SourceModule from ....util.gpu_init import initGPU initGPU() @@ -318,8 +321,14 @@ class PSICOMP_RBF_GPU(PSICOMP_RBF): def get_dimensions(self, Z, variational_posterior): return variational_posterior.mean.shape[0], Z.shape[0], Z.shape[1] - @Cache_this(limit=5, ignore_args=(0,)) def psicomputations(self, kern, Z, variational_posterior, return_psi2_n=False): + try: + return self._psicomputations(kern, Z, variational_posterior, return_psi2_n) + except: + return self.fall_back.psicomputations(kern, Z, variational_posterior, return_psi2_n) + + @Cache_this(limit=10, ignore_args=(0,)) + def _psicomputations(self, kern, Z, variational_posterior, return_psi2_n=False): """ Z - MxQ mu - NxQ @@ -353,9 +362,15 @@ class PSICOMP_RBF_GPU(PSICOMP_RBF): return psi0, psi1_gpu, psi2_gpu else: return psi0, psi1_gpu.get(), psi2_gpu.get() - - @Cache_this(limit=5, ignore_args=(0,2,3,4)) + def psiDerivativecomputations(self, kern, dL_dpsi0, dL_dpsi1, dL_dpsi2, Z, variational_posterior): + try: + return self._psiDerivativecomputations(kern, dL_dpsi0, dL_dpsi1, dL_dpsi2, Z, variational_posterior) + except: + return self.fall_back.psiDerivativecomputations(kern, dL_dpsi0, dL_dpsi1, dL_dpsi2, Z, variational_posterior) + + @Cache_this(limit=10, ignore_args=(0,2,3,4)) + def _psiDerivativecomputations(self, kern, dL_dpsi0, dL_dpsi1, dL_dpsi2, Z, variational_posterior): variance, lengthscale = kern.variance, kern.lengthscale from ....util.linalg_gpu import sum_axis ARD = (len(lengthscale)!=1)