深度学习框架TensorFlow在Kubernetes上的实践

简介:

什么是深度学习?

深度学习这个名词听了很多次,它到底是什么东西,它背后的技术其实起源于神经网络。神经网络最早受到人类大脑工作原理的启发,我们知道人的大脑是很复杂的结构,它可以被分为很多区域,比如听觉中心、视觉中心,我在读研究中心的时候,做视频有计算机视觉研究室,做语言有语言所,语音有语音所,不同的功能在学科划分中已经分开了,这个和我们人类对大脑理解多多少少有一些关系。之后科学家发现人类大脑是一个通用的计算模型。

科学家做了这样一个实验,把小白鼠的听觉中心的神经和耳朵通路剪断,视觉输入接到听觉中心上,过了几个月,小白鼠可以通过听觉中心处理视觉信号。这就说明人类大脑工作原理是一样的,神经元工作原理一样,只是需要经过不断的训练。基于这样的假设,神经学家做了这样的尝试,希望给盲人能够带来重新看到世界的希望,他们相当于是把电极接到舌头上,通过摄像机把不同的像素传到舌头上,使得盲人有可能通过舌头看到世界。对人类神经工作原理的进一步理解让我们看到深度学习有望成为一种通用的学习模型。

上图给出了神经网络的大致结构。图中左侧是人类的神经元,右侧是神经网络的神经元。神经网络的神经元最早受到了人类神经元结构的启发,并试图模型人类神经元的工作方式。具体的技术这里不做过深的讨论。上图中下侧给出的是人类神经网络和人工神经网络(Artificial Neural Network)的对比,在计算机神经网络中,我们需要明确的定义输入层、输出层。合理的利用人工神经网络的输入输出就可以帮助我们解决实际的问题。

神经网络最核心的工作原理,是要通过给定的输入信号转化为输出信号,使得输出信号能够解决需要解决的问题。比如在完成文本分类问题时,我们需要将文章分为体育或者艺术。那么我们可以将文章中的单词作为输入提供给神经网络,而输出的节点就代表不同的种类。文章应该属于哪一个种类,那么我们希望对应的输出节点的输出值为1,其他的输出值为0。通过合理的设置神经网络的结构和训练神经网络中的参数,训练好的神经网络模型就可以帮助我们判断一篇文章应该属于哪一个种类了。

深度学习在图像识别中的应用

深度学习,它最初的应用,在于图像识别。最经典的应用就是Imagenet的数据集。

ImageNet是一个非常大的数据集,它里面有1500万张图片。下图展示了数据集中一张样例图片。

在深度学习算法被应用之前,传统的机器学习方法对图像处理的能力有限。在2012年之前,最好的机器学习算法能够达到的错误率为25%,而且已经很难再有新的突破了。在2012年时,深度学习首次被应用在在ImageNet数据集上,直接将错误率降低到了16%。在随后的几年中,随着深度学习算法的改进,错误率一直降低到2016年的3.5%。在ImageNet数据集上,人类分类的错误率大概为5.1%。我们可以看到,机器的错误率比人的错误率更低,这是深度学习带来的技术突破。

什么是TensorFlow

TensorFlow是谷歌在去年11月份开源出来的深度学习框架。开篇我们提到过AlphaGo,它的开发团队DeepMind已经宣布之后的所有系统都将基于TensorFlow来实现。TensorFlow一款非常强大的开源深度学习开源工具。它可以支持手机端、CPU、GPU以及分布式集群。TensorFlow在学术界和工业界的应用都非常广泛。在工业界,基于TensorFlow开发的谷歌翻译、谷歌RankBrain等系统都已经上线。在学术界很多我在CMU、北大的同学都表示TensorFlow是他们实现深度学习算法的首选工具。

上面的ppt给出了一个简单的TensorFlow程序样例,这个样例实现了向量加法的功能。TensorFlow提供了Python和C++的API,但Python的API更全面,所以大部分TensorFlow程序都是通过Python实现的。在上面程序的第一行我们通过import将TensorFlow加载进来。在TensorFlow中所有的数据都是通过张量(Tensor)的方式存储,要计算张量中数据的具体取值,我们需要通过一个会话(session)。

上面代码中的第二行展示了如何生成会话。会话管理运行一个TensorFlow程序所需要的计算资源。TensorFlow中一个比较特殊的张量是变量(tf.Variable),在使用变量之前,我们需要明确调用变量初始化的过程。在上面的代码最后一行,我们可以看到要得到结果张量output的取值,我们需要明确调用计算张量取值的过程。

通过TensorFlow实现神经网络是非常简单的。通过TFLearn或者TensorFlow-Slim可以在10行之内实现MNIST手写体数字识别问题。上面的ppt展示了TensorFlow对于不同神经网络结构的支持,可以看出,TensorFlow可以在很短的代码内支持各种主要的神经网络结构。

虽然TensorFlow可以很快的实现神经网络的功能,不过单机版的TensorFlow却很难训练大规模的深层神经网络。

这张图给出了谷歌在2015年提出的Inception-v3模型。这个模型在ImageNet数据集上可以达到95%的正确率。然而,这个模型中有2500万个参数,分类一张图片需要50亿次加法或者乘法运算。即使只是使用这样大规模的神经网络已经需要非常大的计算量了,如果需要训练深层神经网络,那么需要更大的计算量。神经网络的优化比较复杂,没有直接的数学方法求解,需要反复迭代。在单机上要把Inception-v3模型训练到78%的准确率大概需要5个多月的时间。如果要训练到95%的正确率需要数年。这对于实际的生产环境是完全无法忍受的。

TensorFlow on Kubernetes

如我们上面所介绍的,在单机环境下是无法训练大型的神经网络的。在谷歌的内部,Google Brain以及TensorFlow都跑在谷歌内部的集群管理系统Borg上。我在谷歌电商时,我们使用的商品分类算法就跑在1千多台服务器上。在谷歌外,我们可以将TensorFlow跑在Kubernetes上。在介绍如何将TensorFlow跑在Kubernetes上之前,我们先来介绍一下如何并行化的训练深度学习的模型。

深度学习模型常用的有两种分布式训练方式。一种是同步更新,另一种是异步更新。如上面的ppt所示,在同步更新模式下,所有服务器都会统一读取参数的取值,计算参数梯度,最后再统一更新。而在异步更新模式下,不同服务器会自己读取参数,计算梯度并更新参数,而不需要与其他服务器同步。同步更新的最大问题在于,不同服务器需要同步完成所有操作,于是快的服务器需要等待慢的服务器,资源利用率会相对低一些。而异步模式可能会使用陈旧的梯度更新参数导致训练的效果受到影响。不同的更新模式各有优缺点,很难统一的说哪一个更好,需要具体问题具体分析。

无论使用哪种更新方式,使用分布式TensorFlow训练深度学习模型需要有两种类型的服务器,一种是参数服务器,一种是计算服务器。参数服务器管理并保存神经网络参数的取值;计算服务器负责计算参数的梯度。

在TensorFlow中启动分布式深度学习模型训练任务也有两种模式。一种为In-graph replication。在这种模式下神经网络的参数会都保存在同一个TensorFlow计算图中,只有计算会分配到不同计算服务器。另一种为Between-graph replication,这种模式下所有的计算服务器也会创建参数,但参数会通过统一的方式分配到参数服务器。因为In-graph replication处理海量数据的能力稍弱,所以Between-graph replication是一个更加常用的模式。

最后一个问题,我们刚刚提到TensorFlow是支持以分布式集群的方式运行的,那么为什么还需要Kubernetes?如果我们将TensorFlow和Hadoop系统做一个简单的类比就可以很清楚的解释这个问题。大家都知道Hadoop系统主要可以分为Yarn、HDFS和mapreduce计算框架,那么TensorFlow就相当于只是Hadoop系统中Mapreduce计算框架的部分。

