New Features
- Implement kernel checkpointing, allowing exact GPs on up to 1M data points with multiple GPUs (499)
- GPyTorch now supports hard parameter constraints (e.g. bounds) via the register_constraint method on `Module` (596)
- All GPyTorch objects now support multiple batch dimensions. In addition to training `b` GPs simultaneously, you can now train a `b1 x b2` matrix of GPs simultaneously if you so choose (492, 589, 627)
- `RBFKernelGrad` now supports ARD (602)
- `FixedNoiseGaussianLikelihood` offers a better interface for dealing with known observation noise values. `WhiteNoiseKernel` is now hard deprecated (593)
- `InvMatmul`, `InvQuadLogDet` and `InvQuad` are now twice differentiable (603)
- `Likelihood` has been redesigned. See the new documentation for details if you are creating custom likelihoods (591)
- Better support for more flexible Pyro models. You can now define likelihoods of the form `p(y|f, z)` where `f` is a GP and `z` are arbitrary latent variables learned by Pyro (591).
- Parameters can now be recursively initialized with full names, e.g. `model.initialize(**{"covar_module.base_kernel.lengthscale": 1., "covar_module.outputscale": 1.})` (484)
- Added `ModelList` and `LikelihoodList` for training multiple GPs when batch mode can't be used -- see example notebooks (471)
Performance and stability improvements
- CG termination is now more tolerance based, and will much more rarely terminate without returning good solves. Furthermore, a warning is raised if it ever does that includes suggested courses of action. (569)
- In non-ARD mode, RBFKernel and MaternKernel use custom backward implementations for performance (517)
- Up to a 3x performance improvement in the regime where the test set is very small (615)
- The noise parameter in `GaussianLikelihood` now has a default lower bound, similar to sklearn (596)
- `psd_safe_cholesky` now adds successively increasing amounts of jitter rather than only once (610)
- Variational inference initialization now uses `psd_safe_cholesky` rather than `torch.cholesky` to initialize with the prior (610)
- The pivoted Cholesky preconditioner now uses a QR decomposition for its solve rather than the Woodbury formula for speed and stability (617)
- GPyTorch now uses Cholesky for solves with very small matrices rather than CG, resulting in reduced overhead for that setting (586)
- Cholesky can additionally be turned on manually for help debugging (586)
- Kernel distance computations now use `torch.cdist` when on PyTorch 1.1.0 in the non-batch setting (642)
- CUDA unit tests now default to using the least used available GPU when run (515)
- `MultiDeviceKernel` is now much faster (491)
Bug Fixes
- Fixed an issue with variational covariances at test time (638)
- Fixed an issue where the training covariance wasn't being detached for variance computations, occasionally resulting in backward errors (566)
- Fixed an issue where `active_dims` in kernels was being applied twice (576)
- Fixes and stability improvements for `MultiDeviceKernel` (560)
- Fixed an issue where `fast_pred_var` was failing for single training inputs (574)
- Fixed an issue when initializing parameter values with non-tensor values (630)
- Fixed an issue with handling the preconditioner log determinant value for MLL computation (634)
- Fixed an issue where `prior_dist` was being cached for VI, which was problematic for pyro models (599)
- Fixed a number of issues with `LinearKernel`, including one where the variance could go negative (584)
- Fixed a bug where training inputs couldn't be set with `set_train_data` if they are currently `None` (565)
- Fixed a number of bugs in `MultitaskMultivariateNormal` (545, 553)
- Fixed an indexing bug in `batch_symeig` (547)
- Fixed an issue where `MultitaskMultivariateNormal` wasn't interleaving rows correctly (540)
Other
- GPyTorch is now fully Python 3.6, and we've begun to include static type hints (581)
- Parameters in GPyTorch no longer have default singleton batch dimensions. For example, the default shape of `lengthscale` is now `torch.Size([1])` rather than `torch.Size([1, 1])` (605)
- `setup.py` now includes optional dependents, reads requirements from `requirements.txt`, does not require `torch` if `pytorch-nightly` is installed (495)