再谈“去虚拟化”对深度学习系统的必要性
作者 | 袁进辉
上周写了一篇《浅谈GPU虚拟化与分布式深度学习框架的异同》,想不到引起很多关注和讨论。和朋友们讨论之后,觉得这个话题值得再发散一下:
首先,文章只讨论了GPU“一分多”这种“狭义”的虚拟化,还存在另外的虚拟化,“多虚一”也是存在的。在此,我想特别强调的是:上一篇文章后半部分对深度学习框架“多合一”的讨论恰恰是想说明“多虚一”是不可能靠仅仅一层包打天下的API就能实现,反而要靠”去虚拟化“的思路。
其次,“去虚拟化”这种理念在追求性能极致的场景不是新鲜事,在这篇文章里再举几个相关的例子。
在这篇小品文里再讨论一下:虚拟化的本质和局限性,为什么在追求性能极致的场景要“去虚拟化”。
“虚拟化”溯源
“虚拟化”可能是计算机科学历史上最伟大的思想之一,对此,计算机先驱David Wheeler有一句名言:
All problems in computer science can be solved by another level of indirection, except for the problem of too many layers of indirection.
这句话被尊称为“软件工程的基本定理”,并被C++之父Bjarne Stroustrup在专著《The C++ Programming Language》的序言处引用。不过,大部分人记住了前半句,却忽略了后半句,而后半句正是本文想展开讨论的。
"another level of indirection"刻画了“虚拟化”的精髓:通过引入一层新的抽象,把与上层应用无关的细节隐藏掉,有选择的给上层用户暴露一些功能供其使用,也称底层细节对用户透明,既不损害上层应用的功能,又能享受“关注点分离”(separation of concerns)的好处,增加易用性。
可以说:虚拟化的案例无处不在,无往而不利。
操作系统是对硬件资源的虚拟化:计算核心被虚拟化成进程;硬件内存变成虚拟内存;存储介质被虚拟化成文件系统;网络传输通过多层协议栈被虚拟化成文件描述符,使得数据传输就像读写普通的文件一样。
分布式存储把通过网络互联多个单机文件系统虚拟化成的一个网络文件系统,使得用户不用再关心网络数据传输的细节,可以像访问本地文件一样访问其它节点上的数据。
当然,虚拟化造就了今天伟大的云计算技术和市场,云原生如火如荼,开发者只需要基于云服务的API编程,而不需要关于API 之下的物理细节,成本低,可靠性又高。
虚拟化的成功不可否认。但是,成也萧何,败也萧何,虚拟化也有其代价。
“虚拟化”和极致性能的矛盾
一层层的抽象层次,一步步降低编程的复杂度,每一层都向上隐藏了一些东西,上层就相应地丢失一些操控能力。每经过一层抽象,就引入一些对上层而言的“不确定性”,最终的结果是,性能的天花板一步一步下降。
以Hadoop的分布式存储为例,虚拟化的结果是掩盖了数据真实的存储位置,不管在哪个节点上,访问接口都是一样的。不过,当向这个集群调度一些MapReduce的数据处理任务时,如果Task被调度到数据所在的节点上,那么就不需要网络传输,如果调度到另外的节点,就需要把数据读到内存并通过网络发送到计算所在的节点。也就是,被隐藏掉的数据位置信息有可能被调度器用来提升系统效率。
随着摩尔定律放缓,不止在深度学习领域,在任何追求极致性能的场景就出现了一种击穿、击碎中间抽象层次,一竿子插到底进行协同优化的强烈需求。
让我们看六个例子。
1、操作系统把CPU资源抽象成被操作系统调度和管理的内核线程,避免了用户调度计算资源的麻烦,但是,在高并发场景,用户级线程(如coroutine)越来越多,计算资源更多的在用户态(user mode)来调度,而不是完全依靠内核的调度。
2、操作系统通过页表机制实现虚拟内存,神不知鬼不觉实现数据的换入换出,但在高性能场景,用户程序会通过编程接口禁止这一行为,譬如在RDMA和GPU异步数据传输都依赖于锁页内存,确保操作系统不会帮倒忙。
3、传统的网络传输协议栈TCP/IP都在操作系统内核,为了避免内核态和用户态的数据拷贝和上下文切换,人们先是使用用户态协议栈(如Intel dpdk),仍无法满足需求的话,就使用支持内核旁路(bypass)的RDMA技术,完全跳过了操作系统这一层。
4、缓存(Cache)技术也可以视为一种虚拟化,命中就直接使用,没命中就花时间从更慢的存储取过来,在局部性较好的负载下工作得很好。但在特定领域,譬如深度学习领域,工作负载有特别的规律,如果用软件来控制缓存数据的弹出以及读取甚至可以做到100%的命中率,这种办法被称为Scratchpad,现在几乎所有的AI芯片都没有用Cache,而是使用Scratchpad技术。
5、操作系统的文件系统或者网络文件系统,把底层硬件的细节隐藏了,编程时不需要考虑数据在哪台机器的哪块磁盘上,编程更简单了,但访问近处的数据速度快,访问远处的数据速度慢,为了提高效率,有人就提出了locality aware(局部性感知)的调度,把计算任务尽可能调度到存储数据的节点上去。
6、工业级的大型软件系统里,通常不会使用库函数,恨不得把底层代码库重新打造一遍,譬如Chromium, OceanBase等大型C++项目,我想,这也可以算作反虚拟化的例子。
“虚拟化”的舒适区
虚拟化试图向上层提供一剂一劳永逸的灵丹妙药,既解决易用性,又不损害上层应用对性能的需求。但是,“虚拟化”到底好不好应该具体问题具体分析,那该如何判断虚拟化到底合不合适呢?
这里尝试抛出一个用来判断是否有必要引入一层抽象(虚拟化)的量化指标,供参考。每引入一层虚拟化,就向上层隐藏了一些东西,向上提供的服务的延迟就因此引入了不确定性(以分布式存储为例,有的数据近,有的数据远;以分布式GPU资源池为例,有的近,有的远),服务的响应延迟有一个波动范围,也就是[min, max],延迟越小越好。
如果上层某一个应用需要保证的最低延迟仍大于max,那么这层虚拟化对这个应用就没有损害,可以大胆的引入这个虚拟化技术(也就是上图的C区域)。
如果上层某一个应用需要保证的最低延迟介于min和max之间,那么引入这层虚拟化就对这个应用是有损害的,把这层虚拟化敲掉,就可以确保以min值满足这个应用对延迟的需求(也就是上图的B区域)。
如果上层某一个应用需要保证的最低延迟小于min,那么即使敲掉当前层的虚拟化,仍不能满足这个应用,就需要继续向下敲,进行联合优化,直到延迟得到满足(也就是上图的A区域)。
鱼与熊掌兼得?
如上所述,虚拟化的基本思路是通过“隐藏细节”给上层应用提供一种假象,降低上层应用使用底层资源的复杂度。不过,有时候,“隐藏”掉的信息会阻碍上层应用挖掘极致的性能。有没有两全其美的办法呢?
David Patterson在《计算机体系结构的黄金时代》一文中开出的药方是从算法到硬件直接打通,结合算法和硬件的特点全部搞定制。定制表现在DSL和DSA,一方面是设计领域特定语言,方便编程,另一方面为面向领域应用设计领域特定架构,挖掘极致效率。
David Patterson的药方既不是在已有方案中插入新的抽象层次,也不是完全不要中间抽象,而是把原有的抽象层次全部敲碎重建,这种重建是基于对算法和硬件特点的充分挖掘。我理解这里有俩关键:软硬件协同设计(分工),以及编译器技术。
一方面,这里的思路和虚拟化不同之处是:不是向上层应用隐藏什么,而是强调要向上层暴露什么,或者说向上层让渡什么职责。
另一方面,这里没有期待只要提供一层API的抽象就包打天下,而是对从算法到硬件的映射复杂性有充足的认识。这种映射既包含任务相关但硬件无关的问题,也包含硬件相关的问题,本质等同于人们熟知的编译器技术。
说到这里,想到另一个“去虚拟化”的绝佳例子,就是软件定义网络(Software defined network,SDN)。对于同一套硬件基础设施,承接不同的工作负载,交换机的最优转发规则是不同的。SDN的思路是,令交换机的转发规则是可编程的,对每一个不同的业务负载,都用静态分析得到最优的转发规则或策略(control plane),并按照这个规则对交换机编程,交换机在转发数据时只需要按照已编程的规则执行即可(data plane)。
在SDN的例子里,交换机让渡了一部分职责给软件,软件根据不同的业务负载都生成不一样的路由规则(策略),这是SDN平衡灵活性和极致性能的关键。
在OneFlow解决分布式深度学习的难题时,也是类似的思路,它不是靠额外引入的一个抽象层次实现,而是分成了控制平面和数据平面。在控制平面,编译器根据特定深度学习模型的任务负载和底层硬件拓扑生成对这个配置最优的执行计划(execution plan), 这个plan不是一劳永逸的,它需要上层模型的知识,也需要底层硬件的知识,模型或硬件拓扑一旦变化,plan就会变化。但是,编译器生成plan的机制可以认为是不变的,也是整套系统的精髓。
结语
这篇文章补充解释了我对“通过向上层算法隐藏硬件信息”的虚拟化思路,以及“通过向上层算法暴露硬件信息和让渡职责”的去虚拟化的思路的理解。
简单来说,虚拟化的思想强调的是隐藏(底层细节)和限制(上层的功能范围),潜台词是:我认为对上层应用的需求足够了解,告诉上层应用太多细节也没有用,我把底层的东西一揽子处理好了,你只管调用我为你提供的API就可以了。
软件定义的思想强调的是暴露(底层细节)和让渡(硬件的策略可被软件分析和配置),潜台词是:我对上层应用的需求了解不足,没有办法为上层应用提供一个足够令人满意的一揽子的策略,于是干脆把底层策略暴露给上层,上层应用对自己的需求和任务负载最清楚,上层自己来负责生成策略并来配置底层。
致力于提升深度学习系统性能的朋友对“去虚拟化”的思路应该是习以为常的,这应该是整个社区经过探索和碰壁逐渐收敛出来的主流思路,不是我个人的发明,我只是把观察和理解写下来而已。
顺着这个思路,算法-软件-硬件协同优化领域正在发生一些令人兴奋的进展。毫无疑问,广义上的编译器技术(无论是单设备代码生成,还是分布式执行计划生成)是里面最核心的部分。
注:题图源自Pixabay
往
期
回
顾
阿里
百度大脑 OCR 技术加持白描 App
技术
一文全览机器学习建模流程
技术
使用 Mask-RCNN 的停车位检测
资讯
波士顿动力机器人解锁跑酷技能
分享
点收藏
点点赞
点在看
相关文章:

