背景

ELF(Essential/Extreme/Excellent Learning Framework) 框架为公司内外的大数据应用提供学习/挖掘算法开发支持。 平台主要包括数据迭代处理的框架支持,并行计算过程中的通信支持和用于存储大规模参数的分布式、快速、高可用参数服务器。应用于fcr-model,公有云bml,大数据实验室,语音技术部门等等。之前是基于zeromq封装的rpc,这次改用brpc。

结论

单个rpc-call以及单次请求所有rpc-call的提升非常显著,延时都缩短了**50%以上,总训练的耗时除了ftrl-sync-no-shuffle提升不明显外,其余三个算法训练总体性能都有15%**左右的提升。现在瓶颈在于计算逻辑,所以相对单个的rpc的提升没有那么多。该成果后续会推动凤巢模型训练的上线替换。详细耗时见下节。

性能对比报告

算法总耗时

ftrl算法: 替换前总耗时2:4:39, 替换后总耗时1:42:48, 提升18%

ftrl-sync-no-shuffle算法: 替换前总耗时3:20:47, 替换后总耗时3:15:28, 提升2.5%

ftrl-sync算法: 替换前总耗时4:28:47, 替换后总耗时3:45:57, 提升16%

fm-sync算法: 替换前总耗时6:16:37, 替换后总耗时5:21:00, 提升14.6%

子任务耗时

单个rpc-call(针对ftrl算法)

AverageMaxMin
替换前164.946ms7938.76ms0.249756ms
替换后10.4198ms2614.38ms0.076416ms
缩短93%67%70%

单次请求所有rpc-call(针对ftrl算法)

AverageMaxMin
替换前658.08ms7123.5ms1.88159ms
替换后304.8782571.340
缩短53.7%63.9%

结论

单个rpc-call以及单次请求所有rpc-call的提升非常显著,提升都在50%以上,总任务的耗时除了ftrl-sync-no-shuffle提升不明显外,其余三个算法都有15%左右的提升,现在算法的瓶颈在于对计算逻辑,所以相对单个的rpc的提升没有那么多。

附cpu profiling结果, top 40没有rpc相关函数。

  1. Total: 8664 samples
  2. 755 8.7% 8.7% 757 8.7% baidu::elf::Partitioner
  3. 709 8.2% 16.9% 724 8.4% baidu::elf::GlobalShardWriterClient::local_aggregator::{lambda#1}::operator [clone .part.1341]
  4. 655 7.6% 24.5% 655 7.6% boost::detail::lcast_ret_unsigned
  5. 582 6.7% 31.2% 642 7.4% baidu::elf::RobinHoodLinkedHashMap
  6. 530 6.1% 37.3% 2023 23.4% std::vector
  7. 529 6.1% 43.4% 529 6.1% std::binary_search
  8. 406 4.7% 48.1% 458 5.3% tc_delete
  9. 405 4.7% 52.8% 2454 28.3% baidu::elf::GlobalShardWriterClient
  10. 297 3.4% 56.2% 297 3.4% __memcpy_sse2_unaligned
  11. 256 3.0% 59.2% 297 3.4% tc_new
  12. 198 2.3% 61.5% 853 9.8% std::__introsort_loop
  13. 157 1.8% 63.3% 157 1.8% baidu::elf::GrowableArray
  14. 152 1.8% 65.0% 177 2.0% calculate_grad
  15. 142 1.6% 66.7% 699 8.1% baidu::elf::BlockTableReaderManager
  16. 137 1.6% 68.2% 656 7.6% baidu::elf::DefaultWriterServer
  17. 127 1.5% 69.7% 127 1.5% _init
  18. 122 1.4% 71.1% 582 6.7% __gnu_cxx::__normal_iterator
  19. 117 1.4% 72.5% 123 1.4% baidu::elf::GrowableArray::emplace_back
  20. 116 1.3% 73.8% 116 1.3% baidu::elf::RobinHoodHashMap::insert
  21. 101 1.2% 75.0% 451 5.2% baidu::elf::NoCacheReaderClient
  22. 99 1.1% 76.1% 3614 41.7% parse_ins
  23. 97 1.1% 77.2% 97 1.1% std::basic_string::_Rep::_M_dispose [clone .part.12]
  24. 96 1.1% 78.3% 154 1.8% std::basic_string
  25. 91 1.1% 79.4% 246 2.8% boost::algorithm::split_iterator
  26. 87 1.0% 80.4% 321 3.7% boost::function2
  27. 76 0.9% 81.3% 385 4.4% boost::detail::function::functor_manager
  28. 69 0.8% 82.1% 69 0.8% std::locale::~locale
  29. 63 0.7% 82.8% 319 3.7% std::__unguarded_linear_insert
  30. 58 0.7% 83.5% 2178 25.2% boost::algorithm::split [clone .constprop.2471]
  31. 54 0.6% 84.1% 100 1.2% std::vector::_M_emplace_back_aux
  32. 49 0.6% 84.7% 49 0.6% boost::algorithm::detail::is_any_ofF
  33. 47 0.5% 85.2% 79 0.9% baidu::elf::DefaultReaderServer
  34. 41 0.5% 85.7% 41 0.5% std::locale::_S_initialize
  35. 39 0.5% 86.1% 677 7.8% boost::detail::function::function_obj_invoker2
  36. 39 0.5% 86.6% 39 0.5% memset
  37. 39 0.5% 87.0% 39 0.5% std::locale::locale
  38. 38 0.4% 87.5% 50 0.6% FTRLAggregator::serialize
  39. 36 0.4% 87.9% 67 0.8% tcmalloc::CentralFreeList::ReleaseToSpans
  40. 34 0.4% 88.3% 34 0.4% madvise
  41. 34 0.4% 88.7% 38 0.4% tcmalloc::CentralFreeList::FetchFromOneSpans
  42. 32 0.4% 89.0% 32 0.4% std::__insertion_sort