Advanced Usage
This guide covers advanced features of Auto3D: multi-GPU workflows, performance optimization, custom neural network potentials, and fine-tuning parameters.
Multi-GPU Processing
Auto3D supports multi-GPU processing for large datasets, automatically distributing molecules across GPUs.
CLI Usage
# Use multiple GPUs (recommended for large datasets)
auto3d run large_dataset.smi --k=1 --gpu --gpu-idx="0,1,2,3"
# Use specific GPUs on shared systems
auto3d run large_dataset.smi --k=1 --gpu --gpu-idx="2,3"
# Use CUDA_VISIBLE_DEVICES environment variable
CUDA_VISIBLE_DEVICES=0,1,2,3 auto3d run large_dataset.smi --k=1 --gpu
Python API
from Auto3D import Auto3DOptions, main
if __name__ == "__main__":
config = Auto3DOptions(
path="large_dataset.smi",
k=1,
use_gpu=True,
gpu_idx=[0, 1, 2, 3], # Use GPUs 0, 1, 2, and 3
)
output = main(config)
Performance Optimization
Quick Settings Reference
# Fast screening (fastest, good enough for ranking)
auto3d run input.smi --k=1 --engine=ANI2xt --gpu
# Balanced (default)
auto3d run input.smi --k=1 --engine=AIMNET --gpu
# High accuracy (for final production runs)
AUTO3D_USE_ENSEMBLE=1 auto3d run input.smi --k=1 --engine=AIMNET --gpu
Configuration Presets
Auto3D provides presets for common use cases:
# Generate preset configurations
auto3d config init -p quick -o quick.yaml # Fast screening
auto3d config init -p balanced -o balanced.yaml # Balanced
auto3d config init -p thorough -o thorough.yaml # High accuracy
# Use a preset
auto3d run input.smi -c quick.yaml
TF32 Acceleration
Enable TensorFloat-32 for ~1.5x faster computation on Ampere+ GPUs (RTX 30xx, A100, H100):
# Create config with TF32 enabled
cat > performance.yaml << EOF
allow_tf32: true
use_gpu: true
EOF
auto3d run input.smi --k=1 -c performance.yaml
Python API:
config = Auto3DOptions(
path="input.smi",
k=1,
use_gpu=True,
allow_tf32=True, # ~1.5x faster matrix operations
)
Note
TF32 reduces precision slightly (19 mantissa bits vs 23 for FP32). This is acceptable for conformer generation but may affect very tight energy comparisons.
torch.compile() Optimization
Enable PyTorch 2.0 compilation for ANI models (~1.25x speedup):
# Enable via environment variable
AUTO3D_COMPILE_MODEL=1 auto3d run input.smi --k=1 --engine=ANI2x --gpu
# Combine multiple optimizations
AUTO3D_COMPILE_MODEL=1 auto3d run input.smi --k=1 --engine=ANI2xt --gpu
Python API:
import os
os.environ["AUTO3D_COMPILE_MODEL"] = "1"
# Or via create_model for custom workflows
from Auto3D import create_model
model = create_model("ANI2xt", device=device, compile_model=True)
Note
torch.compile() works best with ANI2x/ANI2xt. AIMNET uses optimized
JIT compilation internally.
Batch Size Tuning
Adjust batch size based on GPU memory:
# Create config with tuned batch size
cat > gpu_tuning.yaml << EOF
batchsize_atoms: 2048 # For 24GB+ GPUs
# batchsize_atoms: 512 # For 8GB GPUs
use_gpu: true
EOF
auto3d run input.smi --k=1 -c gpu_tuning.yaml
Recommended batch sizes:
GPU |
Memory |
batchsize_atoms |
|---|---|---|
RTX 3070, RTX 4070 |
8 GB |
512 |
RTX 3080, V100 |
16 GB |
1024 (default) |
RTX 3090, A5000, RTX 4090 |
24 GB |
1536 |
A100, H100 |
40-80 GB |
2048 |
Python API:
config = Auto3DOptions(
path="input.smi",
k=1,
batchsize_atoms=2048, # Adjust for your GPU
)
Large Dataset Memory Management
For very large datasets (100k+ molecules), configure memory allocation:
# Create config for large-scale processing
cat > large_scale.yaml << EOF
memory: 64 # Assign 64GB RAM
capacity: 50 # Molecules per GB
use_gpu: true
gpu_idx: [0, 1, 2, 3]
EOF
auto3d run huge_dataset.smi --k=1 -c large_scale.yaml
Python API:
config = Auto3DOptions(
path="huge_dataset.smi",
k=1,
memory=64, # Assign 64GB RAM
capacity=50, # Molecules per GB
use_gpu=True,
gpu_idx=[0, 1, 2, 3],
)
Environment Variables
Control Auto3D behavior via environment variables:
# Enable torch.compile for ANI models
export AUTO3D_COMPILE_MODEL=1
# Use AIMNET ensemble (slower, highest accuracy)
export AUTO3D_USE_ENSEMBLE=1
# Set OpenEye license path
export OE_LICENSE=/path/to/oe_license.txt
# Run with environment settings
auto3d run input.smi --k=1 --gpu
Variable |
Default |
Description |
|---|---|---|
|
|
Enable torch.compile() for ANI models |
|
|
Use AIMNET 8-model ensemble |
|
(none) |
OpenEye license for Omega isomer engine |
Optimization Parameters
Fine-tune geometry optimization via CLI configuration files or Python API.
Quick vs Accurate Settings
# Quick screening (fast, slightly looser convergence)
cat > quick.yaml << EOF
optimizing_engine: ANI2xt
convergence_threshold: 0.02
patience: 100
opt_steps: 1000
max_confs: 50
EOF
# Accurate (tight convergence for production)
cat > accurate.yaml << EOF
optimizing_engine: AIMNET
convergence_threshold: 0.003
patience: 500
opt_steps: 5000
EOF
# Run with settings
auto3d run input.smi --k=1 -c quick.yaml --gpu
auto3d run input.smi --k=1 -c accurate.yaml --gpu
Python API:
# Quick screening
config = Auto3DOptions(
path="input.smi",
k=1,
optimizing_engine="ANI2xt",
convergence_threshold=0.02,
patience=100,
opt_steps=1000,
max_confs=50,
)
# Accurate
config = Auto3DOptions(
path="input.smi",
k=1,
optimizing_engine="AIMNET",
convergence_threshold=0.003,
patience=500,
opt_steps=5000,
)
Parameter Reference
Parameter |
Default |
Description |
|---|---|---|
|
2000 |
Maximum optimization steps per structure |
|
0.01 |
Force convergence threshold in eV/A |
|
250 |
Steps before dropping oscillating structures |
|
1024 |
Atoms per optimization batch per GB memory |
|
(auto) |
Maximum initial conformers per molecule |
Custom Neural Network Potentials
Auto3D supports custom PyTorch NNP models for specialized applications.
CLI Usage
# Use custom model by path
auto3d run input.smi --k=1 --engine=/path/to/my_model.pt --gpu
# With configuration file
cat > custom.yaml << EOF
optimizing_engine: /path/to/my_model.pt
use_gpu: true
EOF
auto3d run input.smi --k=1 -c custom.yaml
Python API
from Auto3D import Auto3DOptions, main
if __name__ == "__main__":
config = Auto3DOptions(
path="input.smi",
k=1,
optimizing_engine="/path/to/my_model.pt",
use_gpu=True,
)
output = main(config)
NNPModel Protocol
Your custom model must implement this interface:
import torch
class MyNNP(torch.nn.Module):
# Required attributes
coord_pad = 0 # Padding value for coordinates
species_pad = -1 # Padding value for species
def forward(
self,
species: torch.Tensor, # Shape: (batch_size, max_atoms)
coords: torch.Tensor, # Shape: (batch_size, max_atoms, 3)
charges: torch.Tensor, # Shape: (batch_size,)
) -> torch.Tensor:
"""
Calculate energies for a batch of molecules.
Args:
species: Atomic numbers, padded with species_pad
coords: Atomic coordinates in Angstroms
charges: Total molecular charges
Returns:
Energies tensor of shape (batch_size,) in eV
"""
energies = self.calculate_energies(species, coords, charges)
return energies
Example Custom Model Wrapper
import torch
import torch.nn as nn
class CustomNNPWrapper(nn.Module):
"""Wrapper to make an external NNP compatible with Auto3D."""
coord_pad = 0
species_pad = -1
def __init__(self, underlying_model):
super().__init__()
self.model = underlying_model
def forward(self, species, coords, charges):
batch_size = species.shape[0]
energies = []
for i in range(batch_size):
mask = species[i] != self.species_pad
valid_species = species[i][mask]
valid_coords = coords[i][mask]
charge = charges[i]
energy = self.model.predict(valid_species, valid_coords, charge)
energies.append(energy)
return torch.stack(energies)
# Save for use with Auto3D
model = CustomNNPWrapper(your_model)
torch.save(model, "my_model.pt")
Tautomer Enumeration
Enable tautomer enumeration for drug-like molecules with multiple possible forms.
CLI Usage
# Enable tautomer enumeration
auto3d run input.smi --k=1 --enumerate-tautomer --gpu
# With ANI2xt (recommended for tautomers)
auto3d run input.smi --k=1 --enumerate-tautomer --engine=ANI2xt --gpu
# Advanced configuration
cat > tautomer.yaml << EOF
enumerate_tautomer: true
tauto_engine: rdkit
optimizing_engine: ANI2xt
max_confs: 10
patience: 200
EOF
auto3d run input.smi --k=1 -c tautomer.yaml --gpu
Python API
from Auto3D import Auto3DOptions
from Auto3D.tautomer import get_stable_tautomers
config = Auto3DOptions(
path="input.smi",
k=1,
enumerate_tautomer=True,
tauto_engine="rdkit", # or "oechem" with license
optimizing_engine="ANI2xt", # Recommended for tautomers
max_confs=10,
patience=200,
)
# Get stable tautomers with top-3 per input
output = get_stable_tautomers(config, tauto_k=3)
Available Models
Model |
Supported Elements |
Charges |
Speed |
|---|---|---|---|
|
H, B, C, N, O, F, Si, P, S, Cl, As, Se, Br, I |
Neutral + charged |
Fast (default) |
|
H, C, N, O, F, S, Cl |
Neutral only |
Very fast |
|
H, C, N, O, F, S, Cl |
Neutral only |
Ultra-fast |
Single Model vs Ensemble (AIMNET)
By default, Auto3D uses a single AIMNet2 model for ~35x faster optimization:
# Default: single model (fast)
auto3d run input.smi --k=1 --gpu
# Ensemble: highest accuracy (slower)
AUTO3D_USE_ENSEMBLE=1 auto3d run input.smi --k=1 --gpu
The single model is accurate enough for conformer generation and ranking. Use ensemble only when you need the most accurate absolute energies.
Model Factory API (Python)
For custom workflows, create models directly:
import torch
from Auto3D import create_model
from Auto3D.model_factory import ModelFactory
device = torch.device("cuda:0")
# Create model
model = create_model("AIMNET", device=device)
# Use for calculations
energies = model(species, coords, charges)
# List available models
print(ModelFactory.available_models())
# Clear cache to free GPU memory
ModelFactory.clear_cache()
Troubleshooting
GPU Memory Issues
If you encounter CUDA out-of-memory errors:
# 1. Reduce batch size
cat > low_memory.yaml << EOF
batchsize_atoms: 512
EOF
auto3d run input.smi --k=1 -c low_memory.yaml --gpu
# 2. Disable ensemble
AUTO3D_USE_ENSEMBLE=0 auto3d run input.smi --k=1 --gpu
# 3. Use CPU as fallback
auto3d run input.smi --k=1 --no-gpu
Python solutions:
# Reduce batch size
config = Auto3DOptions(path="input.smi", k=1, batchsize_atoms=512)
# Clear model cache
from Auto3D.model_factory import ModelFactory
ModelFactory.clear_cache()
Slow Processing
If optimization is slower than expected:
# 1. Use fastest model
auto3d run input.smi --k=1 --engine=ANI2xt --gpu
# 2. Use quick preset
auto3d config init -p quick -o quick.yaml
auto3d run input.smi --k=1 -c quick.yaml --gpu
# 3. Enable TF32 on Ampere+ GPUs
cat > fast.yaml << EOF
optimizing_engine: ANI2xt
allow_tf32: true
convergence_threshold: 0.02
patience: 150
EOF
auto3d run input.smi --k=1 -c fast.yaml --gpu