Enable PowerShell script execution policy
Open Windows PowerShell with administrator Run “Set-ExecutionPolicy UnRestricted –Force” 本文转自学海无涯博客51CTO博客,原文链接http://blog.51cto.com/549687/1918870如需转载请自行联系原作者520feng2007

Linux下DNS轮询与Squid反向代理结合
一、安装反向代理服务器 1.下载反向代理服务器软件采用squid,下载地址: http://www.squid-cache.org/Versions/v2/2.2/squid-2.2.STABLE5-src.tar.gz 下载后存放在/usr/local/squid/src目录里,文件名是 squid-2.2.STABLE5 ... 一…

从iOS证书申请到签名文件生成
2019独角兽企业重金招聘Python工程师标准>>> 苹果的应用在发布时(无论是Adhoc发布还是AppStore正式发布)都需要一个签名文件。这个签名文件是由苹果后台生成的,它把用户生成的证书,注册设备,AppID等统统连在…

GitHub 热榜:来膜拜这个流弊的 AI 框架!
近年来,人工智能正在进入一个蓬勃发展的新时期,这主要得益于深度学习和CV领域近年来的发展和成就。在这其中,卷积神经网络的成功也带动了更多学术和商业应用的发展和进步。为了避免“内卷”,更多人选择学习进阶,但是仍…

