leech
[!WARNING] leech is alpha quality and under active development. APIs, CLI flags, and output formats may change without notice, and bugs are expected. Validate results before relying on it for anything important.
Learning Enhanced Electrical Classifiers from Hanopore signals
Leech classifies aminoacylation state and amino acid identity from Oxford
Nanopore tRNA sequencing data. It extracts dwell time features from move
tables (the BAM mv tag) and feeds them alongside raw signal and sequence
context into a multi-branch neural network, giving it information that
signal-only tools like Remora
discard.
Installation
Requires Python 3.12+
uv add "leech[rust]" # or: pip install "leech[rust]"
The rust extra pulls leech-core, the compiled accelerator for data
preparation and inference. leech runs without it — every accelerated path has
a pure-Python fallback — so plain uv add leech is fine if no wheel matches
your platform (wheels are built for manylinux x86_64 and aarch64).
To work on leech itself:
# Install uv if you don't have it
curl -LsSf https://astral.sh/uv/install.sh | sh
# Clone and install
git clone https://github.com/rnabioco/leech.git
cd leech
uv sync
Quick start
1. Prepare training data
uv run leech data prepare \
--pod5 reads.pod5 \
--bam alignments.bam \
--output-dir chunks/ \
--motif CCAGGC --motif-offset 2 \
--label 1 --workers 8
2. Train a model
uv run leech model train \
--train-data chunks/train.json \
--val-data chunks/val.json \
--model ConvLSTMDwell \
--output-dir models/
3. Evaluate
uv run leech eval test \
--model models/model_best.pt \
--test-data chunks/test.json \
--output metrics.json
4. Run inference
uv run leech predict \
--model models/ \
--pod5 new_reads.pod5 \
--bam new_alignments.bam \
--output predictions.bam
5. Bundle and deploy pairwise models
Package multiple pairwise models into a single file and run aggregated inference:
# Bundle all pairwise models
uv run leech model bundle \
--model-dir results/models/pairwise/ \
--output bundle.pt --version 1.0.0
# Inspect bundle contents
uv run leech model bundle-info --bundle bundle.pt
# Run all models (aggregated amino acid prediction)
uv run leech predict \
--bundle bundle.pt --all \
--pod5 reads.pod5 --bam alignments.bam \
--output predictions.bam
CLI overview
| Group | Commands | Purpose |
|---|---|---|
leech data |
prepare, merge |
Extract features, merge and split datasets |
leech model |
train, optimize, bundle, bundle-info, calibrate, export |
Train, tune, calibrate, and package models |
leech eval |
test, compare, importance, ablation |
Evaluate and analyze models |
leech predict |
Run inference (single model or bundle) |
Model architectures
20 architectures across 5 families, all supporting multi-channel signal input (signal_in_channels):
| Family | Models | Description |
|---|---|---|
| ConvLSTM | ConvLSTMDwell (recommended), ConvLSTMBase | Conv-LSTM with 3 branches (signal, sequence, dwell/level features) |
| ConvLSTM variants | +BN, +Attn, +BNAttn, +GNAttn, +LNAttn | Batch/group/layer normalization and attention pooling |
| Remora-compat | ConvLSTMRemora, ConvLSTMRemoraBase | Remora-compatible architecture for direct comparison |
| Transformer | TransformerDwell, TransformerDwellResidual | Multi-head self-attention; Residual variant uses 2-channel signal (raw + kmer residual) |
| TCN | TCNDwell, +GN, +LN, +Residual | Temporal Convolutional Network with dilated convolutions |
| Other | ResNetDwell, ConvOnly | Residual network; pure CNN with multi-scale convolutions |
Training features
- Loss functions: BCE, focal loss (for class imbalance), and cross-entropy
- Regularization: weight decay, gradient clipping, dropout
- LR scheduling: reduce-on-plateau, cosine annealing with warmup
- Data augmentation: mixup (signal jitter + random scaling)
- Mixed precision: FP16 training on CUDA; TF32 matmul on Ampere+
- Performance:
torch.compilesupport, Rust-accelerated signal statistics (217x) - Class balancing: automatic class weight computation
- Balance-groups sampling: equal contribution per source group per epoch
- K-fold cross-validation: stratified read-level k-fold splits
- Platt calibration: post-hoc Platt scaling for probability calibration
- Signal map refinement: Viterbi-based kmer level table refinement (matches Remora)
- Kmer residual features: expected level, signed/unsigned deviation from kmer table
- Multi-channel signal: 2-channel input (raw + kmer residual) for Residual model variants
- Aggregation: naive, confidence-weighted, and tournament pairwise aggregation
- Composable config: dataclass-based configuration shared between prep and inference
- TorchScript export: standalone model export for deployment without leech
Snakemake pipeline
For production workloads, leech includes a Snakemake pipeline supporting:
- Charged vs. uncharged classification
- Pairwise amino acid discrimination
- Grid search optimization
- Multi-architecture comparison
- HPC clusters (SLURM/LSF)
See pipeline/ for configuration and usage.
Development
uv sync --all-extras # Install with dev tools
uv run pytest # Run tests
uv run ruff check . # Lint
uv run ruff format . # Format
uv run ty check src/leech/ # Type check
Citation
If you use leech, please cite:
- This work (publication pending)
- Remora (underlying training framework)
License
MIT License - see LICENSE for details.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file leech-0.6.7.tar.gz.
File metadata
- Download URL: leech-0.6.7.tar.gz
- Upload date:
- Size: 8.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
14350aaf12b6b25447071839b5f4e426fc6f192a267240ccaf4dde23200189e6
|
|
| MD5 |
ccb4fc80a610877d0de97db90c44aee4
|
|
| BLAKE2b-256 |
ec1958bbda8557d957e5b07b03751bc8f88efdd46a83bd5552fe65bed3e7fa88
|
Provenance
The following attestation bundles were made for leech-0.6.7.tar.gz:
Publisher:
release.yml on rnabioco/leech
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
leech-0.6.7.tar.gz -
Subject digest:
14350aaf12b6b25447071839b5f4e426fc6f192a267240ccaf4dde23200189e6 - Sigstore transparency entry: 2582081894
- Sigstore integration time:
-
Permalink:
rnabioco/leech@e2da0963bd3f68750889fdfd30c132f0c757c00e -
Branch / Tag:
refs/tags/v0.6.7 - Owner: https://github.com/rnabioco
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e2da0963bd3f68750889fdfd30c132f0c757c00e -
Trigger Event:
push
-
Statement type:
File details
Details for the file leech-0.6.7-py3-none-any.whl.
File metadata
- Download URL: leech-0.6.7-py3-none-any.whl
- Upload date:
- Size: 3.4 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0241aac56fee4e0d6161e927985f857a01c311c93337b3d3d1e71072825ac5a6
|
|
| MD5 |
f45fdb8efb0e2625746d71486f5540ed
|
|
| BLAKE2b-256 |
339e1bb97e78d21634fea73e5ae96dbfb139f07d26303e93f62e85c708de7145
|
Provenance
The following attestation bundles were made for leech-0.6.7-py3-none-any.whl:
Publisher:
release.yml on rnabioco/leech
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
leech-0.6.7-py3-none-any.whl -
Subject digest:
0241aac56fee4e0d6161e927985f857a01c311c93337b3d3d1e71072825ac5a6 - Sigstore transparency entry: 2582081900
- Sigstore integration time:
-
Permalink:
rnabioco/leech@e2da0963bd3f68750889fdfd30c132f0c757c00e -
Branch / Tag:
refs/tags/v0.6.7 - Owner: https://github.com/rnabioco
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e2da0963bd3f68750889fdfd30c132f0c757c00e -
Trigger Event:
push
-
Statement type: