奔跑在 K8S 上的 Tensorflow (三) 一些调优

栏目: 数据库 · 发布时间: 5年前

内容简介:本文介绍蘑菇街在分布式机器学习调优的一些经验,主要分为 K8S 层面,Tensorflow 层面和业务层面的一些调优。以商品推荐常用的从直觉上说,训练本质上是大量的矩阵运算,而矩阵运算在内存地址空间具有良好的连续性。若充分利用 CPU cache,将有助于提升 cache 的命中率,最终加快训练速度。K8S 1.8 起支持

本文介绍蘑菇街在分布式机器学习调优的一些经验,主要分为 K8S 层面,Tensorflow 层面和业务层面的一些调优。

K8S 层面调优

CPUShare VS CPUSet

以商品推荐常用的 wide and deep 模型为例,该模型采用 CPU 资源进行训练,宿主机的规格为 80C256G。

从直觉上说,训练本质上是大量的矩阵运算,而矩阵运算在内存地址空间具有良好的连续性。若充分利用 CPU cache,将有助于提升 cache 的命中率,最终加快训练速度。K8S 1.8 起支持 CPU Manager 特性,该特性支持对于 guarantee 类型的 pod,采用 cpuset 为 pod 分配专用的 CPU 核。在相同训练任务下对比 cpuset 和 cpushare 对训练速度的影响,发现在 worker CPU 核数较少的情况下,cpuset 的性能远远超过 cpushare。

奔跑在 K8S 上的 Tensorflow (三) 一些调优

虽然 guarantee 类型的 pod 牺牲了资源弹性,但是 cpuset 带来的性能收益要高于弹性带来的收益。即使对 cpushare 容器不设置 cpu limits,当节点跑满容器时,相同 cpu requests 下,cpuset 容器的性能依旧比 cpushare 的性能高 20% 以上。

PodAffinity

PS-Worker 训练框架下,PS 节点作为中心节点,网络流量往往非常之大,容易把带宽跑满。通过 pod-affinity 将所有 PS 节点尽可能打散到不同的宿主机上,从而分摊网络流量。

podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: tf-replica-type
              operator: NotIn
              values:
              - ps
          topologyKey: kubernetes.io/hostname

设置合适的资源配比

不同的模型的计算量和参数各不相同,因此针对每个模型都应该设置一个合适的 ps/worker 的规格和数量。在监控完善的条件下,可以根据监控数据分析瓶颈,调整实例的规格和数量,使得整体的训练速度和平台吞吐量能达到较好的水平。

Tensorflow 层面调优

Tensorflow 的调优主要参考 官网文档 Performance

线程数

由于 sysconf 系统调用等隔离性的问题,容器看的 CPU 往往是宿主机的 CPU 核数。tensorflow 默认的线程数为 CPU 核数,如此情况下,tensorflow 创建的线程数远远超过实际分配到的 CPU 核数。同样以 wide and deep 模型为例,通过保持与 cpu limit 一致的线程数,上下文切换降低约 40%,训练速度提升约 5%。

config = tf.ConfigProto()
config.intra_op_parallelism_threads = cpu_limit_cores
config.inter_op_parallelism_threads = cpu_limit_cores
tf.Session(config=config)

Intel MKL

之所以谈谈 Intel MKL,是因为编译 MKL tensorflow 后,测试发现 MKL 并没有带来明显的性能提升……

业务层面调优

Partition

发现 PS 流量节点分布不均匀,其中某个 PS 节点的流量非常大,而其它 PS 节点的流量相对较低。通过 timeline.json 发现,主要是某个 embedding 向量非常之大,所以通过 partion,将该 tensor 分散到不同的 PS 节点上,避免某个 PS 节点瓶颈。

partitioner = tf.fixed_size_partitioner(ps_number, axis=0)
with tf.variable_scope("emb_layer", partitioner= partitioner) as scope:
    ...

Adam 优化器

由于 Adam 优化器会更新所有参数的梯度,所以在大 embedding 向量下,如果采用 adam 优化器,会大大增加计算量,严重影响训练速度。因此建议采用 Lazy_Adam_Optimizer 或者 Adadelta 优化器。

TBD…


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

中国游戏风云

中国游戏风云

王亚晖 / 中国发展出版社 / 2018-11-1 / 168.00元

本书以时间为序,介绍了整个游戏产业发展的跌宕起伏。分别讲述了早期游戏市场、单机游戏、网络游戏、网页游戏和手机游戏以及未来游戏世界。作者本人曾为知名游戏产业人,书中披露了大量不为大众所知的行业故事和行业数据。为游戏的制作者、投资人、玩家,抑或想了解游戏的人,提供了一个理性的梳理。一起来看看 《中国游戏风云》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器