from scratch in PyTorch. self-contained: no GPflow/GPyTorch. model: y = f_L(...f_2(f_1(x))) + eps, each f_l a sparse GP. inference: sample-through-the-layers variational inference.