作者|何沧平
修改|Vincent
AI前哨出品| ID:ai-front
借 AI 前哨供给的沟通时机,我给各位报告一下 TensorFlow 在微博的运用状况和在散布式核算上的一点经历,过错遗漏缺乏之处,敬请批判指导。
TensorFlow 在微博的运用场景
今日的共享内容由虚到实,由归纳到详细。
微博的日活和月活数量都在增加,移动端份额很高,占 91%。2017 年 4 月份的财报显现,营收同比增涨 67%,一个重要原因便是移动端抢到了用户的碎片时刻。
微博里随处可见引荐信息:引荐的新闻、引荐的视频、引荐的新账号。最重要还有引荐的广告。
用户登录今后,马上就要核算引荐什么内容。拿引荐广告来说,备选的广告数以万计,需求排序给出最或许被点击的几条广告。
假如切中用户的购买需求,广告就不再是打扰。
废物严重影响用户体会,色情、暴力、反抗、低俗,宁可错杀不行漏网,非常严厉。
人工智能反废物的方针是进步精确度、下降本钱。
图画质量也是用户体会的根本要求。
用户能够忍受不感兴趣的图片,但很难容凌乱的图画。
例如左面的美人图,看起来赏心悦目,手机上刷过,即便不停下细看,也不会恶感。
右边的图片,里边也是美人,但加上文字之后,马上变得凌乱,版式与酒店里的小卡片相仿。很或许被认定为骗子。
明星是微博取胜的法宝。明星是大众人物,论题多、热度高、影响力大。明星粉丝疯狂,消吃力强。
为粉丝引荐她他喜爱的明星的行程、事情、各种点评,粉丝爱看。乃至明星代言的广告,粉丝或许都会喜爱。停留在微博的时刻越长,有意无意阅读的广告就越多。正确辨认明星就很重要了,假如不巧引荐了用户厌烦的明星,或许就没了刷微博的心境。
明星脸辨认是微博的特征,有海量的明星图片,也有巨大的辨认需求。
明星脸辨认有特其他困难:常用人脸辨认研讨所用的相片表情、造型较少,不同人之间的不同较大。而明星表情丰富,造型多变,不管男女都化装!不少人妆容近似,有些整容脸连人脑都傻傻分不清,核算机就更难分清了。
上部的图片或许归属两个及以上类别,因而称为“兼类”。
图片、视频分类的终究意图都是为了相关广告。喜爱旅行的用户就给她他引荐旅行景点、线路、酒店、机票、野外配备等。
假如广告能够切中用户原本就要买的物品,就不必化尽心血压服用户购买不必要的产品,只需求将购买场所由一个地址(网站、实体店)搬运到另一个地址,将购买时刻由将来搬运到现在,将产品品牌由 A 切换为 B。这样广告作用天然会好许多,点击率高,用户还不恶感。
例如,印度电影《三个痴人》中几回说到太空笔,我其时就特别想买一支,在京东上搜了半个小时。假如能够提早辨认到这个广告点,并在播映进程中引荐购买链接,很或许当即就下单了。
但是,图画分类难,视频精密分类更难,又不得不分。短视频(5 分钟以内)方兴未已,变现形式还不老练,处于烧钱阶段。相对于文本、图片,短视频的带宽本钱更高,耗费的用户时刻更多。假如相关广告的转化率不高,捉襟见肘,无法持久。
TensorFlow 在微博的运用技能 & 事例
务虚内容完毕,下面是详细点的技能。
微博机器学习渠道承当了离线练习和在线猜测使命。微博实时发生的文本、图片、视频显现后转入后台,用于提取特征、离线练习。
越来越多的事务运用深度学习方法,TensorFlow/Caffe 结构被集成进来。
离线练习首要运用 GPU 机群。因为事务增加过快,核算机群有一部分来自阿里云。
这一页完满是个人了解。
对规划巨大的练习使命,TensorFlow 供给了散布式的形式。
TensorFlow 散布式核算与 HPC 的 MPI(Message Passing Interface) 散布核算差异很大。用过 MPI 的人都知道,MPI 进程彼此相等,确保没有瓶颈进程。MPI-IO 也规划得每个主机都能均匀分管 IO 压力。MPI 进程上的核算使命也要求均匀区别,确保各个进程的核算进展保持一致。MPI 进程之间也只沟通数据块的鸿沟,尽量削减网络流量,紧缩通讯时刻。
TensorFlow 的散布式核算规划得简略粗犷。
若干参数服务器 (parameter server) 和若干劳工 (worker) 组成一个机群 (cluster),劳工承当运算使命,将每步运算得到的参数(权重和 bias)提交给参数服务器,参数服务器将来自一切 worker 的参数兼并起来,得到大局参数,然后将大局参数发送给劳工。劳工在大局参数的基础上持续下一步运算。
TensorFlow 选用主从形式,参数服务器是瓶颈。每步都要传递一切的参数,网络流量太大,假定每个劳工上参数占用内存 1GB,机群包括 1 个参数服务器和 10 个劳工,那么每个迭代步将发生 20GB 的网络流量,依照 10GbE 网络核算,通讯时刻至少需 16 秒。而实践上,每个 batch 数据的运算时刻或许还缺乏 1 秒,模型参数占用的内存或许远大于 1GB。从理论剖析来看,TensorFlow 散布式运算的功率不如 MPI。
有人说深度学习仅仅高功用核算的一个特别运用,我以为不是这样。
如图中表格所列,TensorFlow 机群就与 HPC 机群有严重差异。
HPC 机群的 3 大特色:高功用核算芯片(高端 CPU、GPU)、高速网络、并行存储。TensorFlow 机群只需求其间的 1 个:高端 GPU。
劳工在一批数据上练习得到W 和b(合称为P),称为一步练习。
如上图所示,一切的劳工(Device A/B/C)在完结一步练习后,暂停练习,将自己得到的P 发送到参数服务器(Parameter Device)。参数服务器一向等候,直到来自一切的劳工的参数改变量P 都接纳成功。参数服务器将一切的P 相加取均匀,然后用这个均值更新旧参数(更新公式请拜见随机梯度算法),得到新参数 P,接着将 P 发送给一切的劳工。劳工在接纳到新参数 P 今后,才进行下一步的练习。
与用 1 台服务器练习比较,用 N 台劳工一起练习 + 同步更新参数等价于将 batch 的规划扩展了 N 倍。详细来说,假如用 1 台服务器时,每步练习选用 100 张数字图片(batch=100), 那么用 4 个劳工得到的参数改变量(即P)同步更新,就相当于每步练习选用 400 张数字图片(batch=400)。然后,参数改变得更平稳,收敛更快。
同步更新也有缺陷:全体速度取决于最慢的那个劳工。假如劳工之间的软硬件装备不同较大,有显着的速度差异,同步更新核算速度较慢。
为了防止劳工有快有慢形成的等候,TensorFlow 供给了异步更新战略。
如图下部所示,当有一个劳工练习得到一个参数改变量P 时,无妨假定是图中的 Device A,该劳工当行将P 发送给参数服务器。参数服务器接纳到来自劳工 Device A 的P 后,不等候其它的劳工,当即用P 更新大局参数,得到大局参数 P,紧接着将 P 发送给劳工 Device A。劳工 Device A 接纳到大局参数 P 后,当即开端下一步练习。
由异步更新参数的进程可知,它等价于只用 1 台服务器练习:都是每次用一小批(batch)图画练习更新参数,仅仅各批数据的上场次序不能事前承认,上场次序由劳工的随机运转状况承认。
刚开端运算时,劳工 0(左面) 先算了 10100 步(对应 localstep), 尔后劳工 1(右边)才开端运算。这阐明,在异步运算形式下,劳工之间的确不彼此等候。劳工 0 和劳工 1 都运算了大局第 10100 步 (global_step_value),阐明运算的剖分并不非常精确。
2 个劳工都履行了第 13142、13144、13146、13148 步,但都没有履行 13143、13145、13147 这 3 步。这阐明 Tensorflow 异步更新的使命指派会随机犯错,并不是必定不重不漏。所幸随机梯度法对更新次序没有要求,少数的过错对终究核算成果影响不大。
同步更新形式不能真实地同步履行,将程序杀死的时分,2 个劳工履行完的步数相差许多。劳工 0 本地履行了 11023 步之后,大局步数居然只要 7072,必定犯错了。
网络上也有人报告了这个过错:
github.com/tensorflow/…,
TensorFlow 开发者现已承认这是一个缝隙,但没有修正。
公式预警……
以 MNIST 手写数字辨以为例,上部分公式迭代一步就运用一切 n 个样本。
下部公式将一切样本分割成若干批次(batch)。
TensorFlow 的异步更新,便是不同的劳工运用不同的小批练习样原本更新权重和 bias,不能事前承认每个劳工的更新次序。详细举例:假定有 2 个劳工履行练习使命,劳工 0 担任更新奇数批次样本 b1/b3/b5…b499,劳工 1 担任更新偶批样本 b2/b4,…,b500。
因为各种随机因素,样本的运用次序或许是 b1àb3àb5àb2àb7àb4à…因为样本的批次区别自身便是随机的,这样乱序更新依然是随机的,对终究成果没有什么影响。
TensorFlow 同步更新时,对一切劳工得到的梯度求均匀,然后更新权重和截距。依然假定有 2 个劳工,它们别离练习第 1 批和第 2 批样本得到梯度w1 和b1 截距别离为w2 和b2,同步之后的梯度如图中所示。
然后,同步更新等价于一次运用 2m 个练习样本,正则化系数和 batch 巨细都扩展为本来的 2 倍罢了。假如劳工数量许多(例如 20 个),那么同步更新就等价于一次运用 2000 个练习样本,与区别 batch 的初衷不符。因而,主张不要运用同步更新。
留意公式里赤色的(2m)
下面是一个详细优化事例:
CTR(Click-Through-Rate,点击通过率)是营收的要害。
对候选广告按点击或许性排序,然后刺进到用户信息流之中。
deepCTR 不完满是特征工程,输入层与隐层的衔接联系也是不全衔接。
千亿样本数据近百 TB,为进步功率,选用多人引荐过的 TensorFlow 行列。
个人了解,行列的规划初衷很好(如图中表格所示),但实践功用很差,GPU 使用率只要 5%。查找原因发现,程序卡在线程同步操作上,而这个线程同步就来自于 TensorFlow 行列。所以尝试用其他方法读取练习样本文件。
左图横轴选用对数坐标。
行列读以 CSV 带宽只要极限带宽的 1/467,行列读取 tfrecord 格式文件带宽进步至 1.24MB/s,进步至 3.2 倍。因为 tfrecord 格式文件较小,读完一个文件的耗时下降至 15%(272.6/1789.9)。
用 pandas 读取文件带宽到达极限带宽的 35%。终究放弃 TensorFlow 行列,选用 pandas 读 CSV 文件。
当 CSV 文件小于 1/3 内存时,直接用 pandas 一次性读入内存。不必 tf 行列,数据混洗就要程序员自己完结,所幸不费事。
对大于内存 1/3 的文件,直接拆分红多个小文件。需求程序员自行确保均匀运用各个小文件。
最终给各位报告一个小游戏。
用 MNIST 练习得到的 CNN 网络来辨认汉字,“霸”字被辨以为 1。这点很简单了解,得到的 CNN 网络只要 10 个类别,不得不在 0~9 个数字中选一个。
因为“霸”字与任何数字都不像,辨以为任何数字的“概率”应该都不太大吧,例如都小于 0.2(随意说的数值)。但是实践状况却是这样:0~9 分类对应的概率不同很大,最大挨近 0.8,最小挨近 0,卷积网络辨认汉字的时分不会优柔寡断,错得非常坚决。
从这个小试验里能够发现几个问题:
图画的特征终究是什么?假如有,怎样用这些特征来区别不认识的图画(比方这个比如里的汉字)?
怎样操控一个网络的泛化才能?这个比如中的泛化才能看起来太强了,以致于把汉字都辨认成数字了。现在看来,CNN 的泛化才能几乎是听其自然。
softmax 后的值真的代表概率吗?看起来它们仅仅是和为 1 正数。概率实质的随机性体现在哪里呢?
这些问题,我还没有想理解,这儿提出来,请各位朋友批判指导。
问答环节
问题 1:行列读取功用差是否是因为设置 cache 的样本数问题?答复:cache 根本没有影响。batch_size 会有影响,最要害仍是线程锁的问题。
问题 2:(反废物)这一步的精确率怎样算的?是模型精确率吗?
答复:这个涉及到事务,不方便泄漏。能够暗里沟通。
问题 3:千亿等级 feature 没有模型并行吗?感觉模型单机放不了,不能数据并行。
答复:数据并行,因而研讨散布式运算。
问题 4:1 亿条谈论的话,你怎样判别分类器是否分正确了?仍是说这儿的精确率仅仅在测验集上的精确率?
答复:事务上详细做法不方便泄漏。这儿提示一下,微博有告发、屏蔽功用。
问题 5:微博的 TensorFlow 环境装备,资源管理和散布式核算是用的第三方渠道吗?仍是自己封装的
答复:资源管理和散布式核算尝试过几种计划,开源软件 + 自行定制。多种机群,安全等级和管理方法不完全相同,因而资源管理方法(网络、存储、权限)也不相同。
问题 6:会考虑点评 GPU 的使用率吗?比方用 deepbench 测?有什么 GPU 进步使用率的经历共享?
答复:GPU 使用率是本钱核算的重要目标,很注重。检查 GPU 使用率比较简略:命令行 nvidia-smi,英伟达还有专门的库,供给轻量级的 C、JAVA 等接口。
进步 GPU 使用率经历:假如显存能装得下,尽量运用 1 个模型练习;设定显存运用量(例如 0.5),将 2 个及以上作业放在同一个 GPU 上。IO 功用差的话,会导致数据供给不上,然后 GPU 使用低。PPT 中 deepCTR 优化事例便是这个状况。batch 太小、权重矩阵过小,都会导致不能充分使用 GPU 的很多中心(一般有 4000-5000 个),使用率低。
问题 7:假如在巨大的 csv 上练习, 用 tf 行列和用 spark df 制造生成器的作用有比对过么?
答复:现在没有对比过 tf 行列和 spark df。
作者介绍
何沧平,微博研制中心算法工程师,现在担任建造深度学习渠道。对高功用核算(HPC)较了解,著有《OpenACC 并行编程实战》一书。如有相关技能问题能够暗里与讲师评论,讲师微信:272702575
-全文完-
AI前哨供给最新最全AI范畴技能资讯、一线业界实践事例、网罗收拾业界技能共享干货、最新AI论文解读。欢迎重视咱们的微信大众号:AI前哨
接下来会连续更新一系列与 TensorFlow 理论与实践事例相关的文章,这是第一篇,敬请期待。