Instalando e executando DrugCLIP no Escola de Sagres

Usando uv

Autor

Fernando Náufel

Data de Publicação

20/04/2026 11:33

1 Sobre este documento

???

2 Objetivos

???

3 Instalar o uv

O uv é um gerenciador de pacotes e ambientes moderno e eficiente para o Python.1

Entramos

curl -LsSf https://astral.sh/uv/install.sh | sh

Este comando instalará o uv em ~/.local/bin.

Podemos verificar com

which uv && uv --version

A resposta deve ser algo como

~/.local/bin/uv
uv 0.11.6

4 Instalar dependências do DrugCLIP

O README do repositório do DrugCLIP diz que as dependências são as mesmas do Uni-Mol.

O repositório do Uni-Mol lista como dependências:

  • Uni-Core (framework distribuído para PyTorch),
  • RDKit versão 2022.9.5.

Aparentemente, o DrugCLIP traz sua própria cópia do Uni-Mol. Não é necessário instalar o Uni-Mol separadamente.

4.1 Verificar CUDA

Precisamos saber a versão do CUDA para a instalação correta do PyTorch.

Vamos descobrir isto em um nó de GPU:

srun --partition=gpu --gres=gpu:1 --time=00:05:00 --pty bash

Isto nos leva a um shell em um nó de GPU. Ali, digitamos

nvcc --version

A saída é

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Tue_Feb_27_16:19:38_PST_2024
Cuda compilation tools, release 12.4, V12.4.99
Build cuda_12.4.r12.4/compiler.33961263_0

No mesmo nó, rodamos, para mais detalhes

nvidia-smi

A saída é

Mon Mar 23 15:16:38 2026       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.14              Driver Version: 550.54.14      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA A2                      On  |   00000000:41:00.0 Off |                    0 |
|  0%   34C    P8              8W /   60W |       0MiB /  15356MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

4.2 Criar o projeto e o ambiente virtual

Criamos o diretório:

mkdir -p ~/BioSensIA
cd ~/BioSensIA

Criamos o projeto:

uv init DrugCLIP-run

Mudamos para o diretório do projeto:

cd DrugCLIP-run

Vamos editar o arquivo .python-version para ajustar a versão do Python. O arquivo deve conter apenas a linha

3.11

Vamos editar também o arquivo pyproject.toml, modificando a linha requires-python para não permitir versões acima de 3.11. O conteúdo final do arquivo deve ser:

[project]
name = "drugclip-run"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.11,<3.12"
dependencies = []

Agora sincronizamos o ambiente virtual:

uv sync

Isto criará o diretório .venv com a versão do Python que especificamos.

Ativamos o ambiente virtual com

source .venv/bin/activate

Confirmamos que está tudo funcionando com

which python

A saída deve ser

~/BioSensIA/DrugCLIP-run/.venv/bin/python

E com

python --version

que produz a saída

Python 3.11.9
NotaNão esquecer de ativar o ambiente virtual

Sempre que fizermos um novo login, precisamos mudar para o diretório do projeto:

cd ~/BioSensIA/DrugCLIP-run

E precisamos ativar o ambiente virtual:

source .venv/bin/activate

No prompt do shell, aparecerá (drugclip-run) no início da linha, indicando o nome do ambiente virtual ativo.

Para desativar o ambiente virtual, basta entrar

deactivate

4.3 Instalar o PyTorch

Vamos editar o arquivo pyproject.toml para que ele consista de

[project]
name = "DrugCLIP-run"
version = "0.1.0"
requires-python = ">=3.11,<3.12"
dependencies = [
  "torch",
  "torchvision",
  "torchaudio",
  "setuptools",
]

[tool.uv.sources]
torch = [
  { index = "pytorch-cu124", marker = "sys_platform == 'linux'" },
]
torchvision = [
  { index = "pytorch-cu124", marker = "sys_platform == 'linux'" },
]
torchaudio = [
  { index = "pytorch-cu124", marker = "sys_platform == 'linux'" },
]

[[tool.uv.index]]
name = "pytorch-cu124"
url = "https://download.pytorch.org/whl/cu124"
explicit = true

Agora, vamos instalar os pacotes especificados.

Pode acontecer de a rede estar lenta. Para evitar time-outs, vamos configurar o uv para ser mais paciente:

export UV_HTTP_TIMEOUT=300
export UV_HTTP_CONNECT_TIMEOUT=120

A seguir, executamos:

uv lock
uv sync

4.4 Verificar a instalação do PyTorch

Vamos verificar se o PyTorch está funcionando com CUDA.

Vamos para um shell em um nó de GPU, pedindo acesso a duas GPUs:

srun --partition=gpu --gres=gpu:2 --time=00:05:00 --pty bash

No nó de GPU, carregamos os pacotes necessários e rodamos o teste:

python - << PY
import os
import torch

x = torch.rand(5, 3)
print(x)
print("torch.__version__                   =", torch.__version__)
print("torch.version.cuda                  =", torch.version.cuda)
print("torch.backends.cuda.is_built        =", torch.backends.cuda.is_built())
print("torch.cuda.is_available             =", torch.cuda.is_available())
print("torch.cuda.device_count             =", torch.cuda.device_count())

if torch.cuda.is_available():
  print("device 0 name                       =", torch.cuda.get_device_name(0))
print("torch.distributed.is_nccl_available =", torch.distributed.is_nccl_available())
PY

A saída deverá ser (com exceção dos valores no tensor, que são aleatórios):

tensor([[0.4314, 0.7784, 0.5975],
        [0.5675, 0.0199, 0.3430],
        [0.9700, 0.3156, 0.9717],
        [0.1576, 0.8838, 0.7823],
        [0.1090, 0.2737, 0.9940]])
torch.__version__                   = 2.6.0+cu124
torch.version.cuda                  = 12.4
torch.backends.cuda.is_built        = True
torch.cuda.is_available             = True
torch.cuda.device_count             = 2
device 0 name                       = NVIDIA A2
torch.distributed.is_nccl_available = True

O PyTorch está instalado, com acesso às GPUs.

4.5 Instalar o Uni-Core

Temos 3 opções:

  1. Instalar um wheel pré-compilado,
  2. Compilar o fonte,
  3. Instalar uma imagem do Docker.

4.5.1 Instalar um wheel pré-compilado (falhou)

No repositório do Uni-Core, estão disponíveis os seguintes wheels:

  • unicore-0.0.1+cu117torch2.0.0-cp310-cp310-linux_x86_64.whl,
  • unicore-0.0.1+cu117torch2.0.0-cp38-cp38-linux_x86_64.whl,
  • unicore-0.0.1+cu117torch2.0.0-cp39-cp39-linux_x86_64.whl,
  • unicore-0.0.1+cu118torch2.0.0-cp310-cp310-linux_x86_64.whl,
  • unicore-0.0.1+cu118torch2.0.0-cp38-cp38-linux_x86_64.whl,
  • unicore-0.0.1+cu118torch2.0.0-cp39-cp39-linux_x86_64.whl.

O número depois de cu é a versão do CUDA, e o número depois de cp é a versão do Python.

CuidadoVersões diferentes

Estamos com CUDA 12.4, PyTorch 2.6.0 e Python 3.11.9.

Nenhum destes wheels serve para o nosso ambiente.

Vamos compilar o Uni-Core a partir do fonte.

4.5.2 Compilar a partir do fonte

Do README do repositório do Uni-Core:

You can use python setup.py install or pip install . to build Uni-Core from source. The CUDA version in the build environment should be the same as the one in PyTorch.

Vamos supor que já clonamos o repositório do Uni-Core para ~/BioSensIA/Uni-Core.

cd ~/BioSensIA/Uni-Core

Agora, instalamos o Uni-Core para o ambiente virtual que criamos no diretório DrugCLIP-run:

source ../DrugCLIP-run/.venv/bin/activate
python setup.py install

Depois disto, os executáveis do Uni-Core estarão instalados em ~/BioSensIA/DrugCLIP-run/.venv/bin.

As dependências do Uni-Core estarão instaladas no ambiente virtual em ~/BioSensIA/DrugCLIP-run/.venv/lib/python3.11/site-packages/.

4.6 Verificar instalação do Uni-Core

Se necessário, mudamos para o diretório correto e ativamos o ambiente virtual:

cd ~/BioSensIA/DrugCLIP-run
source .venv/bin/activate

Precisamos instalar mais pacotes necessários:

uv add lmdb tokenizers tensorboard

A seguir, vamos para o diretório onde instalaremos os dados do exemplo:

cd ../Uni-Core/examples/bert/example_data/

No repositório do Uni-Core, achamos instruções para baixar dados para treinar um modelo BERT:

A simple BERT example

1.  download data `wget https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-2-v1.zip & unzip wikitext-2-v1.zip`
2.  run `python preprocess.py ./wikitext-2/wiki.train.tokens ./train.lmdb`
3.  run `python preprocess.py ./wikitext-2/wiki.valid.tokens ./valid.lmdb`

Mas o arquivo .zip não está mais no URL indicado. Vamos baixá-lo deste outro link.

Depois de descompactar o .zip, executamos os passos (2) e (3).

A seguir, mudamos para o diretório pai:

cd ..

Agora, vamos para um nó de GPU, solicitando duas GPUS:

srun --partition=gpu --gres=gpu:2 --pty bash

No novo shell, rodamos o teste:

./train_bert_test.sh

O treinamento do modelo começará. Podemos confirmar que duas GPUs estão sendo usadas, buscando, na saída, uma linha da forma

2026-04-20 11:17:29 | INFO | unicore_cli.train | training on 2 devices (GPUs)

Se tudo der certo, a execução acabará depois de 10 mil updates (num_updates=10000).

4.7 Instalar o RDKit

Se necessário, mudamos para o diretório correto e ativamos o ambiente virtual:

cd ~/BioSensIA/DrugCLIP-run
source .venv/bin/activate

