{ "cells": [ { "cell_type": "markdown", "id": "5093355f-b45c-483e-a8da-8753eb1536c2", "metadata": { "id": "5093355f-b45c-483e-a8da-8753eb1536c2" }, "source": [ "\n", " \"Open\n", "" ] }, { "cell_type": "markdown", "id": "xQvn0r7NYIgW", "metadata": { "id": "xQvn0r7NYIgW" }, "source": [ "## 0. Preparation:\n", "### 0-1. Add packages" ] }, { "cell_type": "code", "execution_count": 1, "id": "cLDyOsEcYYsy", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "cLDyOsEcYYsy", "outputId": "ecc210a9-5491-4bd9-d843-bf74c4381a01" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Found existing installation: torch 2.1.0+cu121\n", "Uninstalling torch-2.1.0+cu121:\n", " Successfully uninstalled torch-2.1.0+cu121\n", "Found existing installation: torchvision 0.16.0+cu121\n", "Uninstalling torchvision-0.16.0+cu121:\n", " Successfully uninstalled torchvision-0.16.0+cu121\n", "Found existing installation: torchaudio 2.1.0+cu121\n", "Uninstalling torchaudio-2.1.0+cu121:\n", " Successfully uninstalled torchaudio-2.1.0+cu121\n", "Found existing installation: torchdata 0.7.0\n", "Uninstalling torchdata-0.7.0:\n", " Successfully uninstalled torchdata-0.7.0\n", "Found existing installation: torchtext 0.16.0\n", "Uninstalling torchtext-0.16.0:\n", " Successfully uninstalled torchtext-0.16.0\n", "Found existing installation: fastai 2.7.13\n", "Uninstalling fastai-2.7.13:\n", " Successfully uninstalled fastai-2.7.13\n", "\n", "Looking in indexes: https://pypi.org/simple, https://download.pytorch.org/whl/cu113\n", "Collecting torch==1.12.0+cu113\n", " Downloading https://download.pytorch.org/whl/cu113/torch-1.12.0%2Bcu113-cp310-cp310-linux_x86_64.whl (1837.6 MB)\n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 GB 975.3 kB/s eta 0:00:00\n", "Collecting torchvision==0.13.0+cu113\n", " Downloading https://download.pytorch.org/whl/cu113/torchvision-0.13.0%2Bcu113-cp310-cp310-linux_x86_64.whl (23.4 MB)\n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 23.4/23.4 MB 43.2 MB/s eta 0:00:00\n", "Collecting torchaudio==0.12.0\n", " Downloading https://download.pytorch.org/whl/cu113/torchaudio-0.12.0%2Bcu113-cp310-cp310-linux_x86_64.whl (3.8 MB)\n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.8/3.8 MB 33.1 MB/s eta 0:00:00\n", "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from torch==1.12.0+cu113) (4.5.0)\n", "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from torchvision==0.13.0+cu113) (1.23.5)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from torchvision==0.13.0+cu113) (2.31.0)\n", "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /usr/local/lib/python3.10/dist-packages (from torchvision==0.13.0+cu113) (9.4.0)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->torchvision==0.13.0+cu113) (3.3.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->torchvision==0.13.0+cu113) (3.6)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->torchvision==0.13.0+cu113) (2.0.7)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->torchvision==0.13.0+cu113) (2023.11.17)\n", "Installing collected packages: torch, torchvision, torchaudio\n", "Successfully installed torch-1.12.0+cu113 torchaudio-0.12.0+cu113 torchvision-0.13.0+cu113\n", "\n", "Torch version: 1.12.0+cu113\n", "\u001b[1;32m For the 1st run, \n", "a. Install omegafold...\n", "Collecting git+https://github.com/HeliXonProtein/OmegaFold.git\n", " Cloning https://github.com/HeliXonProtein/OmegaFold.git to /tmp/pip-req-build-xd1_66dd\n", " Running command git clone --filter=blob:none --quiet https://github.com/HeliXonProtein/OmegaFold.git /tmp/pip-req-build-xd1_66dd\n", " Resolved https://github.com/HeliXonProtein/OmegaFold.git to commit 313c873ad190b64506a497c926649e15fcd88fcd\n", " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", "Collecting torch@ https://download.pytorch.org/whl/cu113/torch-1.12.0%2Bcu113-cp310-cp310-linux_x86_64.whl (from OmegaFold==0.0.0)\n", " Using cached https://download.pytorch.org/whl/cu113/torch-1.12.0%2Bcu113-cp310-cp310-linux_x86_64.whl (1837.6 MB)\n", "Collecting biopython (from OmegaFold==0.0.0)\n", " Downloading biopython-1.81-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m25.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from biopython->OmegaFold==0.0.0) (1.23.5)\n", "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from torch@ https://download.pytorch.org/whl/cu113/torch-1.12.0%2Bcu113-cp310-cp310-linux_x86_64.whl->OmegaFold==0.0.0) (4.5.0)\n", "Building wheels for collected packages: OmegaFold\n", " Building wheel for OmegaFold (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for OmegaFold: filename=OmegaFold-0.0.0-py3-none-any.whl size=55664 sha256=660238cd81e3b4bedb0e95b8d75becbc1854002b746ed0ef20425125135d223f\n", " Stored in directory: /tmp/pip-ephem-wheel-cache-f1b09_yp/wheels/fe/57/01/3ce12996dd37debe3ee6a02e8748fffdd4df7b885c5bb8071d\n", "Successfully built OmegaFold\n", "Installing collected packages: biopython, OmegaFold\n", "Successfully installed OmegaFold-0.0.0 biopython-1.81\n", "--2023-12-17 13:39:51-- https://helixon.s3.amazonaws.com/release1.pt\n", "Resolving helixon.s3.amazonaws.com (helixon.s3.amazonaws.com)... 52.216.113.187, 52.217.86.252, 16.182.105.201, ...\n", "Connecting to helixon.s3.amazonaws.com (helixon.s3.amazonaws.com)|52.216.113.187|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 3181611124 (3.0G) [binary/octet-stream]\n", "Saving to: ‘/root/.cache/omegafold_ckpt/model.pt’\n", "\n", "/root/.cache/omegaf 100%[===================>] 2.96G 11.7MB/s in 3m 49s \n", "\n", "2023-12-17 13:43:41 (13.3 MB/s) - ‘/root/.cache/omegafold_ckpt/model.pt’ saved [3181611124/3181611124]\n", "\n", "b. Install DSSP...\n", "\n" ] } ], "source": [ "#@title ####For omegafold\n", "\n", "import os,sys\n", "import math\n", "\n", "#os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"-1\" #turn off CUDA if needed\n", "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"\n", "\n", "# control the version of torch\n", "# import torch\n", "# if torch.__version__!='1.12.0+cu113':\n", "# comm_line=f'pip uninstall -y torch torchvision torchaudio torchdata torchtext fastai'\n", "# print(os.popen(comm_line).read())\n", "# comm_line=f'pip install torch==1.12.0+cu113 torchvision==0.13.0+cu113 torchaudio==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu113'\n", "# print(os.popen(comm_line).read())\n", "\n", "comm_line=f'pip uninstall -y torch torchvision torchaudio torchdata torchtext fastai'\n", "print(os.popen(comm_line).read())\n", "comm_line=f'pip install torch==1.12.0+cu113 torchvision==0.13.0+cu113 torchaudio==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu113'\n", "print(os.popen(comm_line).read())\n", "import torch\n", "print('Torch version: ', torch.__version__)\n", "\n", "path_1 = '/opt/bin/'\n", "dssp_file = path_1+'mkdssp'\n", "\n", "file_exists = os.path.exists(dssp_file)\n", "if not (file_exists):\n", " print('\\033[1;32m For the 1st run, ')\n", " # ==============================================\n", " print('a. Install omegafold...')\n", " # install omegafold\n", " # ref: https://github.com/HeliXonProtein/OmegaFold\n", " !pip install git+https://github.com/HeliXonProtein/OmegaFold.git\n", "\n", " # time-consuming step:\n", " # Downloading weights from https://helixon.s3.amazonaws.com/release1.pt to /root/.cache/omegafold_ckpt/model.pt\n", " !mkdir /root/.cache/omegafold_ckpt\n", " !wget https://helixon.s3.amazonaws.com/release1.pt -O /root/.cache/omegafold_ckpt/model.pt\n", "\n", " print('b. Install DSSP...')\n", " # download an mkdssp\n", " # ==============================================\n", " # download things\n", " print(os.popen(f\"wget https://www.dropbox.com/s/v4azy9z9yojg1c6/mkdssp -P {path_1}\").read())\n", " #\n", " !chmod u+x /opt/bin/mkdssp\n", "\n", "else:\n", " print('This is not the first run... ')" ] }, { "cell_type": "code", "execution_count": 2, "id": "pUhFAfNfZFsW", "metadata": { "cellView": "form", "colab": { "base_uri": "https://localhost:8080/" }, "id": "pUhFAfNfZFsW", "outputId": "3f13597c-2418-4aea-a6af-a08615d70b64" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\u001b[1;32m a. on Biopython...\n", "\u001b[1;32m b. on kornia...\n", "Collecting kornia\n", " Downloading kornia-0.7.0-py2.py3-none-any.whl (705 kB)\n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 705.7/705.7 kB 10.2 MB/s eta 0:00:00\n", "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from kornia) (23.2)\n", "Requirement already satisfied: torch>=1.9.1 in /usr/local/lib/python3.10/dist-packages (from kornia) (1.12.0+cu113)\n", "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from torch>=1.9.1->kornia) (4.5.0)\n", "Installing collected packages: kornia\n", "Successfully installed kornia-0.7.0\n", "\n", "\u001b[1;32m c. on einops...\n", "Collecting einops\n", " Downloading einops-0.7.0-py3-none-any.whl (44 kB)\n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 44.6/44.6 kB 1.2 MB/s eta 0:00:00\n", "Installing collected packages: einops\n", "Successfully installed einops-0.7.0\n", "\n", "Collecting einops-exts\n", " Downloading einops_exts-0.0.4-py3-none-any.whl (3.9 kB)\n", "Requirement already satisfied: einops>=0.4 in /usr/local/lib/python3.10/dist-packages (from einops-exts) (0.7.0)\n", "Installing collected packages: einops-exts\n", "Successfully installed einops-exts-0.0.4\n", "\n", "Collecting pytorch-warmup\n", " Downloading pytorch_warmup-0.1.1-py3-none-any.whl (6.6 kB)\n", "Requirement already satisfied: torch>=1.1 in /usr/local/lib/python3.10/dist-packages (from pytorch-warmup) (1.12.0+cu113)\n", "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from torch>=1.1->pytorch-warmup) (4.5.0)\n", "Installing collected packages: pytorch-warmup\n", "Successfully installed pytorch-warmup-0.1.1\n", "\n", "Collecting ema-pytorch\n", " Downloading ema_pytorch-0.3.1-py3-none-any.whl (4.8 kB)\n", "Collecting beartype (from ema-pytorch)\n", " Downloading beartype-0.16.4-py3-none-any.whl (819 kB)\n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 819.1/819.1 kB 13.3 MB/s eta 0:00:00\n", "Requirement already satisfied: torch>=1.6 in /usr/local/lib/python3.10/dist-packages (from ema-pytorch) (1.12.0+cu113)\n", "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from torch>=1.6->ema-pytorch) (4.5.0)\n", "Installing collected packages: beartype, ema-pytorch\n", "Successfully installed beartype-0.16.4 ema-pytorch-0.3.1\n", "\n", "Collecting accelerate\n", " Downloading accelerate-0.25.0-py3-none-any.whl (265 kB)\n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 265.7/265.7 kB 4.4 MB/s eta 0:00:00\n", "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from accelerate) (1.23.5)\n", "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from accelerate) (23.2)\n", "Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from accelerate) (5.9.5)\n", "Requirement already satisfied: pyyaml in /usr/local/lib/python3.10/dist-packages (from accelerate) (6.0.1)\n", "Requirement already satisfied: torch>=1.10.0 in /usr/local/lib/python3.10/dist-packages (from accelerate) (1.12.0+cu113)\n", "Requirement already satisfied: huggingface-hub in /usr/local/lib/python3.10/dist-packages (from accelerate) (0.19.4)\n", "Requirement already satisfied: safetensors>=0.3.1 in /usr/local/lib/python3.10/dist-packages (from accelerate) (0.4.1)\n", "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (4.5.0)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface-hub->accelerate) (3.13.1)\n", "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub->accelerate) (2023.6.0)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from huggingface-hub->accelerate) (2.31.0)\n", "Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub->accelerate) (4.66.1)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub->accelerate) (3.3.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub->accelerate) (3.6)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub->accelerate) (2.0.7)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub->accelerate) (2023.11.17)\n", "Installing collected packages: accelerate\n", "Successfully installed accelerate-0.25.0\n", "\n", "Collecting py3Dmol\n", " Downloading py3Dmol-2.0.4-py2.py3-none-any.whl (12 kB)\n", "Installing collected packages: py3Dmol\n", "Successfully installed py3Dmol-2.0.4\n", "\n", "Collecting fair-esm\n", " Downloading fair_esm-2.0.0-py3-none-any.whl (93 kB)\n", " ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 93.1/93.1 kB 2.2 MB/s eta 0:00:00\n", "Installing collected packages: fair-esm\n", "Successfully installed fair-esm-2.0.0\n", "\n", "Collecting torchinfo\n", " Downloading torchinfo-1.8.0-py3-none-any.whl (23 kB)\n", "Installing collected packages: torchinfo\n", "Successfully installed torchinfo-1.8.0\n", "\n" ] } ], "source": [ "#@title ####For other pip packages\n", "# add some packages\n", "try:\n", " print('\\033[1;32m a. on Biopython...')\n", " from Bio.PDB import PDBParser\n", "except ImportError as e:\n", " print(os.popen('pip install biopython').read())\n", "\n", "try:\n", " print('\\033[1;32m b. on kornia...')\n", " import kornia.augmentation\n", "except ImportError as e:\n", " print(os.popen('pip install kornia').read())\n", "\n", "try:\n", " print('\\033[1;32m c. on einops...')\n", " from einops import rearrange, repeat, reduce\n", "except ImportError as e:\n", " print(os.popen('pip install einops').read())\n", "\n", "try:\n", " from einops_exts import rearrange_many, repeat_many, check_shape\n", "except ImportError as e:\n", " print(os.popen('pip install einops-exts').read())\n", "\n", "try:\n", " import pytorch_warmup as warmup\n", "except ImportError as e:\n", " print(os.popen('pip install pytorch-warmup').read())\n", "\n", "try:\n", " from ema_pytorch import EMA\n", "except ImportError as e:\n", " print(os.popen('pip install ema-pytorch').read())\n", "\n", "try:\n", " from accelerate import Accelerator, DistributedType, DistributedDataParallelKwargs\n", "except ImportError as e:\n", " print(os.popen('pip install accelerate').read())\n", "\n", "try:\n", " import py3Dmol\n", "except ImportError as e:\n", " print(os.popen('pip install py3Dmol').read())\n", "\n", "# added\n", "try:\n", " import esm\n", "except ImportError as e:\n", " print(os.popen('pip install fair-esm').read())\n", "\n", "try:\n", " import torchinfo\n", "except ImportError as e:\n", " print(os.popen('pip install torchinfo').read())" ] }, { "cell_type": "markdown", "id": "R3JeHPw9bOMQ", "metadata": { "id": "R3JeHPw9bOMQ" }, "source": [ "### 0.2. copy src from github" ] }, { "cell_type": "code", "execution_count": 3, "id": "wV1H9Bf0bYat", "metadata": { "cellView": "form", "id": "wV1H9Bf0bYat" }, "outputs": [], "source": [ "#@title #### Model code\n", "\n", "import json, time, os, sys, glob\n", "\n", "# # just script, no install is used\n", "# if not os.path.isdir(\"ProteinMPNN\"):\n", "# os.system(\"git clone -q https://github.com/dauparas/ProteinMPNN.git\")\n", "# sys.path.append('/content/ProteinMPNN/')\n", "\n", "# ===================================================================\n", "\n", "if not os.path.isdir(\"ProteinMechanicsDiffusionDesign_pLDM\"):\n", " os.system(\"git clone -q https://github.com/Bo-Ni/ProteinMechanicsDiffusionDesign_pLDM.git\")\n", "# sys.path.append('/content/ProteinMechanicsDiffusionDesign_pLDM/ProteinMechanicsDiffusionDesign/')\n", "sys.path.append('/content/ProteinMechanicsDiffusionDesign_pLDM/')" ] }, { "cell_type": "code", "execution_count": 4, "id": "TBNNv-Oo7Ftw", "metadata": { "cellView": "form", "colab": { "base_uri": "https://localhost:8080/" }, "id": "TBNNv-Oo7Ftw", "outputId": "b7e492f4-d50f-4e34-a690-0065e169602b" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "identify the device independently cuda:0\n" ] } ], "source": [ "#@title #### Small test\n", "# a slient test\n", "# import ProteinMechanicsDiffusionDesign.UtilityPack as UtilityPack\n", "# import ProteinMechanicsDiffusionDesign.DataSetPack as DataSetPack\n", "# import ProteinMechanicsDiffusionDesign.ModelPack as ModelPack\n", "# import ProteinMechanicsDiffusionDesign.TrainerPack as TrainerPack\n", "# import ProteinMechanicsDiffusionDesign.PostMDPack as PostMDPack\n", "#\n", "import PD_pLMProbXDiff.UtilityPack as UtilityPack\n", "import PD_pLMProbXDiff.DataSetPack as DataSetPack\n", "import PD_pLMProbXDiff.ModelPack as ModelPack\n", "import PD_pLMProbXDiff.TrainerPack as TrainerPack\n", "import PD_pLMProbXDiff.PostMDPack as PostMDPack" ] }, { "cell_type": "markdown", "id": "BRkJe9AUNRfy", "metadata": { "id": "BRkJe9AUNRfy" }, "source": [ "### 0.3. Download the model files" ] }, { "cell_type": "code", "execution_count": 5, "id": "h5l3MrGnNQuJ", "metadata": { "cellView": "form", "colab": { "base_uri": "https://localhost:8080/" }, "id": "h5l3MrGnNQuJ", "outputId": "dc5f1151-7b06-4e13-8299-9a3c51e7cf06" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Creating working path...\n", "\n", "Done.\n", "Downing files...\n", "\n", "\n", "Creating data path...\n", "\n", "Done.\n", "Downing files...\n", "\n", "Creating model path...\n", "\n", "Done.\n", "Downing files...\n", "\n" ] } ], "source": [ "#@title #### Set up the saved model\n", "\n", "# just script, no install is used\n", "this_working_path = '/content/working_results/'\n", "\n", "if not os.path.isdir(this_working_path):\n", " print('Creating working path...')\n", " print(os.popen('mkdir '+this_working_path).read())\n", " print('Done.')\n", " print('Downing files...')\n", "\n", "this_file = this_working_path+'model_pack.pickle'\n", "file_exists = os.path.exists(this_file)\n", "if not (file_exists):\n", " # download things\n", " this_link='https://www.dropbox.com/scl/fi/i2sull7ftjwrrzeaxo8v1/model_pack.pickle?rlkey=7wy5zynrl6m8azufklq3fy8ql&dl=0'\n", " cmd_line = f\"wget -O {this_file} {this_link}\"\n", " print(os.popen(cmd_line).read())\n", "\n", "#\n", "this_file = this_working_path+'data_pack.pickle'\n", "file_exists = os.path.exists(this_file)\n", "if not (file_exists):\n", " # download things\n", " this_link='https://www.dropbox.com/scl/fi/z7sz0q2nsjn85kyh68p86/data_pack.pickle?rlkey=bwm9fgf29ze8o516r155zg4gl&dl=0'\n", " cmd_line = f\"wget -O {this_file} {this_link}\"\n", " print(os.popen(cmd_line).read())\n", "\n", "# add for dataset part\n", "this_temp_path = this_working_path+'0_dataprocess_MD/'\n", "if not os.path.isdir(this_temp_path):\n", " print('Creating data path...')\n", " print(os.popen('mkdir '+this_temp_path).read())\n", " print('Done.')\n", " print('Downing files...')\n", "# add file if needed\n", "#\n", "this_file = this_working_path+'0_dataprocess_MD/'+'ForTest_LE_128_From_F1_f5.pt'\n", "file_exists = os.path.exists(this_file)\n", "if not (file_exists):\n", " # download things\n", " this_link='https://www.dropbox.com/scl/fi/zn2qdcdd4apsh88xirfzj/ForTest_LE_128_From_F1_f5.pk?rlkey=oamepqanqbpzrt8lrgjknp9bk&dl=0'\n", " cmd_line = f\"wget -O {this_file} {this_link}\"\n", " print(os.popen(cmd_line).read())\n", "\n", "# add for model part\n", "this_temp_path = this_working_path+'1_model_SS/'\n", "if not os.path.isdir(this_temp_path):\n", " print('Creating model path...')\n", " print(os.popen('mkdir '+this_temp_path).read())\n", " print('Done.')\n", " print('Downing files...')\n", "# add file if needed\n", "#\n", "this_file = this_working_path+'1_model_SS/'+'trainer_save-model_pLDM.pt'\n", "file_exists = os.path.exists(this_file)\n", "if not (file_exists):\n", " # download things\n", " this_link='https://www.dropbox.com/s/09wyap14yrnoeom/trainer_save-model_pLDM.pt?dl=0'\n", " cmd_line = f\"wget -O {this_file} {this_link}\"\n", " print(os.popen(cmd_line).read())" ] }, { "cell_type": "markdown", "id": "jc-QOhsnGAm9", "metadata": { "id": "jc-QOhsnGAm9" }, "source": [ "## 1. Working part" ] }, { "cell_type": "code", "execution_count": 6, "id": "o6kXrcuX_LtK", "metadata": { "cellView": "form", "colab": { "base_uri": "https://localhost:8080/" }, "id": "o6kXrcuX_LtK", "outputId": "d49af4da-8b56-42a1-dfaa-42de9382fa0f" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Here is : \n", " /content\n", "\n", "What we get in hardware: \n", " Sun Dec 17 13:50:07 2023 \n", "+---------------------------------------------------------------------------------------+\n", "| NVIDIA-SMI 535.104.05 Driver Version: 535.104.05 CUDA Version: 12.2 |\n", "|-----------------------------------------+----------------------+----------------------+\n", "| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n", "| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n", "| | | MIG M. |\n", "|=========================================+======================+======================|\n", "| 0 NVIDIA A100-SXM4-40GB Off | 00000000:00:04.0 Off | 0 |\n", "| N/A 31C P0 42W / 400W | 5MiB / 40960MiB | 0% Default |\n", "| | | Disabled |\n", "+-----------------------------------------+----------------------+----------------------+\n", " \n", "+---------------------------------------------------------------------------------------+\n", "| Processes: |\n", "| GPU GI CI PID Type Process name GPU Memory |\n", "| ID ID Usage |\n", "|=======================================================================================|\n", "| No running processes found |\n", "+---------------------------------------------------------------------------------------+\n", "\n", "What we have in software: \n", " Torch version: 1.12.0+cu113\n", "Python: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]\n", "\n", "What we have in software: \n", " Torch version: 1.12.0+cu113\n", "Python: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]\n", "\n", "What hardware the software see:\n", "cuda:0\n", "# of GPU 1\n", "\n" ] } ], "source": [ "#@title ### 1.0. Check the floor\n", "import os, sys\n", "print('Here is : \\n', os.popen('pwd').read())\n", "print('What we get in hardware: \\n', os.popen('nvidia-smi').read())\n", "\n", "import torch\n", "print(\"What we have in software: \\n Torch version:\", torch.__version__)\n", "print('Python: ', sys.version) # no switch case code\n", "print()\n", "\n", "import torch\n", "print(\"What we have in software: \\n Torch version:\", torch.__version__)\n", "print('Python: ', sys.version) # no switch case code\n", "print()\n", "\n", "print('What hardware the software see:')\n", "device = torch.device(\n", " \"cuda:0\" if torch.cuda.is_available() else \"cpu\"\n", ")\n", "print(device)\n", "num_of_gpus = torch.cuda.device_count()\n", "print(\"# of GPU\", num_of_gpus)\n", "print()\n", "torch.cuda.empty_cache()" ] }, { "cell_type": "code", "execution_count": 7, "id": "SuRSZhjbGgi1", "metadata": { "cellView": "form", "colab": { "base_uri": "https://localhost:8080/" }, "id": "SuRSZhjbGgi1", "outputId": "46666394-2700-4fd2-8c46-acedde6df66f" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "{\n", " \"Running_Type\": 2,\n", " \"Working_Mode\": 2,\n", " \"IF_FirstRun\": 2,\n", " \"Problem_ID\": 11,\n", " \"Debug\": 0,\n", " \"Debug_DataSet\": 1,\n", " \"Debug_Model\": 1,\n", " \"SlientRun\": 1,\n", " \"Debug_DataPack\": 0,\n", " \"Debug_ModelPack\": 0,\n", " \"Debug_TrainerPack\": 0,\n", " \"epochs\": 750,\n", " \"print_loss_every_this_epochs\": 50,\n", " \"sample_every_this_epochs\": 100,\n", " \"save_model_every_this_epochs\": 50,\n", " \"testratio\": 0.1\n", "}\n", "Problem type: 11\n", "Debug mode: 0\n", "Working mode: 2\n" ] } ], "source": [ "#@title ### 1.1. Setup the problem\n", "# prepare for package debugging\n", "# for debug\n", "import importlib\n", "import json\n", "import matplotlib.pyplot as plt\n", "# import PD_pLMProbXDiff.UtilityPack as UtilityPack\n", "# # run this when updating the package\n", "# importlib.reload(UtilityPack)\n", "# ===============================================\n", "# Global control key setup\n", "# ===============================================\n", "# Control keys:\n", "# This one will be directly modified for each task\n", "CKeys = dict(\n", " #\n", " Running_Type=2, # 1-local:engaging cluster, 2-supercould cluster, 3-google colab, 4-local ubuntu\n", " #\n", " # Working_Mode=1, # 1-training, 2-sampling for test\n", " Working_Mode=2,\n", " #\n", " # IF_FirstRun=1, # 1-1st run of training; otherwise, # of training run\n", " IF_FirstRun=2, # 1-1st run of training; otherwise, # of training run\n", " #\n", " # 1-SecStr-ModelB, 2-MD-ModelB, 3-SecStr-ModelA, 4-MD-ModelA\n", " # 5-SecStr-ModelB-Embdding, 6-MD-ModelB, 7-SecStr-ModelA-pLM, 8-MD-ModelA\n", " # 9-MD-Predictor-ModelB, 10-\n", " # 11-MD-ModelB\n", " Problem_ID=11, # 8, # 6,\n", " #\n", " # Debug=1, # 1-debug mode on; add more debug keys for different blocks\n", " Debug=0, # 1-debug mode on; add more debug keys for different blocks\n", " #\n", " Debug_DataSet=1,\n", " Debug_Model=1\n", " #\n", " # Debug=0\n", ")\n", "\n", "if CKeys['Debug']==1:\n", " # add some\n", " CKeys['SlientRun']=0 # 1-save figure into files; 0-show figures\n", " # detailed debug keys\n", " # 1. for model dimension\n", " CKeys['Debug_DataPack']=1\n", " CKeys['Debug_ModelPack']=1\n", " CKeys['Debug_TrainerPack']=1\n", " # 2. for trainer part\n", " CKeys['Debug_DataPack']=1\n", " CKeys['Debug_ModelPack']=0\n", " CKeys['Debug_TrainerPack']=3\n", " # #\n", " # CKeys['testratio']=0.15 # for small ForcPath problem\n", " CKeys['testratio']=0.10 # for large ForcPath problem\n", "\n", "else:\n", " # for real working run\n", " CKeys['SlientRun']=1\n", " #\n", " CKeys['Debug_DataPack'] = 0\n", " CKeys['Debug_ModelPack'] = 0\n", " CKeys['Debug_TrainerPack'] = 0 # 2 # 1\n", " # add some for training\n", " CKeys['epochs'] = 4000-3250 # 1000 # 200\n", " CKeys['print_loss_every_this_epochs']=50 # 5\n", " CKeys['sample_every_this_epochs']=100 # 50 # 20\n", " CKeys['save_model_every_this_epochs']=50 # 20\n", " # #\n", " # # add some for training\n", " # CKeys['epochs'] = 2000 # 1000 # 200\n", " # CKeys['print_loss_every_this_epochs']=20 # 5\n", " # CKeys['sample_every_this_epochs']=50 # 50 # 20\n", " # CKeys['save_model_every_this_epochs']=50 # 20\n", " #\n", " # CKeys['testratio']=0.15 # for small ForcPath problem\n", " CKeys['testratio']=0.10 # for large ForcPath problem\n", " #\n", " # # add some for training\n", " # CKeys['epochs'] = 4 # 1000 # 200\n", " # CKeys['print_loss_every_this_epochs']=1 # 5\n", " # CKeys['sample_every_this_epochs']=1 # 50 # 20\n", " # CKeys['save_model_every_this_epochs']=2 # 20\n", "\n", "# for check\n", "print(json.dumps(CKeys, indent=4))\n", "\n", "\n", "# Problem type:\n", "print('Problem type: ', CKeys['Problem_ID'])\n", "print('Debug mode: ', CKeys['Debug'])\n", "print('Working mode: ', CKeys['Working_Mode'])\n", "\n", "\n", "# ===========================================================\n", "# Parameter key:\n", "# ===========================================================\n", "#\n", "PKeys = {}\n", "# define this one according the running environment\n", "# add more if needed\n", "# if CKeys['Running_Type']==1 or CKeys['Running_Type']==4:\n", "# if CKeys['Running_Type']==1:\n", "#\n", "#\n", "root_path = '/home/gridsan/bni/Test_ground/jupyter/1_git_project/sort_pdb_database_0/Local_Store/'\n", "if CKeys['Debug']==1:\n", " # PKeys['prefix']='../Local_Store/For_16_0/'\n", " # use the absolute path for transformability\n", " PKeys['prefix']=root_path+'For_20_0/'\n", "\n", "if CKeys['Debug']!=1:\n", " # PKeys['prefix']='../Local_Store/For_16_1/'\n", " PKeys['prefix']=root_path+'For_20_1/'\n", " PKeys['prefix']='/home/gridsan/bni/16_WG_git_sort_pdb_database_0/11_pLMProb_Diff_SMD_ModelB_embed_640/0_Training/'\n", " # add one for google colab\n", " PKeys['prefix']=this_working_path # '/content/11_pLMProb_Diff_SMD_ModelB_embed_640/0_Training/'\n", "\n", "# store the data pack after processing\n", "PKeys['pk_data_pack']=PKeys['prefix']+'data_pack.pickle'\n", "PKeys['pk_model_pack']=PKeys['prefix']+'model_pack.pickle'\n", "# PKeys[]\n", "# print(CKeys['Running_Type'])\n", "# print(CKeys['Working_Mode']==1 and CKeys['IF_FirstRun']==1)\n", "# print(PKeys['prefix'])\n", "\n", "#\n", "# clean EVERYTHING in the dir if 1st\n", "#\n", "if CKeys['Working_Mode']==1 and CKeys['IF_FirstRun']==1:\n", " if os.path.exists(PKeys['prefix']):\n", " cmd_line=f\"rm -r {PKeys['prefix']}\"\n", " print(\"clean the slade...\")\n", " print(f\"excute {cmd_line}\")\n", " os.popen(cmd_line).read()\n", " #\n", " # create dir for working space\n", " UtilityPack.create_path(PKeys['prefix'])\n", "# ========================================================================\n", "# prepare the csv files\n", "# ========================================================================\n", "\n", "if CKeys['Problem_ID']==1 or CKeys['Problem_ID']==3 \\\n", "or CKeys['Problem_ID']==5 or CKeys['Problem_ID']==7:\n", "# SS_csv_file = PKeys['prefix']+'PROTEIN_Mar18_2022_SECSTR_ALL.csv'\n", "\n", "# file_exists = os.path.exists(SS_csv_file)\n", "# if not (file_exists):\n", "# print('Downing the csv file...')\n", "# print(os.popen(f\"wget https://www.dropbox.com/s/7o7s15w9qr6z76y/PROTEIN_Mar18_2022_SECSTR_ALL.csv -P {PKeys['prefix']}\").read())\n", "# print('Done.')\n", "# else:\n", "# print(\"Already there\")\n", " # +\n", " # SS_csv_file = '/home/gridsan/bni/Test_ground/jupyter/1_git_project/sort_pdb_database_0/Local_Store/'+'PROTEIN_Mar18_2022_SECSTR_ALL.csv'\n", " SS_csv_file = root_path+'Local_Store/'+'PROTEIN_Mar18_2022_SECSTR_ALL.csv'\n", "\n", "if CKeys['Problem_ID']==2 or CKeys['Problem_ID']==4 \\\n", "or CKeys['Problem_ID']==6 or CKeys['Problem_ID']==8 \\\n", "or CKeys['Problem_ID']==11:\n", " # to be copied locally\n", " # MD_smo_csv_file = '/home/gridsan/bni/Test_ground/jupyter/1_git_project/sort_pdb_database_0/Local_Store/For_1/ForTrain_recon_BSDB_LE_64_smd_disp_forc_df_smo.csv'\n", " # first debug with LE_64, to be update into LE_128\n", " MD_smo_csv_file = root_path+'For_1/ForTrain_recon_BSDB_LE_64_smd_disp_forc_df_smo.csv'\n", " MD_smo_pk_file = root_path+'For_1/ForTrain_recon_BSDB_LE_64_smd_disp_forc_df_smo_shared.pk'\n", " # into LE_128\n", " MD_smo_pk_file = root_path+'For_1/ForTrain_recon_BSDB_LE_128_smd_disp_forc_df_smo.pk'" ] }, { "cell_type": "code", "execution_count": 8, "id": "yI_BcJcx9nVJ", "metadata": { "cellView": "form", "colab": { "base_uri": "https://localhost:8080/" }, "id": "yI_BcJcx9nVJ", "outputId": "02e30df8-a912-4e2c-d208-934d0a4bf4bc" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "On Problem: 11\n", "/content/working_results/\n", "{'Running_Type': 2, 'Working_Mode': 2, 'IF_FirstRun': 2, 'Problem_ID': 11, 'Debug': 0, 'Debug_DataSet': 1, 'Debug_Model': 1, 'SlientRun': 1, 'Debug_DataPack': 0, 'Debug_ModelPack': 0, 'Debug_TrainerPack': 0, 'epochs': 750, 'print_loss_every_this_epochs': 50, 'sample_every_this_epochs': 100, 'save_model_every_this_epochs': 50, 'testratio': 0.1}\n", "This is not the first run\n", "Load back in the data packages...\n", "Done.\n", "{'data_dir': '/content/working_results/0_dataprocess_MD/', 'min_AA_seq_len': 0, 'max_AA_seq_len': 128, 'max_Force_cap': 1000, 'X_Key': 'sample_FORCEpN_data', 'tokenizer_X': None, 'tokenizer_y': None, 'Xnormfac': 750.0, 'ynormfac': 1.0, 'batch_size': 256, 'testset_ratio': 0.15, 'maxdata': 99999999991000, 'ESM-2_Model': 'esm2_t30_150M_UR50D', 'image_channels': 33}\n", "/content/working_results/\n" ] } ], "source": [ "#@title ### 1.2. Handle the dataset\n", "\n", "import pickle\n", "import numpy as np\n", "import pandas as pd\n", "# import PD_pLMProbXDiff.DataSetPack as DataSetPack\n", "# importlib.reload(DataSetPack)\n", "print('On Problem: ', CKeys['Problem_ID'])\n", "print(this_working_path)\n", "# on the sec_str csv file: SecStr\n", "# try to convey all para via one key\n", "# ====================================================\n", "# add some new keys for dataset\n", "# ====================================================\n", "# for data washing: only for 1st training cycle\n", "if CKeys['Working_Mode']==1 and CKeys['IF_FirstRun']==1:\n", "\n", " if CKeys['Problem_ID']==1:\n", " pass\n", " # print(\"1\")\n", " # # +++++++++++++++++++++++++++++++++++++\n", " # # SecStr as input seq\n", " # DataKeys={}\n", " # DataKeys['data_dir']=PKeys['prefix']+'0_dataprocess_SS/'\n", " # # screening rules\n", " # DataKeys['min_AA_seq_len']=0\n", " # DataKeys['max_AA_seq_len']=128\n", " # # X and Y processing\n", " # DataKeys['Xnormfac']=9.\n", " # DataKeys['ynormfac']=21.\n", " # DataKeys['tokenizer_X']=None\n", " # DataKeys['tokenizer_y']=None\n", " # # + for AA embending using ESM\n", " # DataKeys['ESM-2_Model']='esm2_t33_650M_UR50D'\n", " # # deliver\n", " # DataKeys['batch_size']=256\n", " # DataKeys['batch_size']=200\n", " # DataKeys['testset_ratio']=0.1\n", " # DataKeys['maxdata']=99999999999999999\n", " # # add the folder for Data part\n", " # UtilityPack.create_path(DataKeys['data_dir'])\n", "\n", " elif CKeys['Problem_ID']==2:\n", " pass\n", " print(\"2\")\n", "# # ++++++++++++++++++++++++++++++++++++++\n", "# # MD record as the input seq\n", "# #\n", "# # try to convey all para via one key\n", "# DataKeys={}\n", "# # ======================================\n", "# # keys for \"screen_dataset_MD\"\n", "# DataKeys['data_dir']=PKeys['prefix']+'0_dataprocess_MD/'\n", "# # add the folder\n", "# UtilityPack.create_path(DataKeys['data_dir'])\n", "\n", "# # screening rules\n", "# DataKeys['min_AA_seq_len']=0\n", "# DataKeys['max_AA_seq_len']=64\n", "# DataKeys['max_Force_cap']=1000\n", "# # special ones\n", "# # change text arr into np arr\n", "# DataKeys['arr_key']=[\n", "# 'posi_data','pull_data','forc_data',\n", "# 'gap_data','normalized_gap_data',\n", "# 'pull_gap_data', 'normalized_pull_gap_data',\n", "# 'sample_NormPullGap_data','sample_FORCEpN_data']\n", "\n", "# df_raw, protein_df = DataSetPack.screen_dataset_MD(\n", "# file_path=MD_smo_csv_file,\n", "# PKeys=DataKeys, # to be updated\n", "# CKeys=CKeys,\n", "# )\n", "\n", "# # save the dataframe\n", "# pd.to_pickle(protein_df, DataKeys['data_dir']+'protein_df.pk')\n", "# pd.to_pickle(df_raw, DataKeys['data_dir']+'df_raw.pk')\n", "\n", "# # ======================================\n", "# # keys for 2nd function\n", "# DataKeys['X_Key']='sample_FORCEpN_data' # or 'Max_Smo_Force'\n", "# #\n", "# DataKeys['tokenizer_X']=None # will not be used\n", "# DataKeys['tokenizer_y']=None # to be created\n", "# DataKeys['Xnormfac'] = np.max(protein_df['Max_Smo_Force'])\n", "# print('Normalization factor for force: ', DataKeys['Xnormfac'])\n", "# DataKeys['ynormfac']=21. # old force diffusion model 22.\n", "# #\n", "# DataKeys['batch_size']=256\n", "# DataKeys['testset_ratio']=0.15\n", "# DataKeys['maxdata']=99999999991000\n", "\n", " elif CKeys['Problem_ID']==3:\n", " pass\n", " # print(\"3\")\n", " # # +++++++++++++++++++++++++++++++++++++\n", " # # SecStr as input seq\n", " # DataKeys={}\n", " # DataKeys['data_dir']=PKeys['prefix']+'0_dataprocess_SS_ModelA/'\n", " # # screening rules\n", " # DataKeys['min_AA_seq_len']=0\n", " # DataKeys['max_AA_seq_len']=64 # 128\n", " # DataKeys['max_text_len']=8\n", " # # X and Y processing\n", " # DataKeys['Xnormfac']=1.\n", " # DataKeys['ynormfac']=22. # 21.\n", " # DataKeys['tokenizer_X']=None\n", " # DataKeys['tokenizer_y']=None\n", " # # deliver\n", " # DataKeys['batch_size']=512\n", " # # for debug purpose\n", " # # DataKeys['batch_size']=1\n", " # DataKeys['testset_ratio']= 0.1\n", " # DataKeys['maxdata']=99999999999999999\n", " # # add the folder for Data part\n", " # UtilityPack.create_path(DataKeys['data_dir'])\n", "\n", " elif CKeys['Problem_ID']==4:\n", " pass\n", "\n", "# print(\"4: input text condition, output sequence...\")\n", "# # ++++++++++++++++++++++++++++++++++++++\n", "# # MD record as the input seq\n", "# #\n", "# # try to convey all para via one key\n", "# DataKeys={}\n", "# # ======================================\n", "# # keys for \"screen_dataset_MD\"\n", "# DataKeys['data_dir']=PKeys['prefix']+'0_dataprocess_MD/'\n", "# # add the folder\n", "# UtilityPack.create_path(DataKeys['data_dir'])\n", "\n", "# # screening rules\n", "# DataKeys['min_AA_seq_len']=0\n", "# DataKeys['max_AA_seq_len']=64\n", "# DataKeys['max_text_len']=2\n", "# DataKeys['max_Force_cap']=1000\n", "# # special ones\n", "# # change text arr into np arr\n", "# DataKeys['arr_key']=[\n", "# 'posi_data','pull_data','forc_data',\n", "# 'gap_data','normalized_gap_data',\n", "# 'pull_gap_data', 'normalized_pull_gap_data',\n", "# 'sample_NormPullGap_data','sample_FORCEpN_data']\n", "\n", "# df_raw, protein_df = DataSetPack.screen_dataset_MD(\n", "# file_path=MD_smo_csv_file,\n", "# PKeys=DataKeys, # to be updated\n", "# CKeys=CKeys,\n", "# )\n", "\n", "# # save the dataframe\n", "# pd.to_pickle(protein_df, DataKeys['data_dir']+'protein_df.pk')\n", "# pd.to_pickle(df_raw, DataKeys['data_dir']+'df_raw.pk')\n", "\n", "# # ======================================\n", "# # keys for 2nd function\n", "# DataKeys['X_Key']=['Max_Smo_Force','Int_Smo_ForcPull'] # 'sample_FORCEpN_data' # or 'Max_Smo_Force'\n", "# #\n", "# DataKeys['tokenizer_X']=None # will not be used\n", "# DataKeys['tokenizer_y']=None # to be created\n", "# #\n", "# print('Normalization factor for force: ',\n", "# np.max(protein_df['Max_Smo_Force']))\n", "# print('Normalization factor for toughness: ',\n", "# np.max(protein_df['Int_Smo_ForcPull']))\n", "# #\n", "# DataKeys['Xnormfac'] = np.array([\n", "# np.max(protein_df['Max_Smo_Force']),\n", "# np.max(protein_df['Int_Smo_ForcPull'])\n", "# ])\n", "# #\n", "# DataKeys['ynormfac']=21. # old force diffusion model 22.\n", "# #\n", "# DataKeys['batch_size']=256\n", "# DataKeys['testset_ratio']=0.15\n", "# DataKeys['maxdata']=99999999991000\n", "\n", " # /////////////////////////////////////////////////////////////\n", " # try embedding\n", " # \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n", " elif CKeys['Problem_ID']==5:\n", " pass\n", "\n", "# print(\"5\")\n", "# # +++++++++++++++++++++++++++++++++++++\n", "# # SecStr as input seq\n", "# DataKeys={}\n", "# DataKeys['data_dir']=PKeys['prefix']+'0_dataprocess_SS/'\n", "# # screening rules\n", "# DataKeys['min_AA_seq_len']=0\n", "# DataKeys['max_AA_seq_len']=128\n", "# # X and Y processing\n", "# DataKeys['Xnormfac']=9.\n", "# DataKeys['ynormfac']=1 # for ESM # 21.\n", "# DataKeys['tokenizer_X']=None\n", "# DataKeys['tokenizer_y']=None\n", "# # + for AA embending using ESM\n", "# DataKeys['ESM-2_Model']='esm2_t33_650M_UR50D'\n", "# # add for embedding space\n", "# DataKeys['image_channels']=1280\n", "# # deliver\n", "# DataKeys['batch_size']=256\n", "# DataKeys['batch_size']=256 # 0 # 200\n", "# DataKeys['testset_ratio']=CKeys['testratio'] # 0.1\n", "# DataKeys['maxdata']=99999999999999999\n", "\n", "# # add the folder for Data part\n", "# UtilityPack.create_path(DataKeys['data_dir'])\n", " #\n", " elif CKeys['Problem_ID']==6:\n", " print(\"6, input MD ForcePath, output AA sequence\")\n", " # ++++++++++++++++++++++++++++++++++++++\n", " # MD record as the tokenized input seq\n", " #\n", " # try to convey all para via one key\n", " DataKeys={}\n", " # ======================================\n", " # keys for \"screen_dataset_MD\"\n", " DataKeys['data_dir']=PKeys['prefix']+'0_dataprocess_MD/'\n", " # add the folder\n", " UtilityPack.create_path(DataKeys['data_dir'])\n", "\n", " # screening rules\n", " DataKeys['min_AA_seq_len']=0\n", " # DataKeys['max_AA_seq_len']=64\n", " DataKeys['max_AA_seq_len']=128\n", " DataKeys['max_Force_cap']=1000\n", "# # ---------------------------------------\n", "# # special ones\n", "# # change text arr into np arr\n", "# DataKeys['arr_key']=[\n", "# 'posi_data','pull_data','forc_data',\n", "# 'gap_data','normalized_gap_data',\n", "# 'pull_gap_data', 'normalized_pull_gap_data',\n", "# 'sample_NormPullGap_data','sample_FORCEpN_data']\n", "\n", "# df_raw, protein_df = DataSetPack.screen_dataset_MD(\n", "# csv_file=MD_smo_csv_file,\n", "# pk_file=None,\n", "# PKeys=DataKeys, # to be updated\n", "# CKeys=CKeys,\n", "# )\n", " # ++++++++++++++++++++++++++++++++++++++\n", " df_raw, protein_df = DataSetPack.screen_dataset_MD(\n", " csv_file=None,\n", " pk_file=MD_smo_pk_file,\n", " PKeys=DataKeys, # to be updated\n", " CKeys=CKeys,\n", " )\n", "\n", " # save the dataframe\n", " pd.to_pickle(protein_df, DataKeys['data_dir']+'protein_df.pk')\n", " pd.to_pickle(df_raw, DataKeys['data_dir']+'df_raw.pk')\n", "\n", " # ======================================\n", " # keys for 2nd function\n", " DataKeys['X_Key']='sample_FORCEpN_data' # or 'Max_Smo_Force'\n", " #\n", " DataKeys['tokenizer_X']=None # will not be used\n", " DataKeys['tokenizer_y']=None # to be created\n", " # think about this: update this one if necessary\n", " # DataKeys['Xnormfac'] = np.max(protein_df['Max_Smo_Force'])\n", " DataKeys['Xnormfac'] = 750.\n", "\n", " print('Normalization factor for force: ', DataKeys['Xnormfac'])\n", " DataKeys['ynormfac']=1. # not used as esm is used # 21. # old force diffusion model 22.\n", " #\n", " DataKeys['batch_size']=256\n", " DataKeys['testset_ratio']=0.15\n", " DataKeys['maxdata']=99999999991000\n", " # ++ for pLM\n", " # for AA embending using ESM\n", " DataKeys['ESM-2_Model']='esm2_t33_650M_UR50D'\n", " # add for embedding space\n", " DataKeys['image_channels']=1280\n", " #\n", " DataKeys['ESM-2_Model']='esm2_t12_35M_UR50D'\n", " DataKeys['image_channels']=480\n", "\n", "\n", " elif CKeys['Problem_ID']==7:\n", " pass\n", " # print(\"7\")\n", " # # +++++++++++++++++++++++++++++++++++++\n", " # # SecStr text as input seq\n", " # DataKeys={}\n", " # DataKeys['data_dir']=PKeys['prefix']+'0_dataprocess_SS_ModelA/'\n", " # # screening rules\n", " # DataKeys['min_AA_seq_len']=0\n", " # DataKeys['max_AA_seq_len']=64 # 128\n", " # DataKeys['max_text_len']=8\n", " # # X and Y processing\n", " # DataKeys['Xnormfac']=1.\n", " # DataKeys['ynormfac']=1. # for ESM # 21. 22. # 21.\n", " # DataKeys['tokenizer_X']=None\n", " # DataKeys['tokenizer_y']=None\n", " # # deliver\n", " # DataKeys['batch_size']=512\n", " # # for debug purpose\n", " # # DataKeys['batch_size']=1\n", " # DataKeys['testset_ratio']= CKeys['testratio'] # 0.1\n", " # DataKeys['maxdata']=99999999999999999\n", " # # + for AA embending using ESM\n", " # DataKeys['ESM-2_Model']='esm2_t33_650M_UR50D'\n", " # # add for embedding space\n", " # DataKeys['image_channels']=1280\n", " # #\n", " # # add the folder for Data part\n", " # UtilityPack.create_path(DataKeys['data_dir'])\n", "\n", " elif CKeys['Problem_ID']==8:\n", " #\n", " print(\"8: input text condition, output sequence...\")\n", " # ++++++++++++++++++++++++++++++++++++++\n", " # MD record as the input seq\n", " #\n", " # try to convey all para via one key\n", " DataKeys={}\n", " # ======================================\n", " # keys for \"screen_dataset_MD\"\n", " DataKeys['data_dir']=PKeys['prefix']+'0_dataprocess_MD/'\n", " # add the folder\n", " UtilityPack.create_path(DataKeys['data_dir'])\n", "\n", " # screening rules\n", " DataKeys['min_AA_seq_len']=0\n", " DataKeys['max_AA_seq_len']=64\n", " DataKeys['max_AA_seq_len']=128\n", " DataKeys['max_text_len']=2\n", " DataKeys['max_Force_cap']=1000\n", "# # ---------------------------------------------------------\n", "# # special ones\n", "# # change text arr into np arr\n", "# DataKeys['arr_key']=[\n", "# 'posi_data','pull_data','forc_data',\n", "# 'gap_data','normalized_gap_data',\n", "# 'pull_gap_data', 'normalized_pull_gap_data',\n", "# 'sample_NormPullGap_data','sample_FORCEpN_data']\n", "\n", "# df_raw, protein_df = DataSetPack.screen_dataset_MD(\n", "# # # --\n", "# # file_path=MD_smo_csv_file,\n", "# # ++\n", "# csv_file=MD_smo_csv_file,\n", "# pk_file=None,\n", "# PKeys=DataKeys, # to be updated\n", "# CKeys=CKeys,\n", "# )\n", " # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n", " df_raw, protein_df = DataSetPack.screen_dataset_MD(\n", " csv_file=None,\n", " pk_file=MD_smo_pk_file,\n", " PKeys=DataKeys, # to be updated\n", " CKeys=CKeys,\n", " )\n", "\n", " # save the dataframe\n", " pd.to_pickle(protein_df, DataKeys['data_dir']+'protein_df.pk')\n", " pd.to_pickle(df_raw, DataKeys['data_dir']+'df_raw.pk')\n", "\n", " # ======================================\n", " # keys for 2nd function\n", " DataKeys['X_Key']=['Max_Smo_Force','Int_Smo_ForcPull'] # 'sample_FORCEpN_data' # or 'Max_Smo_Force'\n", " #\n", " DataKeys['tokenizer_X']=None # will not be used\n", " DataKeys['tokenizer_y']=None # will not be used # to be created\n", " #\n", " print('Normalization factor for force: ',\n", " np.max(protein_df['Max_Smo_Force']))\n", " print('Normalization factor for toughness: ',\n", " np.max(protein_df['Int_Smo_ForcPull']))\n", " #\n", " DataKeys['Xnormfac'] = np.array([\n", " np.max(protein_df['Max_Smo_Force']),\n", " np.max(protein_df['Int_Smo_ForcPull'])\n", " ])\n", " #\n", " DataKeys['ynormfac']=1.0 # not used in esm # 21. # old force diffusion model 22.\n", " #\n", " DataKeys['batch_size']=256\n", " DataKeys['testset_ratio']=CKeys['testratio'] # 0.15\n", " DataKeys['maxdata']=99999999991000\n", " # + for AA embending using ESM\n", " DataKeys['ESM-2_Model']='esm2_t33_650M_UR50D'\n", " # add for embedding space\n", " DataKeys['image_channels']=1280\n", "\n", " elif CKeys['Problem_ID']==11:\n", " # copied from Problem_ID=6\n", " #\n", " print(\"11, input MD ForcePath, output AA sequence\")\n", " # ++++++++++++++++++++++++++++++++++++++\n", " # MD record as the tokenized input seq\n", " #\n", " # try to convey all para via one key\n", " DataKeys={}\n", " # ======================================\n", " # keys for \"screen_dataset_MD\"\n", " DataKeys['data_dir']=PKeys['prefix']+'0_dataprocess_MD/'\n", " # add the folder\n", " UtilityPack.create_path(DataKeys['data_dir'])\n", "\n", " # screening rules\n", " DataKeys['min_AA_seq_len']=0\n", " # DataKeys['max_AA_seq_len']=64\n", " DataKeys['max_AA_seq_len']=128\n", " DataKeys['max_Force_cap']=1000\n", "# # ---------------------------------------\n", "# # special ones\n", "# # change text arr into np arr\n", "# DataKeys['arr_key']=[\n", "# 'posi_data','pull_data','forc_data',\n", "# 'gap_data','normalized_gap_data',\n", "# 'pull_gap_data', 'normalized_pull_gap_data',\n", "# 'sample_NormPullGap_data','sample_FORCEpN_data']\n", "\n", "# df_raw, protein_df = DataSetPack.screen_dataset_MD(\n", "# csv_file=MD_smo_csv_file,\n", "# pk_file=None,\n", "# PKeys=DataKeys, # to be updated\n", "# CKeys=CKeys,\n", "# )\n", " # ++++++++++++++++++++++++++++++++++++++\n", " df_raw, protein_df = DataSetPack.screen_dataset_MD(\n", " csv_file=None,\n", " pk_file=MD_smo_pk_file,\n", " PKeys=DataKeys, # to be updated\n", " CKeys=CKeys,\n", " )\n", "\n", " # save the dataframe\n", " pd.to_pickle(protein_df, DataKeys['data_dir']+'protein_df.pk')\n", " pd.to_pickle(df_raw, DataKeys['data_dir']+'df_raw.pk')\n", "\n", " # ======================================\n", " # keys for 2nd function\n", " DataKeys['X_Key']='sample_FORCEpN_data' # or 'Max_Smo_Force'\n", " #\n", " DataKeys['tokenizer_X']=None # will not be used\n", " DataKeys['tokenizer_y']=None # to be created\n", " # think about this: update this one if necessary\n", " # DataKeys['Xnormfac'] = np.max(protein_df['Max_Smo_Force'])\n", " DataKeys['Xnormfac'] = 750.\n", "\n", " print('Normalization factor for force: ', DataKeys['Xnormfac'])\n", " DataKeys['ynormfac']=1. # not used as esm is used # 21. # old force diffusion model 22.\n", " #\n", " DataKeys['batch_size']=256\n", " DataKeys['testset_ratio']=0.15\n", " DataKeys['maxdata']=99999999991000\n", " # ++ for pLM\n", " # for AA embending using ESM\n", " DataKeys['ESM-2_Model']='esm2_t33_650M_UR50D'\n", " # add for embedding space\n", " # DataKeys['image_channels']=1280\n", " #\n", " # DataKeys['ESM-2_Model']='esm2_t12_35M_UR50D'\n", " # # DataKeys['image_channels']=480\n", " #\n", " # DataKeys['ESM-2_Model']='esm2_t36_3B_UR50D'\n", " # DataKeys['image_channels']=2560\n", " #\n", " DataKeys['ESM-2_Model']='esm2_t30_150M_UR50D'\n", " # DataKeys['image_channels']=640\n", "\n", " # only use the probability part\n", " DataKeys['image_channels']=33\n", "\n", " else:\n", " print('No Problem Type found...')\n", "# else:\n", "# # load back if there is anything generated in the 1st run\n", "# if CKeys['Problem_ID']==2 or CKeys['Problem_ID']==6:\n", "# protein_df = pd.read_pickle(DataKeys['data_dir']+'protein_df.pk')\n", "# df_raw = pd.read_pickle(DataKeys['data_dir']+'df_raw.pk')\n", "print(CKeys)\n", "\n", "\n", "# ====================================================\n", "# convert into datasets\n", "# ====================================================\n", "if CKeys['Working_Mode']==1 and CKeys['IF_FirstRun']==1:\n", " if CKeys['Problem_ID']==1:\n", " pass\n", " # train_loader, \\\n", " # train_loader_noshuffle, \\\n", " # test_loader, \\\n", " # tokenizer_y, tokenizer_X = DataSetPack.load_data_set_SS_InSeqToOuSeq(\n", " # file_path=SS_csv_file,\n", " # PKeys=DataKeys, # to be updated\n", " # CKeys=CKeys,\n", " # )\n", "\n", " elif CKeys['Problem_ID']==2:\n", " pass\n", " # train_loader, train_loader_noshuffle, \\\n", " # test_loader, tokenizer_y, tokenizer_X = DataSetPack.load_data_set_from_df_SMD(\n", " # protein_df,\n", " # PKeys=DataKeys, # to be updated\n", " # CKeys=CKeys,\n", " # )\n", "\n", " elif CKeys['Problem_ID']==3:\n", " pass\n", " # train_loader, train_loader_noshuffle, \\\n", " # test_loader,tokenizer_y, tokenizer_X = DataSetPack.load_data_set_seq2seq_SecStr_ModelA (\n", " # file_path=SS_csv_file, # 'PROTEIN_Mar18_2022_SECSTR_ALL.csv',\n", " # PKeys=DataKeys, # to be updated\n", " # CKeys=CKeys,\n", " # )\n", "\n", " elif CKeys['Problem_ID']==4:\n", " pass\n", " # train_loader, train_loader_noshuffle, \\\n", " # test_loader,tokenizer_y, tokenizer_X = DataSetPack.load_data_set_text2seq_MD_ModelA (\n", " # protein_df,\n", " # PKeys=DataKeys, # to be updated\n", " # CKeys=CKeys,\n", " # )\n", "\n", " # ///////////////////////////////////////////////////////////////\n", " # add embedding cases\n", " # \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n", " elif CKeys['Problem_ID']==5:\n", " pass\n", " # train_loader, \\\n", " # train_loader_noshuffle, \\\n", " # test_loader, \\\n", " # tokenizer_y, \\\n", " # tokenizer_X = DataSetPack.load_data_set_SS_InSeqToOuSeq_pLM(\n", " # file_path=SS_csv_file,\n", " # PKeys=DataKeys, # to be updated\n", " # CKeys=CKeys,\n", " # )\n", " # # this will triger the following downloading\n", " # # Downloading: \"https://dl.fbaipublicfiles.com/fair-esm/models/esm2_t33_650M_UR50D.pt\" to /home/gridsan/bni/.cache/torch/hub/checkpoints/esm2_t33_650M_UR50D.pt\n", " # # excute the following if without internet on the node\n", " # # 1 $ wget https://dl.fbaipublicfiles.com/fair-esm/models/esm2_t33_650M_UR50D.pt -O /home/gridsan/bni/.cache/torch/hub/checkpoints/esm2_t33_650M_UR50D.pt\n", " # # 2 $ wget https://dl.fbaipublicfiles.com/fair-esm/regression/esm2_t33_650M_UR50D-contact-regression.pt -O /home/gridsan/bni/.cache/torch/hub/checkpoints/esm2_t33_650M_UR50D-contact-regression.pt\n", "\n", " # add if needed\n", " elif CKeys['Problem_ID']==6:\n", "\n", " train_loader, \\\n", " train_loader_noshuffle, \\\n", " test_loader, \\\n", " tokenizer_y, \\\n", " tokenizer_X = DataSetPack.load_data_set_from_df_SMD_pLM(\n", " protein_df,\n", " PKeys=DataKeys, # to be updated\n", " CKeys=CKeys,\n", " )\n", "\n", " elif CKeys['Problem_ID']==7:\n", " pass\n", " # train_loader, \\\n", " # train_loader_noshuffle, \\\n", " # test_loader, \\\n", " # tokenizer_y, \\\n", " # tokenizer_X = DataSetPack.load_data_set_seq2seq_SecStr_ModelA_pLM (\n", " # file_path=SS_csv_file, # 'PROTEIN_Mar18_2022_SECSTR_ALL.csv',\n", " # PKeys=DataKeys, # to be updated\n", " # CKeys=CKeys,\n", " # )\n", "\n", " elif CKeys['Problem_ID']==8:\n", "\n", " train_loader, \\\n", " train_loader_noshuffle, \\\n", " test_loader,\\\n", " tokenizer_y, \\\n", " tokenizer_X = DataSetPack.load_data_set_text2seq_MD_ModelA_pLM (\n", " protein_df,\n", " PKeys=DataKeys, # to be updated\n", " CKeys=CKeys,\n", " )\n", "\n", " elif CKeys['Problem_ID']==11:\n", "\n", " train_loader, \\\n", " train_loader_noshuffle, \\\n", " test_loader, \\\n", " tokenizer_y, \\\n", " tokenizer_X = DataSetPack.load_data_set_from_df_SMD_pLM(\n", " protein_df,\n", " PKeys=DataKeys, # to be updated\n", " CKeys=CKeys,\n", " )\n", "\n", " elif CKeys['Problem_ID']==12:\n", " pass\n", "\n", " else:\n", " print('No Problem Type found...')\n", "\n", " print(\"==========================================\")\n", " print(\"Save the datasets ...\")\n", " print(\"==========================================\")\n", " # save the dataset for for the 1st run\n", " data_pack = {}\n", " data_pack['train_loader']=train_loader\n", " data_pack['train_loader_noshuffle']=train_loader_noshuffle\n", " data_pack['test_loader']=test_loader\n", " data_pack['tokenizer_X']=tokenizer_X\n", " data_pack['tokenizer_y']=tokenizer_y\n", " # keys\n", " data_pack['DataKeys']=DataKeys\n", " # data_pack['CKeys']=CKeys\n", " data_pack['PKeys']=PKeys\n", " with open(PKeys['pk_data_pack'], 'wb') as handle:\n", " pickle.dump(data_pack, handle, protocol=pickle.HIGHEST_PROTOCOL)\n", "\n", "else: # work both for training and testing\n", "\n", " print('This is not the first run')\n", " print('Load back in the data packages...')\n", " with open(PKeys['pk_data_pack'], 'rb') as handle:\n", " data_pack = pickle.load(handle)\n", " # deliver the results\n", " train_loader=data_pack['train_loader']\n", " train_loader_noshuffle=data_pack['train_loader_noshuffle']\n", " test_loader=data_pack['test_loader']\n", " tokenizer_X=data_pack['tokenizer_X']\n", " tokenizer_y=data_pack['tokenizer_y']\n", " # keys (create or update)\n", " DataKeys=data_pack['DataKeys']\n", " # ++ for colab, need to update the path part\n", " DataKeys['data_dir']=this_working_path+'0_dataprocess_MD/'\n", " # ++\n", " # CKeys=data_pack['CKeys']\n", " PKeys=data_pack['PKeys']\n", " # ++ for colab, need to update the path part\n", " PKeys['prefix']=this_working_path\n", " PKeys['pk_data_pack']=this_working_path+'data_pack.pickle'\n", " PKeys['pk_model_pack']=this_working_path+'model_pack.pickle'\n", " # ++\n", " # add some for specific problem\n", " if CKeys['Problem_ID']==2 or CKeys['Problem_ID']==6 \\\n", " or CKeys['Problem_ID']==11:\n", " pass\n", " # skip\n", " # protein_df = pd.read_pickle(DataKeys['data_dir']+'protein_df.pk')\n", " # df_raw = pd.read_pickle(DataKeys['data_dir']+'df_raw.pk')\n", " print('Done.')\n", "\n", "\n", "print(DataKeys)\n", "print(this_working_path)" ] }, { "cell_type": "code", "execution_count": 9, "id": "TwXmEpWhjWcI", "metadata": { "cellView": "form", "colab": { "base_uri": "https://localhost:8080/" }, "id": "TwXmEpWhjWcI", "outputId": "16b3a0af-a41e-4157-c384-ce6ab1a76770" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "tokenizer_X: None\n", "tokenizer_y: None\n", "Xnormfac: 750.0\n", "ynormfac: 1.0\n" ] } ], "source": [ "#@title ### 1.2.1 Prepare for de novo conditions\n", "\n", "# add a block to handle the De Novo force shape\n", "# idea: pick to to mix them\n", "# if CKeys['Working_Mode']==1 and CKeys['IF_FirstRun']==1 and CKeys['Problem_ID']==2:\n", "if CKeys['Working_Mode']==1 and CKeys['Problem_ID']==2:\n", " print( protein_df.keys() )\n", " # pick the Max_Smo_Force max and min\n", " pick_id_0 = protein_df['Max_Smo_Force'].idxmax()\n", " pick_id_1 = protein_df['Max_Smo_Force'].idxmin()\n", " print(protein_df['Max_Smo_Force'].idxmax())\n", " print(protein_df['Max_Smo_Force'].idxmin())\n", "\n", " fig = plt.figure(figsize=(24,16),dpi=200)\n", " fig, ax0 = plt.subplots()\n", " for ii in [pick_id_0, pick_id_1]:\n", " ax0.plot(\n", " protein_df['sample_NormPullGap_data'][ii],\n", " protein_df['sample_FORCE_data'][ii],\n", " alpha=0.1,\n", " # color=\"green\",label='simplified data',\n", " # linestyle='None',marker='^'\n", " )\n", " ax0.scatter(\n", " protein_df['NPullGap_for_MaxSmoF'][ii],\n", " protein_df['Max_Smo_Force'][ii],\n", " )\n", " plt.xlabel('Normalized distance btw pulling ends')\n", " plt.ylabel('Force (pF)')\n", " outname = DataKeys['data_dir']+'CSV_6_PickMaxMinF_SMD_sim_Dist.jpg'\n", " if CKeys['SlientRun'] ==1:\n", " plt.savefig(outname, dpi=200)\n", " else:\n", " plt.show()\n", " plt.close()\n", "\n", "elif CKeys['Working_Mode']==1 and CKeys['Problem_ID']==5:\n", " #\n", " pass\n", " #\n", "elif CKeys['Working_Mode']==1 and CKeys['Problem_ID']==6:\n", " print( protein_df.keys() )\n", " # pick the Max_Smo_Force max and min\n", " pick_id_0 = protein_df['Max_Smo_Force'].idxmax()\n", " pick_id_1 = protein_df['Max_Smo_Force'].idxmin()\n", " # print(protein_df['Max_Smo_Force'].idxmax())\n", " # print(protein_df['Max_Smo_Force'].idxmin())\n", " print(f\"Max Peak Force id: {pick_id_0}\")\n", " print(f\"Min Peak Force id: {pick_id_1}\")\n", "\n", " fig = plt.figure(figsize=(24,16),dpi=200)\n", " fig, ax0 = plt.subplots()\n", " for ii in [pick_id_0, pick_id_1]:\n", " ax0.plot(\n", " protein_df['sample_NormPullGap_data'][ii],\n", " protein_df['sample_FORCE_data'][ii],\n", " alpha=0.1,\n", " # color=\"green\",label='simplified data',\n", " # linestyle='None',marker='^'\n", " )\n", " ax0.scatter(\n", " protein_df['NPullGap_for_MaxSmoF'][ii],\n", " protein_df['Max_Smo_Force'][ii],\n", " )\n", " plt.xlabel('Normalized distance btw pulling ends')\n", " plt.ylabel('Force (pF)')\n", " outname = DataKeys['data_dir']+'CSV_6_PickMaxMinF_SMD_sim_Dist.jpg'\n", " if CKeys['SlientRun'] ==1:\n", " plt.savefig(outname, dpi=200)\n", " else:\n", " plt.show()\n", " plt.close()\n", "\n", "elif CKeys['Working_Mode']==1 and CKeys['Problem_ID']==11:\n", " # skipped\n", " pass\n", " # print( protein_df.keys() )\n", " # # pick the Max_Smo_Force max and min\n", " # pick_id_0 = protein_df['Max_Smo_Force'].idxmax()\n", " # pick_id_1 = protein_df['Max_Smo_Force'].idxmin()\n", " # # print(protein_df['Max_Smo_Force'].idxmax())\n", " # # print(protein_df['Max_Smo_Force'].idxmin())\n", " # print(f\"Max Peak Force id: {pick_id_0}\")\n", " # print(f\"Min Peak Force id: {pick_id_1}\")\n", "\n", " # fig = plt.figure(figsize=(24,16),dpi=200)\n", " # fig, ax0 = plt.subplots()\n", " # for ii in [pick_id_0, pick_id_1]:\n", " # ax0.plot(\n", " # protein_df['sample_NormPullGap_data'][ii],\n", " # protein_df['sample_FORCE_data'][ii],\n", " # alpha=0.1,\n", " # # color=\"green\",label='simplified data',\n", " # # linestyle='None',marker='^'\n", " # )\n", " # ax0.scatter(\n", " # protein_df['NPullGap_for_MaxSmoF'][ii],\n", " # protein_df['Max_Smo_Force'][ii],\n", " # )\n", " # plt.xlabel('Normalized distance btw pulling ends')\n", " # plt.ylabel('Force (pF)')\n", " # outname = DataKeys['data_dir']+'CSV_6_PickMaxMinF_SMD_sim_Dist.jpg'\n", " # if CKeys['SlientRun'] ==1:\n", " # plt.savefig(outname, dpi=200)\n", " # else:\n", " # plt.show()\n", " # plt.close()\n", "# a quick check\n", "print('tokenizer_X: ', tokenizer_X)\n", "print('tokenizer_y: ', tokenizer_y)\n", "print('Xnormfac: ', DataKeys['Xnormfac'])\n", "print('ynormfac: ', DataKeys['ynormfac'])\n", "\n", "if CKeys['Debug']==1:\n", "\n", " if CKeys['Debug_DataPack']==1:\n", " # uppack to check\n", " print('Len of train loader:', len(train_loader))\n", " print('Len of test loader:', len(test_loader))\n", " ii=-1\n", " # for item in train_loader:\n", " for item in test_loader:\n", " ii += 1\n", " if ii<1:\n", " print('Len of 1st batch item: ', len(item))\n", " this_item = item\n", " else:\n", " pass\n", "\n", " # on mini-batch\n", " print('Batch size: ', DataKeys['batch_size'])\n", " print('Seq len: ', DataKeys['max_AA_seq_len'])\n", " print('X.dim: ', this_item[0].shape) # Condition: (Batch, Condi)\n", " print('y_data.dim: ', this_item[1].shape) # AASequenc: (Batch, AACode)\n", " #\n", " # # print(this_item[0][0,:]*DataKeys['Xnormfac'])\n", " # # print(this_item[1][0,:]*DataKeys['ynormfac'])\n", " print(this_item[0][0,:])\n", " # print(torch.FloatTensor(DataKeys['Xnormfac']))\n", " # print(this_item[0][0,:]*torch.FloatTensor(DataKeys['Xnormfac']))\n", "\n", "if CKeys['Debug']==1:\n", "\n", " if CKeys['Debug_DataPack']==1:\n", "\n", " if CKeys['Problem_ID']==8 or CKeys['Problem_ID']==7:\n", "\n", " print (this_item[0][0,:])\n", " print (this_item[0][0,:]*DataKeys['Xnormfac'])" ] }, { "cell_type": "code", "execution_count": 10, "id": "4lE_XT0bjtAV", "metadata": { "cellView": "form", "colab": { "base_uri": "https://localhost:8080/" }, "id": "4lE_XT0bjtAV", "outputId": "c6f59197-a917-4549-aa51-bf72739defd1" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "==================================================\n", "load in the MODEL key from the previous storage\n", "==================================================\n", "This is not the first run\n", "Load back in the model packages...\n", "Done.\n", "128\n", "33\n", "33\n", "33\n", "{\n", " \"dim\": 256,\n", " \"text_embed_dim\": 544,\n", " \"num_resnet_blocks\": 1,\n", " \"cond_dim\": 512,\n", " \"num_image_tokens\": null,\n", " \"num_time_tokens\": null,\n", " \"learned_sinu_pos_emb_dim\": null,\n", " \"out_dim\": null,\n", " \"dim_mults\": [\n", " 1,\n", " 2,\n", " 4,\n", " 8\n", " ],\n", " \"cond_images_channels\": 33,\n", " \"channels\": 33,\n", " \"channels_out\": 33,\n", " \"attn_dim_head\": 64,\n", " \"attn_heads\": 8,\n", " \"ff_mult\": 2.0,\n", " \"lowres_cond\": false,\n", " \"layer_attns\": [\n", " false,\n", " true,\n", " true,\n", " false\n", " ],\n", " \"layer_attns_depth\": 1,\n", " \"layer_attns_add_text_cond\": true,\n", " \"attend_at_middle\": true,\n", " \"layer_cross_attns\": [\n", " false,\n", " true,\n", " true,\n", " false\n", " ],\n", " \"use_linear_attn\": false,\n", " \"use_linear_cross_attn\": false,\n", " \"cond_on_text\": true,\n", " \"max_text_len\": 128,\n", " \"init_dim\": null,\n", " \"resnet_groups\": 8,\n", " \"init_conv_kernel_size\": 7,\n", " \"init_cross_embed\": false,\n", " \"init_cross_embed_kernel_sizes\": [\n", " 3,\n", " 7,\n", " 15\n", " ],\n", " \"cross_embed_downsample\": false,\n", " \"cross_embed_downsample_kernel_sizes\": [\n", " 2,\n", " 4\n", " ],\n", " \"attn_pool_text\": true,\n", " \"attn_pool_num_latents\": 32,\n", " \"dropout\": 0.0,\n", " \"memory_efficient\": false,\n", " \"init_conv_to_final_conv_residual\": false,\n", " \"use_global_context_attn\": true,\n", " \"scale_skip_connection\": true,\n", " \"final_resnet_block\": true,\n", " \"final_conv_kernel_size\": 3,\n", " \"cosine_sim_attn\": true,\n", " \"self_cond\": false,\n", " \"combine_upsample_fmaps\": true,\n", " \"pixel_shuffle_upsample\": false,\n", " \"beginning_and_final_conv_present\": null\n", "}\n", "{'timesteps': (96,), 'dim': 256, 'pred_dim': 33, 'loss_type': 0, 'elucidated': True, 'padding_idx': 0, 'cond_dim': None, 'text_embed_dim': None, 'input_tokens': None, 'sequence_embed': None, 'embed_dim_position': None, 'max_text_len': 128, 'cond_images_channels': 33, 'max_length': 128, 'device': device(type='cuda', index=0)}\n", "33\n", "33\n", "33\n", "33\n", "33\n", "\n", "256\n", "256\n", "--------------------------------------------\n", "On OneD_Unet...\n", "--------------------------------------------\n", "256 33\n", "Working unet part model: \n", "Total parameters: 264376242 trainable parameters: 264376242\n", "--------------------------------------------\n", "On whole model...\n", "--------------------------------------------\n", "Model B: Generative protein diffusion model, residue-based\n", "Using condition as the initial sequence\n", "Use conditioning image during training....\n", "Loss type: 0\n", "Channels in=33, channels out=33\n", "Test on cast_model_parameters...\n", "False\n", "False\n", "None\n", "33\n", "33\n", "256 33\n", "cpu\n", "Total working model: \n", "Total parameters: 262527570 trainable parameters: 262527570\n", "Recasted unet inside the tot one only: \n", "Total parameters: 262521266 trainable parameters: 262521266\n", "--------------------------------------------\n", "On trainer...\n", "--------------------------------------------\n" ] } ], "source": [ "#@title ### 1.3 Model building\n", "\n", "# import PD_pLMProbXDiff.ModelPack as ModelPack\n", "# #\n", "# import PD_pLMProbXDiff.TrainerPack as TrainerPack\n", "# #\n", "# importlib.reload(ModelPack)\n", "# importlib.reload(TrainerPack)\n", "\n", "if CKeys['Working_Mode']==1 and CKeys['IF_FirstRun']==1:\n", " # this is a trining mode\n", " if CKeys['Problem_ID']==1:\n", " pass\n", "# # this is 1st run....\n", "# # +++++++++++++++++++++++++++++++++++++\n", "# # SecStr as input seq\n", "# ModelKeys={}\n", "# # storage\n", "# ModelKeys['model_dir']=PKey['prefix']+'1_model_SS/'\n", "# # create the folder\n", "# print(\"Creating the model dir...\")\n", "# UtilityPack.create_path(ModelKeys['model_dir'])\n", "# # secondary folders\n", "# ModelKeys['model_dir_sample']=ModelKeys['model_dir']+'0_mid_sample/'\n", "# UtilityPack.create_path(ModelKeys['model_dir_sample'])\n", "# ModelKeys['model_dir_model']=ModelKeys['model_dir']+'1_store_model/'\n", "# UtilityPack.create_path(ModelKeys['model_dir_model'])\n", "\n", "# # for UNet\n", "# ModelKeys['dim']=256 # dim for UNet\n", "# ModelKeys['text_embed_dim'] = 512\n", "# ModelKeys['embed_dim_position']=32\n", "# ModelKeys['text_embed_dim']=ModelKeys['text_embed_dim']+ModelKeys['embed_dim_position']\n", "# ModelKeys['cond_dim'] = 512\n", "# ModelKeys['cond_images_channels']=1\n", "# ModelKeys['max_text_len']=DataKeys['max_AA_seq_len'] # this is about text condi\n", "# # for Imagen\n", "# ModelKeys['pred_dim']=1 # for sequence, =1\n", "# ModelKeys['diff_timesteps']=(96,)\n", "# ModelKeys['loss_type']=0 # MSE\n", "# ModelKeys['elucidated']=True #\n", "# ModelKeys['padding_idx']=0\n", "# ModelKeys['max_length']=DataKeys['max_AA_seq_len'] # max seq len\n", "# ModelKeys['device']=device\n", "# #\n", "# # buckets for Model building\n", "# ModelKeys['UNet']={}\n", "# ModelKeys['Imagen']={}\n", "# # ++++++++++++++++++++++++++++++++++++++++++++++++++\n", "# write_PK_UNet=dict()\n", "# write_PK_UNet['dim']=ModelKeys['dim'] # 256\n", "# write_PK_UNet['text_embed_dim']=ModelKeys['text_embed_dim'] # 512+32\n", "# write_PK_UNet['num_resnet_blocks']=1\n", "# write_PK_UNet['cond_dim']=ModelKeys['cond_dim'] #this is where text embeddings are projected to...\n", "# # write_PK_UNet['num_image_tokens']=None # using the default value\n", "# # write_PK_UNet['num_time_tokens']=None # using the default\n", "# # write_PK_UNet['learned_sinu_pos_emb_dim']=None\n", "# # write_PK_UNet['out_dim']=None\n", "# write_PK_UNet['dim_mults']=(1, 2, 4, 8)\n", "\n", "# write_PK_UNet['cond_images_channels']=ModelKeys['cond_images_channels']\n", "# write_PK_UNet['channels']=1\n", "# write_PK_UNet['channels_out']=1\n", "\n", "# write_PK_UNet['attn_dim_head']=64\n", "# write_PK_UNet['attn_heads']=8\n", "# write_PK_UNet['ff_mult']=2.\n", "# write_PK_UNet['lowres_cond']=False # for cascading diffusion - https://cascaded-diffusion.github.io/\n", "\n", "# write_PK_UNet['layer_attns']=(False, True, True, False)\n", "# write_PK_UNet['layer_attns_depth']=1\n", "# write_PK_UNet['layer_attns_add_text_cond']=True # whether to condition the self-attention blocks with the text embeddings, as described in Appendix D.3.1\n", "# write_PK_UNet['attend_at_middle']=True # whether to have a layer of attention at the bottleneck (can turn off for higher resolution in cascading DDPM, before bringing in efficient attention)\n", "# write_PK_UNet['layer_cross_attns']=(False, True, True, False)\n", "# write_PK_UNet['use_linear_attn']=False\n", "# write_PK_UNet['use_linear_cross_attn']=False\n", "\n", "# write_PK_UNet['cond_on_text']=True\n", "# write_PK_UNet['max_text_len']=ModelKeys['max_text_len'] # need to check this one\n", "# # ModelKeys['UNet']['init_dim']=None\n", "# write_PK_UNet['resnet_groups']=8\n", "# write_PK_UNet['init_conv_kernel_size']=7 # kernel size of initial conv, if not using cross embed\n", "# write_PK_UNet['init_cross_embed']=False #TODO - fix ouput size calcs for conv1d\n", "# write_PK_UNet['init_cross_embed_kernel_sizes']=(3, 7, 15)\n", "# write_PK_UNet['cross_embed_downsample']=False\n", "# write_PK_UNet['cross_embed_downsample_kernel_sizes']=(2, 4)\n", "\n", "# write_PK_UNet['attn_pool_text']=True\n", "# write_PK_UNet['attn_pool_num_latents']=32 #perceiver model latents\n", "# write_PK_UNet['dropout']=0.\n", "# write_PK_UNet['memory_efficient']=False\n", "# write_PK_UNet['init_conv_to_final_conv_residual']=False\n", "\n", "# write_PK_UNet['use_global_context_attn']=True\n", "# write_PK_UNet['scale_skip_connection']=True\n", "# write_PK_UNet['final_resnet_block']=True\n", "# write_PK_UNet['final_conv_kernel_size']=3\n", "\n", "# write_PK_UNet['cosine_sim_attn']=True\n", "# write_PK_UNet['self_cond']=False\n", "# write_PK_UNet['combine_upsample_fmaps']=True # combine feature maps from all upsample blocks, used in unet squared successfully\n", "# write_PK_UNet['pixel_shuffle_upsample']=False # may address checkboard artifacts\n", "# # write_PK_UNet['beginning_and_final_conv_present']=None # use default\n", "# ModelKeys['UNet']=UtilityPack.prepare_UNet_keys(write_PK_UNet)\n", "# # +++++++++++++++++++++++++++++++++++++++++++++++++++++\n", "# # beyond UNet, for Whole model, all keys\n", "# # \"None\" means defult value on function definition\n", "# write_PK_Imagen=dict()\n", "\n", "# write_PK_Imagen['timesteps']=ModelKeys['diff_timesteps']\n", "# write_PK_Imagen['dim']=ModelKeys['dim']\n", "# write_PK_Imagen['pred_dim']=ModelKeys['pred_dim']\n", "# write_PK_Imagen['loss_type']=ModelKeys['loss_type'] # 0 # MSE\n", "# write_PK_Imagen['elucidated']=ModelKeys['elucidated'] # True\n", "# write_PK_Imagen['padding_idx']=ModelKeys['padding_idx'] # 0 # need to check\n", "# # write_PK_Imagen['cond_dim']=None # use default\n", "# # write_PK_Imagen['text_embed_dim']=None\n", "# # write_PK_Imagen['input_tokens']=None\n", "# # write_PK_Imagen['sequence_embed']=None\n", "# # write_PK_Imagen['embed_dim_position']=None\n", "# write_PK_Imagen['max_text_len']=ModelKeys['max_text_len']\n", "# write_PK_Imagen['cond_images_channels']=ModelKeys['pred_dim']\n", "# write_PK_Imagen['max_length']=ModelKeys['max_length']\n", "# write_PK_Imagen['device']=ModelKeys['device']\n", "\n", "# # extend it to a full key\n", "# ModelKeys['Imagen']=UtilityPack.prepare_ModelB_keys(write_PK_Imagen)\n", "\n", " elif CKeys['Problem_ID']==2:\n", " pass\n", "# # this is 1st run....\n", "# # +++++++++++++++++++++++++++++++++++++\n", "# # SecStr as input seq\n", "# ModelKeys={}\n", "# # storage\n", "# ModelKeys['model_dir']=PKeys['prefix']+'1_model_SS/'\n", "# # create the folder\n", "# print(\"Creating the model dir...\")\n", "# UtilityPack.create_path(ModelKeys['model_dir'])\n", "# # secondary folders\n", "# ModelKeys['model_dir_sample']=ModelKeys['model_dir']+'0_mid_sample/'\n", "# UtilityPack.create_path(ModelKeys['model_dir_sample'])\n", "# ModelKeys['model_dir_model']=ModelKeys['model_dir']+'1_store_model/'\n", "# UtilityPack.create_path(ModelKeys['model_dir_model'])\n", "\n", "# # for UNet\n", "# ModelKeys['dim']=256 # dim for UNet\n", "# ModelKeys['text_embed_dim'] = 512\n", "# ModelKeys['embed_dim_position']=32\n", "# ModelKeys['text_embed_dim']=ModelKeys['text_embed_dim']+ModelKeys['embed_dim_position']\n", "# ModelKeys['cond_dim'] = 512\n", "# ModelKeys['cond_images_channels']=1\n", "# ModelKeys['max_text_len']=DataKeys['max_AA_seq_len'] # this is about text condi\n", "# # for Imagen\n", "# ModelKeys['pred_dim']=1 # for sequence, =1\n", "# ModelKeys['diff_timesteps']=(96,)\n", "# ModelKeys['loss_type']=0 # MSE\n", "# ModelKeys['elucidated']=True #\n", "# ModelKeys['padding_idx']=0\n", "# ModelKeys['max_length']=DataKeys['max_AA_seq_len'] # max seq len\n", "# ModelKeys['device']=device\n", "# #\n", "# # buckets for Model building\n", "# ModelKeys['UNet']={}\n", "# ModelKeys['Imagen']={}\n", "# # ++++++++++++++++++++++++++++++++++++++++++++++++++\n", "# write_PK_UNet=dict()\n", "# write_PK_UNet['dim']=ModelKeys['dim'] # 256\n", "# write_PK_UNet['text_embed_dim']=ModelKeys['text_embed_dim'] # 512+32\n", "# write_PK_UNet['num_resnet_blocks']=1\n", "# write_PK_UNet['cond_dim']=ModelKeys['cond_dim'] #this is where text embeddings are projected to...\n", "# # write_PK_UNet['num_image_tokens']=None # using the default value\n", "# # write_PK_UNet['num_time_tokens']=None # using the default\n", "# # write_PK_UNet['learned_sinu_pos_emb_dim']=None\n", "# # write_PK_UNet['out_dim']=None\n", "# write_PK_UNet['dim_mults']=(1, 2, 4, 8)\n", "\n", "# write_PK_UNet['cond_images_channels']=ModelKeys['cond_images_channels']\n", "# write_PK_UNet['channels']=1\n", "# write_PK_UNet['channels_out']=1\n", "\n", "# write_PK_UNet['attn_dim_head']=64\n", "# write_PK_UNet['attn_heads']=8\n", "# write_PK_UNet['ff_mult']=2.\n", "# write_PK_UNet['lowres_cond']=False # for cascading diffusion - https://cascaded-diffusion.github.io/\n", "\n", "# write_PK_UNet['layer_attns']=(False, True, True, False)\n", "# write_PK_UNet['layer_attns_depth']=1\n", "# write_PK_UNet['layer_attns_add_text_cond']=True # whether to condition the self-attention blocks with the text embeddings, as described in Appendix D.3.1\n", "# write_PK_UNet['attend_at_middle']=True # whether to have a layer of attention at the bottleneck (can turn off for higher resolution in cascading DDPM, before bringing in efficient attention)\n", "# write_PK_UNet['layer_cross_attns']=(False, True, True, False)\n", "# write_PK_UNet['use_linear_attn']=False\n", "# write_PK_UNet['use_linear_cross_attn']=False\n", "\n", "# write_PK_UNet['cond_on_text']=True\n", "# write_PK_UNet['max_text_len']=ModelKeys['max_text_len'] # need to check this one\n", "# # ModelKeys['UNet']['init_dim']=None\n", "# write_PK_UNet['resnet_groups']=8\n", "# write_PK_UNet['init_conv_kernel_size']=7 # kernel size of initial conv, if not using cross embed\n", "# write_PK_UNet['init_cross_embed']=False #TODO - fix ouput size calcs for conv1d\n", "# write_PK_UNet['init_cross_embed_kernel_sizes']=(3, 7, 15)\n", "# write_PK_UNet['cross_embed_downsample']=False\n", "# write_PK_UNet['cross_embed_downsample_kernel_sizes']=(2, 4)\n", "\n", "# write_PK_UNet['attn_pool_text']=True\n", "# write_PK_UNet['attn_pool_num_latents']=32 #perceiver model latents\n", "# write_PK_UNet['dropout']=0.\n", "# write_PK_UNet['memory_efficient']=False\n", "# write_PK_UNet['init_conv_to_final_conv_residual']=False\n", "\n", "# write_PK_UNet['use_global_context_attn']=True\n", "# write_PK_UNet['scale_skip_connection']=True\n", "# write_PK_UNet['final_resnet_block']=True\n", "# write_PK_UNet['final_conv_kernel_size']=3\n", "\n", "# write_PK_UNet['cosine_sim_attn']=True\n", "# write_PK_UNet['self_cond']=False\n", "# write_PK_UNet['combine_upsample_fmaps']=True # combine feature maps from all upsample blocks, used in unet squared successfully\n", "# write_PK_UNet['pixel_shuffle_upsample']=False # may address checkboard artifacts\n", "# # write_PK_UNet['beginning_and_final_conv_present']=None # use default\n", "# ModelKeys['UNet']=UtilityPack.prepare_UNet_keys(write_PK_UNet)\n", "# # +++++++++++++++++++++++++++++++++++++++++++++++++++++\n", "# # beyond UNet, for Whole model, all keys\n", "# # \"None\" means defult value on function definition\n", "# write_PK_Imagen=dict()\n", "\n", "# write_PK_Imagen['timesteps']=ModelKeys['diff_timesteps']\n", "# write_PK_Imagen['dim']=ModelKeys['dim']\n", "# write_PK_Imagen['pred_dim']=ModelKeys['pred_dim']\n", "# write_PK_Imagen['loss_type']=ModelKeys['loss_type'] # 0 # MSE\n", "# write_PK_Imagen['elucidated']=ModelKeys['elucidated'] # True\n", "# write_PK_Imagen['padding_idx']=ModelKeys['padding_idx'] # 0 # need to check\n", "# # write_PK_Imagen['cond_dim']=None # use default\n", "# # write_PK_Imagen['text_embed_dim']=None\n", "# # write_PK_Imagen['input_tokens']=None\n", "# # write_PK_Imagen['sequence_embed']=None\n", "# # write_PK_Imagen['embed_dim_position']=None\n", "# write_PK_Imagen['max_text_len']=ModelKeys['max_text_len']\n", "# write_PK_Imagen['cond_images_channels']=ModelKeys['cond_images_channels']\n", "# write_PK_Imagen['max_length']=ModelKeys['max_length']\n", "# write_PK_Imagen['device']=ModelKeys['device']\n", "\n", "# # extend it to a full key\n", "# ModelKeys['Imagen']=UtilityPack.prepare_ModelB_keys(write_PK_Imagen)\n", "# # to be defined\n", "\n", " elif CKeys['Problem_ID']==3:\n", " pass\n", "\n", "# ModelKeys={}\n", "# # storage\n", "# ModelKeys['model_dir']=PKeys['prefix']+'1_model_SS/'\n", "# # create the folder\n", "# print(\"Creating the model dir...\")\n", "# UtilityPack.create_path(ModelKeys['model_dir'])\n", "# # secondary folders\n", "# ModelKeys['model_dir_sample']=ModelKeys['model_dir']+'0_mid_sample/'\n", "# UtilityPack.create_path(ModelKeys['model_dir_sample'])\n", "# ModelKeys['model_dir_model']=ModelKeys['model_dir']+'1_store_model/'\n", "# UtilityPack.create_path(ModelKeys['model_dir_model'])\n", "\n", "# # for UNet\n", "# ModelKeys['dim']=768 # dim for UNet\n", "# # for debug\n", "# ModelKeys['dim']=256 # dim for UNet: GPU stat: 256:16093MiB;\n", "# #\n", "# ModelKeys['text_embed_dim']=512-128\n", "# ModelKeys['embed_dim_position']=128\n", "# # ! this is for UNet, not for Imagen\n", "# ModelKeys['text_embed_dim']=ModelKeys['text_embed_dim']+ModelKeys['embed_dim_position']\n", "# ModelKeys['cond_dim']=512\n", "# # ModelKeys['embed_dim_position']=128\n", "# # ModelKeys['text_embed_dim']=ModelKeys['cond_dim']-ModelKeys['embed_dim_position']\n", "# # !!! Need to check this one = 1 or not\n", "# ModelKeys['cond_images_channels']=0 # 1\n", "# # !!! Need to check this one: should it be 8 or 64?\n", "# ModelKeys['max_text_len']= DataKeys['max_text_len'] # DataKeys['max_AA_seq_len'] # 8 # this is about text condi\n", "\n", "# # for Imagen\n", "# ModelKeys['pred_dim']=1 # for sequence, =1\n", "# ModelKeys['diff_timesteps']=(96) # (96,)\n", "# ModelKeys['loss_type']=0 # MSE\n", "# ModelKeys['elucidated']=True #\n", "# ModelKeys['padding_idx']=0\n", "# ModelKeys['max_length']=DataKeys['max_AA_seq_len']\n", "# ModelKeys['device']=device\n", "# #\n", "# # baskets for Model building\n", "# ModelKeys['UNet']={}\n", "# ModelKeys['Imagen']={}\n", "# # ++++++++++++++++++++++++++++++++++++++\n", "# # prepare the Unet Key\n", "# write_PK_UNet=dict()\n", "# # used ones\n", "# write_PK_UNet['dim']=ModelKeys['dim']\n", "# write_PK_UNet['text_embed_dim']=ModelKeys['text_embed_dim']\n", "# write_PK_UNet['num_resnet_blocks']=1\n", "# write_PK_UNet['cond_dim']=ModelKeys['cond_dim'] #this is where text embeddings are projected to...\n", "# # write_PK_UNet['num_image_tokens']=None # using the default value\n", "# # write_PK_UNet['num_time_tokens']=None # using the default\n", "# # write_PK_UNet['learned_sinu_pos_emb_dim']=None\n", "# # write_PK_UNet['out_dim']=None\n", "# write_PK_UNet['dim_mults']=(1, 2, 4, 8)\n", "\n", "# write_PK_UNet['cond_images_channels']=ModelKeys['cond_images_channels']\n", "# write_PK_UNet['channels']=ModelKeys['pred_dim']\n", "# write_PK_UNet['channels_out']=ModelKeys['pred_dim']\n", "\n", "# write_PK_UNet['attn_dim_head']=64\n", "# write_PK_UNet['attn_heads']=8\n", "# write_PK_UNet['ff_mult']=2.\n", "# write_PK_UNet['lowres_cond']=False # for cascading diffusion - https://cascaded-diffusion.github.io/\n", "\n", "\n", "# write_PK_UNet['layer_attns']=(False, True, True, False)\n", "# write_PK_UNet['layer_attns_depth']=1\n", "# write_PK_UNet['layer_attns_add_text_cond']=True # whether to condition the self-attention blocks with the text embeddings, as described in Appendix D.3.1\n", "# write_PK_UNet['attend_at_middle']=True # whether to have a layer of attention at the bottleneck (can turn off for higher resolution in cascading DDPM, before bringing in efficient attention)\n", "# write_PK_UNet['layer_cross_attns']=(False, True, True, False)\n", "# write_PK_UNet['use_linear_attn']=False\n", "# write_PK_UNet['use_linear_cross_attn']=False\n", "\n", "# write_PK_UNet['cond_on_text'] = True\n", "# # !!! Need to check this: 63, Imagen used a different one\n", "# write_PK_UNet['max_text_len'] = DataKeys['max_AA_seq_len'] # ModelKeys['max_text_len']\n", "# # write_PK_UNet['init_dim'] = None\n", "# write_PK_UNet['resnet_groups'] = 8\n", "# write_PK_UNet['init_conv_kernel_size'] =7 # kernel size of initial conv, if not using cross embed\n", "# write_PK_UNet['init_cross_embed'] = False #TODO - fix ouput size calcs for conv1d\n", "# write_PK_UNet['init_cross_embed_kernel_sizes'] = (3, 7, 15)\n", "# write_PK_UNet['cross_embed_downsample'] = False\n", "# write_PK_UNet['cross_embed_downsample_kernel_sizes'] = (2, 4)\n", "\n", "# write_PK_UNet['attn_pool_text'] = True\n", "# write_PK_UNet['attn_pool_num_latents'] = 32 #32, #perceiver model latents\n", "# write_PK_UNet['dropout'] = 0.\n", "# write_PK_UNet['memory_efficient'] = False\n", "# write_PK_UNet['init_conv_to_final_conv_residual'] = False\n", "\n", "# write_PK_UNet['use_global_context_attn'] = True\n", "# write_PK_UNet['scale_skip_connection'] = True\n", "# write_PK_UNet['final_resnet_block'] = True\n", "# write_PK_UNet['final_conv_kernel_size'] = 3\n", "\n", "# write_PK_UNet['cosine_sim_attn'] = True\n", "# write_PK_UNet['self_cond'] = False\n", "# write_PK_UNet['combine_upsample_fmaps'] = True # combine feature maps from all upsample blocks, used in unet squared successfully\n", "# write_PK_UNet['pixel_shuffle_upsample'] = False # may address checkboard artifacts\n", "# # write_PK_UNet['beginning_and_final_conv_present']=None # use default\n", "# #\n", "# ModelKeys['UNet']=UtilityPack.prepare_UNet_keys(write_PK_UNet)\n", "# # ++++++++++++++++++++++++++++++++++++++\n", "# # beyond UNet, for Whole model, all keys\n", "# # \"None\" means defult value on function definition\n", "# write_PK_Imagen=dict()\n", "\n", "# # used ones\n", "# write_PK_Imagen['timesteps']=ModelKeys['diff_timesteps']\n", "# write_PK_Imagen['dim']=ModelKeys['dim']\n", "# write_PK_Imagen['pred_dim']=ModelKeys['pred_dim']\n", "# write_PK_Imagen['loss_type']=ModelKeys['loss_type'] # 0 # MSE\n", "# write_PK_Imagen['elucidated']=ModelKeys['elucidated'] # True\n", "# write_PK_Imagen['padding_idx']=ModelKeys['padding_idx'] # 0 # need to check\n", "# write_PK_Imagen['cond_dim']=ModelKeys['cond_dim'] # use default\n", "# # can use default, 512; or like the below (check the code)\n", "# write_PK_Imagen['text_embed_dim']=ModelKeys['text_embed_dim']-ModelKeys['embed_dim_position']\n", "# # write_PK_Imagen['input_tokens']=None\n", "# # write_PK_Imagen['sequence_embed']=None\n", "# write_PK_Imagen['embed_dim_position']=ModelKeys['embed_dim_position']\n", "# write_PK_Imagen['max_text_len']=ModelKeys['max_text_len']\n", "# write_PK_Imagen['cond_images_channels']=ModelKeys['cond_images_channels']\n", "# write_PK_Imagen['max_length']=ModelKeys['max_length']\n", "# write_PK_Imagen['device']=ModelKeys['device']\n", "\n", "# # extend it to a full key\n", "# ModelKeys['Imagen']=UtilityPack.prepare_ModelB_keys(write_PK_Imagen)\n", "\n", " elif CKeys['Problem_ID']==4:\n", " pass\n", "\n", "# ModelKeys={}\n", "# # storage\n", "# ModelKeys['model_dir']=PKeys['prefix']+'1_model_SS/'\n", "# # create the folder\n", "# print(\"Creating the model dir...\")\n", "# UtilityPack.create_path(ModelKeys['model_dir'])\n", "# # secondary folders\n", "# ModelKeys['model_dir_sample']=ModelKeys['model_dir']+'0_mid_sample/'\n", "# UtilityPack.create_path(ModelKeys['model_dir_sample'])\n", "# ModelKeys['model_dir_model']=ModelKeys['model_dir']+'1_store_model/'\n", "# UtilityPack.create_path(ModelKeys['model_dir_model'])\n", "\n", "# # for UNet\n", "# ModelKeys['dim']=768 # dim for UNet\n", "# # for debug\n", "# ModelKeys['dim']=256 # dim for UNet: GPU stat: 256:16093MiB;\n", "# #\n", "# ModelKeys['text_embed_dim']=512-128\n", "# ModelKeys['embed_dim_position']=128\n", "# # ! this is for UNet, not for Imagen\n", "# ModelKeys['text_embed_dim']=ModelKeys['text_embed_dim']+ModelKeys['embed_dim_position']\n", "# ModelKeys['cond_dim']=512\n", "# # ModelKeys['embed_dim_position']=128\n", "# # ModelKeys['text_embed_dim']=ModelKeys['cond_dim']-ModelKeys['embed_dim_position']\n", "# # !!! Need to check this one = 1 or not\n", "# ModelKeys['cond_images_channels']=0 # 1\n", "# # !!! Need to check this one: should it be 8 or 64?\n", "# ModelKeys['max_text_len']= DataKeys['max_text_len'] # DataKeys['max_AA_seq_len'] # 8 # this is about text condi\n", "\n", "# # for Imagen\n", "# ModelKeys['pred_dim']=1 # for sequence, =1\n", "# ModelKeys['diff_timesteps']=(96) # (96,)\n", "# ModelKeys['loss_type']=0 # MSE\n", "# ModelKeys['elucidated']=True #\n", "# ModelKeys['padding_idx']=0\n", "# ModelKeys['max_length']=DataKeys['max_AA_seq_len']\n", "# ModelKeys['device']=device\n", "# #\n", "# # baskets for Model building\n", "# ModelKeys['UNet']={}\n", "# ModelKeys['Imagen']={}\n", "# # ++++++++++++++++++++++++++++++++++++++\n", "# # prepare the Unet Key\n", "# write_PK_UNet=dict()\n", "# # used ones\n", "# write_PK_UNet['dim']=ModelKeys['dim']\n", "# write_PK_UNet['text_embed_dim']=ModelKeys['text_embed_dim']\n", "# write_PK_UNet['num_resnet_blocks']=1\n", "# write_PK_UNet['cond_dim']=ModelKeys['cond_dim'] #this is where text embeddings are projected to...\n", "# # write_PK_UNet['num_image_tokens']=None # using the default value\n", "# # write_PK_UNet['num_time_tokens']=None # using the default\n", "# # write_PK_UNet['learned_sinu_pos_emb_dim']=None\n", "# # write_PK_UNet['out_dim']=None\n", "# write_PK_UNet['dim_mults']=(1, 2, 4, 8)\n", "\n", "# write_PK_UNet['cond_images_channels']=ModelKeys['cond_images_channels']\n", "# write_PK_UNet['channels']=ModelKeys['pred_dim']\n", "# write_PK_UNet['channels_out']=ModelKeys['pred_dim']\n", "\n", "# write_PK_UNet['attn_dim_head']=64\n", "# write_PK_UNet['attn_heads']=8\n", "# write_PK_UNet['ff_mult']=2.\n", "# write_PK_UNet['lowres_cond']=False # for cascading diffusion - https://cascaded-diffusion.github.io/\n", "\n", "\n", "# write_PK_UNet['layer_attns']=(False, True, True, False)\n", "# write_PK_UNet['layer_attns_depth']=1\n", "# write_PK_UNet['layer_attns_add_text_cond']=True # whether to condition the self-attention blocks with the text embeddings, as described in Appendix D.3.1\n", "# write_PK_UNet['attend_at_middle']=True # whether to have a layer of attention at the bottleneck (can turn off for higher resolution in cascading DDPM, before bringing in efficient attention)\n", "# write_PK_UNet['layer_cross_attns']=(False, True, True, False)\n", "# write_PK_UNet['use_linear_attn']=False\n", "# write_PK_UNet['use_linear_cross_attn']=False\n", "\n", "# write_PK_UNet['cond_on_text'] = True\n", "# # !!! Need to check this: 63, Imagen used a different one\n", "# write_PK_UNet['max_text_len'] = DataKeys['max_text_len'] # DataKeys['max_AA_seq_len'] # ModelKeys['max_text_len']\n", "# # write_PK_UNet['init_dim'] = None\n", "# write_PK_UNet['resnet_groups'] = 8\n", "# write_PK_UNet['init_conv_kernel_size'] =7 # kernel size of initial conv, if not using cross embed\n", "# write_PK_UNet['init_cross_embed'] = False #TODO - fix ouput size calcs for conv1d\n", "# write_PK_UNet['init_cross_embed_kernel_sizes'] = (3, 7, 15)\n", "# write_PK_UNet['cross_embed_downsample'] = False\n", "# write_PK_UNet['cross_embed_downsample_kernel_sizes'] = (2, 4)\n", "\n", "# write_PK_UNet['attn_pool_text'] = True\n", "# write_PK_UNet['attn_pool_num_latents'] = 32 #32, #perceiver model latents\n", "# write_PK_UNet['dropout'] = 0.\n", "# write_PK_UNet['memory_efficient'] = False\n", "# write_PK_UNet['init_conv_to_final_conv_residual'] = False\n", "\n", "# write_PK_UNet['use_global_context_attn'] = True\n", "# write_PK_UNet['scale_skip_connection'] = True\n", "# write_PK_UNet['final_resnet_block'] = True\n", "# write_PK_UNet['final_conv_kernel_size'] = 3\n", "\n", "# write_PK_UNet['cosine_sim_attn'] = True\n", "# write_PK_UNet['self_cond'] = False\n", "# write_PK_UNet['combine_upsample_fmaps'] = True # combine feature maps from all upsample blocks, used in unet squared successfully\n", "# write_PK_UNet['pixel_shuffle_upsample'] = False # may address checkboard artifacts\n", "# # write_PK_UNet['beginning_and_final_conv_present']=None # use default\n", "# #\n", "# ModelKeys['UNet']=UtilityPack.prepare_UNet_keys(write_PK_UNet)\n", "# # ++++++++++++++++++++++++++++++++++++++\n", "# # beyond UNet, for Whole model, all keys\n", "# # \"None\" means defult value on function definition\n", "# write_PK_Imagen=dict()\n", "\n", "# # used ones\n", "# write_PK_Imagen['timesteps']=ModelKeys['diff_timesteps']\n", "# write_PK_Imagen['dim']=ModelKeys['dim']\n", "# write_PK_Imagen['pred_dim']=ModelKeys['pred_dim']\n", "# write_PK_Imagen['loss_type']=ModelKeys['loss_type'] # 0 # MSE\n", "# write_PK_Imagen['elucidated']=ModelKeys['elucidated'] # True\n", "# write_PK_Imagen['padding_idx']=ModelKeys['padding_idx'] # 0 # need to check\n", "# write_PK_Imagen['cond_dim']=ModelKeys['cond_dim'] # use default\n", "# # can use default, 512; or like the below (check the code)\n", "# write_PK_Imagen['text_embed_dim']=ModelKeys['text_embed_dim']-ModelKeys['embed_dim_position']\n", "# # write_PK_Imagen['input_tokens']=None\n", "# # write_PK_Imagen['sequence_embed']=None\n", "# write_PK_Imagen['embed_dim_position']=ModelKeys['embed_dim_position']\n", "# write_PK_Imagen['max_text_len']=ModelKeys['max_text_len']\n", "# write_PK_Imagen['cond_images_channels']=ModelKeys['cond_images_channels']\n", "# write_PK_Imagen['max_length']=ModelKeys['max_length']\n", "# write_PK_Imagen['device']=ModelKeys['device']\n", "\n", "# # extend it to a full key\n", "# ModelKeys['Imagen']=UtilityPack.prepare_ModelB_keys(write_PK_Imagen)\n", "\n", " elif CKeys['Problem_ID']==5:\n", " pass\n", "\n", "# # this is 1st run....\n", "# # +++++++++++++++++++++++++++++++++++++\n", "# # SecStr as input seq\n", "# ModelKeys={}\n", "# # storage\n", "# ModelKeys['model_dir']=PKeys['prefix']+'1_model_SS/'\n", "# # create the folder\n", "# print(\"Creating the model dir...\")\n", "# UtilityPack.create_path(ModelKeys['model_dir'])\n", "# # secondary folders\n", "# ModelKeys['model_dir_sample']=ModelKeys['model_dir']+'0_mid_sample/'\n", "# UtilityPack.create_path(ModelKeys['model_dir_sample'])\n", "# ModelKeys['model_dir_model']=ModelKeys['model_dir']+'1_store_model/'\n", "# UtilityPack.create_path(ModelKeys['model_dir_model'])\n", "\n", "# # for UNet\n", "# ModelKeys['dim']=256 # dim for UNet\n", "# ModelKeys['text_embed_dim'] = 512\n", "# ModelKeys['embed_dim_position']=32\n", "# ModelKeys['text_embed_dim']=ModelKeys['text_embed_dim']+ModelKeys['embed_dim_position']\n", "# ModelKeys['cond_dim'] = 512\n", "# ModelKeys['cond_images_channels']=DataKeys['image_channels'] # 1280 # for embedding dim # 1\n", "# ModelKeys['max_text_len']=DataKeys['max_AA_seq_len'] # this is about text condi\n", "# # + for embedding\n", "# ModelKeys['image_channels']=DataKeys['image_channels'] # 1280\n", "# # for Imagen\n", "# ModelKeys['pred_dim']= ModelKeys['image_channels'] # 1 # for sequence, =1\n", "# ModelKeys['diff_timesteps']=(96,)\n", "# ModelKeys['loss_type']=0 # MSE\n", "# ModelKeys['elucidated']=True #\n", "# ModelKeys['padding_idx']=0\n", "# ModelKeys['max_length']=DataKeys['max_AA_seq_len'] # max seq len\n", "# ModelKeys['device']=device\n", "# #\n", "# # buckets for Model building\n", "# ModelKeys['UNet']={}\n", "# ModelKeys['Imagen']={}\n", "# # ++++++++++++++++++++++++++++++++++++++++++++++++++\n", "# write_PK_UNet=dict()\n", "# write_PK_UNet['dim']=ModelKeys['dim'] # 256\n", "# write_PK_UNet['text_embed_dim']=ModelKeys['text_embed_dim'] # 512+32\n", "# write_PK_UNet['num_resnet_blocks']=1\n", "# write_PK_UNet['cond_dim']=ModelKeys['cond_dim'] #this is where text embeddings are projected to...\n", "# # write_PK_UNet['num_image_tokens']=None # using the default value\n", "# # write_PK_UNet['num_time_tokens']=None # using the default\n", "# # write_PK_UNet['learned_sinu_pos_emb_dim']=None\n", "# # write_PK_UNet['out_dim']=None\n", "# write_PK_UNet['dim_mults']=(1, 2, 4, 8)\n", "\n", "# write_PK_UNet['cond_images_channels']=ModelKeys['cond_images_channels']\n", "# write_PK_UNet['channels']=ModelKeys['image_channels'] # 1\n", "# write_PK_UNet['channels_out']=ModelKeys['image_channels'] # 1\n", "\n", "# write_PK_UNet['attn_dim_head']=64\n", "# write_PK_UNet['attn_heads']=8\n", "# write_PK_UNet['ff_mult']=2.\n", "# write_PK_UNet['lowres_cond']=False # for cascading diffusion - https://cascaded-diffusion.github.io/\n", "\n", "# write_PK_UNet['layer_attns']=(False, True, True, False)\n", "# write_PK_UNet['layer_attns_depth']=1\n", "# write_PK_UNet['layer_attns_add_text_cond']=True # whether to condition the self-attention blocks with the text embeddings, as described in Appendix D.3.1\n", "# write_PK_UNet['attend_at_middle']=True # whether to have a layer of attention at the bottleneck (can turn off for higher resolution in cascading DDPM, before bringing in efficient attention)\n", "# write_PK_UNet['layer_cross_attns']=(False, True, True, False)\n", "# write_PK_UNet['use_linear_attn']=False\n", "# write_PK_UNet['use_linear_cross_attn']=False\n", "\n", "# write_PK_UNet['cond_on_text']=True\n", "# write_PK_UNet['max_text_len']=ModelKeys['max_text_len'] # need to check this one\n", "# # ModelKeys['UNet']['init_dim']=None\n", "# write_PK_UNet['resnet_groups']=8\n", "# write_PK_UNet['init_conv_kernel_size']=7 # kernel size of initial conv, if not using cross embed\n", "# write_PK_UNet['init_cross_embed']=False #TODO - fix ouput size calcs for conv1d\n", "# write_PK_UNet['init_cross_embed_kernel_sizes']=(3, 7, 15)\n", "# write_PK_UNet['cross_embed_downsample']=False\n", "# write_PK_UNet['cross_embed_downsample_kernel_sizes']=(2, 4)\n", "\n", "# write_PK_UNet['attn_pool_text']=True\n", "# write_PK_UNet['attn_pool_num_latents']=32 #perceiver model latents\n", "# write_PK_UNet['dropout']=0.\n", "# write_PK_UNet['memory_efficient']=False\n", "# write_PK_UNet['init_conv_to_final_conv_residual']=False\n", "\n", "# write_PK_UNet['use_global_context_attn']=True\n", "# write_PK_UNet['scale_skip_connection']=True\n", "# write_PK_UNet['final_resnet_block']=True\n", "# write_PK_UNet['final_conv_kernel_size']=3\n", "\n", "# write_PK_UNet['cosine_sim_attn']=True\n", "# write_PK_UNet['self_cond']=False\n", "# write_PK_UNet['combine_upsample_fmaps']=True # combine feature maps from all upsample blocks, used in unet squared successfully\n", "# write_PK_UNet['pixel_shuffle_upsample']=False # may address checkboard artifacts\n", "# # write_PK_UNet['beginning_and_final_conv_present']=None # use default\n", "# ModelKeys['UNet']=UtilityPack.prepare_UNet_keys(write_PK_UNet)\n", "# # +++++++++++++++++++++++++++++++++++++++++++++++++++++\n", "# # beyond UNet, for Whole model, all keys\n", "# # \"None\" means defult value on function definition\n", "# write_PK_Imagen=dict()\n", "\n", "# write_PK_Imagen['timesteps']=ModelKeys['diff_timesteps']\n", "# write_PK_Imagen['dim']=ModelKeys['dim']\n", "# write_PK_Imagen['pred_dim']=ModelKeys['pred_dim']\n", "# write_PK_Imagen['loss_type']=ModelKeys['loss_type'] # 0 # MSE\n", "# write_PK_Imagen['elucidated']=ModelKeys['elucidated'] # True\n", "# write_PK_Imagen['padding_idx']=ModelKeys['padding_idx'] # 0 # need to check\n", "# # write_PK_Imagen['cond_dim']=None # use default\n", "# # write_PK_Imagen['text_embed_dim']=None\n", "# # write_PK_Imagen['input_tokens']=None\n", "# # write_PK_Imagen['sequence_embed']=None\n", "# # write_PK_Imagen['embed_dim_position']=None\n", "# write_PK_Imagen['max_text_len']=ModelKeys['max_text_len']\n", "# write_PK_Imagen['cond_images_channels']=ModelKeys['pred_dim']\n", "# write_PK_Imagen['max_length']=ModelKeys['max_length']\n", "# write_PK_Imagen['device']=ModelKeys['device']\n", "\n", "# # extend it to a full key\n", "# ModelKeys['Imagen']=UtilityPack.prepare_ModelB_keys(write_PK_Imagen)\n", "\n", " elif CKeys['Problem_ID']==6:\n", " # =====================================================\n", " # ForcePath --> AA sequence\n", " # =====================================================\n", " #\n", " # this is 1st run....\n", " # +++++++++++++++++++++++++++++++++++++\n", " # ForcPath as input seq\n", " ModelKeys={}\n", " # storage\n", " ModelKeys['model_dir']=PKeys['prefix']+'1_model_SS/'\n", " # create the folder\n", " print(\"Creating the model dir...\")\n", " UtilityPack.create_path(ModelKeys['model_dir'])\n", " # secondary folders\n", " ModelKeys['model_dir_sample']=ModelKeys['model_dir']+'0_mid_sample/'\n", " UtilityPack.create_path(ModelKeys['model_dir_sample'])\n", " ModelKeys['model_dir_model']=ModelKeys['model_dir']+'1_store_model/'\n", " UtilityPack.create_path(ModelKeys['model_dir_model'])\n", "\n", " # for UNet\n", " ModelKeys['dim']=256 # dim for UNet\n", " ModelKeys['text_embed_dim'] = 512\n", " ModelKeys['embed_dim_position']=32\n", " ModelKeys['text_embed_dim']=ModelKeys['text_embed_dim']+ModelKeys['embed_dim_position']\n", " ModelKeys['cond_dim'] = 512\n", " ModelKeys['cond_images_channels']=DataKeys['image_channels'] # 1\n", " ModelKeys['max_text_len']=DataKeys['max_AA_seq_len'] # this is about text condi\n", " # for Imagen\n", " ModelKeys['pred_dim']=DataKeys['image_channels'] # 1 # for sequence, =1\n", " ModelKeys['diff_timesteps']=(96,)\n", " ModelKeys['loss_type']=0 # MSE\n", " ModelKeys['elucidated']=True #\n", " ModelKeys['padding_idx']=0\n", " ModelKeys['max_length']=DataKeys['max_AA_seq_len'] # max seq len\n", " ModelKeys['device']=device\n", " #\n", " # buckets for Model building\n", " ModelKeys['UNet']={}\n", " ModelKeys['Imagen']={}\n", " # ++++++++++++++++++++++++++++++++++++++++++++++++++\n", " write_PK_UNet=dict()\n", " write_PK_UNet['dim']=ModelKeys['dim'] # 256\n", " write_PK_UNet['text_embed_dim']=ModelKeys['text_embed_dim'] # 512+32\n", " write_PK_UNet['num_resnet_blocks']=1\n", " write_PK_UNet['cond_dim']=ModelKeys['cond_dim'] #this is where text embeddings are projected to...\n", " # write_PK_UNet['num_image_tokens']=None # using the default value\n", " # write_PK_UNet['num_time_tokens']=None # using the default\n", " # write_PK_UNet['learned_sinu_pos_emb_dim']=None\n", " # write_PK_UNet['out_dim']=None\n", " write_PK_UNet['dim_mults']=(1, 2, 4, 8)\n", "\n", " write_PK_UNet['cond_images_channels']=ModelKeys['cond_images_channels']\n", " write_PK_UNet['channels']=DataKeys['image_channels'] # 1\n", " write_PK_UNet['channels_out']=DataKeys['image_channels'] # 1\n", "\n", " write_PK_UNet['attn_dim_head']=64\n", " write_PK_UNet['attn_heads']=8\n", " write_PK_UNet['ff_mult']=2.\n", " write_PK_UNet['lowres_cond']=False # for cascading diffusion - https://cascaded-diffusion.github.io/\n", "\n", " write_PK_UNet['layer_attns']=(False, True, True, False)\n", " write_PK_UNet['layer_attns_depth']=1\n", " write_PK_UNet['layer_attns_add_text_cond']=True # whether to condition the self-attention blocks with the text embeddings, as described in Appendix D.3.1\n", " write_PK_UNet['attend_at_middle']=True # whether to have a layer of attention at the bottleneck (can turn off for higher resolution in cascading DDPM, before bringing in efficient attention)\n", " write_PK_UNet['layer_cross_attns']=(False, True, True, False)\n", " write_PK_UNet['use_linear_attn']=False\n", " write_PK_UNet['use_linear_cross_attn']=False\n", "\n", " write_PK_UNet['cond_on_text']=True\n", " write_PK_UNet['max_text_len']=ModelKeys['max_text_len'] # need to check this one\n", " # ModelKeys['UNet']['init_dim']=None\n", " write_PK_UNet['resnet_groups']=8\n", " write_PK_UNet['init_conv_kernel_size']=7 # kernel size of initial conv, if not using cross embed\n", " write_PK_UNet['init_cross_embed']=False #TODO - fix ouput size calcs for conv1d\n", " write_PK_UNet['init_cross_embed_kernel_sizes']=(3, 7, 15)\n", " write_PK_UNet['cross_embed_downsample']=False\n", " write_PK_UNet['cross_embed_downsample_kernel_sizes']=(2, 4)\n", "\n", " write_PK_UNet['attn_pool_text']=True\n", " write_PK_UNet['attn_pool_num_latents']=32 #perceiver model latents\n", " write_PK_UNet['dropout']=0.\n", " write_PK_UNet['memory_efficient']=False\n", " write_PK_UNet['init_conv_to_final_conv_residual']=False\n", "\n", " write_PK_UNet['use_global_context_attn']=True\n", " write_PK_UNet['scale_skip_connection']=True\n", " write_PK_UNet['final_resnet_block']=True\n", " write_PK_UNet['final_conv_kernel_size']=3\n", "\n", " write_PK_UNet['cosine_sim_attn']=True\n", " write_PK_UNet['self_cond']=False\n", " write_PK_UNet['combine_upsample_fmaps']=True # combine feature maps from all upsample blocks, used in unet squared successfully\n", " write_PK_UNet['pixel_shuffle_upsample']=False # may address checkboard artifacts\n", " # write_PK_UNet['beginning_and_final_conv_present']=None # use default\n", " ModelKeys['UNet']=UtilityPack.prepare_UNet_keys(write_PK_UNet)\n", " # +++++++++++++++++++++++++++++++++++++++++++++++++++++\n", " # beyond UNet, for Whole model, all keys\n", " # \"None\" means defult value on function definition\n", " write_PK_Imagen=dict()\n", "\n", " write_PK_Imagen['timesteps']=ModelKeys['diff_timesteps']\n", " write_PK_Imagen['dim']=ModelKeys['dim']\n", " write_PK_Imagen['pred_dim']=ModelKeys['pred_dim']\n", " write_PK_Imagen['loss_type']=ModelKeys['loss_type'] # 0 # MSE\n", " write_PK_Imagen['elucidated']=ModelKeys['elucidated'] # True\n", " write_PK_Imagen['padding_idx']=ModelKeys['padding_idx'] # 0 # need to check\n", " # write_PK_Imagen['cond_dim']=None # use default\n", " # write_PK_Imagen['text_embed_dim']=None\n", " # write_PK_Imagen['input_tokens']=None\n", " # write_PK_Imagen['sequence_embed']=None\n", " # write_PK_Imagen['embed_dim_position']=None\n", " write_PK_Imagen['max_text_len']=ModelKeys['max_text_len']\n", " write_PK_Imagen['cond_images_channels']=ModelKeys['cond_images_channels']\n", " write_PK_Imagen['max_length']=ModelKeys['max_length']\n", " write_PK_Imagen['device']=ModelKeys['device']\n", "\n", " # extend it to a full key\n", " ModelKeys['Imagen']=UtilityPack.prepare_ModelB_keys(write_PK_Imagen)\n", " # to be defined\n", "\n", " elif CKeys['Problem_ID']==7:\n", " pass\n", "# # ================================================================\n", "# # SecStr text summary --> AA seq pLM embedding\n", "# # ================================================================\n", "# ModelKeys={}\n", "# # storage\n", "# ModelKeys['model_dir']=PKeys['prefix']+'1_model_SS/'\n", "# # create the folder\n", "# print(\"Creating the model dir...\")\n", "# UtilityPack.create_path(ModelKeys['model_dir'])\n", "# # secondary folders\n", "# ModelKeys['model_dir_sample']=ModelKeys['model_dir']+'0_mid_sample/'\n", "# UtilityPack.create_path(ModelKeys['model_dir_sample'])\n", "# ModelKeys['model_dir_model']=ModelKeys['model_dir']+'1_store_model/'\n", "# UtilityPack.create_path(ModelKeys['model_dir_model'])\n", "\n", "# # for UNet\n", "# ModelKeys['dim']=768 # dim for UNet\n", "# # for debug\n", "# ModelKeys['dim']=256 # dim for UNet: GPU stat: 256:16093MiB;\n", "# #\n", "# ModelKeys['text_embed_dim']=512-128\n", "# ModelKeys['embed_dim_position']=128\n", "# # ! this is for UNet, not for Imagen\n", "# ModelKeys['text_embed_dim']=ModelKeys['text_embed_dim']+ModelKeys['embed_dim_position']\n", "# ModelKeys['cond_dim']=512\n", "# # ModelKeys['embed_dim_position']=128\n", "# # ModelKeys['text_embed_dim']=ModelKeys['cond_dim']-ModelKeys['embed_dim_position']\n", "# # !!! Need to check this one = 1 or not\n", "# # $: UNet use this key to decide whether cond_img is provided or not (0)\n", "# ModelKeys['cond_images_channels']= 0 # indicate NO cond_img # 0 # DataKeys['image_channels']\n", "# # !!! Need to check this one: should it be 8 or 64?\n", "# ModelKeys['max_text_len']= DataKeys['max_text_len'] # DataKeys['max_AA_seq_len'] # 8 # this is about text condi\n", "\n", "# # for Imagen\n", "# ModelKeys['pred_dim']=DataKeys['image_channels'] # 1 # for sequence, =1\n", "# ModelKeys['diff_timesteps']=(96) # (96,)\n", "# ModelKeys['loss_type']=0 # MSE\n", "# ModelKeys['elucidated']=True #\n", "# ModelKeys['padding_idx']=0\n", "# ModelKeys['max_length']=DataKeys['max_AA_seq_len']\n", "# ModelKeys['device']=device\n", "# #\n", "# # baskets for Model building\n", "# ModelKeys['UNet']={}\n", "# ModelKeys['Imagen']={}\n", "# # ++++++++++++++++++++++++++++++++++++++\n", "# # prepare the Unet Key\n", "# write_PK_UNet=dict()\n", "# # used ones\n", "# write_PK_UNet['dim']=ModelKeys['dim']\n", "# write_PK_UNet['text_embed_dim']=ModelKeys['text_embed_dim']\n", "# write_PK_UNet['num_resnet_blocks']=1\n", "# write_PK_UNet['cond_dim']=ModelKeys['cond_dim'] #this is where text embeddings are projected to...\n", "# # write_PK_UNet['num_image_tokens']=None # using the default value\n", "# # write_PK_UNet['num_time_tokens']=None # using the default\n", "# # write_PK_UNet['learned_sinu_pos_emb_dim']=None\n", "# # write_PK_UNet['out_dim']=None\n", "# write_PK_UNet['dim_mults']=(1, 2, 4, 8)\n", "\n", "# write_PK_UNet['cond_images_channels']=ModelKeys['cond_images_channels']\n", "# write_PK_UNet['channels']=DataKeys['image_channels'] # ModelKeys['pred_dim']\n", "# write_PK_UNet['channels_out']=DataKeys['image_channels'] # ModelKeys['pred_dim']\n", "\n", "# write_PK_UNet['attn_dim_head']=64\n", "# write_PK_UNet['attn_heads']=8\n", "# write_PK_UNet['ff_mult']=2.\n", "# write_PK_UNet['lowres_cond']=False # for cascading diffusion - https://cascaded-diffusion.github.io/\n", "\n", "\n", "# write_PK_UNet['layer_attns']=(False, True, True, False)\n", "# write_PK_UNet['layer_attns_depth']=1\n", "# write_PK_UNet['layer_attns_add_text_cond']=True # whether to condition the self-attention blocks with the text embeddings, as described in Appendix D.3.1\n", "# write_PK_UNet['attend_at_middle']=True # whether to have a layer of attention at the bottleneck (can turn off for higher resolution in cascading DDPM, before bringing in efficient attention)\n", "# write_PK_UNet['layer_cross_attns']=(False, True, True, False)\n", "# write_PK_UNet['use_linear_attn']=False\n", "# write_PK_UNet['use_linear_cross_attn']=False\n", "\n", "# write_PK_UNet['cond_on_text'] = True\n", "# # !!! Need to check this: 63, Imagen used a different one\n", "# # !!! here try the new one which seems to be correct\n", "# write_PK_UNet['max_text_len'] = ModelKeys['max_text_len'] # DataKeys['max_AA_seq_len'] # ModelKeys['max_text_len']\n", "# # write_PK_UNet['init_dim'] = None\n", "# write_PK_UNet['resnet_groups'] = 8\n", "# write_PK_UNet['init_conv_kernel_size'] =7 # kernel size of initial conv, if not using cross embed\n", "# write_PK_UNet['init_cross_embed'] = False #TODO - fix ouput size calcs for conv1d\n", "# write_PK_UNet['init_cross_embed_kernel_sizes'] = (3, 7, 15)\n", "# write_PK_UNet['cross_embed_downsample'] = False\n", "# write_PK_UNet['cross_embed_downsample_kernel_sizes'] = (2, 4)\n", "\n", "# write_PK_UNet['attn_pool_text'] = True\n", "# write_PK_UNet['attn_pool_num_latents'] = 32 #32, #perceiver model latents\n", "# write_PK_UNet['dropout'] = 0.\n", "# write_PK_UNet['memory_efficient'] = False\n", "# write_PK_UNet['init_conv_to_final_conv_residual'] = False\n", "\n", "# write_PK_UNet['use_global_context_attn'] = True\n", "# write_PK_UNet['scale_skip_connection'] = True\n", "# write_PK_UNet['final_resnet_block'] = True\n", "# write_PK_UNet['final_conv_kernel_size'] = 3\n", "\n", "# write_PK_UNet['cosine_sim_attn'] = True\n", "# write_PK_UNet['self_cond'] = False\n", "# write_PK_UNet['combine_upsample_fmaps'] = True # combine feature maps from all upsample blocks, used in unet squared successfully\n", "# write_PK_UNet['pixel_shuffle_upsample'] = False # may address checkboard artifacts\n", "# # write_PK_UNet['beginning_and_final_conv_present']=None # use default\n", "# #\n", "# ModelKeys['UNet']=UtilityPack.prepare_UNet_keys(write_PK_UNet)\n", "# # ++++++++++++++++++++++++++++++++++++++\n", "# # beyond UNet, for Whole model, all keys\n", "# # \"None\" means defult value on function definition\n", "# write_PK_Imagen=dict()\n", "\n", "# # used ones\n", "# write_PK_Imagen['timesteps']=ModelKeys['diff_timesteps']\n", "# write_PK_Imagen['dim']=ModelKeys['dim']\n", "# write_PK_Imagen['pred_dim']=ModelKeys['pred_dim']\n", "# write_PK_Imagen['loss_type']=ModelKeys['loss_type'] # 0 # MSE\n", "# write_PK_Imagen['elucidated']=ModelKeys['elucidated'] # True\n", "# write_PK_Imagen['padding_idx']=ModelKeys['padding_idx'] # 0 # need to check\n", "# write_PK_Imagen['cond_dim']=ModelKeys['cond_dim'] # use default\n", "# # can use default, 512; or like the below (check the code)\n", "# write_PK_Imagen['text_embed_dim']=ModelKeys['text_embed_dim']-ModelKeys['embed_dim_position']\n", "# # write_PK_Imagen['input_tokens']=None\n", "# # write_PK_Imagen['sequence_embed']=None\n", "# write_PK_Imagen['embed_dim_position']=ModelKeys['embed_dim_position']\n", "# write_PK_Imagen['max_text_len']=ModelKeys['max_text_len']\n", "# write_PK_Imagen['cond_images_channels']=ModelKeys['cond_images_channels']\n", "# write_PK_Imagen['max_length']=ModelKeys['max_length']\n", "# write_PK_Imagen['device']=ModelKeys['device']\n", "\n", "# # extend it to a full key\n", "# ModelKeys['Imagen']=UtilityPack.prepare_ModelB_keys(write_PK_Imagen)\n", "\n", " elif CKeys['Problem_ID']==8:\n", " # ================================================================\n", " # FmaxEne text summary --> AA seq pLM embedding\n", " # ================================================================\n", " ModelKeys={}\n", " # storage\n", " ModelKeys['model_dir']=PKeys['prefix']+'1_model_SS/'\n", " # create the folder\n", " print(\"Creating the model dir...\")\n", " UtilityPack.create_path(ModelKeys['model_dir'])\n", " # secondary folders\n", " ModelKeys['model_dir_sample']=ModelKeys['model_dir']+'0_mid_sample/'\n", " UtilityPack.create_path(ModelKeys['model_dir_sample'])\n", " ModelKeys['model_dir_model']=ModelKeys['model_dir']+'1_store_model/'\n", " UtilityPack.create_path(ModelKeys['model_dir_model'])\n", "\n", " # for UNet\n", " ModelKeys['dim']=768 # dim for UNet\n", " # for debug\n", " ModelKeys['dim']=256 # dim for UNet: GPU stat: 256:16093MiB;\n", " #\n", " ModelKeys['text_embed_dim']=512-128\n", " ModelKeys['embed_dim_position']=128\n", " # ! this is for UNet, not for Imagen\n", " ModelKeys['text_embed_dim']=ModelKeys['text_embed_dim']+ModelKeys['embed_dim_position']\n", " ModelKeys['cond_dim']=512\n", " # ModelKeys['embed_dim_position']=128\n", " # ModelKeys['text_embed_dim']=ModelKeys['cond_dim']-ModelKeys['embed_dim_position']\n", " # !!! Need to check this one = 1 or not\n", " # $: UNet use this key to decide whether cond_img is provided or not (0)\n", " ModelKeys['cond_images_channels']=0 # indicate no cond_img is used # 1\n", " # !!! Need to check this one: should it be 8 or 64?\n", " ModelKeys['max_text_len']= DataKeys['max_text_len'] # DataKeys['max_AA_seq_len'] # 8 # this is about text condi\n", "\n", " # for Imagen\n", " ModelKeys['pred_dim']=DataKeys['image_channels'] # 1 # for sequence, =1\n", " ModelKeys['diff_timesteps']=(96) # (96,)\n", " ModelKeys['loss_type']=0 # MSE\n", " ModelKeys['elucidated']=True #\n", " ModelKeys['padding_idx']=0\n", " ModelKeys['max_length']=DataKeys['max_AA_seq_len']\n", " ModelKeys['device']=device\n", " #\n", " # baskets for Model building\n", " ModelKeys['UNet']={}\n", " ModelKeys['Imagen']={}\n", " # ++++++++++++++++++++++++++++++++++++++\n", " # prepare the Unet Key\n", " write_PK_UNet=dict()\n", " # used ones\n", " write_PK_UNet['dim']=ModelKeys['dim']\n", " write_PK_UNet['text_embed_dim']=ModelKeys['text_embed_dim']\n", " write_PK_UNet['num_resnet_blocks']=1\n", " write_PK_UNet['cond_dim']=ModelKeys['cond_dim'] #this is where text embeddings are projected to...\n", " # write_PK_UNet['num_image_tokens']=None # using the default value\n", " # write_PK_UNet['num_time_tokens']=None # using the default\n", " # write_PK_UNet['learned_sinu_pos_emb_dim']=None\n", " # write_PK_UNet['out_dim']=None\n", " write_PK_UNet['dim_mults']=(1, 2, 4, 8)\n", "\n", " write_PK_UNet['cond_images_channels']=ModelKeys['cond_images_channels']\n", " write_PK_UNet['channels']=DataKeys['image_channels'] # ModelKeys['pred_dim']\n", " write_PK_UNet['channels_out']=DataKeys['image_channels'] # ModelKeys['pred_dim']\n", "\n", " write_PK_UNet['attn_dim_head']=64\n", " write_PK_UNet['attn_heads']=8\n", " write_PK_UNet['ff_mult']=2.\n", " write_PK_UNet['lowres_cond']=False # for cascading diffusion - https://cascaded-diffusion.github.io/\n", "\n", "\n", " write_PK_UNet['layer_attns']=(False, True, True, False)\n", " write_PK_UNet['layer_attns_depth']=1\n", " write_PK_UNet['layer_attns_add_text_cond']=True # whether to condition the self-attention blocks with the text embeddings, as described in Appendix D.3.1\n", " write_PK_UNet['attend_at_middle']=True # whether to have a layer of attention at the bottleneck (can turn off for higher resolution in cascading DDPM, before bringing in efficient attention)\n", " write_PK_UNet['layer_cross_attns']=(False, True, True, False)\n", " write_PK_UNet['use_linear_attn']=False\n", " write_PK_UNet['use_linear_cross_attn']=False\n", "\n", " write_PK_UNet['cond_on_text'] = True\n", " # !!! Need to check this: 63, Imagen used a different one\n", " write_PK_UNet['max_text_len'] = DataKeys['max_text_len'] # DataKeys['max_AA_seq_len'] # ModelKeys['max_text_len']\n", " # write_PK_UNet['init_dim'] = None\n", " write_PK_UNet['resnet_groups'] = 8\n", " write_PK_UNet['init_conv_kernel_size'] =7 # kernel size of initial conv, if not using cross embed\n", " write_PK_UNet['init_cross_embed'] = False #TODO - fix ouput size calcs for conv1d\n", " write_PK_UNet['init_cross_embed_kernel_sizes'] = (3, 7, 15)\n", " write_PK_UNet['cross_embed_downsample'] = False\n", " write_PK_UNet['cross_embed_downsample_kernel_sizes'] = (2, 4)\n", "\n", " write_PK_UNet['attn_pool_text'] = True\n", " write_PK_UNet['attn_pool_num_latents'] = 32 #32, #perceiver model latents\n", " write_PK_UNet['dropout'] = 0.\n", " write_PK_UNet['memory_efficient'] = False\n", " write_PK_UNet['init_conv_to_final_conv_residual'] = False\n", "\n", " write_PK_UNet['use_global_context_attn'] = True\n", " write_PK_UNet['scale_skip_connection'] = True\n", " write_PK_UNet['final_resnet_block'] = True\n", " write_PK_UNet['final_conv_kernel_size'] = 3\n", "\n", " write_PK_UNet['cosine_sim_attn'] = True\n", " write_PK_UNet['self_cond'] = False\n", " write_PK_UNet['combine_upsample_fmaps'] = True # combine feature maps from all upsample blocks, used in unet squared successfully\n", " write_PK_UNet['pixel_shuffle_upsample'] = False # may address checkboard artifacts\n", " # write_PK_UNet['beginning_and_final_conv_present']=None # use default\n", " #\n", " ModelKeys['UNet']=UtilityPack.prepare_UNet_keys(write_PK_UNet)\n", " # ++++++++++++++++++++++++++++++++++++++\n", " # beyond UNet, for Whole model, all keys\n", " # \"None\" means defult value on function definition\n", " write_PK_Imagen=dict()\n", "\n", " # used ones\n", " write_PK_Imagen['timesteps']=ModelKeys['diff_timesteps']\n", " write_PK_Imagen['dim']=ModelKeys['dim']\n", " write_PK_Imagen['pred_dim']=ModelKeys['pred_dim']\n", " write_PK_Imagen['loss_type']=ModelKeys['loss_type'] # 0 # MSE\n", " write_PK_Imagen['elucidated']=ModelKeys['elucidated'] # True\n", " write_PK_Imagen['padding_idx']=ModelKeys['padding_idx'] # 0 # need to check\n", " write_PK_Imagen['cond_dim']=ModelKeys['cond_dim'] # use default\n", " # can use default, 512; or like the below (check the code)\n", " write_PK_Imagen['text_embed_dim']=ModelKeys['text_embed_dim']-ModelKeys['embed_dim_position']\n", " # write_PK_Imagen['input_tokens']=None\n", " # write_PK_Imagen['sequence_embed']=None\n", " write_PK_Imagen['embed_dim_position']=ModelKeys['embed_dim_position']\n", " write_PK_Imagen['max_text_len']=ModelKeys['max_text_len']\n", " write_PK_Imagen['cond_images_channels']=ModelKeys['cond_images_channels']\n", " write_PK_Imagen['max_length']=ModelKeys['max_length']\n", " write_PK_Imagen['device']=ModelKeys['device']\n", "\n", " # extend it to a full key\n", " ModelKeys['Imagen']=UtilityPack.prepare_ModelB_keys(write_PK_Imagen)\n", "\n", " elif CKeys['Problem_ID']==11:\n", " # =====================================================\n", " # ForcePath --> AA sequence\n", " # =====================================================\n", " #\n", " # this is 1st run....\n", " # +++++++++++++++++++++++++++++++++++++\n", " # ForcPath as input seq\n", " ModelKeys={}\n", " # storage\n", " ModelKeys['model_dir']=PKeys['prefix']+'1_model_SS/'\n", " # create the folder\n", " print(\"Creating the model dir...\")\n", " UtilityPack.create_path(ModelKeys['model_dir'])\n", " # secondary folders\n", " ModelKeys['model_dir_sample']=ModelKeys['model_dir']+'0_mid_sample/'\n", " UtilityPack.create_path(ModelKeys['model_dir_sample'])\n", " ModelKeys['model_dir_model']=ModelKeys['model_dir']+'1_store_model/'\n", " UtilityPack.create_path(ModelKeys['model_dir_model'])\n", "\n", " # for UNet\n", " ModelKeys['dim']=256 # dim for UNet\n", " ModelKeys['text_embed_dim'] = 512\n", " ModelKeys['embed_dim_position']=32\n", " ModelKeys['text_embed_dim']=ModelKeys['text_embed_dim']+ModelKeys['embed_dim_position']\n", " ModelKeys['cond_dim'] = 512\n", " ModelKeys['cond_images_channels']=DataKeys['image_channels'] # 1\n", " ModelKeys['max_text_len']=DataKeys['max_AA_seq_len'] # this is about text condi\n", " # for Imagen\n", " ModelKeys['pred_dim']=DataKeys['image_channels'] # 1 # for sequence, =1\n", " ModelKeys['diff_timesteps']=(96,)\n", " ModelKeys['loss_type']=0 # MSE\n", " ModelKeys['elucidated']=True #\n", " ModelKeys['padding_idx']=0\n", " ModelKeys['max_length']=DataKeys['max_AA_seq_len'] # max seq len\n", " ModelKeys['device']=device\n", " #\n", " # buckets for Model building\n", " ModelKeys['UNet']={}\n", " ModelKeys['Imagen']={}\n", " # ++++++++++++++++++++++++++++++++++++++++++++++++++\n", " write_PK_UNet=dict()\n", " write_PK_UNet['dim']=ModelKeys['dim'] # 256\n", " write_PK_UNet['text_embed_dim']=ModelKeys['text_embed_dim'] # 512+32\n", " write_PK_UNet['num_resnet_blocks']=1\n", " write_PK_UNet['cond_dim']=ModelKeys['cond_dim'] #this is where text embeddings are projected to...\n", " # write_PK_UNet['num_image_tokens']=None # using the default value\n", " # write_PK_UNet['num_time_tokens']=None # using the default\n", " # write_PK_UNet['learned_sinu_pos_emb_dim']=None\n", " # write_PK_UNet['out_dim']=None\n", " write_PK_UNet['dim_mults']=(1, 2, 4, 8)\n", "\n", " write_PK_UNet['cond_images_channels']=ModelKeys['cond_images_channels']\n", " write_PK_UNet['channels']=DataKeys['image_channels'] # 1\n", " write_PK_UNet['channels_out']=DataKeys['image_channels'] # 1\n", "\n", " write_PK_UNet['attn_dim_head']=64\n", " write_PK_UNet['attn_heads']=8\n", " write_PK_UNet['ff_mult']=2.\n", " write_PK_UNet['lowres_cond']=False # for cascading diffusion - https://cascaded-diffusion.github.io/\n", "\n", " write_PK_UNet['layer_attns']=(False, True, True, False)\n", " write_PK_UNet['layer_attns_depth']=1\n", " write_PK_UNet['layer_attns_add_text_cond']=True # whether to condition the self-attention blocks with the text embeddings, as described in Appendix D.3.1\n", " write_PK_UNet['attend_at_middle']=True # whether to have a layer of attention at the bottleneck (can turn off for higher resolution in cascading DDPM, before bringing in efficient attention)\n", " write_PK_UNet['layer_cross_attns']=(False, True, True, False)\n", " write_PK_UNet['use_linear_attn']=False\n", " write_PK_UNet['use_linear_cross_attn']=False\n", "\n", " write_PK_UNet['cond_on_text']=True\n", " write_PK_UNet['max_text_len']=ModelKeys['max_text_len'] # need to check this one\n", " # ModelKeys['UNet']['init_dim']=None\n", " write_PK_UNet['resnet_groups']=8\n", " write_PK_UNet['init_conv_kernel_size']=7 # kernel size of initial conv, if not using cross embed\n", " write_PK_UNet['init_cross_embed']=False #TODO - fix ouput size calcs for conv1d\n", " write_PK_UNet['init_cross_embed_kernel_sizes']=(3, 7, 15)\n", " write_PK_UNet['cross_embed_downsample']=False\n", " write_PK_UNet['cross_embed_downsample_kernel_sizes']=(2, 4)\n", "\n", " write_PK_UNet['attn_pool_text']=True\n", " write_PK_UNet['attn_pool_num_latents']=32 #perceiver model latents\n", " write_PK_UNet['dropout']=0.\n", " write_PK_UNet['memory_efficient']=False\n", " write_PK_UNet['init_conv_to_final_conv_residual']=False\n", "\n", " write_PK_UNet['use_global_context_attn']=True\n", " write_PK_UNet['scale_skip_connection']=True\n", " write_PK_UNet['final_resnet_block']=True\n", " write_PK_UNet['final_conv_kernel_size']=3\n", "\n", " write_PK_UNet['cosine_sim_attn']=True\n", " write_PK_UNet['self_cond']=False\n", " write_PK_UNet['combine_upsample_fmaps']=True # combine feature maps from all upsample blocks, used in unet squared successfully\n", " write_PK_UNet['pixel_shuffle_upsample']=False # may address checkboard artifacts\n", " # write_PK_UNet['beginning_and_final_conv_present']=None # use default\n", " ModelKeys['UNet']=UtilityPack.prepare_UNet_keys(write_PK_UNet)\n", " # +++++++++++++++++++++++++++++++++++++++++++++++++++++\n", " # beyond UNet, for Whole model, all keys\n", " # \"None\" means defult value on function definition\n", " write_PK_Imagen=dict()\n", "\n", " write_PK_Imagen['timesteps']=ModelKeys['diff_timesteps']\n", " write_PK_Imagen['dim']=ModelKeys['dim']\n", " write_PK_Imagen['pred_dim']=ModelKeys['pred_dim']\n", " write_PK_Imagen['loss_type']=ModelKeys['loss_type'] # 0 # MSE\n", " write_PK_Imagen['elucidated']=ModelKeys['elucidated'] # True\n", " write_PK_Imagen['padding_idx']=ModelKeys['padding_idx'] # 0 # need to check\n", " # write_PK_Imagen['cond_dim']=None # use default\n", " # write_PK_Imagen['text_embed_dim']=None\n", " # write_PK_Imagen['input_tokens']=None\n", " # write_PK_Imagen['sequence_embed']=None\n", " # write_PK_Imagen['embed_dim_position']=None\n", " write_PK_Imagen['max_text_len']=ModelKeys['max_text_len']\n", " write_PK_Imagen['cond_images_channels']=ModelKeys['cond_images_channels']\n", " write_PK_Imagen['max_length']=ModelKeys['max_length']\n", " write_PK_Imagen['device']=ModelKeys['device']\n", "\n", " # extend it to a full key\n", " ModelKeys['Imagen']=UtilityPack.prepare_ModelB_keys(write_PK_Imagen)\n", " # to be defined\n", "\n", "\n", " # --\n", " print(\"==================================================\")\n", " print(\"store the MODEL key for the next-time usage\")\n", " print(\"==================================================\")\n", " model_pack = {}\n", " model_pack['ModelKeys']=ModelKeys\n", " with open(PKeys['pk_model_pack'], 'wb') as handle:\n", " pickle.dump(model_pack, handle, protocol=pickle.HIGHEST_PROTOCOL)\n", "\n", " print(\"Done.\")\n", "\n", "\n", "else: # both for training and testing\n", " #\n", " print(\"==================================================\")\n", " print(\"load in the MODEL key from the previous storage\")\n", " print(\"==================================================\")\n", " #\n", " # this is not the first run\n", " print('This is not the first run')\n", " print('Load back in the model packages...')\n", " with open(PKeys['pk_model_pack'], 'rb') as handle:\n", " model_pack = pickle.load(handle)\n", " # deliver the results\n", " ModelKeys=model_pack['ModelKeys']\n", " print('Done.')\n", "\n", "\n", "# print(DataKeys)\n", "# check a few key words\n", "# print (DataKeys['max_text_len'])\n", "# print(DataKeys['max_text_len'])\n", "print(ModelKeys['max_text_len'])\n", "print(DataKeys['image_channels'])\n", "print(ModelKeys['cond_images_channels'])\n", "print(ModelKeys['pred_dim'])\n", "print(json.dumps(ModelKeys['UNet'], indent=4))\n", "# print(json.dumps(ModelKeys['Imagen'], indent=4))\n", "print(ModelKeys['Imagen'])\n", "\n", "# select some key values\n", "print(ModelKeys['UNet']['channels'])\n", "print(ModelKeys['UNet']['channels_out'])\n", "print(ModelKeys['UNet']['cond_images_channels'])\n", "print(ModelKeys['Imagen']['pred_dim'])\n", "print(ModelKeys['Imagen']['cond_images_channels'])\n", "# how large the model will be\n", "print()\n", "print(ModelKeys['UNet']['dim'])\n", "print(ModelKeys['Imagen']['dim'])\n", "# =====================================\n", "# setup the model\n", "# =====================================\n", "if CKeys['Problem_ID']==1 or CKeys['Problem_ID']==2:\n", " pass\n", "# # =================================================\n", "# # Resideual level tasks: Model B\n", "# # =================================================\n", "\n", "# # working code: assemble the model archi\n", "# print('--------------------------------------------')\n", "# print('On OneD_Unet...')\n", "# print('--------------------------------------------')\n", "# working_unet = ModelPack.OneD_Unet(\n", "# CKeys=CKeys,\n", "# PKeys=ModelKeys['UNet'],\n", "# ).to(device)\n", "\n", "# print(\"Working unet part model: \")\n", "# UtilityPack.params ( working_unet)\n", "\n", "# print('--------------------------------------------')\n", "# print('On whole model...')\n", "# print('--------------------------------------------')\n", "# # on the model part\n", "# working_model = ModelPack.ProteinDesigner_B(\n", "# working_unet,\n", "# CKeys=CKeys,\n", "# PKeys=ModelKeys['Imagen'],\n", "# ). to(device)\n", "\n", "# # measure\n", "# print (\"Total working model: \")\n", "# UtilityPack.params ( working_model)\n", "# print (\"Recasted unet inside the tot one only: \")\n", "# UtilityPack.params ( working_model.imagen.unets[0])\n", "\n", "# print('--------------------------------------------')\n", "# print('On trainer...')\n", "# print('--------------------------------------------')\n", "# working_trainer = TrainerPack.ImagenTrainer(\n", "# working_model,\n", "# CKeys=CKeys\n", "# )\n", "\n", "elif CKeys['Problem_ID']==3 or CKeys['Problem_ID']==4:\n", " pass\n", "# # =================================================\n", "# # Sequence level tasks: Model A\n", "# # =================================================\n", "\n", "# # working code: assemble the model archi\n", "# print('--------------------------------------------')\n", "# print('On OneD_Unet...')\n", "# print('--------------------------------------------')\n", "# working_unet = ModelPack.OneD_Unet(\n", "# CKeys=CKeys,\n", "# PKeys=ModelKeys['UNet'],\n", "# ).to(device)\n", "\n", "# print(\"Working unet part model: \")\n", "# UtilityPack.params ( working_unet)\n", "\n", "# print('--------------------------------------------')\n", "# print('On whole model...')\n", "# print('--------------------------------------------')\n", "# # on the model part\n", "# working_model = ModelPack.ProteinDesigner_A_II(\n", "# working_unet,\n", "# CKeys=CKeys,\n", "# PKeys=ModelKeys['Imagen'],\n", "# ). to(device)\n", "\n", "# # measure\n", "# print (\"Total working model: \")\n", "# UtilityPack.params ( working_model)\n", "# print (\"Recasted unet inside the tot one only: \")\n", "# UtilityPack.params ( working_model.imagen.unets[0])\n", "\n", "# print('--------------------------------------------')\n", "# print('On trainer...')\n", "# print('--------------------------------------------')\n", "# working_trainer = TrainerPack.ImagenTrainer(\n", "# working_model,\n", "# CKeys=CKeys\n", "# )\n", "\n", "elif CKeys['Problem_ID']==5 or CKeys['Problem_ID']==6 \\\n", "or CKeys['Problem_ID']==11:\n", " # =================================================\n", " # Resideual level tasks: Model B\n", " # =================================================\n", "\n", " # working code: assemble the model archi\n", " print('--------------------------------------------')\n", " print('On OneD_Unet...')\n", " print('--------------------------------------------')\n", " working_unet = ModelPack.OneD_Unet(\n", " CKeys=CKeys,\n", " PKeys=ModelKeys['UNet'],\n", " ).to(device)\n", "\n", " print(\"Working unet part model: \")\n", " UtilityPack.params ( working_unet)\n", "\n", " print('--------------------------------------------')\n", " print('On whole model...')\n", " print('--------------------------------------------')\n", " # on the model part\n", " working_model = ModelPack.ProteinDesigner_B(\n", " working_unet,\n", " CKeys=CKeys,\n", " PKeys=ModelKeys['Imagen'],\n", " ). to(device)\n", "\n", " # measure\n", " print (\"Total working model: \")\n", " UtilityPack.params ( working_model)\n", " print (\"Recasted unet inside the tot one only: \")\n", " UtilityPack.params ( working_model.imagen.unets[0])\n", "\n", " print('--------------------------------------------')\n", " print('On trainer...')\n", " print('--------------------------------------------')\n", " working_trainer = TrainerPack.ImagenTrainer(\n", " working_model,\n", " CKeys=CKeys\n", " )\n", "\n", "elif CKeys['Problem_ID']==7 or CKeys['Problem_ID']==8:\n", " # =================================================\n", " # Sequence level tasks: Model A\n", " # =================================================\n", "\n", " # working code: assemble the model archi\n", " print('--------------------------------------------')\n", " print('On OneD_Unet...')\n", " print('--------------------------------------------')\n", " working_unet = ModelPack.OneD_Unet(\n", " CKeys=CKeys,\n", " PKeys=ModelKeys['UNet'],\n", " ).to(device)\n", "\n", " print(\"Working unet part model: \")\n", " UtilityPack.params ( working_unet)\n", "\n", " print('--------------------------------------------')\n", " print('On whole model...')\n", " print('--------------------------------------------')\n", " # on the model part\n", " working_model = ModelPack.ProteinDesigner_A_II(\n", " working_unet,\n", " CKeys=CKeys,\n", " PKeys=ModelKeys['Imagen'],\n", " ). to(device)\n", "\n", " # measure\n", " print (\"Total working model: \")\n", " UtilityPack.params ( working_model)\n", " print (\"Recasted unet inside the tot one only: \")\n", " UtilityPack.params ( working_model.imagen.unets[0])\n", "\n", " print('--------------------------------------------')\n", " print('On trainer...')\n", " print('--------------------------------------------')\n", " working_trainer = TrainerPack.ImagenTrainer(\n", " working_model,\n", " CKeys=CKeys\n", " )\n", "\n", "\n", "\n", "del working_unet\n", "torch.cuda.empty_cache()" ] }, { "cell_type": "code", "execution_count": 11, "id": "oP6SZ_omkf8k", "metadata": { "cellView": "form", "colab": { "base_uri": "https://localhost:8080/" }, "id": "oP6SZ_omkf8k", "outputId": "5f3b1fc4-3647-4a11-da46-c930d8fc9391" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Check tokenizer_X: None\n", "tokenizer_y: None\n" ] } ], "source": [ "#@title ### 1.4. Training part\n", "\n", "if CKeys['Working_Mode']==1:\n", " print(\"Training mode...\")\n", "\n", " TrainKeys={}\n", " if CKeys['Debug']==1:\n", " TrainKeys['epochs']=4\n", " TrainKeys['print_loss_every_this_epochs']=1\n", " TrainKeys['sample_every_this_epochs']=1\n", " TrainKeys['save_model_every_this_epochs']=2\n", " else:\n", " TrainKeys['epochs']=CKeys['epochs'] # 200\n", " TrainKeys['print_loss_every_this_epochs']=CKeys['print_loss_every_this_epochs'] # 5\n", " TrainKeys['sample_every_this_epochs']=CKeys['sample_every_this_epochs'] # 10\n", " TrainKeys['save_model_every_this_epochs']=CKeys['save_model_every_this_epochs'] # 20\n", "\n", "# one mini batch\n", "if CKeys['Debug']==1 and CKeys['Debug_DataPack']==1:\n", " print(\"in a mini-batch:\")\n", " print(\"input.dim: \", this_item[0].shape)\n", " # print(this_item[0][0,:]*torch.FloatTensor(DataKeys['Xnormfac']))\n", " print(\"output.dim: \", this_item[1].shape)\n", " print(DataKeys['Xnormfac'])\n", "\n", "if CKeys['Working_Mode']==1:\n", " # ==============================================================\n", " # copy from the above when debug is done:\n", " # ==============================================================\n", " # a few files for restarts:\n", " TRAINING_HIST_FILE = ModelKeys['model_dir']+'Training_Hist.csv'\n", " TRAINING_HIST_FILE_FULL = ModelKeys['model_dir']+'Training_Hist_Full.csv'\n", " TRAINING_BREAK_POINT = ModelKeys['model_dir']+'Training_Info.txt'\n", "\n", " if CKeys['Problem_ID']==1:\n", " pass\n", " # # de novo test\n", " # test_condition_list = [\n", " # ['~~~HHHHHHHHHHHHHHH~~'],\n", " # ['~~EEESSTTS~SEEEEEEEEE~SBS~EEEEEE~~'],\n", " # ]\n", "\n", " elif CKeys['Problem_ID']==2:\n", " pass\n", "\n", " # test_condition_list = [\n", " # np.expand_dims(np.array(DataSetPack.pad_a_np_arr(protein_df['sample_NormPullGap_data'][pick_id_0],0,64))*DataKeys['Xnormfac']*0.33, axis=0),\n", " # np.expand_dims(np.array(DataSetPack.pad_a_np_arr(protein_df['sample_NormPullGap_data'][pick_id_0],0,64))*DataKeys['Xnormfac']*0.66, axis=0),\n", " # ]\n", "\n", " # de novo test\n", " elif CKeys['Problem_ID']==3:\n", " pass\n", "\n", " # test_condition_list = [\n", " # [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],\n", " # [0, 0.7, 0.07, 0.1, 0.01, 0.02, 0.01, 0.11],\n", " # ]\n", "\n", " elif CKeys['Problem_ID']==4:\n", " pass\n", "\n", " # # here we used normalized (nFmax, nToughness)\n", " # # the real values will be (nFmax, nToughness)*Xnormfac\n", " # test_condition_list = [\n", " # [0.5, 0.5],\n", " # [0.2, 0.8],\n", " # ]\n", "\n", " # # #\n", " # # test_condition_list = [\n", " # # np.expand_dims(np.array(this_item[0][10,:]*DataKeys['Xnormfac']), axis=0),\n", " # # np.expand_dims(np.array(this_item[0][20,:]*DataKeys['Xnormfac']), axis=0),\n", " # # ]\n", " # # protein_df['sample_NormPullGap_data'][pick_id_0]\n", " # # DataSetPack.pad_a_np_arr(protein_df['sample_NormPullGap_data'][pick_id_0],0,64)\n", " # # #\n", " # test_condition_list = [\n", " # np.expand_dims(np.array(DataSetPack.pad_a_np_arr(protein_df['sample_NormPullGap_data'][pick_id_0],0,64))*DataKeys['Xnormfac']*0.33, axis=0),\n", " # np.expand_dims(np.array(DataSetPack.pad_a_np_arr(protein_df['sample_NormPullGap_data'][pick_id_0],0,64))*DataKeys['Xnormfac']*0.66, axis=0),\n", " # ]\n", " elif CKeys['Problem_ID']==5:\n", " pass\n", "\n", " # # de novo test\n", " # test_condition_list = [\n", " # ['~~~HHHHHHHHHHHHHHH~~'],\n", " # ['~~EEESSTTS~SEEEEEEEEE~SBS~EEEEEE~~'],\n", " # ]\n", "\n", " #\n", " elif CKeys['Problem_ID']==6 or CKeys['Problem_ID']==11:\n", " # for ESM model: 0+content+00\n", " # test_condition_list = [\n", " # np.expand_dims(np.array([0]+DataSetPack.pad_a_np_arr(protein_df['sample_NormPullGap_data'][pick_id_0],0,64-1))*DataKeys['Xnormfac']*0.33, axis=0),\n", " # np.expand_dims(np.array([0]+DataSetPack.pad_a_np_arr(protein_df['sample_NormPullGap_data'][pick_id_0],0,64-1))*DataKeys['Xnormfac']*0.66, axis=0),\n", " # ]\n", " #\n", " # test_condition_list = [\n", " # np.insert(np.array(DataSetPack.pad_a_np_arr(protein_df['sample_NormPullGap_data'][pick_id_0],0,64-1))*DataKeys['Xnormfac']*0.33, 0, 0.),\n", " # np.insert(np.array(DataSetPack.pad_a_np_arr(protein_df['sample_NormPullGap_data'][pick_id_0],0,64-1))*DataKeys['Xnormfac']*0.66, 0, 0.),\n", " # ]\n", " #\n", " test_0 = DataSetPack.pad_a_np_arr(\n", " protein_df['sample_FORCE_data'][pick_id_0],\n", " 0.,\n", " DataKeys['max_AA_seq_len']\n", " )\n", " test_1 = DataSetPack.pad_a_np_arr_esm(\n", " protein_df['sample_FORCE_data'][pick_id_1],\n", " 0.,\n", " DataKeys['max_AA_seq_len']\n", " )\n", " # test_condition_list = [\n", " # test_0*0.33,\n", " # test_0*0.66,\n", " # test_1*0.33,\n", " # test_1*0.66,\n", " # ]\n", " test_condition_list = [\n", " test_0*0.66,\n", " test_1*1.66,\n", " ]\n", "\n", "\n", " #\n", " # de novo test\n", " elif CKeys['Problem_ID']==7:\n", " pass\n", "\n", " # test_condition_list = [\n", " # [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],\n", " # [0, 0.7, 0.07, 0.1, 0.01, 0.02, 0.01, 0.11],\n", " # ]\n", "\n", " elif CKeys['Problem_ID']==8:\n", "\n", " test_condition_list = [\n", " [0.2, 0.8]*DataKeys['Xnormfac'],\n", " [0.8, 0.2]*DataKeys['Xnormfac'],\n", " ]\n", "\n", "\n", " else:\n", " print(\"No de novo condition is found for the problem...\")\n", "\n", "\n", "\n", "print('Check tokenizer_X:', tokenizer_X)\n", "print('tokenizer_y:', tokenizer_y)\n", "# skip training part" ] }, { "cell_type": "code", "execution_count": 12, "id": "k65qjerclFxn", "metadata": { "cellView": "form", "colab": { "base_uri": "https://localhost:8080/" }, "id": "k65qjerclFxn", "outputId": "eed8ac6c-fa75-4784-cde6-f3bc7866aeb7" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "This is testing model...\n", "Creating the given path...\n", "Done.\n", "/content/working_results/\n", "Load back the saved model...\n", "checkpoint loaded from /content/working_results/1_model_SS/trainer_save-model_pLDM.pt\n", "11\n", "esm2_t30_150M_UR50D\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "Downloading: \"https://dl.fbaipublicfiles.com/fair-esm/models/esm2_t30_150M_UR50D.pt\" to /root/.cache/torch/hub/checkpoints/esm2_t30_150M_UR50D.pt\n", "Downloading: \"https://dl.fbaipublicfiles.com/fair-esm/regression/esm2_t30_150M_UR50D-contact-regression.pt\" to /root/.cache/torch/hub/checkpoints/esm2_t30_150M_UR50D-contact-regression.pt\n" ] } ], "source": [ "#@title ### 1.5. Testing loop\n", "\n", "if CKeys['Working_Mode']==2:\n", " print(\"This is testing model...\")\n", " # setup test key\n", " TestKeys={}\n", " TestKeys['Sample_On_TestSet']=False # True # True # False\n", " TestKeys['Sample_On_DeNovo']=True\n", " # create a test dir\n", " # TestKeys['test_dir']=PKeys['prefix']+'2_test/'\n", " # TestKeys['test_dir']=PKeys['prefix']+'3_test_common_denovo/'\n", " # add for colab\n", " TestKeys['test_dir']=PKeys['prefix']+'4_test_individual_cases/'\n", " UtilityPack.create_path(TestKeys['test_dir'])\n", "print(PKeys['prefix'])\n", "\n", "\n", "if CKeys['Working_Mode']==2:\n", " # skip for colab inferring\n", " pass\n", " # # looking back at the training\n", " # print(\"Check the training history...\")\n", " # #\n", " # # training history\n", " # TRAINING_HIST_FILE = ModelKeys['model_dir']+'Training_Hist.csv'\n", " # TRAINING_HIST_FILE_FULL = ModelKeys['model_dir']+'Training_Hist_Full.csv'\n", " # TRAINING_BREAK_POINT = ModelKeys['model_dir']+'Training_Info.txt'\n", "\n", " # # pick up the leftover info\n", " # # train_rec = pd.read_csv(TRAINING_HIST_FILE)\n", " # train_rec = pd.read_csv(TRAINING_HIST_FILE_FULL)\n", " # #\n", " # id_best_loss = np.argmin(train_rec['norm_loss'])\n", " # best_epoch = train_rec['epoch'][id_best_loss]\n", " # # print(best_epoch)\n", " # print(f\"Best epoch: {best_epoch}; LOSS: {train_rec['norm_loss'][id_best_loss]}\", )\n", "\n", " # fig = plt.figure()\n", " # plt.plot(\n", " # train_rec['epoch'],\n", " # train_rec['norm_loss'],\n", " # label='Loss',\n", " # )\n", " # plt.legend()\n", " # outname=TestKeys['test_dir']+\"0_Training_Hist.jpg\"\n", " # if CKeys['SlientRun']==1:\n", " # plt.savefig(outname, dpi=200)\n", " # else:\n", " # pass\n", " # plt.show()\n", " # plt.close(fig)\n", "\n", " # #\n", " # # pick up the breaking point of last time\n", " # breaking_rec = pd.read_csv(TRAINING_BREAK_POINT)\n", " # last_epoch = breaking_rec['epoch'][0]\n", " # last_step = breaking_rec['steps'][0]\n", " # # print(\"Last epoch: \", breaking_rec['epoch'][0])\n", " # print(f\"Last epoch: {last_epoch}; LOSS: {breaking_rec['norm_loss'][0]}\", )\n", " #\n", " # last_epoch = 4000\n", " # last_step = 92000\n", "\n", "\n", "if CKeys['Working_Mode']==2:\n", " print(\"Load back the saved model...\")\n", " # load back the LAST model:\n", " # model_last_fname=f\"{ModelKeys['model_dir_model']}trainer_save-model-epoch_{last_epoch}.pt\"\n", " model_last_fname=f\"{this_working_path}1_model_SS/trainer_save-model_pLDM.pt\"\n", " working_trainer.load(model_last_fname)\n", " # TBA: load back the Best model AVAILABLE\n", "\n", "print(CKeys['Problem_ID'])\n", "print(DataKeys['ESM-2_Model'])\n", "# +++++++++++++++++++++++++++++++++++++++++++++\n", "# for pLM models, we need to add the\n", "# pretrained pLM model\n", "# +++++++++++++++++++++++++++++++++++++++++++++\n", "if CKeys['Working_Mode']==2:\n", " #\n", " if CKeys['Problem_ID']==5 or CKeys['Problem_ID']==6 \\\n", " or CKeys['Problem_ID']==11 :\n", " pLM_Model_Name=DataKeys['ESM-2_Model']\n", "# # --\n", "# import esm\n", "# # make this into a function\n", "# # ++ for pLM\n", "# if pLM_Model_Name=='None':\n", "# pLM_Model=None\n", "\n", "# elif pLM_Model_Name=='esm2_t33_650M_UR50D':\n", "# # dim: 1280\n", "# pLM_Model, esm_alphabet = esm.pretrained.esm2_t33_650M_UR50D()\n", "# len_toks=len(esm_alphabet.all_toks)\n", "# pLM_Model.eval()\n", "# pLM_Model. to(device)\n", "\n", "# elif pLM_Model_Name=='esm2_t36_3B_UR50D':\n", "# # dim: 2560\n", "# esm_layer=36\n", "# pLM_Model, esm_alphabet = esm.pretrained.esm2_t36_3B_UR50D()\n", "# len_toks=len(esm_alphabet.all_toks)\n", "# pLM_Model.eval()\n", "# pLM_Model. to(device)\n", "\n", "# elif pLM_Model_Name=='esm2_t30_150M_UR50D':\n", "# # dim: 640\n", "# esm_layer=30\n", "# pLM_Model, esm_alphabet = esm.pretrained.esm2_t30_150M_UR50D()\n", "# len_toks=len(esm_alphabet.all_toks)\n", "# pLM_Model.eval()\n", "# pLM_Model. to(device)\n", "\n", "# elif pLM_Model_Name=='esm2_t12_35M_UR50D':\n", "# # dim: 480\n", "# esm_layer=12\n", "# pLM_Model, esm_alphabet = esm.pretrained.esm2_t12_35M_UR50D()\n", "# len_toks=len(esm_alphabet.all_toks)\n", "# pLM_Model.eval()\n", "# pLM_Model. to(device)\n", "\n", "# else:\n", "# print(\"pLM model is missing...\")\n", " pLM_Model,esm_alphabet,_,_ = UtilityPack.load_in_pLM(\n", " pLM_Model_Name,\n", " device\n", " )\n" ] }, { "cell_type": "code", "execution_count": 13, "id": "LbFnbaCB2A7H", "metadata": { "cellView": "form", "colab": { "base_uri": "https://localhost:8080/", "height": 1000, "referenced_widgets": [ "f6ec7f703621416fb631812d2f8def00", "68b23bcc31a8453890de44568dfeb1ee", "ef0f7e87f6334939bea151726af03b83", "5d5f291eb6644e6d95d07ba755b56870", "a37c10d569254e958453c189f15cdf9c", "e37c525959bc4dc0ad96b94d83153319", "2ab06057ee1e4c11a487f0d1b289373c", "595600bfe70f4c0bb5fb200217116674", "e2893aae1bb7495e96c770bcdf3dfa4d", "b7dfef148b8645ea9b2c70103a81b6d0", "d908b047df4f4ea59d37355d673319bc", "f833b0f88df14acf8432b8a7098d029f", "bf0a9c22ce974f2eb796c2275e7dec12", "1521cf912d2f4207866034891baad8d9", "51c23b8303c9450f8cfe8c8015ccfa9d", "9901ee5e2d554071a43888b93ddf0073", "a1cfeea9cbab45eca372c506825e25f4", "af16e614a3104abfa5179e6b3e066397", "0f9a7631770a4c64845d95effc1c38ba", "b164b59990084bed94eca230208166ca", "7b5706c2f1a84fabbb828a1bacb36b3d", "d04ff74e247443bc8d8127e3f2161c0c" ] }, "id": "LbFnbaCB2A7H", "outputId": "557258f6-671a-4a97-ccf4-3962a1e14b6a" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Run sampling on De Novo inputs set...\n", "Loading back a common de novo tests: \n", "Get de novo tests #: 8\n", "On the inputs:\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "
" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Now, make design based on the inputs...\n", "\n", "\n", "\n", "Producing 2 samples...from image conditingig x_data ...\n", "Input contents:\n", "cond_img condition: x_data=\n", " [array([ 0. , 0. , 0. , 0. ,\n", " 0. , 0. , 0. , 0. ,\n", " 18.28863362, 80.0692019 , 138.13979123, 139.44611167,\n", " 129.23179473, 124.99945748, 147.03594515, 154.26267409,\n", " 85.748749 , 94.74763505, 127.92603341, 123.13805332,\n", " 99.12313939, 146.59346182, 165.770035 , 193.86780985,\n", " 214.00913136, 230.90415894, 285.97514621, 220.28478982,\n", " 165.21657777, 140.97041526, 160.604996 , 182.73803652,\n", " 159.35024788, 149.0699255 , 150.54626136, 148.51384136,\n", " 141.537062 , 178.25737158, 183.89341758, 187.809765 ,\n", " 179.40302 , 167.89063924, 145.78564655, 130.70708892,\n", " 156.36648317, 138.20652636, 134.73462406, 99.97278411,\n", " 119.99524355, 175.66467083, 201.65559424, 212.72502818,\n", " 187.39930591, 153.31598397, 134.58059364, 195.43962833,\n", " 201.50041515, 198.09182045, 181.17193439, 175.74727894,\n", " 156.24546282, 153.27967029, 149.26799638, 144.94954964,\n", " 138.48748241, 154.92514391, 179.62173 , 185.41952212,\n", " 194.21023345, 183.58478745, 157.48736061, 156.53251552,\n", " 171.67232909, 158.94420333, 176.64668212, 154.79523564,\n", " 167.48380455, 189.05203 , 173.74290091, 186.28143273,\n", " 214.02058894, 215.24586955, 219.26901409, 213.58790242,\n", " 200.20914818, 223.59095136, 212.30616773, 233.90132136,\n", " 228.09856667, 222.87644909, 256.01106682, 250.59852318,\n", " 243.01985182, 292.44150727, 284.88984348, 284.51895106,\n", " 295.07615818, 332.62036364, 365.2915753 , 382.064295 ]), array([ 0. , 0. , 0. , 0. ,\n", " 0. , 0. , 0. , 0. ,\n", " 12.19242241, 53.37946793, 92.09319415, 92.96407444,\n", " 86.15452982, 83.33297166, 98.02396343, 102.84178273,\n", " 57.16583267, 63.16509003, 85.28402227, 82.09203555,\n", " 66.08209293, 97.72897455, 110.51335667, 129.24520657,\n", " 142.67275424, 153.93610596, 190.65009747, 146.85652655,\n", " 110.14438518, 93.98027684, 113.26618295, 130.32051743,\n", " 115.21384005, 109.95814935, 111.50363362, 112.12047879,\n", " 110.6379971 , 139.25401676, 147.61078685, 144.61681044,\n", " 135.93508952, 133.8414882 , 112.20370803, 105.51703962,\n", " 126.78428185, 115.69128733, 114.14739412, 86.50069256,\n", " 97.78519682, 137.55264183, 161.15336059, 169.76223629,\n", " 154.79631037, 136.03060112, 129.56109911, 159.6066976 ,\n", " 159.01942819, 156.89666416, 140.6024269 , 145.42806336,\n", " 136.13430188, 133.84294094, 130.63544912, 126.44938608,\n", " 125.60422528, 139.85916623, 153.52631933, 157.29334918,\n", " 166.96625393, 163.38836786, 146.11630993, 156.10143063,\n", " 169.23123586, 157.99337498, 162.88871136, 142.62287141,\n", " 156.99899748, 176.13464122, 163.78415271, 164.45332481,\n", " 189.85552387, 195.0109843 , 195.37009694, 189.6662509 ,\n", " 189.36861348, 214.00427838, 213.70498551, 233.86747303,\n", " 236.059855 , 238.31386515, 263.50758182, 255.58019414,\n", " 242.30366399, 269.54060652, 264.16919869, 272.51291813,\n", " 283.48890394, 310.40469131, 337.19108152, 362.22738833])]\n", "Text condition: X_cond=\n", " None\n", "Working on cond_scale 1.0\n", "Conditioning target sequence provided via x_data_tokenized ... tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0244,\n", " 0.1068, 0.1842, 0.1859, 0.1723, 0.1667, 0.1960, 0.2057, 0.1143, 0.1263,\n", " 0.1706, 0.1642, 0.1322, 0.1955, 0.2210, 0.2585, 0.2853, 0.3079, 0.3813,\n", " 0.2937, 0.2203, 0.1880, 0.2141, 0.2437, 0.2125, 0.1988, 0.2007, 0.1980,\n", " 0.1887, 0.2377, 0.2452, 0.2504, 0.2392, 0.2239, 0.1944, 0.1743, 0.2085,\n", " 0.1843, 0.1796, 0.1333, 0.1600, 0.2342, 0.2689, 0.2836, 0.2499, 0.2044,\n", " 0.1794, 0.2606, 0.2687, 0.2641, 0.2416, 0.2343, 0.2083, 0.2044, 0.1990,\n", " 0.1933, 0.1846, 0.2066, 0.2395, 0.2472, 0.2589, 0.2448, 0.2100, 0.2087,\n", " 0.2289, 0.2119, 0.2355, 0.2064, 0.2233, 0.2521, 0.2317, 0.2484, 0.2854,\n", " 0.2870, 0.2924, 0.2848, 0.2669, 0.2981, 0.2831, 0.3119, 0.3041, 0.2972,\n", " 0.3413, 0.3341, 0.3240, 0.3899, 0.3799, 0.3794, 0.3934, 0.4435, 0.4871,\n", " 0.5094, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n", " 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n", " 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n", " 0.0000, 0.0000],\n", " [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0163,\n", " 0.0712, 0.1228, 0.1240, 0.1149, 0.1111, 0.1307, 0.1371, 0.0762, 0.0842,\n", " 0.1137, 0.1095, 0.0881, 0.1303, 0.1474, 0.1723, 0.1902, 0.2052, 0.2542,\n", " 0.1958, 0.1469, 0.1253, 0.1510, 0.1738, 0.1536, 0.1466, 0.1487, 0.1495,\n", " 0.1475, 0.1857, 0.1968, 0.1928, 0.1812, 0.1785, 0.1496, 0.1407, 0.1690,\n", " 0.1543, 0.1522, 0.1153, 0.1304, 0.1834, 0.2149, 0.2263, 0.2064, 0.1814,\n", " 0.1727, 0.2128, 0.2120, 0.2092, 0.1875, 0.1939, 0.1815, 0.1785, 0.1742,\n", " 0.1686, 0.1675, 0.1865, 0.2047, 0.2097, 0.2226, 0.2179, 0.1948, 0.2081,\n", " 0.2256, 0.2107, 0.2172, 0.1902, 0.2093, 0.2348, 0.2184, 0.2193, 0.2531,\n", " 0.2600, 0.2605, 0.2529, 0.2525, 0.2853, 0.2849, 0.3118, 0.3147, 0.3178,\n", " 0.3513, 0.3408, 0.3231, 0.3594, 0.3522, 0.3634, 0.3780, 0.4139, 0.4496,\n", " 0.4830, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n", " 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n", " 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n", " 0.0000, 0.0000]]) torch.Size([2, 128])\n", "x_data.dim provided from x_data_tokenized: torch.Size([2, 33, 128])\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "0it [00:00, ?it/s]" ], "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "f6ec7f703621416fb631812d2f8def00" } }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "sampling time step: 0%| | 0/96 [00:00" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGdCAYAAACyzRGfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9aZhl21keCL57OufElBmZeef5ahYSEhqvBsACVEhqlxgMVY27MdBFl11YuAqrjJ+S26aA5rFscHugLcBu08LYBqqZjQcECJAA6d4rXUloQLrSle6UeefMjIzhDHvsH2t9a31r7bX32fvEkBF51vc8+URkxIlz9hn2Xu963/d7v6Cqqgq+fPny5cuXL19HVOHVPgBfvnz58uXL13KVBx++fPny5cuXryMtDz58+fLly5cvX0daHnz48uXLly9fvo60PPjw5cuXL1++fB1pefDhy5cvX758+TrS8uDDly9fvnz58nWk5cGHL1++fPny5etIK77aB2BXWZZ44oknsLGxgSAIrvbh+PLly5cvX746VFVV2NnZwS233IIwbOc2jh34eOKJJ3D77bdf7cPw5cuXL1++fC1Qjz/+OG677bbW2xw78LGxsQFAHPypU6eu8tH48uXLly9fvrrU9vY2br/9drWOt9WxAx8ktZw6dcqDD1++fPny5euEVRfLhDec+vLly5cvX76OtDz48OXLly9fvnwdaXnw4cuXL1++fPk60vLgw5cvX758+fJ1pOXBhy9fvnz58uXrSMuDD1++fPny5cvXkZYHH758+fLly5evIy0PPnz58uXLly9fR1oefPjy5cuXL1++jrQ8+PDly5cvX758HWl58OHLly9fvnz5OtLy4MOXL1++fPnydaTlwYcvX8tQsx3gz/4FcOnh+bd96jPAR98HFPnhH5cvX76Wsjz48OVrGepzvwX8/o8AH/6p+bf9wN8T/x758KEfli9fvpazPPjw5WsZanpFfB1fmn/bvefE19nO4R2PL1++lro8+PDlaxmqSMXXfDL/trNd8bX0sosvX74Opzz48OVrGYqARDadf9uUwEdxeMfjy5evpS4PPnz5WoYqMvG1C/OR7omvHnz48uXrkMqDD1++lqFKCT7mMR9FBhQz+TdedvHly9fhlAcfvnwtQ3VlPkhyATz48OXL16GVBx++fC1DdfV8zBj4qLzs4suXr8Mp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\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "tensor([17, 20, 14, 14, 4, 5, 15, 7, 12, 11, 18, 10, 5, 17, 11, 6, 14, 18,\n", " 15, 4, 14, 9, 14, 9, 9, 12, 20, 10, 16, 10, 6, 8, 5, 6, 6, 14,\n", " 14, 21, 19, 6, 14, 15, 7, 17, 15, 19, 11, 14, 5, 6, 7, 15, 11, 7,\n", " 9, 15, 16, 22, 14, 9, 6, 4, 4, 15, 13, 9, 9, 15, 14, 9, 7, 7,\n", " 14, 11, 11, 10, 8, 5, 20, 15, 18, 19, 8, 12, 7, 5, 5, 14, 15, 8,\n", " 17, 6, 4, 7, 13, 13, 12, 11, 15, 16, 17, 9, 8, 15, 9, 11, 20, 13,\n", " 17, 11, 13, 17, 11, 11, 11, 17, 11, 13, 13, 17, 13, 13, 11, 17, 13, 11,\n", " 11, 10], device='cuda:0')\n", "tensor([ 5, 20, 13, 13, 14, 11, 15, 4, 5, 5, 4, 17, 19, 4, 11, 10, 5, 18,\n", " 8, 4, 7, 8, 5, 5, 13, 4, 4, 7, 18, 10, 9, 5, 10, 4, 6, 18,\n", " 14, 14, 10, 6, 10, 10, 5, 6, 12, 19, 19, 6, 5, 17, 13, 7, 11, 11,\n", " 23, 16, 18, 23, 6, 7, 6, 6, 18, 9, 5, 9, 9, 6, 5, 13, 14, 14,\n", " 4, 11, 22, 22, 15, 22, 20, 14, 8, 14, 12, 7, 7, 4, 5, 8, 15, 5,\n", " 13, 13, 12, 7, 14, 9, 4, 15, 4, 4, 11, 9, 9, 8, 15, 14, 11, 11,\n", " 11, 17, 13, 17, 11, 11, 17, 11, 17, 13, 11, 11, 17, 17, 17, 11, 11, 11,\n", " 11, 11], device='cuda:0')\n", "For None or [ 0. 0. 0. 0. 0.\n", " 0. 0. 0. 18.28863362 80.0692019\n", " 138.13979123 139.44611167 129.23179473 124.99945748 147.03594515\n", " 154.26267409 85.748749 94.74763505 127.92603341 123.13805332\n", " 99.12313939 146.59346182 165.770035 193.86780985 214.00913136\n", " 230.90415894 285.97514621 220.28478982 165.21657777 140.97041526\n", " 160.604996 182.73803652 159.35024788 149.0699255 150.54626136\n", " 148.51384136 141.537062 178.25737158 183.89341758 187.809765\n", " 179.40302 167.89063924 145.78564655 130.70708892 156.36648317\n", " 138.20652636 134.73462406 99.97278411 119.99524355 175.66467083\n", " 201.65559424 212.72502818 187.39930591 153.31598397 134.58059364\n", " 195.43962833 201.50041515 198.09182045 181.17193439 175.74727894\n", " 156.24546282 153.27967029 149.26799638 144.94954964 138.48748241\n", " 154.92514391 179.62173 185.41952212 194.21023345 183.58478745\n", " 157.48736061 156.53251552 171.67232909 158.94420333 176.64668212\n", " 154.79523564 167.48380455 189.05203 173.74290091 186.28143273\n", " 214.02058894 215.24586955 219.26901409 213.58790242 200.20914818\n", " 223.59095136 212.30616773 233.90132136 228.09856667 222.87644909\n", " 256.01106682 250.59852318 243.01985182 292.44150727 284.88984348\n", " 284.51895106 295.07615818 332.62036364 365.2915753 382.064295 ], predicted sequence: MPPLAKVITFRANTGPFKLPEPEEIMRQRGSAGGPPHYGPKVNKYTPAGVKTVEKQWPEGLLKDEEKPEVVPTTRSAMKFYSIVAAPKSNGLVDDITKQ\n", "================================================\n", "foldproteins: True\n", "Writing FASTA file: /content/working_results/4_test_individual_cases/fasta_in_100.fasta\n", "Now run OmegaFold.... on device=cuda:0\n", "INFO:root:Loading weights from /root/.cache/omegafold_ckpt/model.pt\n", "INFO:root:Constructing OmegaFold\n", "INFO:root:Reading /content/working_results/4_test_individual_cases/fasta_in_100.fasta\n", "INFO:root:Predicting 1th chain in /content/working_results/4_test_individual_cases/fasta_in_100.fasta\n", "INFO:root:99 residues in this chain.\n", "INFO:root:Finished prediction in 8.89 seconds.\n", "INFO:root:Saving prediction to /content/working_results/4_test_individual_cases/temp_100.pdb\n", "INFO:root:Saved\n", "INFO:root:Done!\n", "\n", "Done OmegaFold\n", "Resulting PDB file...: /content/working_results/4_test_individual_cases/temp_100.pdb\n", "Properly named PDB file produced: /content/working_results/4_test_individual_cases/DN_0_CondS_No_0_Val_1.0_epo_100_step_100.pdb\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} }, { "output_type": "display_data", "data": { "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", "text/html": [ "
\n", "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "For None or [ 0. 0. 0. 0. 0.\n", " 0. 0. 0. 12.19242241 53.37946793\n", " 92.09319415 92.96407444 86.15452982 83.33297166 98.02396343\n", " 102.84178273 57.16583267 63.16509003 85.28402227 82.09203555\n", " 66.08209293 97.72897455 110.51335667 129.24520657 142.67275424\n", " 153.93610596 190.65009747 146.85652655 110.14438518 93.98027684\n", " 113.26618295 130.32051743 115.21384005 109.95814935 111.50363362\n", " 112.12047879 110.6379971 139.25401676 147.61078685 144.61681044\n", " 135.93508952 133.8414882 112.20370803 105.51703962 126.78428185\n", " 115.69128733 114.14739412 86.50069256 97.78519682 137.55264183\n", " 161.15336059 169.76223629 154.79631037 136.03060112 129.56109911\n", " 159.6066976 159.01942819 156.89666416 140.6024269 145.42806336\n", " 136.13430188 133.84294094 130.63544912 126.44938608 125.60422528\n", " 139.85916623 153.52631933 157.29334918 166.96625393 163.38836786\n", " 146.11630993 156.10143063 169.23123586 157.99337498 162.88871136\n", " 142.62287141 156.99899748 176.13464122 163.78415271 164.45332481\n", " 189.85552387 195.0109843 195.37009694 189.6662509 189.36861348\n", " 214.00427838 213.70498551 233.86747303 236.059855 238.31386515\n", " 263.50758182 255.58019414 242.30366399 269.54060652 264.16919869\n", " 272.51291813 283.48890394 310.40469131 337.19108152 362.22738833], predicted sequence: MDDPTKLAALNYLTRAFSLVSAADLLVFREARLGFPPRGRRAGIYYGANDVTTCQFCGVGGFEAEEGADPPLTWWKWMPSPIVVLASKADDIVPELKLL\n", "================================================\n", "foldproteins: True\n", "Writing FASTA file: /content/working_results/4_test_individual_cases/fasta_in_100.fasta\n", "Now run OmegaFold.... on device=cuda:0\n", "INFO:root:Loading weights from /root/.cache/omegafold_ckpt/model.pt\n", "INFO:root:Constructing OmegaFold\n", "INFO:root:Reading /content/working_results/4_test_individual_cases/fasta_in_100.fasta\n", "INFO:root:Predicting 1th chain in /content/working_results/4_test_individual_cases/fasta_in_100.fasta\n", "INFO:root:99 residues in this chain.\n", "INFO:root:Finished prediction in 8.87 seconds.\n", "INFO:root:Saving prediction to /content/working_results/4_test_individual_cases/temp_100.pdb\n", "INFO:root:Saved\n", "INFO:root:Done!\n", "\n", "Done OmegaFold\n", "Resulting PDB file...: /content/working_results/4_test_individual_cases/temp_100.pdb\n", "Properly named PDB file produced: /content/working_results/4_test_individual_cases/DN_1_CondS_No_0_Val_1.0_epo_100_step_100.pdb\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} }, { "output_type": "display_data", "data": { "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", "text/html": [ "
\n", "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] }, "metadata": {} } ], "source": [ "#@title ### Example:\n", "\n", "#@markdown Infer for given unfolding force vecter\n", "\n", "\n", "Sample_for_Num_inputs = 2 #@param {type:\"slider\", min:1, max:8, step:1}\n", "\n", "\n", "\n", "\n", "#\n", "if CKeys['Working_Mode']==2:\n", " if TestKeys['Sample_On_DeNovo']:\n", " #\n", " print(\"Run sampling on De Novo inputs set...\")\n", " #\n", " # de novo test\n", " if CKeys['Problem_ID']==2 or CKeys['Problem_ID']==6 \\\n", " or CKeys['Problem_ID']==11:\n", " print('Loading back a common de novo tests: ')\n", " import pickle\n", " pk_save_de_novo_list = this_working_path+'0_dataprocess_MD/ForTest_LE_128_From_F1_f5.pt'\n", "\n", " with open(pk_save_de_novo_list, 'rb') as handle:\n", " de_novo_test_condition_list = pickle.load(handle)\n", "\n", " de_novo_test_condition_list = de_novo_test_condition_list[:8]\n", " print(\"Get de novo tests #: \", len(de_novo_test_condition_list))\n", " # de_novo_test_condition_list = [\n", " # # =====================================\n", " # # sacle max:\n", "\n", " # UtilityPack.interpolate_and_resample_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][pick_id_0]*1.0,\n", " # seq_len1=protein_df['seq_len'][pick_id_0],\n", " # )['y1'], # max_forc x 1\n", "\n", " # UtilityPack.interpolate_and_resample_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][pick_id_0]*0.66,\n", " # seq_len1=60,\n", " # )['y1'], # max_forc x 0.66\n", "\n", " # UtilityPack.interpolate_and_resample_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][pick_id_0]*0.33,\n", " # seq_len1=60,\n", " # )['y1'], # max_forc x 0.33\n", "\n", " # UtilityPack.interpolate_and_resample_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][pick_id_0]*1.50,\n", " # seq_len1=60,\n", " # )['y1'], # max_forc x 1.5\n", " # # =====================================\n", " # # scale mid peak: 2\n", "\n", " # UtilityPack.interpolate_and_resample_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][2]*1.0,\n", " # seq_len1=protein_df['seq_len'][2],\n", " # )['y1'], # peak_mid x 1\n", "\n", " # UtilityPack.interpolate_and_resample_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][2]*0.66,\n", " # seq_len1=60,\n", " # )['y1'], # max_forc x 0.66\n", "\n", " # UtilityPack.interpolate_and_resample_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][2]*0.33,\n", " # seq_len1=60,\n", " # )['y1'], # max_forc x 0.33\n", "\n", " # UtilityPack.interpolate_and_resample_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][2]*1.50,\n", " # seq_len1=60,\n", " # )['y1'], # max_forc x 1.50\n", " # # ======================================\n", " # # mix two: max and min\n", "\n", " # UtilityPack.mix_two_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][pick_id_0]*1.,\n", " # y1=protein_df['sample_FORCE_data'][pick_id_1]*0.,\n", " # seq_len2=60,\n", " # )['y2'], # max x 1 + min x 0\n", "\n", " # UtilityPack.mix_two_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][pick_id_0]*2./3.,\n", " # y1=protein_df['sample_FORCE_data'][pick_id_1]*1./3.,\n", " # seq_len2=60,\n", " # )['y2'], # max x 2/3 + min x 1/3\n", "\n", " # UtilityPack.mix_two_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][pick_id_0]*1./2.,\n", " # y1=protein_df['sample_FORCE_data'][pick_id_1]*1./2.,\n", " # seq_len2=60,\n", " # )['y2'], # max x 1/2 + min x 1/2\n", "\n", " # UtilityPack.mix_two_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][pick_id_0]*1./3.,\n", " # y1=protein_df['sample_FORCE_data'][pick_id_1]*2./3.,\n", " # seq_len2=60,\n", " # )['y2'], # max x 1/3 + min x 2/3\n", "\n", " # UtilityPack.mix_two_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][pick_id_0]*0.,\n", " # y1=protein_df['sample_FORCE_data'][pick_id_1]*1.,\n", " # seq_len2=60,\n", " # )['y2'], # max x 0. + min x 1.\n", " # # =======================================\n", " # # mix another two: middle peak 2 + slope 174\n", "\n", " # UtilityPack.mix_two_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][2]*1.,\n", " # y1=protein_df['sample_FORCE_data'][174]*0.,\n", " # seq_len2=60,\n", " # )['y2'], # max x 1 + min x 0\n", "\n", " # UtilityPack.mix_two_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][2]*2./3.,\n", " # y1=protein_df['sample_FORCE_data'][174]*1./3.,\n", " # seq_len2=60,\n", " # )['y2'], # max x 2/3 + min x 1/3\n", "\n", " # UtilityPack.mix_two_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][2]*1./2.,\n", " # y1=protein_df['sample_FORCE_data'][174]*1./2.,\n", " # seq_len2=60,\n", " # )['y2'], # max x 1/2 + min x 1/2\n", "\n", " # UtilityPack.mix_two_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][2]*1./3.,\n", " # y1=protein_df['sample_FORCE_data'][174]*2./3.,\n", " # seq_len2=60,\n", " # )['y2'], # max x 1/3 + min x 2/3\n", "\n", " # UtilityPack.mix_two_ForcPath(\n", " # y0=protein_df['sample_FORCE_data'][2]*0.,\n", " # y1=protein_df['sample_FORCE_data'][174]*1.,\n", " # seq_len2=60,\n", " # )['y2'], # max x 0. + min x 1.\n", "\n", " # ]\n", "\n", " elif CKeys['Problem_ID']==3:\n", " de_novo_test_condition_list = [\n", " [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],\n", " [0, 0.7, 0.07, 0.1, 0.01, 0.02, 0.01, 0.11],\n", " ]\n", " elif CKeys['Problem_ID']==4:\n", " # normalized (Fmax,Toughness)\n", " de_novo_test_condition_list = [\n", " [0.8, 0.8],\n", " [0.8, 0.2],\n", " ]\n", "\n", " elif CKeys['Problem_ID']==5:\n", " de_novo_test_condition_list = [\n", " ['~~~HHHHHHHHHHHHHHH~~'],\n", " ['~~EEESSTTS~SEEEEEEEEE~SBS~EEEEEE~~'],\n", " ]\n", "\n", "\n", "\n", "\n", "\n", "if CKeys['Working_Mode']==2:\n", " #\n", " if TestKeys['Sample_On_DeNovo']:\n", "\n", "\n", " if CKeys['Problem_ID']==2:\n", " TrainerPack.sample_sequence_omegafold_ModelB (\n", " working_model_B,\n", " x_data=NewInput_List,\n", " flag=last_epoch, # flag=\"DeNovo\", # ,\n", " cond_scales=1.,\n", " foldproteins=True, # foldproteins,\n", " # ++++++++++\n", " ynormfac=DataKeys['ynormfac'],\n", " train_unet_number=1, # train_unet_number,\n", " tokenizer_X=tokenizer_X,\n", " Xnormfac=DataKeys['Xnormfac'],\n", " max_length=DataKeys['max_AA_seq_len'], # max_length,\n", " prefix=PKeys['prefix'], # prefix,\n", " tokenizer_y=tokenizer_y,\n", " # ++\n", " CKeys=CKeys,\n", " sample_dir=TestKeys['test_dir'], # sample_dir,\n", " steps=last_step,\n", " e=last_epoch,\n", " IF_showfig= True, # CKeys['SlientRun']!=1,\n", " )\n", "\n", " elif CKeys['Problem_ID']==3:\n", " TrainerPack.sample_sequence_omegafold_ModelA (\n", " # # ----------------------------------------------\n", " # model,\n", " # X=[[0, 0.7, 0.07, 0.1, 0.01, 0.02, 0.01, 0.11]],\n", " # foldproteins=foldproteins,\n", " # flag=steps,cond_scales=1.,\n", " # ++++++++++++++++++++++++++++++++++++++++++++++\n", " working_model,\n", " X=test_condition_list, # [[0.92, 0., 0.04, 0.04, 0., 0., 0., 0., ]], # from text conditioning X\n", " flag=last_epoch, # e+start_ep, # steps, # 0,\n", " cond_scales=1., # cond_scales, # 1.,\n", " foldproteins=True, # False,\n", " X_string=None, # from text conditioning X_string\n", " x_data=None, # from image conditioning x_data\n", " skip_steps=0,\n", " inpaint_images=None, # in formation Y data\n", " inpaint_masks = None,\n", " inpaint_resample_times = None,\n", " init_images = None,\n", " num_cycle=16, # for omegafolding\n", " calc_error=True, # False, # for check on folded results, not used for every case\n", " # ++++++++++++++++++++++++++\n", " # tokenizers\n", " tokenizer_X_forImageCondi=None, # for x_data\n", " Xnormfac_forImageCondi=1.,\n", " tokenizer_X_forTextCondi=None, # for X if NEEDED only\n", " Xnormfac_forTextCondi=DataKeys['Xnormfac'], # 1.,\n", " tokenizer_y=tokenizer_y, # None, # for output Y\n", " ynormfac=DataKeys['ynormfac'], # ynormfac,\n", " # length\n", " train_unet_number=1,\n", " max_length_Y=DataKeys['max_AA_seq_len'], # max_length_Y, # for Y, X_forImageCondi\n", " max_text_len=DataKeys['max_text_len'], # max_text_len_X, # for X_forTextCondi\n", " # other info\n", " steps=last_step, # steps, # None,\n", " e=last_epoch, # e, # None,\n", " sample_dir=TestKeys['test_dir'], # sample_dir, # None,\n", " prefix=PKeys['prefix'], # prefix, # None,\n", " IF_showfig= True, # CKeys['SlientRun']!=1, # True,\n", " CKeys=CKeys,\n", " # TBA to Model B\n", " normalize_X_cond_to_one=False,\n", " )\n", " #\n", " elif CKeys['Problem_ID']==4:\n", " TrainerPack.sample_sequence_omegafold_ModelA (\n", " # # ----------------------------------------------\n", " # model,\n", " # X=[[0, 0.7, 0.07, 0.1, 0.01, 0.02, 0.01, 0.11]],\n", " # foldproteins=foldproteins,\n", " # flag=steps,cond_scales=1.,\n", " # ++++++++++++++++++++++++++++++++++++++++++++++\n", " working_model,\n", " X=test_condition_list, # [[0.92, 0., 0.04, 0.04, 0., 0., 0., 0., ]], # from text conditioning X\n", " flag=last_epoch, # e+start_ep, # steps, # 0,\n", " cond_scales=1., # cond_scales, # 1.,\n", " foldproteins=True, # False,\n", " X_string=None, # from text conditioning X_string\n", " x_data=None, # from image conditioning x_data\n", " skip_steps=0,\n", " inpaint_images=None, # in formation Y data\n", " inpaint_masks = None,\n", " inpaint_resample_times = None,\n", " init_images = None,\n", " num_cycle=16, # for omegafolding\n", " # only for ModelA-SecStr:ProblemID:4\n", " calc_error=False, # True, # False, # for check on folded results, not used for every case\n", " # ++++++++++++++++++++++++++\n", " # tokenizers\n", " tokenizer_X_forImageCondi=None, # for x_data\n", " Xnormfac_forImageCondi=1.,\n", " tokenizer_X_forTextCondi=None, # for X if NEEDED only\n", " Xnormfac_forTextCondi=DataKeys['Xnormfac'], # 1.,\n", " tokenizer_y=tokenizer_y, # None, # for output Y\n", " ynormfac=DataKeys['ynormfac'], # ynormfac,\n", " # length\n", " train_unet_number=1,\n", " max_length_Y=DataKeys['max_AA_seq_len'], # max_length_Y, # for Y, X_forImageCondi\n", " max_text_len=DataKeys['max_text_len'], # max_text_len_X, # for X_forTextCondi\n", " # other info\n", " steps=last_step, # steps, # None,\n", " e=last_epoch, # e, # None,\n", " sample_dir=TestKeys['test_dir'], # sample_dir, # None,\n", " prefix=PKeys['prefix'], # prefix, # None,\n", " IF_showfig= True, # CKeys['SlientRun']!=1, # True,\n", " CKeys=CKeys,\n", " # TBA to Model B\n", " normalize_X_cond_to_one=False,\n", " )\n", " # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n", " # Model B + SecStr\n", " # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", " elif CKeys['Problem_ID']==5:\n", " DeNovoSam_pdbs, DeNovoSam_fasta = \\\n", " TrainerPack.sample_sequence_omegafold_pLM_ModelB (\n", " working_model,\n", " x_data=NewInput_List,\n", " flag=last_epoch, # flag=\"DeNovo\", # ,\n", " cond_scales=1.,\n", " foldproteins=True, # foldproteins,\n", " # ++++++++++\n", " ynormfac=DataKeys['ynormfac'],\n", " train_unet_number=1, # train_unet_number,\n", " tokenizer_X=tokenizer_X,\n", " Xnormfac=DataKeys['Xnormfac'],\n", " max_length=DataKeys['max_AA_seq_len'], # max_length,\n", " prefix=PKeys['prefix'], # prefix,\n", " tokenizer_y=tokenizer_y,\n", " # ++\n", " CKeys=CKeys,\n", " sample_dir=TestKeys['test_dir'], # sample_dir,\n", " steps=last_step,\n", " e=last_epoch,\n", " IF_showfig= True, # CKeys['SlientRun']!=1,\n", " # ++\n", " pLM_Model=pLM_Model,\n", " pLM_Model_Name=pLM_Model_Name,\n", " image_channels=DataKeys['image_channels'],\n", " pLM_alphabet=esm_alphabet,\n", " )\n", " #\n", " elif CKeys['Problem_ID']==6:\n", " DeNovoSam_pdbs, DeNovoSam_fasta = \\\n", " TrainerPack.sample_sequence_omegafold_pLM_ModelB_For_ForcPath (\n", " working_model,\n", " x_data=de_novo_test_condition_list[:2],\n", " flag=last_epoch, # flag=\"DeNovo\", # ,\n", " cond_scales=[1., 2.],\n", " foldproteins=True, # foldproteins,\n", " # ++++++++++\n", " ynormfac=DataKeys['ynormfac'],\n", " train_unet_number=1, # train_unet_number,\n", " tokenizer_X=tokenizer_X,\n", " Xnormfac=DataKeys['Xnormfac'],\n", " max_length=DataKeys['max_AA_seq_len'], # max_length,\n", " prefix=PKeys['prefix'], # prefix,\n", " tokenizer_y=tokenizer_y,\n", " # ++\n", " CKeys=CKeys,\n", " sample_dir=TestKeys['test_dir'], # sample_dir,\n", " steps=last_step,\n", " e=last_epoch,\n", " IF_showfig= True, # CKeys['SlientRun']!=1,\n", " # ++\n", " pLM_Model=pLM_Model,\n", " pLM_Model_Name=pLM_Model_Name,\n", " image_channels=DataKeys['image_channels'],\n", " pLM_alphabet=esm_alphabet,\n", " )\n", "\n", " # DeNovoSam_pdbs, DeNovoSam_fasta = \\\n", " # TrainerPack.sample_sequence_omegafold_pLM_ModelB (\n", " # working_model,\n", " # x_data=NewInput_List,\n", " # flag=last_epoch, # flag=\"DeNovo\", # ,\n", " # cond_scales=1.,\n", " # foldproteins=True, # foldproteins,\n", " # # ++++++++++\n", " # ynormfac=DataKeys['ynormfac'],\n", " # train_unet_number=1, # train_unet_number,\n", " # tokenizer_X=tokenizer_X,\n", " # Xnormfac=DataKeys['Xnormfac'],\n", " # max_length=DataKeys['max_AA_seq_len'], # max_length,\n", " # prefix=PKeys['prefix'], # prefix,\n", " # tokenizer_y=tokenizer_y,\n", " # # ++\n", " # CKeys=CKeys,\n", " # sample_dir=TestKeys['test_dir'], # sample_dir,\n", " # steps=last_step,\n", " # e=last_epoch,\n", " # IF_showfig= True, # CKeys['SlientRun']!=1,\n", " # # ++\n", " # pLM_Model=pLM_Model,\n", " # pLM_Model_Name=pLM_Model_Name,\n", " # image_channels=DataKeys['image_channels'],\n", " # pLM_alphabet=esm_alphabet,\n", " # )\n", " #\n", " elif CKeys['Problem_ID']==7:\n", " DeNovoSam_pdbs, fasta_file_list=\\\n", " TrainerPack.sample_sequence_omegafold_pLM_ModelA (\n", " working_model,\n", " X=NewInput_List, # test_condition_list, # [[0.92, 0., 0.04, 0.04, 0., 0., 0., 0., ]], # from text conditioning X\n", " flag=last_epoch, # e+start_ep, # steps, # 0,\n", " cond_scales=1.,\n", " foldproteins=True, # False,\n", " X_string=None, # from text conditioning X_string\n", " x_data=None, # from image conditioning x_data\n", " skip_steps=0,\n", " inpaint_images=None, # in formation Y data\n", " inpaint_masks = None,\n", " inpaint_resample_times = None,\n", " init_images = None,\n", " num_cycle=16, # for omegafolding\n", " calc_error=True, # False, # for check on folded results, not used for every case\n", " # ++++++++++++++++++++++++++\n", " # tokenizers\n", " tokenizer_X_forImageCondi=None, # for x_data\n", " Xnormfac_forImageCondi=1.,\n", " tokenizer_X_forTextCondi=None, # for X if NEEDED only\n", " Xnormfac_forTextCondi=1.,\n", " tokenizer_y=tokenizer_y, # None, # for output Y\n", " ynormfac=DataKeys['ynormfac'], # ynormfac,\n", " # length\n", " train_unet_number=1,\n", " max_length_Y=DataKeys['max_AA_seq_len'], # max_length_Y, # for Y, X_forImageCondi\n", " max_text_len=DataKeys['max_text_len'], # max_text_len_X, # for X_forTextCondi\n", " # other info\n", " steps=last_step, # None,\n", " e=last_epoch, # None,\n", " sample_dir=TestKeys['test_dir'], # None,\n", " prefix=PKeys['prefix'], # None,\n", " IF_showfig= True, # CKeys['SlientRun']!=1, # True,\n", " CKeys=CKeys,\n", " # TBA to Model B\n", " normalize_X_cond_to_one=False,\n", " # ++ for pLM\n", " pLM_Model=pLM_Model,\n", " pLM_Model_Name=pLM_Model_Name,\n", " image_channels=DataKeys['image_channels'], # image_channels,\n", " pLM_alphabet=esm_alphabet,\n", " )\n", "\n", " elif CKeys['Problem_ID']==8:\n", " DeNovoSam_pdbs, fasta_file_list=\\\n", " TrainerPack.sample_sequence_omegafold_pLM_ModelA (\n", " working_model,\n", " X=NewInput_List, # test_condition_list, # [[0.92, 0., 0.04, 0.04, 0., 0., 0., 0., ]], # from text conditioning X\n", " flag=last_epoch, # e+start_ep, # steps, # 0,\n", " cond_scales=1.,\n", " foldproteins=True, # False,\n", " X_string=None, # from text conditioning X_string\n", " x_data=None, # from image conditioning x_data\n", " skip_steps=0,\n", " inpaint_images=None, # in formation Y data\n", " inpaint_masks = None,\n", " inpaint_resample_times = None,\n", " init_images = None,\n", " num_cycle=16, # for omegafolding\n", " calc_error=True, # False, # for check on folded results, not used for every case\n", " # ++++++++++++++++++++++++++\n", " # tokenizers\n", " tokenizer_X_forImageCondi=None, # for x_data\n", " Xnormfac_forImageCondi=1.,\n", " tokenizer_X_forTextCondi=None, # for X if NEEDED only\n", " Xnormfac_forTextCondi=1.,\n", " tokenizer_y=tokenizer_y, # None, # for output Y\n", " ynormfac=DataKeys['ynormfac'], # ynormfac,\n", " # length\n", " train_unet_number=1,\n", " max_length_Y=DataKeys['max_AA_seq_len'], # max_length_Y, # for Y, X_forImageCondi\n", " max_text_len=DataKeys['max_text_len'], # max_text_len_X, # for X_forTextCondi\n", " # other info\n", " steps=last_step, # None,\n", " e=last_epoch, # None,\n", " sample_dir=TestKeys['test_dir'], # None,\n", " prefix=PKeys['prefix'], # None,\n", " IF_showfig= CKeys['SlientRun']!=1, # True,\n", " CKeys=CKeys,\n", " # TBA to Model B\n", " normalize_X_cond_to_one=False,\n", " # ++ for pLM\n", " pLM_Model=pLM_Model,\n", " pLM_Model_Name=pLM_Model_Name,\n", " image_channels=DataKeys['image_channels'], # image_channels,\n", " pLM_alphabet=esm_alphabet,\n", " )\n", "\n", " elif CKeys['Problem_ID']==11:\n", " # plot the input\n", " print(\"On the inputs:\")\n", " fig = plt.figure(figsize=(24,16),dpi=200)\n", " fig, ax0 = plt.subplots()\n", " for ii in range(Sample_for_Num_inputs):\n", " ax0.plot(\n", " de_novo_test_condition_list[ii],\n", " label='Input_'+str(ii+0)+'_to_be_inferred'\n", " )\n", "\n", " plt.legend()\n", " plt.xlabel('Normalized pulling gap')\n", " plt.ylabel('Pulling force (kcal/(mol*Å))')\n", " plt.show()\n", " plt.close()\n", " # conduct inferring\n", " print(\"Now, make design based on the inputs...\")\n", " print(\"\\n\\n\")\n", " DeNovoSam_pdbs, DeNovoSam_fasta = \\\n", " TrainerPack.sample_sequence_omegafold_pLM_ModelB_For_ForcPath (\n", " working_model,\n", " x_data=de_novo_test_condition_list[:Sample_for_Num_inputs], # [:2],\n", " flag=100, #last_epoch, # flag=\"DeNovo\", # ,\n", " cond_scales=[1.],\n", " foldproteins=True, # foldproteins,\n", " # ++++++++++\n", " ynormfac=DataKeys['ynormfac'],\n", " train_unet_number=1, # train_unet_number,\n", " tokenizer_X=tokenizer_X,\n", " Xnormfac=DataKeys['Xnormfac'],\n", " max_length=DataKeys['max_AA_seq_len'], # max_length,\n", " prefix=PKeys['prefix'], # prefix,\n", " tokenizer_y=tokenizer_y,\n", " # ++\n", " CKeys=CKeys,\n", " sample_dir=TestKeys['test_dir'], # sample_dir,\n", " steps=100, # last_step,\n", " e=100, # last_epoch,\n", " IF_showfig= True, # CKeys['SlientRun']!=1,\n", " # ++\n", " pLM_Model=pLM_Model,\n", " pLM_Model_Name=pLM_Model_Name,\n", " image_channels=DataKeys['image_channels'],\n", " pLM_alphabet=esm_alphabet,\n", " )\n", "\n" ] }, { "cell_type": "code", "execution_count": 13, "id": "e0KlqgH44W3W", "metadata": { "id": "e0KlqgH44W3W" }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 13, "id": "tuGOEsVx4W6U", "metadata": { "id": "tuGOEsVx4W6U" }, "outputs": [], "source": [] } ], "metadata": { "accelerator": "GPU", "colab": { "gpuType": "A100", "machine_shape": "hm", "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.16" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "f6ec7f703621416fb631812d2f8def00": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_68b23bcc31a8453890de44568dfeb1ee", "IPY_MODEL_ef0f7e87f6334939bea151726af03b83", "IPY_MODEL_5d5f291eb6644e6d95d07ba755b56870" ], "layout": "IPY_MODEL_a37c10d569254e958453c189f15cdf9c" } }, "68b23bcc31a8453890de44568dfeb1ee": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_e37c525959bc4dc0ad96b94d83153319", "placeholder": "​", "style": "IPY_MODEL_2ab06057ee1e4c11a487f0d1b289373c", "value": "" } }, "ef0f7e87f6334939bea151726af03b83": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "danger", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_595600bfe70f4c0bb5fb200217116674", "max": 1, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_e2893aae1bb7495e96c770bcdf3dfa4d", "value": 0 } }, "5d5f291eb6644e6d95d07ba755b56870": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_b7dfef148b8645ea9b2c70103a81b6d0", "placeholder": "​", "style": "IPY_MODEL_d908b047df4f4ea59d37355d673319bc", "value": " 0/? [00:09<?, ?it/s]" } }, "a37c10d569254e958453c189f15cdf9c": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "e37c525959bc4dc0ad96b94d83153319": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2ab06057ee1e4c11a487f0d1b289373c": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "595600bfe70f4c0bb5fb200217116674": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "20px" } }, "e2893aae1bb7495e96c770bcdf3dfa4d": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "b7dfef148b8645ea9b2c70103a81b6d0": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "d908b047df4f4ea59d37355d673319bc": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "f833b0f88df14acf8432b8a7098d029f": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_bf0a9c22ce974f2eb796c2275e7dec12", "IPY_MODEL_1521cf912d2f4207866034891baad8d9", "IPY_MODEL_51c23b8303c9450f8cfe8c8015ccfa9d" ], "layout": "IPY_MODEL_9901ee5e2d554071a43888b93ddf0073" } }, "bf0a9c22ce974f2eb796c2275e7dec12": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_a1cfeea9cbab45eca372c506825e25f4", "placeholder": "​", "style": "IPY_MODEL_af16e614a3104abfa5179e6b3e066397", "value": "sampling time step: 100%" } }, "1521cf912d2f4207866034891baad8d9": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_0f9a7631770a4c64845d95effc1c38ba", "max": 96, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_b164b59990084bed94eca230208166ca", "value": 96 } }, "51c23b8303c9450f8cfe8c8015ccfa9d": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_7b5706c2f1a84fabbb828a1bacb36b3d", "placeholder": "​", "style": "IPY_MODEL_d04ff74e247443bc8d8127e3f2161c0c", "value": " 96/96 [00:09<00:00, 12.45it/s]" } }, "9901ee5e2d554071a43888b93ddf0073": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a1cfeea9cbab45eca372c506825e25f4": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "af16e614a3104abfa5179e6b3e066397": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "0f9a7631770a4c64845d95effc1c38ba": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b164b59990084bed94eca230208166ca": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "7b5706c2f1a84fabbb828a1bacb36b3d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "d04ff74e247443bc8d8127e3f2161c0c": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } } } } }, "nbformat": 4, "nbformat_minor": 5 }