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

PyTorch Lightning训练报错TypeError: 'NoneType' object is not callable求助

问题:trainer.fit调用时触发TypeError: 'NoneType' object is not callable

运行kNN-KG项目的main.py(执行bash脚本./scripts/fb15k-237/fb15k.sh)时,调用trainer.fit(lit_model, datamodule=data)出现TypeError: 'NoneType' object is not callable错误。先后尝试pytorch_lightning==1.3.1和1.5.10版本,问题未解决。

代码片段

import argparse
import importlib
from logging import debug
import numpy as np
import torch
import pytorch_lightning as pl
import lit_models
import yaml
import time
from transformers import AutoConfig
import os

os.environ["TOKENIZERS_PARALLELISM"] = "false"


def _import_class(module_and_class_name: str) -> type:
    """Import class from a module, e.g. 'text_recognizer.models.MLP'
    
    """
    module_name, class_name = module_and_class_name.rsplit(".", 1)
    module = importlib.import_module(module_name)
    class_ = getattr(module, class_name)
    return class_


def _setup_parser():
    """Set up Python's ArgumentParser with data, model, trainer, and other arguments."""
    parser = argparse.ArgumentParser(add_help=False)

    trainer_parser = pl.Trainer.add_argparse_args(parser)
    trainer_parser._action_groups[1].title = "Trainer Args"
    parser = argparse.ArgumentParser(add_help=False, parents=[trainer_parser])

    parser.add_argument("--wandb", action="store_true", default=False)
    parser.add_argument("--litmodel_class", type=str, default="TransformerLitModel")
    parser.add_argument("--seed", type=int, default=7)
    parser.add_argument("--data_class", type=str, default="KGC")
    parser.add_argument("--chunk", type=str, default="")
    parser.add_argument("--model_class", type=str, default="RobertaUseLabelWord")
    parser.add_argument("--checkpoint", type=str, default=None)

    temp_args, _ = parser.parse_known_args()
    data_class = _import_class(f"data.{temp_args.data_class}")
    model_class = _import_class(f"models.{temp_args.model_class}")
    lit_model_class = _import_class(f"lit_models.{temp_args.litmodel_class}")

    data_group = parser.add_argument_group("Data Args")
    data_class.add_to_argparse(data_group)

    model_group = parser.add_argument_group("Model Args")
    if hasattr(model_class, "add_to_argparse"):
        model_class.add_to_argparse(model_group)

    lit_model_group = parser.add_argument_group("LitModel Args")
    lit_model_class.add_to_argparse(lit_model_group)

    parser.add_argument("--help", "-h", action="help")
    return parser


def _saved_pretrain(lit_model, tokenizer, path):
    lit_model.model.save_pretrained(path)
    tokenizer.save_pretrained(path)


def main():
    parser = _setup_parser()
    args = parser.parse_args()

    np.random.seed(args.seed)
    torch.manual_seed(args.seed)
    pl.seed_everything(args.seed)

    data_class = _import_class(f"data.{args.data_class}")
    model_class = _import_class(f"models.{args.model_class}")
    litmodel_class = _import_class(f"lit_models.{args.litmodel_class}")

    config = AutoConfig.from_pretrained(args.model_name_or_path)
    config.label_smoothing = args.label_smoothing

    model = model_class.from_pretrained(args.model_name_or_path, config=config)
    data = data_class(args, model)
    tokenizer = data.tokenizer

    lit_model = litmodel_class(args=args, model=model, tokenizer=tokenizer, data_config=data.get_config())
    if args.checkpoint:
        lit_model.load_state_dict(torch.load(args.checkpoint, map_location="cpu")["state_dict"])

    logger = pl.loggers.TensorBoardLogger("training/logs")
    if args.wandb:
        logger = pl.loggers.WandbLogger(project="kgc_bert", name=args.data_dir.split("/")[-1])
        logger.log_hyperparams(vars(args))

    metric_name = "Eval/mrr" if not args.pretrain else "Eval/hits1"

    early_callback = pl.callbacks.EarlyStopping(monitor="Eval/mrr", mode="max", patience=10)
    model_checkpoint = pl.callbacks.ModelCheckpoint(monitor=metric_name, mode="max",
                                                    filename=args.data_dir.split("/")[
                                                                 -1] + '/{epoch}-{Eval/hits10:.2f}-{Eval/hits1:.2f}' if not args.pretrain else
                                                    args.data_dir.split("/")[-1] + '/{epoch}-{step}-{Eval/hits10:.2f}',
                                                    dirpath="output",
                                                    save_weights_only=True,
                                                    every_n_train_steps=100 if args.pretrain else None,
                                                    save_top_k=5 if args.pretrain else 1
                                                    )
    callbacks = [early_callback, model_checkpoint]

    trainer = pl.Trainer.from_argparse_args(args, callbacks=callbacks, logger=logger, default_root_dir="training/logs")

    if "EntityEmbedding" not in lit_model.__class__.__name__:
        trainer.fit(lit_model, datamodule=data)
        path = model_checkpoint.best_model_path
        lit_model.load_state_dict(torch.load(path)["state_dict"])

    result = trainer.test(lit_model, datamodule=data)
    print(result)

    if "EntityEmbedding" not in lit_model.__class__.__name__:
        print("*path" * 30)
        print(path)