ASP.net:添加.net(2.0C#)FCKeditor在线编辑器步骤
1.下载本版本的编辑器压缩包。源码下载地址 2.解压缩打开文件夹拥有如下文件:3.在VS中添加“选择项”加载在此文件夹的Bin下FredCK.FCKeditorV2.dll。4.在你的网站的web.config的 <appSettings>枝节中加入:<appSettings><add key"FC…

安装varish作为缓存和代理
1,Varish的使用有两种模式:第1种 Nginx(负载)varish(缓存)WEB第2种 Varish(缓存和负载)web2,varish是以内存作为共享容器的:内存的大小决定了它的缓存容量。相对于主要以硬盘为存储的squid来说要高效的多…

英伟达 400 亿美元收购 ARM 受阻,不妨考虑 VMware?
作者 | 马超 出品 | CSDN(ID:CSDNnews)目前半导体行业的发展可以用冰火两重天来形容,传统的桌面及移动SOC(System on a Chip,系统级芯片)市场已经基本停止增长,而云计算成了各…

单目和双目模式识别---游戏控制
http://v.youku.com/v_show/id_XMzQwMjUwNTY.html http://blog.csdn.net/anthonywanted/article/details/3024535转载于:https://www.cnblogs.com/pengkunfan/p/4220144.html

vsftpd企业应用快速部署文档
系统环境:centos 5.6 vsftpd:2.3.5 vsftpd是UNIX/Linux中非常安全且快速的FTP服务器,目前已经被许多大型站点所采用。vsftpd支持将用户名和口令保存在数据库文件或数据库服务器中。登录FTP有三种方式,匿名登录、本地用户登录和虚拟…

华为持续引领,开辟5G Massive MIMO绿色新赛道
今日,在华为举办的无线首届媒体沙龙暨MBBF2021预沟通会上,华为无线产品线首席营销官甘斌发表了“华为持续引领,开辟5G Massive MIMO绿色新赛道”的主题发言,分享了Massive MIMO的下一个突破性创新方向,引领绿色5G网络建…

MRTG—网络监控工具
最近一段时间在研究后台服务器测试技术,需要对后台服务器的各项性能指标进行实时监控和统计,也由此让我回想起之前公司曾经接触过的一个服务SNMP,SNMP是一种称之为简单网络管理协议的服务,主要是用于获取系统的流量、I/O、CPU、Me…

IBM会话设置和覆盖规则
为什么80%的码农都做不了架构师?>>> 中文版地址:http://www-01.ibm.com/support/docview.wss?uidswg21659740 Technote (troubleshooting) Problem(Abstract) It is possible to set the HTTP Session time-out in various places on th…

FOSCommentBundle功能包:设置Doctrine ODM映射
Step 2b: Setup MongoDB mapping The MongoDB implementation does not provide a concrete Comment class for your use,you must create one: MongoDB实现并不提供为您所用的具体评论类,您必须要创建一个。 1234567891011121314151617181920212223<?php// src…

lighttpd 负载均衡-反向代理+cache浅谈
Lighttpd有硬盘级别的cache-(mod_cache)和内存级别的cache(mod_mem_cache),内存级别的cache是国人的产品,我喜欢用lighttpd就是因为它具有2种选择的cache,像我的实际需求,由于系统存在很多图片,但是容量不大…

设置网页标题图标
网页图标如图上位置 设置语句如下: link rel:"SHORTCUT ICON", href:"/images/logo.ico"

DeepMind 的新强化学习系统,是迈向通用人工智能的一步吗?
作者:Ben Dickson来源:数据实战派前言尽管已经掌握围棋、星际争霸 2 和其他游戏,深度强化学习模型的主要挑战之一是,它们无法将其能力泛化到训练领域之外。这种限制使得将这些系统在现实世界中的应用变得非常困难,因为…

无法访问D盘,执行页内操作时的错误
打开D盘后出现“无法访问D:/,执行页内操作时的错误”怎么办?既便D盘有病毒也不会出现这种状况,初步判断是D: 分区表错误,用系统安装光盘开机进入纯DOS下的修复模式中用 CHKDSK /R 或 /F来修复一下试试看。在cmd下输入chkdsk空格d:空格/f本文转…

怎样修改Ubuntu的root帐户密码并使用root登录
Ubuntu版本11.04 Ubuntu是一套基于Debian的Linux系统,它追求的是“Just Work”,最新的7.10版本发布于2007年10月,不同于其他Linux发行版本,Ubuntu的所有版本都是免费的,包括企业版。第一次安装Ubuntu,发现比…

CSDN 开学见面礼!限时免费申请,手慢无!
暑假即将结束,金秋开学季来袭。别让年轻的自己虚度光阴,现在扫码申请学习资格,10+场考前辅导,600+分钟大咖讲解与答疑直播免费看!大厂CTO级别导师陪你加buff!3周带你掌握大厂工程师基…

【No.1_sizeof与strlen】
【注意】 程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度 本帖属不定时连载贴,以试卷的形式提出一个比较基础的问题供大…

Linux: CentOS 7下搭建高可用集群
转载: http://linux.cn/article-3963-1.html本文以两台机器实现双集热备高可用集群,主机名node1的IP为192.168.122.168 ,主机名node2的IP为192.168.122.169 。一、安装集群软件必须软件pcs,pacemaker,corosync…

史上最大规模 DDoS 攻击,每秒 1720 万次 HTTP 请求
整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 互联网基础设施公司 Cloudflare 表示,已化解了迄今为止所记录的最大规模的容量耗尽分布式拒绝服务(DDoS)攻击。 近日,互联网基础设施服务提供商 Cloudfl…

如何查看当前Linux的版本
查看linux的版本主要有三种方法:1) 登录到服务器执行 lsb_release -a ,即可列出所有版本信息,例如:[root3.5.5Biz-46 ~]# lsb_release -a LSB Version: 1.3Distributor ID: RedHatEnterpriseASDescription: Red Hat Enterprise Li…