TensorFlow没有类似Yarn的调度系统,也没有类似HDFS的存储系统。这就是Kubernetes需要解决的部分。Kubernetes可以提供任务调度、监控、失败重启等功能。没有这些功能,我们很难手工的去每一台机器上启动TensorFlow服务器并时时监控任务运行的状态。除此之外,分布式TensorFlow目前不支持生命周期管理,结束的训练进程并不会自动关闭,这也需要进行额外的处理。


本文作者:佚名

来源:51CTO

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
16天前
|
机器学习/深度学习 API 语音技术
|
16天前
|
机器学习/深度学习 PyTorch API
|
4月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
【深度学习】Tensorflow、MindSpore框架介绍及张量算子操作实战(超详细 附源码)
【深度学习】Tensorflow、MindSpore框架介绍及张量算子操作实战(超详细 附源码)
65 0
|
9月前
|
机器学习/深度学习 移动开发 算法
Python垃圾识别系统,TensorFlow+Django网页框架+深度学习模型+卷积网络【完整代码】
垃圾识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对5种垃圾数据集进行训练,最后得到一个识别精度较高的模型。并基于Django,开发网页端操作平台,实现用户上传一张垃圾图片识别其名称。
165 0
|
5月前
|
机器学习/深度学习 PyTorch 算法框架/工具
深度学习Pytorch框架Tensor张量
深度学习Pytorch框架Tensor张量
45 0
|
8月前
|
机器学习/深度学习 算法 PyTorch
深度学习框架Pytorch学习笔记
深度学习框架Pytorch学习笔记
|
11月前
|
机器学习/深度学习 缓存 人工智能
深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO的区别优缺点,模型框架、一些Trick、Transformer Encoder等原理详解
深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO的区别优缺点,模型框架、一些Trick、Transformer Encoder等原理详解
深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO的区别优缺点,模型框架、一些Trick、Transformer Encoder等原理详解
|
机器学习/深度学习 算法 PyTorch
看这里,使用docker部署图深度学习框架GraphLearn使用说明
看这里,使用docker部署图深度学习框架GraphLearn使用说明
看这里,使用docker部署图深度学习框架GraphLearn使用说明
|
机器学习/深度学习 人工智能 PyTorch
神工鬼斧惟肖惟妙,M1 mac系统深度学习框架Pytorch的二次元动漫动画风格迁移滤镜AnimeGANv2+Ffmpeg(图片+视频)快速实践
前段时间,业界鼎鼎有名的动漫风格转化滤镜库AnimeGAN发布了最新的v2版本,一时间街谈巷议,风头无两。提起二次元,目前国内用户基数最大的无疑是抖音客户端,其内置的一款动画转换滤镜“变身漫画”,能够让用户在直播中,把自己的实际外貌转换为二次元“画风”。对于二次元粉丝来说,“打破次元壁,变身纸片人”这种自娱自乐方式可谓屡试不爽
神工鬼斧惟肖惟妙,M1 mac系统深度学习框架Pytorch的二次元动漫动画风格迁移滤镜AnimeGANv2+Ffmpeg(图片+视频)快速实践
|
机器学习/深度学习 机器人 PyTorch
金玉良缘易配而木石前盟难得|M1 Mac os(Apple Silicon)天生一对Python3开发环境搭建(集成深度学习框架Tensorflow/Pytorch)
笔者投入M1的怀抱已经有一段时间了,俗话说得好,但闻新人笑,不见旧人哭,Intel mac早已被束之高阁,而M1 mac已经不能用真香来形容了,简直就是“香透满堂金玉彩,扇遮半面桃花开!”,轻抚M1 mac那滑若柔荑的秒控键盘,别说996了,就是007,我们也能安之若素,也可以笑慰平生。好了,日常吹M1的环节结束,正所谓剑虽利,不厉不断,材虽美,不学不高。本次我们尝试在M1 Mac os 中搭建Python3的开发环境。
金玉良缘易配而木石前盟难得|M1 Mac os(Apple Silicon)天生一对Python3开发环境搭建(集成深度学习框架Tensorflow/Pytorch)