EasyRec Processor(阿里云上的EasyRec Processor详细文档,包括版本、使用方式), 是EasyRec对应的高性能在线打分引擎, 包含特征处理和模型推理功能. EasyRecProcessor运行在PAI-EAS之上, 可以充分利用PAI-EAS多种优化特性.
EasyRec Processor包含三个部分: Item特征缓存(支持通过FeatureStore加载MaxCompute表做初始化), 特征生成(Feature Generator), TFModel(tensorflow model).
将FeatureGenerator和TFModel分开, 先做特征生成(即fg),然后再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时间
- 优化后
版本 | 说明 |
---|---|
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 |