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

训练完成1个epoch后出现AttributeError: 'NoneType'无state_dict属性问题

问题解决:AttributeError: 'NoneType' object has no attribute 'state_dict'

问题场景

已按仓库要求安装所有依赖:

conda install pytorch==1.8.0 torchvision==0.9.0 cudatoolkit=10.2 -c pytorch
pip install opencv-python==4.4.0.46 termcolor==1.1.0 yacs==0.1.8

但完成一个epoch训练后,程序在保存checkpoint时报错。

相关代码

import os
import torch
import torch.distributed as dist
import numpy as np
import pdb
 
try:
    # noinspection PyUnresolvedReferences
    from apex import amp
except ImportError:
    amp = None

def save_checkpoint(config, epoch, model, max_accuracy, optimizer, lr_scheduler, logger):
    save_state = {'model': model.state_dict(),
                  'optimizer': optimizer.state_dict(),
                  'lr_scheduler': lr_scheduler.state_dict(),
                  'max_accuracy': max_accuracy,
                  'epoch': epoch,
                  'config': config}
    if config.AMP_OPT_LEVEL != "O0":
        save_state['amp'] = amp.state_dict()

    save_path = os.path.join(config.OUTPUT, f'ckpt_epoch_{epoch}.pth')
    logger.info(f"{save_path} saving......")
    torch.save(save_state, save_path)
    logger.info(f"{save_path} saved !!!")

训练日志

loss 6.5611 (6.7661)    grad_norm 2.8034 (nan)  mem 12138MB
[2023-06-08 11:25:02 deit_small_patch14_mask56_224_alpha1](main.py 488): INFO Train: [0/300][4970/5004] eta 0:00:37 lr 0.000051 time 1.0590 (1.1059)loss 6.6133 (6.7656)    grad_norm 2.9514 (nan)  mem 12138MB
[2023-06-08 11:25:13 deit_small_patch14_mask56_224_alpha1](main.py 488): INFO Train: [0/300][4980/5004] eta 0:00:26 lr 0.000051 time 1.1264 (1.1059)loss 6.3637 (6.7652)    grad_norm 3.3315 (nan)  mem 12138MB
[2023-06-08 11:25:24 deit_small_patch14_mask56_224_alpha1](main.py 488): INFO Train: [0/300][4990/5004] eta 0:00:15 lr 0.000051 time 1.0718 (1.1058)loss 6.5798 (6.7649)    grad_norm 2.6179 (nan)  mem 12138MB
[2023-06-08 11:25:35 deit_small_patch14_mask56_224_alpha1](main.py 488): INFO Train: [0/300][5000/5004] eta 0:00:04 lr 0.000051 time 1.0397 (1.1058)loss 6.7300 (6.7645)    grad_norm 3.6217 (nan)  mem 12138MB
[2023-06-08 11:25:38 deit_small_patch14_mask56_224_alpha1](main.py 497): INFO EPOCH 0 training takes 1:32:13

错误栈信息

Traceback (most recent call last):
  File "main.py", line 645, in <module>
    main(config)
  File "main.py", line 237, in main
    logger,
  File "/home2/coremax/Documents/MixPro/utils.py", line 193, in save_checkpoint
    save_state['amp'] = amp.state_dict()
AttributeError: 'NoneType' object has no attribute 'state_dict'

问题原因

代码尝试导入NVIDIA Apex库的amp(自动混合精度)模块失败,导致amp变量被赋值为None。但训练配置中的AMP_OPT_LEVEL不是"O0"(即启用了混合精度训练),触发了amp.state_dict()的调用,从而抛出AttributeError。

解决方案

方案1:安装Apex模块

执行以下命令安装适配PyTorch 1.8.0的Apex版本:

git clone https://github.com/NVIDIA/apex
cd apex
pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./

如果编译时出现问题,可尝试去掉编译加速参数:

pip install -v --disable-pip-version-check --no-cache-dir ./

方案2:修改代码兼容未安装Apex的情况

修改save_checkpoint函数,增加对amp是否为None的判断,避免空对象调用:

def save_checkpoint(config, epoch, model, max_accuracy, optimizer, lr_scheduler, logger):
    save_state = {'model': model.state_dict(),
                  'optimizer': optimizer.state_dict(),
                  'lr_scheduler': lr_scheduler.state_dict(),
                  'max_accuracy': max_accuracy,
                  'epoch': epoch,
                  'config': config}
    # 增加amp是否为None的判断
    if config.AMP_OPT_LEVEL != "O0" and amp is not None:
        save_state['amp'] = amp.state_dict()

    save_path = os.path.join(config.OUTPUT, f'ckpt_epoch_{epoch}.pth')
    logger.info(f"{save_path} saving......")
    torch.save(save_state, save_path)
    logger.info(f"{save_path} saved !!!")

如果不需要混合精度训练,也可以直接将配置中的AMP_OPT_LEVEL设置为"O0",这样就不会触发任何amp相关的代码逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:54:57