{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 08. N-Body Neural Force Fields" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# disable GPU. Remove this if you've compiled HOOMD for GPU\n", "import os\n", "os.environ['CUDA_VISIBLE_DEVICES'] = '-1'\n", "\n", "\n", "# import the hoomd, htf packages\n", "import hoomd\n", "import hoomd.htf as htf\n", "import tensorflow as tf\n", "import matplotlib.pyplot as plt\n", "from MDAnalysis import Universe" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Build the SimModel\n", "\n", "Here we build a 2 hidden-layer N-body neural force fields. The inputs are the nearest N neighbors." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "class NlistNN(htf.SimModel):\n", " def setup(self, dim, top_neighs):\n", " self.dense1 = tf.keras.layers.Dense(dim)\n", " self.dense2 = tf.keras.layers.Dense(dim)\n", " self.last = tf.keras.layers.Dense(1)\n", " self.top_neighs = top_neighs\n", "\n", " def compute(self, nlist, positions, box, sample_weight):\n", " rinv = htf.nlist_rinv(nlist)\n", " # closest neighbors have largest value in 1/r, take top\n", " sorted_n = tf.reshape(tf.sort(rinv, axis=1, direction='DESCENDING'), [-1, self.nneighbor_cutoff])\n", " top_n = sorted_n[:, :self.top_neighs]\n", " # run through NN\n", " x = self.dense1(top_n)\n", " x = self.dense2(x)\n", " pair_energy = self.last(x)\n", " # get per-particle energy\n", " energy = tf.reduce_sum(pair_energy, axis=1)\n", " forces = htf.compute_nlist_forces(nlist, energy)\n", " # don't output last column of forces, pairwise energy, since it's meaningless here\n", " return forces[:,:3], energy\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training from a Trajectory File\n", "\n", "We will compile our model and then train against a trajectory. If this were a real example, we would be training against the forces in the trajectory but this trajectory (to save space) has no forces. Instead, we will train to make our forces match the positions of the trajctory, which makes no physical sense, but it has the correct dimensions." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "model = NlistNN(128, dim=16, top_neighs=8)\n", "# when we compile, add a None loss so as to not train the second output\n", "# which is energy\n", "model.compile('Adam', ['MeanSquaredError', None])\n", "universe = Universe('test_topol.pdb', 'test_traj.trr')\n", "losses = []\n", "for epoch in range(3):\n", " for inputs, ts in htf.iter_from_trajectory(128, universe, r_cut=25, period=5):\n", " #labels = ts.forces\n", " labels = ts.positions\n", " loss = model.train_on_batch(inputs, labels)\n", " losses.append(loss)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(losses)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Inferrence with the Model\n", "\n", "Now we will run a particle simulation with our model." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "notice(2): Group \"all\" created containing 256 particles\n", "notice(2): Force mode is FORCE_MODE.tf2hoomd \n", "notice(2): Starting TensorflowCompute \n", "notice(2): completed reallocate\n", "notice(2): Setting flag indicating virial modification will occur\n", "notice(2): -- Neighborlist exclusion statistics -- :\n", "notice(2): Particles with 0 exclusions : 256\n", "notice(2): Neighbors included by diameter : no\n", "notice(2): Neighbors excluded when in the same body: no\n", "** starting run **\n", "Time 00:00:04 | Step 1000 / 1000 | TPS 222.051 | ETA 00:00:00\n", "Average TPS: 222.024\n", "---------\n", "-- Neighborlist stats:\n", "3 normal updates / 10 forced updates / 0 dangerous updates\n", "n_neigh_min: 58 / n_neigh_max: 69 / n_neigh_avg: 62.7266\n", "shortest rebuild period: 25\n", "-- Cell list stats:\n", "Dimension: 3, 3, 1\n", "n_min : 27 / n_max: 30 / n_avg: 28.4444\n", "** run complete **\n" ] } ], "source": [ "########### Hoomd-Sim Code ################\n", "hoomd.context.initialize('--mode=cpu')\n", "\n", "tfcompute = htf.tfcompute(model)\n", "\n", "# create a square lattice\n", "system = hoomd.init.create_lattice(unitcell=hoomd.lattice.sq(a=1.2),\n", " n=[16,16])\n", "nlist = hoomd.md.nlist.cell()\n", "# NVT ensemble\n", "hoomd.md.integrate.mode_standard(dt=0.001)\n", "hoomd.md.integrate.nvt(group=hoomd.group.all(), kT=0.1, tau=0.5).randomize_velocities(seed=1)\n", "tfcompute.attach(nlist, r_cut=5, save_output_period=5)\n", "#run with our silly model\n", "hoomd.run(1e3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analysis\n", "\n", "This model is not properly trained so there is not much analysis to do. We'll just take a look at the energy" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "e = tf.reduce_sum(tfcompute.outputs[0], axis=1)\n", "plt.plot(e)\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.8" } }, "nbformat": 4, "nbformat_minor": 2 }