You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一代码中实例化多个CrabNet模型的报错问题及解决咨询

在同一代码中实例化多个CrabNet模型的解决方案

问题描述

在催化项目中使用CrabNet工具验证不同数据集子集的训练效果时,同一代码中实例化两个CrabNet模型,调用第二个模型的fit方法触发以下错误:

File ".conda\lib\site-packages\torch\optim\optimizer.py", line 271, in wrapper for pre_hook in chain(_global_optimizer_pre_hooks.values(), self._optimizer_step_pre_hooks.values()): AttributeError: 'SWA' object has no attribute '_optimizer_step_pre_hooks'

复现代码:

"""Basic usage of CrabNet regression on elasticity dataset."""
from crabnet.utils.data import get_data
from crabnet.data.materials_data import elasticity, example_materials_property
from crabnet.crabnet_ import CrabNet

train_df, val_df = get_data(elasticity, "train.csv", dummy=True)
train_df_2, val_df_2 = get_data(example_materials_property, "train.csv", dummy=True)

cb = CrabNet(mat_prop="elasticity")
cb.fit(train_df)
val_pred, val_sigma = cb.predict(val_df, return_uncertainty=True)

cbn = CrabNet(mat_prop="example_materials_property")
cbn.fit(train_df_2)
val_pred_2, val_sigma_2 = cbn.predict(val_df_2, return_uncertainty=True)

解决方案

方法1:重置PyTorch全局优化器钩子

在实例化第二个CrabNet模型前,清空PyTorch的全局优化器前置钩子,避免跨模型的状态冲突:

import torch

# 训练第一个模型
cb = CrabNet(mat_prop="elasticity")
cb.fit(train_df)
val_pred, val_sigma = cb.predict(val_df, return_uncertainty=True)

# 重置全局优化器钩子
torch._C._clear_global_optimizer_pre_hooks()

# 训练第二个模型
cbn = CrabNet(mat_prop="example_materials_property")
cbn.fit(train_df_2)
val_pred_2, val_sigma_2 = cbn.predict(val_df_2, return_uncertainty=True)

方法2:用函数作用域隔离模型训练

将每个模型的训练逻辑封装到独立函数中,利用局部作用域隔离模型、优化器的状态,避免全局状态污染:

"""Basic usage of CrabNet regression on elasticity dataset."""
from crabnet.utils.data import get_data
from crabnet.data.materials_data import elasticity, example_materials_property
from crabnet.crabnet_ import CrabNet

def train_and_evaluate(mat_prop, train_data, val_data):
    model = CrabNet(mat_prop=mat_prop)
    model.fit(train_data)
    pred, sigma = model.predict(val_data, return_uncertainty=True)
    return model, pred, sigma

train_df, val_df = get_data(elasticity, "train.csv", dummy=True)
train_df_2, val_df_2 = get_data(example_materials_property, "train.csv", dummy=True)

# 训练第一个模型
cb, val_pred, val_sigma = train_and_evaluate("elasticity", train_df, val_df)

# 训练第二个模型
cbn, val_pred_2, val_sigma_2 = train_and_evaluate("example_materials_property", train_df_2, val_df_2)

方法3:升级PyTorch版本

该错误是PyTorch旧版本中SWA优化器与全局钩子机制的兼容性问题,升级PyTorch到1.13.0及以上版本后,该问题通常会被官方修复。

内容的提问来源于stack exchange,提问作者David Siret Marqués

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:47:24