参数错误后的报错内容:“Error in atexit._run_exitfuncs: RuntimeError: assertion `i->ptr' failed”

为使您的问题得到快速解决,建议参考以下模板:

【标题】
参数错误后的报错内容:“Error in atexit._run_exitfuncs: RuntimeError: assertion `i->ptr’ failed”
【版本、环境信息】

  • MegEngine 版本:1.12
  • CPU型号:Intel i7
  • 系统环境:macos 10.15
  • python版本: 3.6.7

【如为报错请提供以下复现信息】

  • 复现步骤:
    发现问题是24行的交叉熵函数存在问题,将23~24行改为:
loss = F.nn.cross_entropy(logits, tensor(i[1]).reshape(-1)) * (-1)

则问题解决,但是错误情况下的报错不太对劲,或许可以修下
运行关键片段代码即可复现

  • 日志信息:
python3 4.py
14 23:46:43 load_serialized_obj_from_url: download to or using cached /Users/ppppp/.cache/megengine/serialized/009607_resnet18_naiveaug_70312_78a63ca6.pkl
Error in atexit._run_exitfuncs:
RuntimeError: assertion `i->ptr' failed at /Users/mac_ci/engine_group_share_dir/group_build_whl/megengine/imperative/src/impl/interpreter_impl.cpp:422: auto mgb::imperative::interpreter::intl::ChannelImpl::process_one_task(mgb::imperative::interpreter::intl::Command &)::(anonymous class)::operator()(auto &) const
extra message: Invalid input tensor ptr!

backtrace:
2   libmegengine_export.dylib           0x0000000111c70df6 _ZN3mgb13MegBrainErrorC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE + 54
3   libmegengine_export.dylib           0x0000000111c70733 _ZN3mgb15__assert_fail__EPKciS1_S1_S1_z + 259
4   _imperative_rt.cpython-36m-darwin.s 0x0000000111b966d9 _imperative_rt.cpython-36m-darwin.s + 1304281
5   _imperative_rt.cpython-36m-darwin.s 0x0000000111b9b1e6 _imperative_rt.cpython-36m-darwin.s + 1323494
6   _imperative_rt.cpython-36m-darwin.s 0x0000000111b9adf2 _imperative_rt.cpython-36m-darwin.s + 1322482
7   _imperative_rt.cpython-36m-darwin.s 0x0000000111b9b57e _imperative_rt.cpython-36m-darwin.s + 1324414
8   libsystem_pthread.dylib             0x0000000101464109 _pthread_start + 148
9   libsystem_pthread.dylib             0x000000010145fb8b thread_start + 15
  • 代码关键片段:
import megengine as mge
import megengine.hub
import megengine.functional as F
import numpy as np
from megengine import tensor
from megengine.data.dataset import CIFAR10
from megengine.tensor import Parameter
from megengine.optimizer import Adam
from megengine.autodiff import GradManager

resnet18 = megengine.hub.load("megengine/models", "resnet18", pretrained=True)
train_dataset = CIFAR10(root="./dataset", train=True, download=True)

for i in train_dataset:
    pre_noise = Parameter(tensor(np.zeros((32, 32, 3))))
    opt = Adam(pre_noise, 0.01)
    gm = GradManager().attach(pre_noise)
    with gm:
        i_noise = tensor(i[0]) + 10 * F.tanh(pre_noise)
        i_noise = F.expand_dims(F.transpose((i_noise - 114.495) / 57.63, (2, 0, 1)), 0)
        i_resize = F.nn.interpolate(i_noise, [224, 224], align_corners=None)
        logits = resnet18(i_resize)
        gt_one_hot = F.one_hot(tensor(i[1]), 10)
        loss = F.nn.cross_entropy(logits, gt_one_hot) * (-1)
        gm.backward(loss)
    break

你好,我复现了这段代码,发现了几个问题,供参考:

  1. F.one_hot 需要接受一个维度不等于 0 的 Tensor 作为输入,而上面的 tensor(i[1]) 并不满足要求。改成 tensor(i[1]).reshape(-1)可以避免这行报错,但是后续还有别的问题。
  2. megengine.hub.load加载的resnet18输出为1000类,和cifar10数据集标签类别数量是不匹配的。

关于报错信息不明确的问题,我们会继续改进。

cross_entropy的label不需要转成one hot格式,把这一行gt_one_hot = F.one_hot(tensor(i[1]), 10) 删掉后,再把这下面一行loss = F.nn.cross_entropy(logits, gt_one_hot) * (-1)改成loss = F.nn.cross_entropy(logits, tensor([i[1]])) * (-1)就能跑过了

为什么要对 cross_entropy的结果乘以 -1?

远离groundtruth

或许可以修下报错

1.已经发现了,在复现步骤中写明了
2.因为 megengine.dataset 中只有 CIFAR10 所以暂时用这个写的复现片段,在项目中使用的是ImageNet1000 数据集,目前的问题是不知道为什么会有这种报错信息

解释一下为什么会是这样的报错信息:
MegEngine的python线程和执行op计算的线程是异步进行的,所以会导致报错信息偏离python代码的实际位置。你可以在进入循环之前设置

mge.core._imperative_rt.core2.config_async_level(0)

来获取看起来更合理的报错信息,不过这个 API 后续很有可能会变。

1赞

打错了,1.2.0