首页 > 其他分享 >为 Paddle2ONNX 修复 elementwise_floordiv 算子计算错误的问题

为 Paddle2ONNX 修复 elementwise_floordiv 算子计算错误的问题

时间:2024-11-29 17:56:53浏览次数:5  
标签:info 计算错误 auto _- elementwise input Paddle2ONNX output div

1 简介

elementwise_floordiv 算子在 int32/int64 的情况下直接转换成了 ONNX 中的 div 算子,由于 div 算子是普通除操作,而不是整除操作,因此无法通过 CI 的校验。

2 实现过程

原核心实现代码如下

void ElementWiseFloordivMapper::Opset7() {
    auto input_x_info = GetInput("X");
    auto input_y_info = GetInput("Y");
    auto output_info = GetOutput("Out");

    bool is_int = false;
    if (input_x_info[0].dtype <= 3 || input_x_info[0].dtype == 20 ||
        input_y_info[0].dtype <= 3 || input_y_info[0].dtype == 20) {
        is_int = true;
    }
    if (axis_ == -1 || axis_ == input_x_info[0].Rank() - 1 ||
        input_x_info[0].Rank() == input_y_info[0].Rank()) {
        if (is_int) {
            helper_->MakeNode("Div", {input_x_info[0].name, input_y_info[0].name},
                {output_info[0].name});
        } else {
            auto div_node = helper_->MakeNode(
            "Div", {input_x_info[0].name, input_y_info[0].name});
            helper_->MakeNode("Floor", {div_node->output(0)}, {output_info[0].name});
        }
    } else {
        std::vector<int64_t> broadcast_shape;
        broadcast_shape.resize(axis_ + input_x_info[0].Rank(), 1);
        for (auto i = 0; i < input_y_info[0].Rank(); ++i) {
            broadcast_shape[axis_ + i] = input_y_info[0].shape[i];
        }
        std::string broadcast_shape_node =
        helper_->Constant(GetOnnxDtype(P2ODataType::INT64), broadcast_shape);
        auto y_node = helper_->MakeNode(
        "Reshape", {input_y_info[0].name, broadcast_shape_node});
        if (is_int) {
            helper_->MakeNode("Div", {input_x_info[0].name, y_node->output(0)},
                {output_info[0].name});
        } else {
            auto div_node =
            helper_->MakeNode("Div", {input_x_info[0].name, y_node->output(0)});
            helper_->MakeNode("Floor", {div_node->output(0)}, {output_info[0].name});
        }
    }
}

可以看到,针对 int 的情况,原转换函数直接将 elementwise_floordiv 算子转换成了 Div 算子,这显然缺少了一个 floor 操作,因此修改为如下代码:

void ElementWiseFloordivMapper::Opset7() {
  auto input_x_info = GetInput("X");
  auto input_y_info = GetInput("Y");
  auto output_info = GetOutput("Out");

  auto div_input_0 = helper_->AutoCast(input_x_info[0].name, input_x_info[0].dtype, P2ODataType::FP32);
  auto div_input_1 = helper_->AutoCast(input_y_info[0].name, input_y_info[0].dtype, P2ODataType::FP32);

 if (axis_ == -1 || axis_ == input_x_info[0].Rank() - 1 || input_x_info[0].Rank() == input_y_info[0].Rank()) {
    auto div_node = helper_->MakeNode("Div", {div_input_0, div_input_1});
    auto floor_output = helper_->MakeNode("Floor", {div_node->output(0)});
    helper_->AutoCast(floor_output->output(0), output_info[0].name, P2ODataType::FP32, output_info[0].dtype);
  } else {
    std::vector<int64_t> broadcast_shape;
    broadcast_shape.resize(axis_ + input_x_info[0].Rank(), 1);
    for (auto i = 0; i < input_y_info[0].Rank(); ++i) {
      broadcast_shape[axis_ + i] = input_y_info[0].shape[i];
    }
    std::string broadcast_shape_node = helper_->Constant(GetOnnxDtype(P2ODataType::INT64), broadcast_shape);
    auto y_node = helper_->MakeNode("Reshape", {div_input_1, broadcast_shape_node});
    auto div_node = helper_->MakeNode("Div", {div_input_0, y_node->output(0)});
    auto floor_output = helper_->MakeNode("Floor", {div_node->output(0)});
    helper_->AutoCast(floor_output->output(0), output_info[0].name, P2ODataType::FP32, output_info[0].dtype);
  }
}

