SFVM是一个纯C代码实现的轻量且高效的AI编译器, 试图解决当前主流AI编译器代码过重、不易理解和维护、编译慢等问题。
前端图转换已适配ONNX
中间表示(graph)支持的优化pass包括:
// 消除不可达节点
remove_unreachable_nodes()
// 消除恒等映射节点 e.g.(add 0, mul 1)
remove_identity_nodes()
// 将squeeze, flatten, transpose替换为reshape
convert_to_reshape()
// 将batch-norm替换为mul, add
batchnorm_to_mul_add()
// 融合conv, mul, add, relu
fuse_conv_mul_add_relu()
// 将conv, pooling统一为NHWC layout
convert_layout_NHWC()
// 将权重pack成NK16格式 (消除GEMM内的矩阵pack开销)
pack_conv_weight()
// transpose节点后移
swap_transpose()
// 合并相邻的reshape或transpose
merge_redundant_nodes()
// 常量折叠
fold_constant()
后端实现了x86 CPU版的VM,已适配ResNet50所需的float32算子,关键算子采用AVX256 SIMD极致优化。
特别是convolution算子,采用了implicit GEMM算法,相比普通实现性能提升显著。
cd sfvm
python ./build_demo.py
./run
cd sfvm
python ./build_test.py
./run
CPU: i7-13700F
model | precision | FPS | TFLOPS |
---|---|---|---|
ResNet-18 | float32 | 215 | 0.77 |
ResNet-50 | float32 | 85 | 0.66 |