if __name__ == "__main__":
    main()

报错信息

trainer.fit(lit_model, datamodule=data)#TypeError: 'NoneType' object is not callable
    File "/home///projects/KNN-KG/main.py", line 134, in <module>
        main()
      File "/home///projects/KNN-KG/main.py", line 120, in main
        trainer.fit(lit_model, datamodule=data)
      File "/home//anaconda3/envs/py111/lib/python3.9/site-packages/pytorch_lightning/trainer/trainer.py", line 740, in fit
        self._call_and_handle_interrupt(
      File "/home//anaconda3/envs/py111/lib/python3.9/site-packages/pytorch_lightning/trainer/trainer.py", line 685, in _call_and_handle_interrupt
        return trainer_fn(*args, **kwargs)
      File "/home//anaconda3/envs/py111/lib/python3.9/site-packages/pytorch_lightning/trainer/trainer.py", line 777, in _fit_impl
        self._run(model, ckpt_path=ckpt_path)
      File "/home//anaconda3/envs/py111/lib/python3.9/site-packages/pytorch_lightning/trainer/trainer.py", line 1199, in _run
        self._dispatch()
      File "/home//anaconda3/envs/py111/lib/python3.9/site-packages/pytorch_lightning/trainer/trainer.py", line 1279, in _dispatch
        self.training_type_plugin.start_training(self)
      File "/home//anaconda3/envs/py111/lib/python3.9/site-packages/pytorch_lightning/plugins/training_type/ddp_spawn.py", line 173, in start_training
        self.spawn(self.new_process, trainer, self.mp_queue, return_result=False)
      File "/home//anaconda3/envs/py111/lib/python3.9/site-packages/pytorch_lightning/plugins/training_type/ddp_spawn.py", line 201, in spawn
        mp.spawn(self._wrapped_function, args=(function, args, kwargs, return_queue), nprocs=self.num_processes)
      File "/home//anaconda3/envs/py111/lib/python3.9/site-packages/torch/multiprocessing/spawn.py", line 240, in spawn
        return start_processes(fn, args, nprocs, join, daemon, start_method='spawn')
      File "/home//anaconda3/envs/py111/lib/python3.9/site-packages/torch/multiprocessing/spawn.py", line 189, in start_processes
        process.start()
      File "/home//anaconda3/envs/py111/lib/python3.9/multiprocessing/process.py", line 121, in start
        self._popen = self._Popen(self)
      File "/home//anaconda3/envs/py111/lib/python3.9/multiprocessing/context.py", line 284, in _Popen
        return Popen(process_obj)
      File "/home//anaconda3/envs/py111/lib/python3.9/multiprocessing/popen_spawn_posix.py", line 32, in __init__
        super().__init__(process_obj)
      File "/home//anaconda3/envs/py111/lib/python3.9/multiprocessing/popen_fork.py", line 19, in __init__
        self._launch(process_obj)
      File "/home//anaconda3/envs/py111/lib/python3.9/multiprocessing/popen_spawn_posix.py", line 47, in _launch
        reduction.dump(process_obj, fp)
      File "/home//anaconda3/envs/py111/lib/python3.9/multiprocessing/reduction.py", line 60, in dump
        ForkingPickler(file, protocol).dump(obj)
          
    TypeError: 'NoneType' object is not callable

排查与解决方案

从报错栈看,错误发生在多进程序列化阶段,说明传递到子进程的对象中存在无法被pickle序列化的None类型可调用对象,按以下步骤排查:

  • 检查datamodule的可序列化性
    手动测试data对象的序列化:

    import pickle
    pickle.dumps(data)
    

    若报错,直接定位KGC类中的问题属性——比如未初始化的回调函数、lambda表达式、引用外部None值的可调用对象。

  • 检查lit_model中的不可序列化对象
    确认TransformerLitModel实例没有lambda函数、未绑定的方法或其他不可pickle的属性;同时验证HuggingFace tokenizer是否被正确初始化,无自定义修改导致的序列化问题。

  • 切换多进程启动方式
    当前用的ddp_spawn依赖pickle,可尝试切换到ddp(用torchrun启动),或临时禁用多进程:在启动命令中添加--accelerator cpu --devices 1,验证是否是多进程序列化导致的问题。

  • 检查模型初始化
    确认RobertaUseLabelWord.from_pretrained返回的实例中,所有可调用属性(如loss函数、钩子)都已正确初始化,未被设为None。

  • 验证依赖兼容性
    检查torch版本是否与pytorch_lightning 1.5.10匹配(建议torch>=1.7.0),transformers版本是否符合项目要求,避免依赖冲突。

内容的提问来源于stack exchange,提问作者Ayler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:04:43