3 参考资料

标签:info,计算错误,auto,_-,elementwise,input,Paddle2ONNX,output,div
From: https://www.cnblogs.com/Zheng-Bicheng/p/18577257

相关文章

  • 将 Paddle2ONNX 的项目构建方式从 setup.py 迁移到 pyproject.toml
    1简介在软件开发中,项目构建方式的选择对项目的可维护性,可扩展性及与其他工具的兼容性至关重要.随着Python生态系统的进步,使用pyproject.toml文件管理项目依赖和构建配置成为一种新兴趋势.相较于setup.py,pyproject.toml采用TOML语法,简化配置文件读写;提供灵......
  • 为 Paddle2ONNX 添加修改模型输入 shape 功能
    1简介原先的tools/paddle/infer_paddle_model_shape.py脚本使用的是PaddlePaddle2.5,这里将Paddle相关API升级到2.6.0。2实现过程Paddle2.6和Paddle2.5的在推理模型输入shape上的差别主要在读取/保存模型以及存放函数的位置上有区别。2.1修改读取函数原读取模型......
  • 为 Paddle2ONNX 搭建 Github Actions 自动发包机制
    1简介Paddle2ONNX此前一直使用手动编译所有版本的Python源码包再手动上传到PyPI的方式来分发发行版。很显然,这是一种极其低效的办法,本文介绍如何为Paddle2ONNX添加自动发包机制。2实现过程Paddle2ONNX的编译流程参考onnx的编译流程实现,因此在自动发包机制的设计上......
  • 为 Paddle2ONNX 添加对 Opset 18 的支持
    1简介随着ONNX标准的不断更新,保持Paddle2ONNX与最新版本的兼容性显得尤为重要。本篇文章将详细介绍如何为Paddle2ONNX项目升级其依赖的ONNXOpset版本。2添加对Opset18的支持2.1升级ONNX依赖库版本支持Opset18前我们需要修改ONNX的branch参数到最新的co......
  • 【Paddle2ONNX】为 Paddle2ONNX 适配自适应 ONNX IR Version 功能
    1简介最近在浏览Paddle2ONNX的Issues时,我发现有用户需要让Paddle2ONNX支持导出的ONNX模型根据OpsetVersion自适应IRVersion的功能。这个功能对于老的Runtime来说还是很重要的,于是我动手添加了这个功能,这里写一篇博客和大家分享下。能否指定IRrepresentation......
  • 用 Count 注释的查询集正在计算错误发生次数
    我想计算名称在查询集中出现的次数:items=self.get_queryset()items=items.values("name").annotate(count=Count("name")).order_by("-count")其中get_queryset()返回带有一些过滤器和注释的项目列表。defget_queryset(self):return(sel......
  • 一个很有意思的excel计算错误
    工作多年,好多年没有写blog了。今天发现了个很有意思的计算错误想写一下。写报告的时候习惯性用计算器算了一下,发现数据不对,311.3*24=7471.20.但是我这个表计算出来是7471.30,我用的是excel的自动求和 A1*24这样的公式。很奇怪因为这是excel的自动计算,按道理不会出现这种错误,然......
  • MySql中SUM函数计算错误问题
    前言今天一个很久前做的项目突然找到我,说是之前做的项目中,页面上数据汇总和列表中的数据的总数存在对不上的问题。说是列表是对的,但是根据列表统计出来的数据要比正常小很多。排查这个项目已经好几年了,之前用了很久都是正常的,不可能会突然出问题了;我觉得这个统计肯定是没问题了......
  • 二分法计算错误
    2023牛客冬季训练5-A二分代码出错,使用upper_bound()正确while(l<r){intmid=l+r+1>>1;if(a[mid]<=x)......
  • 遇到过的错误之“日期计算错误,Java8API导致Unsupported unit: Seconds【时间类错误】"
    一、问题场景:在计算相差天数时爆出的错误 报错内容:java.time.temporal.UnsupportedTemporalTypeException:Unsupportedunit:Seconds 二、原因 我这里使用了L......