ops.Bucketize算子在计算梯度的时候出现报错RuntimeError: Illegal primitive Bucketize's bprop not defined
收藏回复举报
ops.Bucketize算子在计算梯度的时候出现报错RuntimeError: Illegal primitive Bucketize's bprop not defined
发表于2023-09-14 17:20:35
0 查看

1 系统环境

硬件环境(Ascend/GPU/CPU): Ascend/GPU/CPU

MindSpore版本: mindspore=2.0.0

执行模式(PyNative/ Graph):不限

Python版本: Python=3.9.13

操作系统平台: 不限

2 报错信息

2.1 问题描述

程序在计算梯度的时候出现报错,根据提示可能是ops.Bucketize算子的问题。

Error executing job with overrides: []
Traceback (most recent call last):
File "/home/xcflab/wgx/work/train.py", line 466, in run
exp.start_training()
File "/home/xcflab/wgx/work/train.py", line 124, in start_training
epoch_log = self.train_epoch(
File "/home/xcflab/wgx/work/train.py", line 142, in train_epoch
loss, aux_data = self.update_fn(train_feats)
File "/home/xcflab/wgx/work/train.py", line 151, in update_fn
(loss, aux_data), grads = self.grad_fn(data)
File "/home/xcflab/conda/envs/se3/lib/python3.9/site-packages/mindspore/ops/composite/base.py", line 605, in after_grad
return grad_(fn_, weights)(*args, **kwargs)
File "/home/xcflab/conda/envs/se3/lib/python3.9/site-packages/mindspore/common/api.py", line 102, in wrapper
results = fn(*arg, **kwargs)
File "/home/xcflab/conda/envs/se3/lib/python3.9/site-packages/mindspore/ops/composite/base.py", line 583, in after_grad
pynative_executor.grad(fn, grad, weights, grad_position, *args, **kwargs)
File "/home/xcflab/conda/envs/se3/lib/python3.9/site-packages/mindspore/common/api.py", line 1118, in grad
self._executor.grad_net(grad, obj, weights, grad_position, *args, *(kwargs.values()))
RuntimeError: Illegal primitive Bucketize's bprop not defined

C++ Call Stack: (For framework developers)
mindspore/ccsrc/pipeline/pynative/grad/auto_grad.cc:1295 BackPropagate

2.2 脚本代码(代码格式,可上传附件)

self._optimizer = nn.Adam(self._model.trainable_params(),learning_rate=self._exp_conf.learning_rate)
self.grad_fn = mindspore.value_and_grad(self.loss_fn, None, self._optimizer.parameters)

def update_fn(self, data):
    """Updates the state using some data and returns metrics."""
    #loss, aux_data = self.loss_fn(data)
    (loss, aux_data), grads = self.grad_fn(data)
    loss = ops.depend(loss, optimizer(grads))
    return loss, aux_data

def torch_score(
        self,
        vec: mindspore.Tensor,
        t: mindspore.Tensor,
        eps: mindspore.float32=1e-6
    ):
    omega = ops.norm(vec, dim=-1)
    score_norms_t = self._score_norms[self.t_to_idx(du.move_to_np(t))]
    score_norms_t = mindspore.Tensor(score_norms_t,mindspore.float32)
    omega_idx = ops.Bucketize(list(self.discrete_omega[:-1]))(omega)
    omega_score_t = ops.gather_elements(
        score_norms_t, 1, omega_idx)
    return omega_score_t[..., None] * vec / (omega[..., None] + eps)

3 根因分析

cke_3098.png

4 解决方案

******此处由用户填写******

包含文字方案和最终脚本代码

请将正确的脚本打包并上传附件

我要发帖子