Graph-transformer pre-training · 5×5 cross validation · two data sets
KERMT1 is NVIDIA's GPU-optimised reimplementation of GROVER3, the dual-view graph transformer that pre-trains on 11 million unlabelled molecules by predicting masked subgraph motifs; KERMT v22 re-pretrains that encoder with a contrastive, probabilistic objective and is the checkpoint NVIDIA released. All three are fine-tuned here by KERMT's own main.py finetune, one multitask model per fold, on the same fifteen ExpansionRx and Biogen endpoints, folds and held-out test sets as the rest of this site, and v2's frozen 512-d latent is also read by TabPFN 36 exactly as Monroe is. The re-pretraining earns its keep inside the family: fine-tuned v2 beats fine-tuned GROVER base 30–13–2 and GROVER large 33–12–0 over 45 endpoint × metric calls, and all three clear LightGBM and fine-tuned CheMeleon7. Scaling the original checkpoint does not: GROVER large goes 3–26–16 against GROVER base. But none of the three reaches the front of this field. Fine-tuned v2 trails fine-tuned Atom-JEPA4 7–11–27, wins no Biogen call against Monroe + TabPFN 35 (0–2–16), and is never best alone on either data set. Frozen, v2's latent loses 38 of 45 calls to Monroe's vector. And the comparison carries a caveat the GROVER arms exist to expose: v2 was pre-trained on a corpus that contains every molecule in both test sets.
The NV-KERMT-70M-v2 checkpoint records the corpus it was pre-trained on, and that corpus includes both data sets used here: its train_data_path is a hybrid of ZINC15, ChEMBL, Biogen, OpenADMET and ChEMBL-MT. Structures only, with no labels, and the objective is contrastive rather than supervised — but every test molecule was in the pre-training set, so the test split is not blind to the encoder in the way the protocol assumes. That is the reason the two original GROVER checkpoints are here. Both pre-date these data sets, so they have never seen a test molecule in any form, and they share the encoder, the fine-tuning code and the recipe with v2. Read the v2 result as an upper bound and the GROVER results as the clean ones; the gap between them mixes better pre-training with whatever structural exposure is worth, and this design cannot separate the two. What can be said is that the gap is small — a mean +0.023 R² over GROVER base — and that it does not move v2 past Atom-JEPA or Monroe.
Each of the 150 fold models is one call to main.py finetune at commit 8828743, with nothing of ours inside the training loop. The fold's four training fifths, the held-out fifth and the fixed test set go in as three CSVs with a matching feature file each; KERMT fits its target scaler on the training CSV only, trains for 100 epochs, keeps the epoch that scored best on the held-out fifth, and predicts the test set with it. One model covers every endpoint of its data set at once, labels masked where unmeasured, the multitask setting CheMeleon and Atom-JEPA are also fine-tuned in. The recipe is the v2 paper's Appendix E: Noam-scheduled Adam from 1e−4 to 2e−5, batch 32, a 2-layer shared trunk under a 3-layer head per endpoint, every MLP 700 wide. Molecule-level features are descriptastorus' CDF-normalised RDKit 2D descriptors9, the repository default, computed once for every molecule — the normalisation is fitted by descriptastorus on a reference set, not on these data, so nothing passes between folds.
One thing to know about running this code as released: load_checkpoint copies the pre-trained checkpoint's own saved model arguments over the command line (task/train.py:249), so a few settings are the checkpoint's rather than ours, and they differ between the arms. Each fold records what it actually trained with, and that is what the table below reports. The two that matter: v2 trains with dropout 0.1 and keeps the epoch with the best validation MAE, while both GROVER checkpoints train with no dropout and keep the epoch with the best validation loss. The code was left unmodified rather than forced to agree, so the arms differ a little in more than their weights.
| In effect | KERMT v2 FT | GROVER-B FT | GROVER-L FT |
|---|---|---|---|
| Encoder | gtrans | dualtrans | dualtrans |
| Hidden width | 800 | 800 | 1200 |
| Dropout | 0.1 | 0.0 | 0.0 |
| Distance coefficient | 0.1 | 0.1 | 0.1 |
| Bond drop rate | 0 | 0 | 0 |
| Best epoch picked on | validation MAE | validation loss | validation loss |
The four comparators are imported unchanged from the nine-method foundation-model comparison and the Atom-JEPA study on the identical fold assignments: LightGBM on 2,048-bit Morgan counts10 (the classical floor), ChemProp8 fine-tuned from CheMeleon7 (the strongest 2D message-passing arm), Monroe + TabPFN 35 (the strongest frozen encoder read in context), and fine-tuned Atom-JEPA4 (a 39M-parameter 3D EquiformerV3 pre-trained by latent prediction). The frozen KERMT arm (kermt_tabpfn) takes v2's 512-d projected cMIM latent for every molecule and hands each fold's training vectors to TabPFN 3 with Monroe's exact call: one TabPFNRegressor, 8 estimators, softmax temperature 0.9, no PCA, the mean as the point estimate. The latent was chosen before any fold was scored.
Tukey HSD per endpoint and metric, counted the same way across every study on this site: a method is on top if Tukey's simultaneous correction cannot separate it from the best mean at α = 0.05, and it is only best alone if no other arm shares the top group. MAE is in the log units of each endpoint, followed by R².
| Endpoint | LightGBM | CheMeleon | Monroe/PFN3 | Atom-JEPA FT | GROVER-B FT | GROVER-L FT | KERMT v2 FT | KERMT v2/PFN3 |
|---|---|---|---|---|---|---|---|---|
| LogD | 0.545±0.012 | 0.427±0.018 | 0.402±0.015 | 0.382±0.014tied | 0.386±0.010tied | 0.386±0.014tied | 0.383±0.011tied | 0.656±0.019 |
| LogS | 0.454±0.015 | 0.358±0.017 | 0.380±0.009 | 0.323±0.010best | 0.358±0.018 | 0.369±0.021 | 0.352±0.017 | 0.425±0.012 |
| LOG_HLM | 0.332±0.009 | 0.314±0.014 | 0.293±0.009 | 0.277±0.014best | 0.295±0.017 | 0.301±0.016 | 0.303±0.019 | 0.355±0.006 |
| LOG_MLM | 0.410±0.014 | 0.399±0.030 | 0.358±0.011tied | 0.390±0.017 | 0.369±0.016tied | 0.367±0.019tied | 0.369±0.020tied | 0.378±0.008 |
| LOG_Caco_AB | 0.340±0.022 | 0.305±0.033 | 0.248±0.011best | 0.314±0.037 | 0.329±0.029 | 0.334±0.026 | 0.320±0.030 | 0.325±0.017 |
| LOG_Caco_Efflux | 0.432±0.019 | 0.375±0.034 | 0.346±0.012best | 0.375±0.034 | 0.402±0.027 | 0.410±0.022 | 0.392±0.033 | 0.393±0.023 |
| LOG_MPPB | 0.288±0.020 | 0.212±0.021 | 0.259±0.013 | 0.185±0.018best | 0.218±0.018 | 0.230±0.020 | 0.204±0.016 | 0.226±0.011 |
| LOG_MBPB | 0.223±0.018 | 0.157±0.018 | 0.192±0.016 | 0.124±0.005best | 0.162±0.014 | 0.165±0.014 | 0.148±0.011 | 0.187±0.006 |
| LOG_MGMB | 0.302±0.034 | 0.175±0.015tied | 0.204±0.033 | 0.163±0.010tied | 0.188±0.013 | 0.189±0.017 | 0.169±0.011tied | 0.216±0.022 |
| Endpoint | LightGBM | CheMeleon | Monroe/PFN3 | Atom-JEPA FT | GROVER-B FT | GROVER-L FT | KERMT v2 FT | KERMT v2/PFN3 |
|---|---|---|---|---|---|---|---|---|
| LogD | 0.510±0.021 | 0.671±0.019 | 0.718±0.017 | 0.754±0.015best | 0.721±0.010 | 0.721±0.013 | 0.727±0.011 | 0.309±0.033 |
| LogS | 0.335±0.036 | 0.474±0.029 | 0.442±0.028 | 0.562±0.021best | 0.513±0.037 | 0.486±0.041 | 0.524±0.037 | 0.323±0.025 |
| LOG_HLM | 0.139±0.045 | 0.221±0.071 | 0.314±0.049 | 0.388±0.062best | 0.312±0.084 | 0.299±0.071 | 0.274±0.103 | 0.039±0.033 |
| LOG_MLM | 0.084±0.064 | 0.135±0.141 | 0.290±0.048tied | 0.183±0.074 | 0.262±0.063tied | 0.270±0.073tied | 0.251±0.088tied | 0.188±0.026 |
| LOG_Caco_AB | -0.014±0.129 | 0.160±0.191 | 0.471±0.041best | 0.103±0.219 | 0.030±0.172 | -0.002±0.164 | 0.081±0.181 | 0.100±0.110 |
| LOG_Caco_Efflux | -0.135±0.096 | 0.110±0.158 | 0.275±0.054best | 0.112±0.158 | -0.014±0.133 | -0.061±0.113 | 0.029±0.158 | 0.053±0.130 |
| LOG_MPPB | 0.229±0.105 | 0.541±0.093 | 0.300±0.068 | 0.639±0.059best | 0.490±0.084 | 0.433±0.102 | 0.564±0.068 | 0.462±0.041 |
| LOG_MBPB | 0.477±0.080 | 0.713±0.061 | 0.590±0.066 | 0.797±0.013best | 0.686±0.042 | 0.675±0.044 | 0.735±0.027 | 0.604±0.018 |
| LOG_MGMB | 0.260±0.148 | 0.642±0.027tied | 0.588±0.098 | 0.670±0.023tied | 0.630±0.033tied | 0.623±0.043tied | 0.663±0.030tied | 0.505±0.094 |
| Endpoint | LightGBM | CheMeleon | Monroe/PFN3 | Atom-JEPA FT | GROVER-B FT | GROVER-L FT | KERMT v2 FT | KERMT v2/PFN3 |
|---|---|---|---|---|---|---|---|---|
| LOG_SOL | 0.413±0.009 | 0.370±0.007 | 0.322±0.004best | 0.340±0.006 | 0.347±0.006 | 0.342±0.007 | 0.342±0.007 | 0.408±0.006 |
| LOG_HLM | 0.395±0.005 | 0.337±0.007 | 0.299±0.003tied | 0.295±0.008tied | 0.317±0.004 | 0.319±0.005 | 0.309±0.008 | 0.384±0.004 |
| LOG_RLM | 0.470±0.005 | 0.404±0.006 | 0.375±0.003best | 0.385±0.005 | 0.389±0.006 | 0.393±0.006 | 0.384±0.007 | 0.462±0.005 |
| LOG_MDR1_ER | 0.385±0.005 | 0.340±0.004 | 0.294±0.002best | 0.317±0.005 | 0.329±0.004 | 0.331±0.006 | 0.321±0.005 | 0.383±0.003 |
| LOG_HPPB | 0.576±0.033 | 0.558±0.025 | 0.438±0.017best | 0.500±0.019 | 0.510±0.020 | 0.518±0.020 | 0.501±0.026 | 0.589±0.029 |
| LOG_RPPB | 0.554±0.021 | 0.553±0.023 | 0.445±0.026best | 0.513±0.023 | 0.512±0.026 | 0.504±0.025 | 0.494±0.025 | 0.605±0.035 |
| Endpoint | LightGBM | CheMeleon | Monroe/PFN3 | Atom-JEPA FT | GROVER-B FT | GROVER-L FT | KERMT v2 FT | KERMT v2/PFN3 |
|---|---|---|---|---|---|---|---|---|
| LOG_SOL | 0.275±0.024 | 0.363±0.021 | 0.504±0.013best | 0.436±0.017 | 0.384±0.022 | 0.396±0.020 | 0.413±0.027 | 0.289±0.019 |
| LOG_HLM | 0.326±0.015 | 0.474±0.019 | 0.556±0.009 | 0.573±0.016best | 0.531±0.012 | 0.526±0.013 | 0.558±0.021 | 0.354±0.012 |
| LOG_RLM | 0.389±0.011 | 0.513±0.012 | 0.569±0.007tied | 0.564±0.012tied | 0.555±0.013 | 0.547±0.012 | 0.561±0.011tied | 0.392±0.011 |
| LOG_MDR1_ER | 0.449±0.010 | 0.520±0.009 | 0.641±0.008best | 0.584±0.012 | 0.569±0.011 | 0.565±0.015 | 0.573±0.014 | 0.451±0.009 |
| LOG_HPPB | 0.129±0.094 | 0.230±0.065 | 0.478±0.036best | 0.390±0.038 | 0.315±0.055 | 0.307±0.056 | 0.336±0.068 | 0.143±0.079 |
| LOG_RPPB | 0.118±0.067 | 0.154±0.061 | 0.415±0.051best | 0.318±0.051 | 0.266±0.062 | 0.279±0.063 | 0.303±0.053 | 0.143±0.095 |
On ExpansionRx fine-tuned Atom-JEPA is on top of 19 of 27 combinations (13 of them alone) and Monroe + TabPFN 3 of 9 (5 alone). The three arms fine-tuned here land in a band below that and close together: KERMT v2 on top of 7 combinations, GROVER base 7, GROVER large 6, and none of the three ever alone. v2's are three endpoints: LogD, LOG_MLM and LOG_MGMB. On Biogen ADME the picture is Monroe's — on top of 17 of 18 combinations, 13 of them alone — and the fine-tuned graph transformers mostly drop out: KERMT v2 reaches the top tier on 2 of them, all on LOG_RLM, and neither GROVER arm nor the frozen latent reaches it at all.
Paired by fold, a two-sided t-test over the 25 shared folds at p < 0.05 for each endpoint and metric. Inside the family the ordering is clear and in the direction the v2 paper argues: fine-tuned v2 over fine-tuned GROVER base 30–13–2 (mean +0.023 R²) and over GROVER large 33–12–0 (+0.035 R²), with the two GROVER arms close enough that most of their calls go unmade — GROVER large against base is 3–26–16, so the bigger original checkpoint is if anything the weaker one. Outside the family it gets harder. All three beat LightGBM almost everywhere and CheMeleon more often than not. Against Monroe, v2 is ahead on ExpansionRx (15–1–11) and loses everything that is called on Biogen (0–2–16); the same split, deeper, holds for both GROVER arms. Against fine-tuned Atom-JEPA every one of the three loses clearly: v2 7–11–27, GROVER base 4–4–37, GROVER large 5–4–36.
| KERMT v2 fine-tuned against | ExpansionRx, 27 | Biogen, 18 | Gain, mean of 15 | |||||
|---|---|---|---|---|---|---|---|---|
| wins | no call | losses | wins | no call | losses | Δ R² | MAE drop | |
| Atom-JEPA fine-tuned | 3 | 5 | 19 | 4 | 6 | 8 | −0.032 | −0.0070 |
| Monroe + TabPFN 3 | 15 | 1 | 11 | 0 | 2 | 16 | −0.037 | −0.0090 |
| ChemProp + CheMeleon, fine-tuned | 16 | 7 | 4 | 18 | 0 | 0 | +0.045 | +0.0196 |
| LightGBM + Morgan | 27 | 0 | 0 | 18 | 0 | 0 | +0.202 | +0.0751 |
| GROVER base fine-tuned | 15 | 10 | 2 | 15 | 3 | 0 | +0.023 | +0.0081 |
| GROVER large fine-tuned | 19 | 8 | 0 | 14 | 4 | 0 | +0.035 | +0.0113 |
| KERMT v2 frozen + TabPFN 3 | 23 | 4 | 0 | 18 | 0 | 0 | +0.149 | +0.0669 |
| GROVER base fine-tuned against Atom-JEPA fine-tuned | 3 | 1 | 23 | 1 | 3 | 14 | −0.055 | −0.0151 |
| GROVER base fine-tuned against Monroe + TabPFN 3 | 14 | 4 | 9 | 0 | 0 | 18 | −0.060 | −0.0171 |
| GROVER base fine-tuned against ChemProp + CheMeleon, fine-tuned | 11 | 8 | 8 | 18 | 0 | 0 | +0.022 | +0.0115 |
| GROVER base fine-tuned against LightGBM + Morgan | 26 | 1 | 0 | 18 | 0 | 0 | +0.179 | +0.0670 |
| GROVER large fine-tuned against Atom-JEPA fine-tuned | 3 | 1 | 23 | 2 | 3 | 13 | −0.067 | −0.0183 |
| GROVER large fine-tuned against Monroe + TabPFN 3 | 12 | 6 | 9 | 0 | 0 | 18 | −0.072 | −0.0203 |
| GROVER large fine-tuned against ChemProp + CheMeleon, fine-tuned | 9 | 3 | 15 | 18 | 0 | 0 | +0.010 | +0.0083 |
| GROVER large fine-tuned against LightGBM + Morgan | 25 | 2 | 0 | 18 | 0 | 0 | +0.166 | +0.0638 |
| GROVER large against GROVER base fine-tuned | 0 | 17 | 10 | 3 | 9 | 6 | −0.012 | −0.0032 |
| frozen KERMT v2 + TabPFN 3 against Monroe + TabPFN 3 | 3 | 4 | 20 | 0 | 0 | 18 | −0.186 | −0.0759 |
| frozen KERMT v2 + TabPFN 3 against ChemProp + CheMeleon, fine-tuned | 2 | 1 | 24 | 0 | 1 | 17 | −0.104 | −0.0473 |
| frozen KERMT v2 + TabPFN 3 against LightGBM + Morgan | 18 | 1 | 8 | 8 | 6 | 4 | +0.052 | +0.0082 |
Reading v2 frozen through Monroe's TabPFN 3 call splits the distance from Monroe to fine-tuned v2 into two steps: first swap Monroe's vector for v2's latent, then fine-tune v2 instead of reading it.
| Endpoint | Data set | Swap Monroe's embedding for KERMT v2's frozen latent, same TabPFN 3 | Then fine-tune KERMT v2 instead | Fine-tuned KERMT v2 against Monroe |
|---|---|---|---|---|
| LOG_Caco_AB | ExpansionRx | −0.371 | −0.018 | −0.389 |
| LOG_Caco_Efflux | ExpansionRx | −0.222 | −0.023 | −0.246 |
| LOG_HLM | ExpansionRx | −0.276 | +0.236 | −0.040 |
| LOG_MBPB | ExpansionRx | +0.014 | +0.131 | +0.145 |
| LOG_MGMB | ExpansionRx | −0.083 | +0.158 | +0.075 |
| LOG_MLM | ExpansionRx | −0.103 | +0.063 | −0.040 |
| LOG_MPPB | ExpansionRx | +0.162 | +0.102 | +0.264 |
| LogD | ExpansionRx | −0.409 | +0.418 | +0.009 |
| LogS | ExpansionRx | −0.119 | +0.201 | +0.082 |
| LOG_HLM | Biogen ADME | −0.202 | +0.204 | +0.002 |
| LOG_HPPB | Biogen ADME | −0.335 | +0.193 | −0.142 |
| LOG_MDR1_ER | Biogen ADME | −0.190 | +0.123 | −0.068 |
| LOG_RLM | Biogen ADME | −0.176 | +0.169 | −0.008 |
| LOG_RPPB | Biogen ADME | −0.272 | +0.160 | −0.111 |
| LOG_SOL | Biogen ADME | −0.215 | +0.124 | −0.091 |
| median | ExpansionRx | −0.119 | +0.131 | +0.009 |
| median | Biogen ADME | −0.209 | +0.164 | −0.079 |
As a frozen vector v2's latent is behind Monroe's on 13 of the 15 endpoints — ahead only on LOG_MBPB and LOG_MPPB — by a median −0.119 R² on ExpansionRx and −0.209 on Biogen, and it wins only 3 of 45 calls against Monroe. It also loses to CheMeleon 2–2–41, though it does beat LightGBM 26–7–12, so the latent is not uninformative — just not a drop-in for an encoder built to be read frozen. Fine-tuning then lifts R² on 13 of 15 endpoints, by a median +0.131 R² on ExpansionRx and +0.164 on Biogen, and wins 41 of 45 calls against the frozen arm while losing 0. The net against Monroe is a median +0.009 R² on ExpansionRx and −0.079 on Biogen — the one data set it gains on and the one it does not. This is the same shape the Uni-Mol study found: an encoder pre-trained to reconstruct or contrast, rather than to summarise a molecule in one vector, needs its weights moved before it competes.
The 150 fine-tuned fold models took 149 GPU hours across two machines (apollo, an RTX 5070 Ti; spark, a DGX Spark GB10). The one arm both machines ran, GROVER base on ExpansionRx, took a median 4.2× as long on spark, though that figure flatters apollo: spark ran two fine-tuning jobs at a time for most of the sweep, which raises its time per fold and its throughput together. KERMT runs its full epoch budget with no early stopping, so a fold costs the same whatever epoch it ends up keeping. The kept epoch is usually well inside the 100 available — a median of 61 for v2, 40 for GROVER base and 35 for GROVER large — so the budget is not the binding constraint, and an early-stopping patience would cut most of this bill. On ExpansionRx, the one arm pairing both ran on apollo, a GROVER large fold costs 1.4× a GROVER base one for its 1200-wide encoder, and gets nothing for it. The frozen arm needs one forward pass per molecule and then TabPFN 3, minutes rather than hours, and is not tabulated.
| Arm | Data set | Machine | Fold models | Median minutes / fold | Median best epoch | Epoch budget | Total, GPU hours |
|---|---|---|---|---|---|---|---|
| GROVER-B FT | Biogen ADME | spark, GB10 | 25 | 61.1 | 61 | 100 | 24.7 |
| GROVER-B FT | ExpansionRx | apollo, GeForce RTX 5070 Ti | 5 | 36.1 | 25 | 100 | 3.0 |
| GROVER-B FT | ExpansionRx | spark, GB10 | 20 | 151.6 | 20 | 100 | 50.1 |
| GROVER-L FT | Biogen ADME | apollo, GeForce RTX 5070 Ti | 25 | 20.5 | 56 | 100 | 8.5 |
| GROVER-L FT | ExpansionRx | apollo, GeForce RTX 5070 Ti | 25 | 50.3 | 26 | 100 | 20.8 |
| KERMT v2 FT | Biogen ADME | spark, GB10 | 25 | 62.8 | 50 | 100 | 26.1 |
| KERMT v2 FT | ExpansionRx | apollo, GeForce RTX 5070 Ti | 25 | 36.9 | 66 | 100 | 15.6 |
Reported the way “Even More Thoughts on ML Method Comparisons” and the protocol paper it points at13 argue comparisons should be: distributions over folds, simultaneous confidence intervals, paired tests on the folds, and no bolded maxima. Where two methods cannot be separated, both are reported as tied.
Code, per-fold metrics and every figure: studies/kermt.
NV-KERMT-70M-v2, fine-tuned here as kermt_ft and read frozen as kermt_tabpfn. hf:nvidia/NV-KERMT-70M-v2