From 0382ff8ce0352d5e7d8efd318dbba30ece06f969 Mon Sep 17 00:00:00 2001 From: Jackson Burns Date: Tue, 13 Aug 2024 17:26:42 -0400 Subject: [PATCH] include notebook output --- .../fastprop_computational_adme_demo.ipynb | 963 ++++++++++++++++-- 1 file changed, 867 insertions(+), 96 deletions(-) diff --git a/examples/fastprop_computational_adme_demo.ipynb b/examples/fastprop_computational_adme_demo.ipynb index 5dd0710..f6b05dc 100644 --- a/examples/fastprop_computational_adme_demo.ipynb +++ b/examples/fastprop_computational_adme_demo.ipynb @@ -18,7 +18,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -51,7 +51,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -78,9 +78,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 3521/3521 [03:34<00:00, 16.44it/s]\n" + ] + } + ], "source": [ "import os\n", "import numpy as np\n", @@ -122,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -179,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -264,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -329,100 +337,863 @@ "name": "stderr", "output_type": "stream", "text": [ + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", "GPU available: True (cuda), used: True\n", "TPU available: False, using: 0 TPU cores\n", "HPU available: False, using: 0 HPUs\n", - "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n" - ] - } - ], - "source": [ - "%%capture\n", - "from pathlib import Path\n", - "\n", - "fastprop_extrapolation = []\n", - "fastprop_interpolation = []\n", - "linear_extrapolation = []\n", - "linear_interpolation = []\n", - "for task_number in range(targets.shape[1]):\n", - " # select only the rows which have values\n", - " task_mask = ~np.isnan(targets[:, task_number])\n", - " # run the extrapolation\n", - " fastprop_result, baseline_result = replicate_fastprop(\n", - " smiles_arr=smiles[task_mask],\n", - " descriptors_arr=descriptors[task_mask, :],\n", - " targets_arr=targets[task_mask, task_number, None], # keep it 2d\n", - " outdir=Path(f\"adme_output_task_{task_number}_extrapolation\"),\n", - " )\n", - " fastprop_extrapolation.append(fastprop_result)\n", - " linear_extrapolation.append(baseline_result)\n", - " # and the interpolation\n", - " fastprop_result, baseline_result = cross_validate_fastprop(\n", - " smiles_arr=smiles[task_mask],\n", - " descriptors_arr=descriptors[task_mask, :],\n", - " targets_arr=targets[task_mask, task_number, None], # keep it 2d\n", - " outdir=Path(f\"adme_output_task_{task_number}_interpolation\"),\n", - " )\n", - " fastprop_interpolation.append(fastprop_result)\n", - " linear_interpolation.append(baseline_result)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's take a look at the results, organizing them into a nice table including the reference results from the source paper:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tabulate import tabulate\n", - "\n", - "table = tabulate(\n", - " headers=[\"Model\"] + list(target_names.keys()),\n", - " tabular_data=[\n", - " [\"RF\", 0.62, 0.73, 0.57, 0.65, 0.75, 0.69],\n", - " [\"MPNN + Descriptors\", 0.68, 0.78, 0.59, 0.74, 0.77, 0.70],\n", - " [\"Linear\"] + linear_interpolation,\n", - " [\"fastprop\"] + fastprop_interpolation,\n", - " [\"Linear (KMeans)\"] + linear_extrapolation,\n", - " [\"fastprop (KMeans)\"] + fastprop_extrapolation,\n", - " ],\n", - " floatfmt=\".2f\",\n", - ")\n", - "print(table)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`fastprop` is right in line with the methods presented in the reference study, matching Chemprop (MPNN + Descriptors) performance on HLM and Solubility, beating Random Forest (RF) on RLM, narrowly trailing both methods on MDR1-MDCK ER and rPPB, and falling significantly behind in hPPB.\n", - "When moving to extrapolation, `fastprop`'s performance drops only a small amount on all tasks (_except_ hPPB) which is encouraging - this demonstrates that `fastprop` is capable of predicting in chemical space it has not seen during training!\n", - "The reason hPPB improve under extrapolation is unknown.\n", - "It could be because extrapolation turns out be easier for this _specific_ dataset, though this could also just be a product of the small dataset size (i.e. this is not a significant result).\n", - "\n", - "The linear model does quite poorly on some of the tasks under interpolation, though not extrapolation!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To make this easier to visualize, let's make a bar plot of the tasks:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "Missing logger folder: adme_output_task_0_interpolation/tensorboard_logs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "Missing logger folder: adme_output_task_1_interpolation/tensorboard_logs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "Missing logger folder: adme_output_task_2_interpolation/tensorboard_logs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "Missing logger folder: adme_output_task_3_interpolation/tensorboard_logs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "Missing logger folder: adme_output_task_4_interpolation/tensorboard_logs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "Missing logger folder: adme_output_task_5_interpolation/tensorboard_logs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "GPU available: True (cuda), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "HPU available: False, using: 0 HPUs\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n", + "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n" + ] + } + ], + "source": [ + "%%capture\n", + "from pathlib import Path\n", + "\n", + "fastprop_extrapolation = []\n", + "fastprop_interpolation = []\n", + "linear_extrapolation = []\n", + "linear_interpolation = []\n", + "for task_number in range(targets.shape[1]):\n", + " # select only the rows which have values\n", + " task_mask = ~np.isnan(targets[:, task_number])\n", + " # run the extrapolation\n", + " fastprop_result, baseline_result = replicate_fastprop(\n", + " smiles_arr=smiles[task_mask],\n", + " descriptors_arr=descriptors[task_mask, :],\n", + " targets_arr=targets[task_mask, task_number, None], # keep it 2d\n", + " outdir=Path(f\"adme_output_task_{task_number}_extrapolation\"),\n", + " )\n", + " fastprop_extrapolation.append(fastprop_result)\n", + " linear_extrapolation.append(baseline_result)\n", + " # and the interpolation\n", + " fastprop_result, baseline_result = cross_validate_fastprop(\n", + " smiles_arr=smiles[task_mask],\n", + " descriptors_arr=descriptors[task_mask, :],\n", + " targets_arr=targets[task_mask, task_number, None], # keep it 2d\n", + " outdir=Path(f\"adme_output_task_{task_number}_interpolation\"),\n", + " )\n", + " fastprop_interpolation.append(fastprop_result)\n", + " linear_interpolation.append(baseline_result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's take a look at the results, organizing them into a nice table including the reference results from the source paper:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model HLM MDR1-MDCK ER Solubility RLM hPPB rPPB\n", + "------------------ ----- -------------- ------------ ----- ------ ------\n", + "RF 0.62 0.73 0.57 0.65 0.75 0.69\n", + "MPNN + Descriptors 0.68 0.78 0.59 0.74 0.77 0.70\n", + "Linear 0.02 0.69 0.51 -0.01 0.16 0.15\n", + "fastprop 0.69 0.71 0.58 0.70 0.67 0.68\n", + "Linear (KMeans) 0.45 0.64 0.48 0.62 0.63 0.51\n", + "fastprop (KMeans) 0.63 0.68 0.52 0.67 0.80 0.66\n" + ] + } + ], + "source": [ + "from tabulate import tabulate\n", + "\n", + "table = tabulate(\n", + " headers=[\"Model\"] + list(target_names.keys()),\n", + " tabular_data=[\n", + " [\"RF\", 0.62, 0.73, 0.57, 0.65, 0.75, 0.69],\n", + " [\"MPNN + Descriptors\", 0.68, 0.78, 0.59, 0.74, 0.77, 0.70],\n", + " [\"Linear\"] + linear_interpolation,\n", + " [\"fastprop\"] + fastprop_interpolation,\n", + " [\"Linear (KMeans)\"] + linear_extrapolation,\n", + " [\"fastprop (KMeans)\"] + fastprop_extrapolation,\n", + " ],\n", + " floatfmt=\".2f\",\n", + ")\n", + "print(table)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`fastprop` is right in line with the methods presented in the reference study, matching Chemprop (MPNN + Descriptors) performance on HLM and Solubility, beating Random Forest (RF) on RLM, narrowly trailing both methods on MDR1-MDCK ER and rPPB, and falling significantly behind in hPPB.\n", + "When moving to extrapolation, `fastprop`'s performance drops only a small amount on all tasks (_except_ hPPB) which is encouraging - this demonstrates that `fastprop` is capable of predicting in chemical space it has not seen during training!\n", + "The reason hPPB improve under extrapolation is unknown.\n", + "It could be because extrapolation turns out be easier for this _specific_ dataset, though this could also just be a product of the small dataset size (i.e. this is not a significant result).\n", + "\n", + "The linear model does quite poorly on some of the tasks under interpolation, though not extrapolation!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To make this easier to visualize, let's make a bar plot of the tasks:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "import matplotlib.pyplot as plt\n", "try:\n",