MindSpore Ascend GatherNd 算子问题

问题描述:

  • 输入 tokens 是一个形状为 (1, 77) 的张量,表示提示词 '船' 的 token 序列,在 FrozenOpenCLIPEmbedder2.pool 方法中,ops.gather_nd(x, indices) 尝试从 x(形状 (1, 77, 1280))中提取特定位置的特征,其中 indices 是 [[0, 4]]。预期 GatherNd 返回形状为 (1, 1280) 的张量,表示第 0 个样本、第 4 个 token 的特征。然而,实际执行时抛出索引越界错误,提示访问了超出范围的索引 205,且要求索引在 [-2, 2) 范围内。错误发生在图执行阶段(construct 方法的调试打印前),表明问题可能源于 GatherNd 算子在 Ascend 上的索引计算或内存访问错误,而非用户代码逻辑问题
  • 关键日志:Pool: x shape: (1, 77, 1280), tokens shape: (1, 77), dtype: Float32 

    Pool: indices shape: (1, 2), indices: [[0 4]] 

    Pool: max index: 4, x dim1: 77 

    Traceback (most recent call last): 

      File "/home/mindspore/work/mindone/examples/pangu_draw_v3/pangu_sampling.py", line 511, in <module> 

        sample(args) 

      File "/home/mindspore/work/mindone/examples/pangu_draw_v3/pangu_sampling.py", line 456, in sample 

        out = run_img2img( 

      File "/home/mindspore/work/mindone/examples/pangu_draw_v3/pangu_sampling.py", line 285, in run_img2img 

        out = model.do_img2img( 

      File "/home/mindspore/work/mindone/examples/pangu_draw_v3/gm/models/diffusion.py", line 415, in do_img2img 

        c, uc = self.conditioner.get_unconditional_conditioning( 

      File "/home/mindspore/work/mindone/examples/pangu_draw_v3/gm/modules/embedders/modules.py", line 234, in get_unconditional_conditioning 

        c = self.tokenize_embedding(batch_c) 

      File "/home/mindspore/work/mindone/examples/pangu_draw_v3/gm/modules/embedders/modules.py", line 215, in tokenize_embedding 

        vector, crossattn, concat = self.embedding(*tokens, force_zero_embeddings=force_zero_embeddings) 

      File "/home/mindspore/work/mindone/examples/pangu_draw_v3/gm/modules/embedders/modules.py", line 168, in embedding 

        emb_out = embedder(*token) 

    IndexError: Given index 205 out of range. Please make sure the value of index in [-2, 2), and the type is int32. 

    ---------------------------------------------------- 

    - C++ Call Stack: (For framework developers) 

    ---------------------------------------------------- 

    mindspore/ccsrc/runtime/graph_scheduler/actor/control_flow/switch_actor.cc:51 FetchInput

解决方法:

最新的ms2.5.0版本, ops.gather_nd这个算子我在910a上单独测试了一下,并没有问题:

你这边报错确定是ops.gather_nd算子引发的吗,看报错信息感觉也不像ops.gather_nd引发的?目前运行的是静态图吗,如果是静态图,可以先改成动态图,并设置动态图同步模式运行,看看有没有报错,有错误的话可能可以获得更准确的错误信息;动态图默认异步模式,或者静态图下,报错有时候堆栈定位不是很准;如果动态图正常,静态图出错,那有可能是图编译上的bug了

### Ascend C算子使用方法及API文档 #### 升腾C算子概述 升腾C(Ascend C)提供了一套完整的工具链来支持开发者创建高效的AI应用程序。对于自定义算子开发而言,掌握特定的API及其工作原理至关重要[^2]。 #### 主要API介绍 - **AllocTensor**:用于分配张量对象,在指定设备上的内存空间中预留位置以便后续操作。 - **DataCopy**:负责处理不同存储区域间的数据传输任务;能够有效地将源地址处的信息复制到目标地址。 - **EnQue**:把准备好的本地张量加入队列等待进一步处理或计算资源调度。 下面给出一段简化版的例子展示如何利用上述提到的功能构建一个简单的输入过程: ```cpp __aicore__ inline void CopyIn(int32_t progress, uint32_t length) { LocalTensor<DTYPE_X> xLocal = inQueueX.AllocTensor<DTYPE_X>(); // 分配局部张量 DataCopy(xLocal, xGm[progress * this->tileLength], length); // 数据拷贝至局部张量 inQueueX.EnQue(xLocal); // 将局部张量放入队列 } ``` 这段代码片段展示了怎样通过`inQueueX`这个队列管理器实例化并初始化一个新的局部张量(`xLocal`),接着从全局内存(`xGm`)读取数据填充该张量最后将其推送到队列里供其他组件访问[^3]。 #### 自定义算子实现案例-SinhCustom 针对具体的数学运算如双曲正弦函数(Sinh),可以通过组合基本的操作符和库函数来达成目的。这里给出了关于`SinhCustom`算子的一个简单设计思路: 1. 定义核函数(Kernel-side Code): 这部分涉及到实际数值计算逻辑,通常是在GPU或其他加速硬件上运行。 ```cpp extern "C" __global__ void SinhKernel(const float* input, float* output, size_t n) { int idx = blockIdx.x * blockDim.x + threadIdx.x; if (idx < n){ double ex = exp(input[idx]); double emx = exp(-input[idx]); output[idx] = static_cast<float>((ex - emx)/2.); } } ``` 2. 编写主机端接口(Host-side Code): 提供给用户调用的方式,同时也承担着参数传递、错误检测等工作。 ```cpp AclLiteError ExecuteSinhCustom(AclLiteContext& context, const std::vector<void*>& inputs, std::vector<void*>& outputs) { // ... 设置启动配置 ... dim3 block_size(BLOCK_SIZE); dim3 grid_size((num_elements + BLOCK_SIZE - 1) / BLOCK_SIZE); SinhKernel<<<grid_size, block_size>>>(static_cast<const float*>(inputs[0]), static_cast<float*>(outputs[0]), num_elements); cudaDeviceSynchronize(); return ACLLITE_OK; } ``` 3. 测试与验证: 利用预置的数据集对新编写的算子进行全面检验以确保其正确性和性能表现良好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值