Skip to content

Instantly share code, notes, and snippets.

@smsharma
Created June 13, 2023 19:24
Show Gist options
  • Save smsharma/3a3bbfb4fbea3a0880cb7cc0e4f0e706 to your computer and use it in GitHub Desktop.
Save smsharma/3a3bbfb4fbea3a0880cb7cc0e4f0e706 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# ! pip install powerbox\n",
"# ! pip install git+https://github.com/tlmakinen/powerbox-jax.git\n",
"# ! pip install jax-cosmo\n",
"# ! pip install nflows"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"import jax.numpy as np\n",
"import jax\n",
"import numpy as onp\n",
"import jax_cosmo as jc\n",
"import powerbox_jax as pbj\n",
"import powerbox as pbox\n",
"\n",
"import matplotlib.pyplot as plt"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Simulate some spectra"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# Define cosmology\n",
"cosmo_params = jc.Planck15(Omega_c=0.4, sigma8=0.6)\n",
"\n",
"# Define power spectrum\n",
"def P(k, Omega_c=0.40, sigma8=0.60):\n",
" cosmo_params = jc.Planck15(Omega_c=Omega_c, sigma8=sigma8)\n",
" return jc.power.linear_matter_power(cosmo_params, k)\n",
"\n",
"N = 50 # Number of points in box\n",
"L = 50. # Mpc; box size\n",
"\n",
"rng = jax.random.PRNGKey(32)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"# Draw N uniform numbers between (0.1, 0.5) and (0.6, 1.0) as prior\n",
"\n",
"from tqdm.notebook import tqdm\n",
"from scipy.stats import uniform\n",
"\n",
"n_train = 100\n",
"thetas = np.array(uniform.rvs(size=(n_train, 2), loc=(0.1, 0.6), scale=(0.4, 0.4)))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f5cf02dbf8254bfaa363b4d6c073e93a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/100 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def lnpb_fn(theta):\n",
" \n",
" lnpb = pbj.LogNormalPowerBox(\n",
" N=N, dim=2, pk = lambda k: P(k, Omega_c=theta[0], sigma8=theta[1]) / L, boxlength = L, key = rng, vol_normalised_power=True, supplied_freqs=None\n",
" )\n",
"\n",
" p_k_lnfield, bins_lnfield = pbox.get_power(lnpb.delta_x(), lnpb.boxlength)\n",
"\n",
" return p_k_lnfield\n",
" \n",
"\n",
"pspecs = [lnpb_fn(theta) for theta in tqdm(thetas)]"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Helper function for constructing normalizing flows with `nflows`"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"from nflows import distributions as distributions_\n",
"from nflows import flows, transforms\n",
"from nflows.nn import nets\n",
"import torch\n",
"\n",
"def build_maf(dim=1, num_transforms=8, context_features=None, hidden_features=128):\n",
" transform = transforms.CompositeTransform(\n",
" [\n",
" transforms.CompositeTransform(\n",
" [\n",
" transforms.MaskedAffineAutoregressiveTransform(\n",
" features=dim,\n",
" hidden_features=hidden_features,\n",
" context_features=context_features,\n",
" num_blocks=2,\n",
" use_residual_blocks=False,\n",
" random_mask=False,\n",
" activation=torch.tanh,\n",
" dropout_probability=0.0,\n",
" use_batch_norm=False,\n",
" ),\n",
" transforms.RandomPermutation(features=dim),\n",
" ]\n",
" )\n",
" for _ in range(num_transforms)\n",
" ]\n",
" )\n",
"\n",
" distribution = distributions_.StandardNormal((dim,))\n",
" neural_net = flows.Flow(transform, distribution)\n",
"\n",
" return neural_net\n",
"\n",
"# Test\n",
"flow = build_maf(dim=2, context_features=2)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Train normalizing flow"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"import pytorch_lightning as pl\n",
"from torch.utils.data import TensorDataset, DataLoader"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/nx/bx2847k56j3dddp761x637pc0000gn/T/ipykernel_6719/229339229.py:1: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at /Users/runner/work/pytorch/pytorch/pytorch/torch/csrc/utils/tensor_new.cpp:248.)\n",
" pspecs = torch.Tensor(pspecs)\n"
]
}
],
"source": [
"pspecs = torch.Tensor(pspecs)\n",
"thetas = torch.Tensor(onp.array(thetas))"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"batch_size = 4\n",
"\n",
"dataset = TensorDataset(pspecs, thetas)\n",
"train_loader = DataLoader(dataset, batch_size=batch_size, num_workers=8, pin_memory=True, shuffle=True)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"class FlowSurrogate(pl.LightningModule):\n",
" def __init__(\n",
" self,\n",
" optimizer=torch.optim.AdamW,\n",
" optimizer_kwargs={\"weight_decay\": 1e-5},\n",
" max_epochs=50,\n",
" scheduler=torch.optim.lr_scheduler.CosineAnnealingLR,\n",
" ):\n",
" super().__init__()\n",
"\n",
" self.optimizer = optimizer\n",
" self.optimizer_kwargs = optimizer_kwargs\n",
" self.scheduler = scheduler\n",
" self.scheduler_kwargs = {\"T_max\":max_epochs}\n",
" self.lr = 3e-4\n",
"\n",
" self.flow = build_maf(dim=pspecs.shape[-1], context_features=2)\n",
"\n",
" def forward(self, x, theta):\n",
" log_prob = self.flow.log_prob(x, context=theta)\n",
" return log_prob.mean()\n",
"\n",
" def configure_optimizers(self):\n",
" optimizer = self.optimizer(self.parameters(), lr=self.lr, **self.optimizer_kwargs)\n",
"\n",
" return {\"optimizer\": optimizer, \"lr_scheduler\": {\"scheduler\": self.scheduler(optimizer, **self.scheduler_kwargs), \"interval\": \"epoch\", \"monitor\": \"val_loss\", \"frequency\": 1}}\n",
"\n",
" def training_step(self, batch, batch_idx):\n",
" x, theta = batch\n",
" log_prob = self(x, theta)\n",
" loss = -log_prob\n",
" self.log(\"train_loss\", loss, on_epoch=True)\n",
" return loss"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: True (mps), used: False\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
"HPU available: False, using: 0 HPUs\n",
"/opt/homebrew/Caskroom/miniforge/base/envs/torch-mps/lib/python3.9/site-packages/pytorch_lightning/trainer/setup.py:200: UserWarning: MPS available but not used. Set `accelerator` and `devices` using `Trainer(accelerator='mps', devices=1)`.\n",
" rank_zero_warn(\n",
"\n",
" | Name | Type | Params\n",
"------------------------------\n",
"0 | flow | Flow | 336 K \n",
"------------------------------\n",
"336 K Trainable params\n",
"0 Non-trainable params\n",
"336 K Total params\n",
"1.345 Total estimated model params size (MB)\n",
"/opt/homebrew/Caskroom/miniforge/base/envs/torch-mps/lib/python3.9/site-packages/pytorch_lightning/trainer/trainer.py:1595: PossibleUserWarning: The number of training batches (25) is smaller than the logging interval Trainer(log_every_n_steps=50). Set a lower value for log_every_n_steps if you want to see logs for the training epoch.\n",
" rank_zero_warn(\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "24d3038cb22d44bdba0f20113067e21a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"`Trainer.fit` stopped: `max_epochs=50` reached.\n"
]
}
],
"source": [
"model = FlowSurrogate()\n",
"\n",
"trainer = pl.Trainer(max_epochs=50, accelerator='cpu', devices=1)\n",
"trainer.fit(model=model, train_dataloaders=train_loader)\n"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"model.eval();"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Simulator function and sampling examples"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"def simulator(theta, num_samples=1):\n",
" \"\"\" Simulator by sampling from the trained normalizing flow\n",
" \"\"\"\n",
" return model.flow.sample(num_samples=num_samples, context=theta)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Pk')"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"pspec_sample = simulator(thetas[0], num_samples=1)\n",
"plt.plot(pspec_sample[0, 0].detach().numpy(), label='sample', color='C0')\n",
"plt.plot(pspecs[0].detach().numpy(), label='truth', color='C0', ls='--')\n",
"\n",
"pspec_sample = simulator(thetas[5], num_samples=1)\n",
"plt.plot(pspec_sample[0, 0].detach().numpy(), label='sample', color='C1')\n",
"plt.plot(pspecs[5].detach().numpy(), label='truth', color='C1', ls='--')\n",
"\n",
"plt.yscale('log')\n",
"\n",
"plt.legend()\n",
"\n",
"plt.ylabel(\"Pk\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "torch-mps",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment