内容来源: 2016年12月16日,小米云平台深度学习研发工程师陈迪豪在“GIAC 全球互联网架构大会”进行《支撑百度搜索引擎99.995%可靠名字服务架构设计》演讲分享。IT大咖说做为独家视频合做方,经主办方和讲者审阅受权发布。
阅读字数:2783 | 4分钟阅读
深度学习的概念源于人工神经网络的研究,含多隐层的多层感知器就是一种深度学习结构。深度学习经过组合低层特征造成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。程序员
嘉宾演讲视频和PPT地址:t.cn/R9ONt8f算法
机器学习是经过机器进行自主学习数据而非以编码的方式;深度学习是机器学习的一个分支,主要包括四种最基本的网络结构。编程
CNN是卷积神经网络。经过卷积网络的模型,能够高效地处理图像分类或人脸识别等应用。后端
MLP是多层感知机,也就是传统的神经网络。已经被Google大量应用在Youtube视频推荐和APP推荐上。数组
RNN模型是在神经元里加入带记忆的神经元结构,能够处理和时间序列有关的问题。服务器
RL是Alphago用到的加强学习,它的底层也用到一些深度学习技术。网络
假若有一个应用要经过大量图片训练分辨出猫和狗的图片。若是按照传统的方法,程序员本身写应用来区别猫狗图片,可能须要不少规则和图形处理技巧,必须是一个图像专家。架构
但如今有了神经网络,输入只是数据,只要定义一个简单的神经网络,把应用写好后经过数据训练,就能实现一个效果不错的图像分类应用。并发
Google已经开源了Inception的模型,是层数比较高的一个多层神经网络。这个网络有些复杂,用GPU机器可能要训练两到三周才能实现。有了Tensorflow这样的工具后,能够在Github地址上直接下载它的模型。框架
GameAI是游戏人工智能,经过图像的结果用加强学习和Qlearning的算法,就能够实现它自动最大化地获得分数。
Tensorflow是Google开源的一个Deep Learning Library,提供了C++和Python接口,支持使用GPU和CPU进行训练,也支持分布式大规模训练。
在使用Tensorflow的时候,只写一个静态纯文本的文件,经过Python解释器去运行,因此Tensorflow本质上只是一个Deep Learning Library。
Tensorflow这个Library须要人工安装,脚本须要手动运行,环境须要手动配置。分布式的Tensorflow要把一个脚本拷贝到多台机器上,手动配置。要进行代码调优须要手动Run和Tune。
咱们想作Tensorflow模型调优,但服务器可能出现OOM、可能使用的端口被别人占用、也可能磁盘出现故障,服务器环境变成应用开发者的负担。
分布式Tensorflow一样须要把代码拷贝到分布式的各台机器上,且不论Tensorflow的性能是否随着节点数越多而加强,服务器维护成本已呈线性增长了。
虽然Google开源了一个很是好的深度学习工具,但它并无解决深度学习应用部署和调度的问题。
有人说过,任何复杂的问题都能经过抽象来解决。
咱们在中间引入一个分布式的管理系统,让上层业务应用不须要直接管理底层资源,由统一的调度系统去实现。
咱们但愿这是一个云计算,而不是提供裸机的服务。用户只需写好应用代码提交,不用经过Ssh或登陆到服务器上用脚本运行。
咱们想把模型的训练和服务进行集成。一个模型训练完成后会获得一些模型文件,能够直接把这些模型文件应用起来。
咱们但愿这个平台是高可用的,即便用户的任务训练失败,也能从新给用户作一个调度。
用户之间的任务是须要作资源隔离和动态调度。
咱们但愿能支持并发的训练。
经过Automatically Tuning平台,用户能够一次提交多个超参数组合,让它并行训练,等训练结束能够直接看到效果。
目前这个平台已经为用户提供深度学习框架的开发环境,开发完以后能够把代码提交上去,而后就能够训练,训练结果会直接保存在咱们本身的分布式存储里。用户能够经过这个平台起一个RPC服务,他的手机或业务服务器可以直接调用这个服务。咱们还提供了Model Zoo以及RPC客户端的一些功能。
这是深度学习平台的基本架构。
最上层是用户业务,有广告、搜索、游戏等,都有本身的业务场景,能够根据本身的数据格式编写一些Tensorflow、深度学习的脚本。经过Cloud-Ml的API把任务提交到服务端,由服务端建立一个容器,把它调用到真正的物理机计算资源上。
这整个大平台主要是由Tensorflow和Kubermetes实现的。由这个平台管理底层维护的CPU服务器和GPU服务器、虚拟机以及AWS的机器。
Kubermetes是一个容器的集群管理系统,它会依赖一个多节点的Etcd集群,有一个或多个Master去管理Kubelet节点。每一个物理机会部署一个Kubelet和Docker进程,在上面会运行多个Docker的Container。
咱们这个平台封装了一个Kubelet,让用户把业务代码提交上来,组成一个Docker容器的格式,而后由Kubelet去调度。
这是一个分层和解耦的基本架构,好处就是API服务只须要负责受权认证、任务管理,调度经过Kubermetes去作,Kubermetes的元数据都经过Etcd去存储,每一部分都利用API进行请求。这样就能把整个系统的组件解耦。
有了深度学习平台以后,经过已经支持的API声明提交任务的名称,编写好Python代码的地址。运行代码的参数经过Post请求过来。
咱们也提供SDK对API作了封装。
命令行工具Command可以直接把写好的脚本提交到云平台进行训练。还有内部集成的Web Console。
训练任务提交以后,在命令行能够看到任务训练日志。
Tensorboard能够看定义的模型结构。
训练任务结束后能够直接起一个Model Service。由于文件已经保存在云存储里了,只要再发一个API请求,在后端也封装了一个Docker Image。
底层是依赖Google已经开源的Tensorflow Serving直接加载模型文件。
左边是Online Services,用户把模型训练完保存在这里,起一个容器,对外提供高性能的RPC服务。
在线服务支持Grpc和HTTP接口,理论上支持大部分编程语言。可使用Java客户端、C++客户端、Go客户端和Python客户端,或直接在Andriod请求模型服务。
经过一个统一的接口对外提供图像相关的API,底层是由Kubermetes进行调度和资源隔离。
右边是Python的Grpc客户端,当模型起来之后,用户只须要编写二十几行Python代码,把模型的输入准备好,就能够请求服务。
在有深度学习平台之后,工做流是这样的。上面是工做环境,云端有服务器和基础架构维护的服务。用户在本地环境编写本身的Tensorflow应用,在本地验证这个应用可否跑起来。
经过Submit Train Job的API把任务提交到云端,真正用GPU或CPU训练的代码就在云端运行。运行完以后会把模型保存到分布式存储里面。
用户能够用官方提供的Test TF APP去看模型训练的效果如何,若是没问题,在用户本身的环境调用Deploy Model的API,这样就会把Model拿出来起一个容器,对外提供RPC服务。
用户就能够选择本身喜欢的客户端,用RPC的方式请求模型服务。
支持分布式训练。用户在Python脚本里定义了一系列参数,把这个脚本拷贝到各台机器上去运行。
咱们让用户把分布式节点个数和当前进程角色经过环境变量定义,环境变量名是固定的。这样它只须要一个环境变量就能够定义进程在分布式训练里的角色。
咱们把用户的脚本拿出来之后,不须要它去管理服务器的环境,只须要声明这个集群有多少个PS、Worker和Master,把这些参数提交给Cloud-Ml的API服务,由它来申请可用的IP和端口。
咱们对存储系统作了集成。开源的Tensorflow目前只支持本地存储,由于咱们在云端训练,任务由咱们调度到特定的机器,用户不可能直接把训练数据放到本地。
咱们但愿用户能直接访问咱们的分布式存储,因此对Tensorflow源码作了修改。提交任务的时候能够直接指定一个FDS的路径,系统就能根据用户的权限直接读取训练数据。
对Google官方的Tensorflow作了拓展。训练完以后数据所有放在分布式存储里,用Tensorflow指定FDS路径。
训练完把模型导出到FDS之后,经过Cloud-Ml的API建立一个服务,加载它的模型文件。
针对不一样的模型声明不一样的请求数据,输入类型和输入的值经过Json定义,就能够请求模型服务了。
HPAT是神经网络里的超参数自动调优,极大缩短了科研人员和专一作算法模型人员的时间。
让用户提交代码的时候提交一个标准的Python Package。
让用户的Docker直接提交到Kubermetes集群里,真正完全解决用户依赖的问题。
咱们把Model文件放到存储中,经过API把Paper实现了,不一样的Model均可以部署到这个平台上,这样就能够经过RPC来直接访问这个服务了。
今天主要给你们分享了深度学习的应用,以及在思考作一个深度学习平台以后,咱们的考虑和架构设计,但愿能给你们带来一些帮助。咱们也相信云计算大数据时代已经到来,下一个时代将会是深度学习,而且将来会继续往云深度学习发展。谢谢你们!
今天的分享到此结束,谢谢你们!
相关推荐