huawei-noah / bolt

Bolt is a deep learning library with high performance and heterogeneous flexibility.
https://huawei-noah.github.io/bolt/
MIT License
910 stars 158 forks source link

如何设置运行时浮点精度为fp16 #108

Open likefxz2009 opened 2 years ago

likefxz2009 commented 2 years ago

bolt的开发人员你们好,我在使用的过程中遇到如下问题,希望你们可以抽空帮忙看一下 问题1:在使用C API时,我发现并没有多少示例代码,而且我根据API也没有发现设置运行时浮点精度的方式(即模型为fp32的,但是按照fp16的精度计算),难道只有将模型转换为fp16的才能跑fp16代码吗? 问题2:如果只有fp16的模型才能跑fp16代码,那么请问如何设置输入,因为fp16的tensor也是fp16的,难道需要外部给进去fp16的数据吗?

jianfeifeng commented 2 years ago

你好,

  1. 要用fp16精度跑模型,就需要在转换模型(使用X2bolt)时设置-i参数为FP16;
  2. x86目前不支持fp16精度;arm支持fp16,可以直接传fp16数据
yuxianzhi commented 2 years ago
likefxz2009 commented 2 years ago

@jianfeifeng @yuxianzhi 感谢两位的回复,也就是说假设我需要把模型下发到应用里,就必须根据不同的设备下发不同的模型对吧,比如在支持armv8.2的机器上下发fp16的模型,其他机器上下发fp32的模型。 请问一下有没有考虑过开放配置接口,即提供同一个Fp32的模型,如果设置跑fp16的精度,在运行时自行检测设备支持情况,如果支持fp16,则将权重等数据转换到fp16并且使用fp16推理呢?之前使用mnn/tnn等框架时都有这个功能。 再次感谢回复

yuxianzhi commented 2 years ago

Bolt的模型精度转换模块可以提取出来单独调用,只需要保证模型数据结构的精度参数和权重类型是目标类型即可。可以参考X2bolt.cpp部分调用的ms_datatype_converter函数https://github.com/huawei-noah/bolt/blob/c3eb7a22e4f7acc2cc450606d1875666d4b11574/model_tools/src/online_conversion.cpp#L99。