Adicionamos o pacote ao ambiente, especificando a versão:

uv add rdkit==2022.9.5

4.8 Verificar instalação do RDKit

Rodamos o seguinte:

python - <<'PY'
from rdkit import Chem
from rdkit.Chem import Descriptors
print("RDKit version:", Chem.rdBase.rdkitVersion)
mol = Chem.MolFromSmiles("CCO")
print("Canonical SMILES:", Chem.MolToSmiles(mol))
print("Num atoms:", mol.GetNumAtoms())
print("Molecular weight:", Descriptors.MolWt(mol))
PY

O resultado deve ser

RDKit version: 2022.09.5
Canonical SMILES: CCO
Num atoms: 3
Molecular weight: 46.069

Outro teste:

python - <<'PY'
from rdkit import Chem
from rdkit.Chem import AllChem

mol = Chem.MolFromSmiles("c1ccccc1O")
mol = Chem.AddHs(mol)
ok = AllChem.EmbedMolecule(mol, randomSeed=0xf00d)
print("Embed return code:", ok)
print("Num conformers:", mol.GetNumConformers())
PY

O resultado deve ser

Embed return code: 0
Num conformers: 1

5 Instalar o DrugCLIP

5.1 O DrugCLIP não é um pacote

Ao contrário do Uni-Core, o DrugCLIP é simplesmente uma coleção de scripts e arquivos que devem ser usados da forma que estão. Não existe processo de instalação propriamente dito. Vamos verificar e instalar as dependências que ainda estão faltando, baixar os dados necessários para o modelo, e organizar os arquivos em diretórios específicos.

5.2 Verificar dependências

Se necessário, mudamos para o diretório e ativamos o ambiente:

cd ~/BioSensIA/DrugCLIP-run
???

Verificamos se as versões corretas de Python, PyTorch, RDKit e Uni-Core estão sendo usadas:

which python
which unicore-train
python - <<'PY'
import torch, rdkit, unicore
print("torch:", torch.__version__)
print("rdkit:", rdkit.__version__)
print("unicore:", unicore.__file__)
PY

A saída deve mostrar diretórios dentro do nosso ambiente.

O snippet Python retorna alguns avisos: ???

fused_multi_tensor is not installed corrected
fused_rounding is not installed corrected
fused_layer_norm is not installed corrected
fused_softmax is not installed corrected

São extensões opcionais. Podemos prosseguir. Se quisermos, podemos recompilar o Uni-Core de maneira a incluir estas extensões, como orientado nesta discussão no Github.

Fazer isto???

5.4 Adicionar outras dependências

Precisamos adicionar mais alguns pacotes ao ambiente. Embora as documentações do Uni-Mol e do DrugCLIP não mencionem estas dependências, ocorrem erros se elas não estiverem satisfeitas.

Executamos ??? Acrescentar antes???

spack add py-ipython
spack add py-scikit-learn
spack add py-pandas
spack concretize -f
spack install

5.5 Baixar dados do DrugCLIP

O README do DrugCLIP diz que os dados para treinamento, um modelo já treinado e os dados de teste estão em https://drive.google.com/drive/folders/1zW1MGpgunynFxTKXC2Q4RgWxZmg6CInV.

Vamos instalar o gdown para acessar arquivos do Google Drive:

???

Executamos então

cd ~/BioSensIA/DrugCLIP-run
gdown --folder 'https://drive.google.com/drive/folders/1zW1MGpgunynFxTKXC2Q4RgWxZmg6CInV?usp=sharing'

São mais de 15GB no total.

Além disso, precisamos baixar os modelos pré-treinados do Uni-Mol:

gdown 'https://github.com/deepmodeling/Uni-Mol/releases/download/v0.1/mol_pre_no_h_220816.pt'
gdown 'https://github.com/deepmodeling/Uni-Mol/releases/download/v0.1/pocket_pre_220816.pt'

5.6 Organizar dados

Depois de descompactar os arquivos baixados, vamos organizá-los do seguinte modo:

~/BioSensIA/DrugCLIP/
            ├── data/
            │   ├── DUD-E/
            │   │   └── ...
            │   ├── emb/
            │   ├── lit_pcba/
            │   │   └── ...
            │   ├── train.lmdb
            │   ├── valid.lmdb
            │   ├── dict_mol.txt
            │   └── dict_pkt.txt
            ├── mols.lmdb
            ├── pocket.lmdb
            ├── checkpoint_best.pt
            ├── mol_pre_no_h_220816.pt
            └── pocket_pre_220816.pt
          

O arquivo train.lmdb existe em dois locais: em pdbbind_only.zip e em pdbbind_2020_combineset.zip. Vamos usar este último.

5.7 Definir permissões de execução

Os arquivos .sh devem ser executáveis:

chmod a+x *.sh

5.8 Verificar caminhos nos scripts

5.8.1 test.sh

Aparentemente, tudo OK.

Notas de rodapé

  1. uv: https://docs.astral.sh/uv/↩︎