具体请参考文档:
https://huggingface.co/docs/optimum/index
实际上,huggingface 的optimum就是对onnxruntime optimizer的包装, 如果你是huggingface上面获取的模型,有model和config,那就可以直接通过optimum进行进一步图优化和简单的fp16量化。如果你是自己的自然语言模型,那就只能用onnxruntime的optimizer进行处理了。但实际上应该是一个东西,本质只是一层包装。
它的默认选项如下:
- Gelu fusion with ,
- Layer Normalization fusion with ,
- Attention fusion with ,
- SkipLayerNormalization fusion with ,
- Add Bias and SkipLayerNormalization fusion with ,
- Add Bias and Gelu / FastGelu fusion with ,
- Gelu approximation with .
具体可以在文件中看到对应的实现:
OptimizationConfig的Attributes注释写的很明白了,每个功能的作用和为什么要设置True和Flase
这里可能有些人会感觉奇怪,什么叫做,这个你可以尝试使用优化后就会看到对应的布局转换(根据不同硬件可能适配的数据构造不同)
是optimum内部的优化逻辑,最后还是以onnxruntime的为准。
如果你想对模型进行量化,在无法使用optimum的加载情况下,完全可以参考optimum对onnxruntime的包装自行处理,在的方法中有很多针对对应指令集的量化配置,比如vnni:
这里面的本质是对的包装,参考设计后可以改造出自己的方案,同时对于静态离线量化要注意到,具体你可以调试一次过程查看每一步的参数就可以大概明白数据是怎么流动的。
如果你想直接使用huggingface optimum对支持模型的优化,你可以参考以下流程:
优化过程:
优化后加载: