带你读《2022技术人的百宝黑皮书》——淘宝逛逛ODL模型优化总结(2) https://developer.aliyun.com/article/1246920?groupCode=taobaotech
// 判断使用本地缓存还是调用子图进行计算 bool useCached() { …… int64 curTime = TimeUtility::currentTimeInSeconds(); // _countInterval和_timeInterval支持自定义值,也可以使用默认值。 if (_currCount++ % _countInterval == 0 || curTime - _lastTime >= _timeInterval) { _lastTime = curTime; return false; } return true; }
得益于RTP的灵活性,我们可以将整个模型的图分解成若干个子图,子图之间可以连通调用。因此我们在模型图中,将原本应当被ConstantFolding优化掉的节点抽取出来,得到一张ConstantFoldable子图,通过CallGraphOP算子来进行子图调用。然后将原图中的这些节点从图中删掉,最后通过RerouteTensor,将子图与子图外节点的tensor进行重置,使用CallGraphOP的输出tensor进行替换。
优化后的TimeLine如下所示,可以看到,模型的tf图中,可被折叠的算子都已经被包含到ConstantFoldable子图中,并通过CallGraphOP调用。优化后,ODL模型在线serving阶段,大部分请求将直接使用本地缓存,只有很少量的请求会触发子图的计算。
相对于ODL模型的更新频率来讲,1~2秒的参数延迟对于ODL模型的实时效果来讲基本毫无影响。这项优化在保障模型参数时效性的同时,提升了模型在线serving的性能。在我们推全这项优化之后,集群的GPU负载显著降低。
带你读《2022技术人的百宝黑皮书》——淘宝逛逛ODL模型优化总结(4) https://developer.aliyun.com/article/1246918?groupCode=taobaotech