EasyRec Processor¶
EasyRec Processor, 是EasyRec对应的高性能在线打分引擎, 包含特征处理和模型推理功能. EasyRecProcessor运行在PAI-EAS之上, 可以充分利用PAI-EAS多种优化特性.
架构设计¶
EasyRec Processor包含三个部分: Item特征缓存, 特征处理(Feature Generator), TFModel(tensorflow model).
性能优化¶
基础实现¶
将FeatureGenerator和TFModel分开, 先做特征生成,然后再Run TFModel.
优化实现¶
FeatureGenerator作为算子嵌入, 和TFModel联合优化,主要的优化点包括:
Feature算子化
Feature算子直接输出SparseTensor, 减少String Concat, Copy, Split, ToSparseTensor开销
Feature算子和其他算子之间可以Overlap执行, 显著降低单个请求的时间
Feature Tile后置
在线推理User Feature的BatchSize = 1, 因此只需要计算一次, Tile可以放到UserFeature EmbeddingLookUp的后面,和EmbeddingLookUp融合起来
EmbeddingLookup OpFusion
embedding lookup涉及到GatherV2 / SparseSegmentMean等多个小op, 使用OpFusion可以减少kernel launch以及Tensor内存分配和拷贝的开销
embedding lookup的过程需要用到比较多的SparseSegment Mean/Sum操作, 使用avx指令优化向量运算
MatchFeature / LookupFeature优化
使用string_view代替std::string,减少string拷贝的开销
Sequence特征优化
sequence特征建模通常需要带上side info才能取得比较好的效果, 将side info放在请求中传递过来会带来通信的开销, EasyRec Processor在客户侧缓存了item特征, 因此在请求中只传递item_id sequence, side info sequence通过item_id查找客户侧缓存构建.
BFloat16支持
推荐模型Embedding占了主要的部分, 使用BF16可以在不损失精度的情况下,减少一半的内存
原生的BFloat到Float的转换效率很低,使用avx加速后,性能(tp99)提升1倍
性能对比¶
模型1:
特征:
id_feature raw_feature lookup_feature sequence_feature 67 170 756 main seq num: 4 | sideinfo seq num: 32 | max seq len: 50 请求信息:
batch_size: 100
bytes: 平均50k
硬件:
CPU核数: 10
CPU型号: IceLake
测试结果:
CPU利用率 QPS AVG RT TP99 优化前 96 20 247ms 333ms 优化后 91 55 86ms 113ms 提升 175% 65% 66% 模型2:
特征数:
id_feature raw_feature lookup_feature match_feature 306 77 60 1000 请求信息:
batch_size: 150
bytes: 平均500k
硬件:
CPU核数: 15
CPU型号: IceLake
测试结果:
CPU利用率 QPS AVG RT TP99 优化前 89 33 288 362 优化后 93 226 34 57 提升 580% 88% 84% 总结: 可以看出来, 优化实现比基础实现性能高出很多.
参考¶
火焰图¶
优化前
可以看到特征生成之后还有较多的string处理,包括拷贝、拆分等, 占据了比较多的CPU时间
优化后
Release¶
版本 | 说明 |
---|---|
easyrec | AVX Kernel优化; 支持向量召回引擎(Faiss向量引擎); 支持GPU推理 |
easyrec-1.2 | 优化weighted category embedding |
easyrec-1.3 | 支持PAI-FeatureStore; 支持从max compute加载数据 |
easyrec-1.4 | 优化keras model性能; input自动扩展; placement优化 |
easyrec-1.5 | graph pattern match bugfix |