【问题标题】:How do you run a half float ONNX model using ONNXRuntime C API?如何使用 ONNXRuntime C API 运行半浮动 ONNX 模型?
【发布时间】:2020-04-28 11:16:30
【问题描述】:

由于 C 语言没有半浮点实现,如何向 ONNXRuntime C API 发送数据?

【问题讨论】:

    标签: c++ c onnx onnxruntime


    【解决方案1】:

    您可能可以从此处链接到一个示例:https://github.com/microsoft/onnxruntime/issues/1173#issuecomment-501088662

    您可以使用 CreateTensorAsOrtValue 创建一个缓冲区以将输入数据写入其中,并使用 GetTensorMutableData 访问 OrtValue 内的缓冲区。

    ONNXRuntime 使用 Eigen 将浮点数转换为可以写入该缓冲区的 16 位值。

    uint16_t floatToHalf(float f) {
      return Eigen::half_impl::float_to_half_rtne(f).x;
    }
    

    或者,您可以编辑模型以将 Cast 节点从 float32 添加到 float16,以便模型将 float32 作为输入。

    【讨论】:

    【解决方案2】:

    C 语言没有半浮点实现

    是的,但是有语言扩展,您可以编写自己的库来处理数据。

    例如,在某些架构上,gcc 支持 ISO/IEC TS 18661-3:2015 定义的 _Float16 类型。

    您可以编写或find a library 来处理半浮点运算。

    【讨论】:

    • 是的,我可以尝试使用来自 github 的实现。但是,如果 ONNXRuntime 已经在使用某种半浮点实现,那么使用他们正在使用的实现会不会更简单?由于糟糕的 ONNXRuntime 文档,我无法弄清楚如何做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2023-01-25
    • 2020-03-31
    • 1970-01-01
    相关资源
    最近更新 更多