AIX5.3安装bash shell
一、下载bash shell,地址是:ftp://ftp.software.ibm.com/aix/freeSoftware/aixtoolbox/RPMS/ppc/bash/ 二、安装bash shell,rpm -ivh bash-3.2-1.aix5.2.ppc.rpm三、你现在就可以用了,赶紧bash试试!----你可能会有疑问我的系统的是…

经典算法题每日演练——第六题 协同推荐SlopeOne 算法
原文:经典算法题每日演练——第六题 协同推荐SlopeOne 算法相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,“商品推荐”,"猜你喜欢“,在实体店中我们有导购来为我们服务,在网络上 我们需要同样的一种替代物&…

基于 Python 环境搭建 - YOLO 实现吸烟行为监测
作者|李秋键 出品|AI科技大本营(ID:rgznai100) 引言 目标检测是一种与计算机视觉和图像处理有关的计算机技术, 用于检测数字图像和视频中特定类别的语义对象 (例如人、建筑物或汽车等), 其在视频安防,自动驾驶, 交通监控, 无人机场景分析和机器人视觉等领域有广阔的应用前景。近…

Ubuntu 下安装thttpd Web服务器
不知道大家是不是真的需要用appache这么复杂的功能这么强大的web server,其实有很多时候使用webserver也只是一种远程共享访问的方式。这里,Ubuntu repository的提供了一个简单的web server,名为thttpd,即 tiny http daemon. th…

mysql 新增 删除用户和权限分配
1. 新增用户 mysql>insert into mysql.user(Host,User,Password) values("localhost","lionbule",password("hello1234")); mysql>flush privileges; 2. 修改用户密码 mysql>update mysql.user set passwordpassword(new password)…

简历空空,如何编写一个面试时能拿的出手的真实项目?
最近,新一波的秋招全面开启,各大互联网行业像腾讯、百度、美团、哔哩哔哩,都加入到招聘队伍,秋招面试也进入白热化。作为一名求职者,要想在招聘浪潮中抢先一步,锁定大厂Offer,现在就要着手准备起…

mysql通过查看跟踪日志跟踪执行的sql语句
在SQL SERVER下跟踪sql采用事件探查器,而在mysql下如何跟踪sql呢? 其实方法很简单,开启mysql的日志log功能,通过查看跟踪日志即可。 开启mysql的日志log方法: windows环境下的配置方法: 我使用的版本&#…