专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

对比PyTorchTensorFlowJAXTheano,我

  作者王益
  OneFlow社区编译
  翻译杨婷
  最近,我在处理PyTorch分布式和TorchRec相关的工作,为此,我开始学习PyTorch2。0。在业余时间,我也在跟着Alpa作者学习JAX和XLA。如今回顾这些技术,我发现它们的关注点似乎都是如下两个问题:
  包含自动求导和并行在内的函数转换,例如vmap,pmap和pjit等;异构计算,CPU负责控制流,GPUTPU负责张量计算和集合通信。
  本文档中的所有例子都支持在Colab中运行:
  1函数转换
  函数转换意为将一个程序转变成另一个程序,最常见的例子是自动求导(autograd)。自动求导采用用户编写的前向过程并创建后向过程,对于用户来说,编写自动求导通常都太过复杂。函数转换的主要难点在于:在编写函数转换算法时以何种方式表示输入和输出过程。
  Theano:显式地构建IR
  Theano是最早的深度学习工具之一,也就是如今为人们所熟知的Aesara项目。Theano有一个允许用户在内存中将IR构建为数据结构的API,因此Theano可实现自动求导,并将结果输出为Python函数。
  importaesarafromaesaraimporttensorasataat。dscalar(a)Defineplaceholders,whichhavenovalues。bat。dscalar(b)cabcnowcontainstheIRofanexpression。TTdcaesara。grad(c,a)ConverttheIRincintoanotherone,dcfdcaesara。function(〔a,b〕,dc)ConverttheIRintoaPythonfunction,assertfdc(1。5,2。5)2。5sowecancallit。
  TensorFlow1。x:用于运行IR的虚拟机
  TensorFlow1。x明确保留了构建IR的想法。若在TensorFlow中运行上述示例,结果不会有什么差别;但倘若在TensorFlow1。x中来运行,最大的差别在于:我们不会将后向IR转换为Python函数,并使用Python解释器来运行。相反,我们会在TensorFlowruntime中来运行。
  importtensorflow。compat。v1astfTensorFlow1。xAPIimportnumpyasnptf。disableeagerexecution()atf。placeholder(tf。float32,shape())btf。placeholder(tf。float32,shape())cabdctf。gradients(c,〔a〕,stopgradients〔a,b〕)withtf。compat。v1。Session()assess:TensorFlowhasaruntimetoexecutetheIR,xnp。single(2)so,noconvertingitintoPythoncode。ynp。single(3)print(sess。run(dc,feeddict{a:x,b:y}))
  PyTorch1。x:没有前向IR
  PyTorch不会像Theano或TensorFlow那样将前向传播转换为IR。反之,PyTorch使用Python解释器来运行前向传播。这样做的弊端在于会在运行期间生成表示后向传播的IR,我们称之为Eager模式(动态图模式)。
  importtorchatorch。tensor(1。0,requiresgradTrue)Thesearenotplaceholders,butvalues。btorch。tensor(2。0)cabEvaluatescandderivestheIRofthebackwardinc。gradfn。c。backward()Executesc。gradfn。print(c。grad)
  TensorFlow2。x:梯度带
  TensorFlow2。x增加了一个像PyTorchAPI的Eager模式API。此API追踪前向传播如何运行名为梯度带(GradientTape)的IR。TensorFlow2。x可以从这个跟踪中找出后向传播。
  importtensorflowastfatf。Variable(1。0)LikePyTorch,thesearevalues,notplacehodlers。btf。Variable(2。0)withtf。GradientTape()astape:cabdcdatape。gradient(c,a)print(dcda)
  JAX
  JAX不会向用户公开诸如梯度带等方面的低级别细节。简单说来,JAX的思维方式为:将输入和输出都用Python函数来表示。
  importjaxa2。0b3。0jax。grad(jax。lax。mul)(a,b)Computecabw。r。t。a。Theresultisb3。jax。jit(jax。grad(jax。lax。mul))(a,b)jax。experimental。pjit(jax。grad(jax。lax。mul),devicemesh(ntpus))(a,b)
  对于想要自己编写的函数转换的高级用户,他们可以调用makejaxpr等低级API来访问IR,称为JAXPR。
  jax。makejaxpr(jax。lax。mul)(2。0,3。0)ReturnstheIRrepresentingjax。lax。mul(2,3)jax。makejaxpr(jax。grad(jax。lax。mul))(2。0,3。0)ReturnstheIRofgrad(mul)(2,3)
  FuncTorch
  FuncTorch和JAX类似,都是基于PyTorch的函数转换。
  importtorch,functorchatorch。tensor(〔2。0〕)btorch。tensor(〔3。0〕)functorch。grad(torch。dot)(a,b)
  JAX的makejaxpr类似于functorch的makefx。
  deff(a,b):returntorch。dot(a,b)Havetowrapthebuiltinfunctiondotintof。必须将内置函数dot转换成f。print(functorch。makefx(f)(a,b)。code)print(functorch。makefx(functorch。grad(f))(a,b)。code)
  TensorFlow2。x、JAX和functorch都为前向传递构建了一个IR,但PyTorchEager模式没有。IR不仅可用于自动求导,还可用于其他类型的函数转换。在下列例子中,functorch。compile。aotfunction调用了回调函数printcompilefn两次,分别用于前向和后向传播。
  fromfunctorch。compileimportaotfunctionimporttorch。fxasfxdefprintcompilefn(fxmodule,args):print(fxmodule)returnfxmoduleaotfnaotfunction(torch。dot,printcompilefn)aotfn(a,b)
  2高阶导数
  PyTorch
  importtorchfromtorchimportautogradxtorch。tensor(1。,requiresgradTrue)y2x38firstderivativeautograd。grad(y,x,creategraphTrue)print(firstderivative)secondderivativeautograd。grad(firstderivative,x)print(secondderivative)
  TensorFlow2。x
  importtensorflowastfxtf。Variable(1。0)withtf。GradientTape()asoutertape:withtf。GradientTape()astape:y2x38dydxtape。gradient(y,x)print(dydx)d2ydx2outertape。gradient(dydx,x)print(d2ydx2)
  JAX
  deff(a):return2a38print(jax。grad(f)(1。0))print(jax。grad(jax。grad(f))(1。0))
  3动态控制流
  动态控制流(dynamiccontrolflows)有两个层级:在CPU上运行的粗粒度级别和在GPUTPU上运行的细粒度级别。本部分主要介绍在CPU上运行的粗粒度级别的动态控制流。下面我们将用(ifelse)条件语句作为例子检验深度学习工具。
  TensorFlow1。x
  在TensorFlow1。x中,我们需要将条件语句显式构建到IR中。此时条件语句是一个特殊的运算符tf。cond。
  deff1():returntf。multiply(a,17)deff2():returntf。add(b,23)rtf。cond(tf。less(a,b),f1,f2)withtf。compat。v1。Session()assess:TensorFlowhasaruntimetoexecutetheIR,print(sess。run(r,feeddict{a:x,b:y}))
  TensorFlow2。x
  TensorFlow2。x支持使用tf。cond和tf。whileloop显式构建控制流。此外,实验项目googletangent中有AutoGraph功能,它可以将Python控制流转换为tf。cond或tf。whileloop。此功能利用了Python解释器支持的函数和函数源代码。例如下面的g函数调用了Python的标准库将源代码解析为AST,然后调用SSA表单来理解控制流。
  defg(x,y):iftf。reduceany(xy):returntf。multiply(x,17)returntf。add(y,23)convertedgtf。autograph。tograph(g)importinspectprint(inspect。getsource(convertedg))
  JAX
  由于部分Python语法很复杂,所以通过解析源代码来理解控制流就显得很困难,这就导致AutoGraph经常出错。但如果这种方法很简单,那么Python开发者社区也不会在构建Python编译器时失败这么多次了。正是由于有这种挑战的存在,必须要明确地将控制流构建到IR中。为此,JAX提供了jax。lax。cond和jax。lax。forloop函数。
  jax。lax。cond(ab,lambda:a17,lambda:b23)
  考虑到这一点,你可能会觉得我们可以使用递归算法。但是下面用于计算阶乘的递归无法用JAX跟踪。
  deffactorial(r,x):returnjax。lax。cond(x1。0,lambda:r,lambda:factorial(rx,x1))factorial(1。0,3。0)
  可能你还想调用factorial来计算3!6。但这会让递归深度超过最大值,因为递归不仅依赖于条件,还依赖于函数定义和调用。
  PyTorch
  PyTorch最初是Pythonnative。正如前文所说,由于多功能调度机制,grad和vamp的函数转换都是即时的。值得注意的是:
  相比Theano和TensorFlow构建IR后的函数转换,即时函数转换效率更高。在进行grad和vmap时,JAX也是即时函数转换。然而像pamp和pjit等更复杂的函数转换需要对整个计算过程进行概述,在这个过程中IR是必不可少的。
  由于IR在pmap和pjit中的必要性,PyTorch社区最近添加了torch。condpytorchpytorch83154
  4分布式计算
  根据执行代码或IR的不同方式,在使用Python解释器或runtime时,有两种分布式计算方法。
  PythonNative
  Theano和PyTorch采用了Pythonnative分布式计算方式。这种分布式训练工作包含多个Python解释器进程。这导致出现了以下结果。
  打包和运行(Packandrun)。由于这些Python进程在不同的host上运行,因此我们需要打包用户程序和依赖项,并将它们发送到这些host上去运行。一直以来TorchX负责了这个打包过程。它支持例如Docker和torch。package等各种打包格式,并且可以与各种集群管理器配合使用,如Kubernetes和SLURM。单程序多数据(SPMD)。由于将用户程序发送到各种host上要依赖于打包,与其他权重较轻的方式(如通过RPC发送代码)相比,这种方式不太灵活,因此,我们通常只发送一个程序。当所有这些进程运行同一程序时,这个作业就变成了单程序多数据(SPMD)作业。
  PythonnativeSPMD
  下面是一个简单的SPMDPyTorch程序,我们可以在相同或不同的host上使用进程运行这个程序。在这个过程中,我们只需要调用allgather。真正的分布式训练程序会调用更高级别的API,例如torch。nn。parallel。DistributedDataParallel和torchrec。DistributedModelParallel,然后再调用低级API,例如allgather和allreduce。
  importosimporttorchfromtorchimportdistributedasdistdefmain():usegputorch。cuda。isavailable()localrankint(os。environ。get(LOCALRANK,0))localworldsizeint(os。environ。get(LOCALWORLDSIZE,0))devicetorch。device(fcuda:{localrank}ifusegpuelsecpu)dist。initdistributed(backendnccl)lsttorch。tensor(〔localrank100〕)。to(device)placeholderrltlst〔torch。zeroslike(lst)forinrange(localworldsize)〕dist。allgather(rltlst,lst,asyncopFalse)print(Afterbroadcasting:,rltlst)
  PythonnativeNonSPMD
  PyTorch不仅限于SPMD式的分布式训练。它还通过torch。distributed。pipeline。sync。Pipe和PiPPyproject提供流水并行,其中流水并行的各个阶段在不同的设备上运行不同的程序。这些阶段常通过torch。rpc包来沟通。
  分布式运行时机制
  分布式TensorFlow作业由运行TensorFlowruntime程序的进程组成,而不是由Python解释器组成。此分布式运行时作业执行TensorFlowgraph(IR),它是由执行用户程序的Python解释器生成。
  用户程序可以使用低级API(如tf。device)去指定作业要运行什么操作、在哪台设备和主机上运行等等。因为API有runtime,所以可以做到这一点。
  withtf。device(job:bartask:0device:gpu:2):opscreatedherehavethefullyspecifieddeviceabove
  与PyTorch一样,TensorFlow也为分布式训练提供了高级APItf。distributed。strategy,Keras和DTensor。
  strategytf。distribute。MirroredStrategy()iftf。config。listphysicaldevices(GPU)elsetf。distribute。getstrategy()withstrategy。scope():modeltf。keras。Sequential(〔tf。keras。layers。Dense(1,inputshape(1,))〕)model。compile(lossmse,optimizersgd)
  分布式运行时极大地方便了训练服务的维护,因为我们不再将用户程序打包到集群上运行。相反,我们打包运行时程序,因为相比用户程序,运行时程序更加统一。
  混合理念
  JAX支持Pythonnative和分布式运行时。
  JAX提供例如vmap、pmap和pjit的函数转换,这可以将Python函数转换为分布式程序。
  (本文经授权后由OneFlow社区编译,译文转载请联系获得授权。原文:https:quip。comY8qtAyV4EXRg)
  欢迎Star、试用OneFlow最新版本:https:github。comOneflowInconeflow

降价红利背后的忧思已经全部卖完了,客户太热情了。3月15日晚,在武汉东风本田友芝友4S店的直播间,仍然有大量客户涌入,甚至有来自东北的客户,不断咨询销售问题。有黑龙江客户甚至飞了2000多公里过来买同一宗案件,为何德勤被罚没2。1亿华融才被罚80万元?3月17日,财政部公布了对中国华融资产管理股份有限公司(以下简称华融)及其审计机构德勤华永会计师事务所(以下简称德勤)的处罚结果。经查,华融2014至2019年度不同程度存在内部控汽车降价潮蔓延多品牌优惠促销,销售称不敢不降,也不敢大降本文来源时代周报作者郑栩彤湖北车企降价拉开的价格战,蔓延至其他车企品牌。行情不好,湖北汽车降价又这么厉害,我们压力大,只能跟着降。但降价的用处也不大,只能保住一部分客户。3月16日济南高新区举办首期科创金融云鼎汇活动为高水平建设中央科创区(CTD),加快金融资源集聚,促进高新科技产业创新发展,3月17日,济南高新区举办首期科创金融云鼎汇活动。本次活动以金融供给侧结构性改革为主线,旨在探索金融资一觉醒来,楼市又传来好消息01hr最近一周时间,国外金融市场连续暴雷,国内市场却频频释放出利好的信号。政策层面,昨天央妈宣布,打算在3月27日全面降准0。25个百分点,预计释放约5000亿元的中长期流动性。长安深蓝遭网暴,揭开市场竞争背后的乱象与隐忧虽然今年的315晚会没有点名汽车品牌,但各大汽车品牌丝毫不觉轻松。经历了三年疫情,遭遇全球供应链紧张原材料涨价,好不容易等到消费复苏,又被降价大潮裹挟汽车行业早已步入盐碱地。除了说塔里木油田去冬今春供气124。71亿方多项指标创新高天山网讯(记者于江艳通讯员吴朋报道)从2022年11月1日至今年3月15日,中国石油塔里木油田分公司冬供期间累计向西气东输下游及南疆地区供应天然气124。71亿立方米,同比增加0。一间银行的独特倒闭,一场风险的必然发生错误可以通过监管避免,但犯错的动机不会消失。图视觉中国采访丨财经记者宋玮管艺雯程曼祺高洪浩文丨龚方毅黄俊杰编辑丨黄俊杰北京时间周五(3月10日)晚上,硅谷银行(SiliconVal金融工委2。0,这次有何不同?(东吴宏观陶川,邵翔)时隔35年,中央金融工作委员会重现,这意味着防范化解金融风险将进入深水区和攻坚阶段。与此前公布的国务院机构改革方案相比,本周印发的党和国家机构改革方案对于金融决策和监管体系大刀阔斧达内IT培训集团携手腾讯教育,助力大学生精准就业产业发展依靠人才,抓产业必须抓人才,如今,培养数字化人才已经成为社会各界的共识。然而,数字化人才的培养并不能照本宣科,需要对标产业与企业发展的真实需求,避免理论与实践脱节。日前,达00后女大学生边读书边创业营收1800万,你眼红吗?金融工程专业的00后女大学生边读书边创业营收1800万登上热搜,引发了网友们的激烈讨论。看了下网友的评论,有这么几种声音。网友们在好奇女孩如何取得创业成功的同时,也引发了对创业本身
咖啡之翼尹峰,从美女老板变成求职者,背后原因是什么?咖啡之翼创始人尹峰之所以到非你莫属节目去求职,首先是因为她的咖啡之翼终止挂牌,宣告创业失败。其次,她想换个身份,不是以老板而是以求职者身份去参加节目,衡量下自己在职场的价值所在。再刘强东强奸案再次反转,女方承认自愿发生关系,并索赔五百万要和解6月26日,刘强东一案出现巨大反转。该案24日举行听证会,大量与案件相关的视频也首次被媒体曝光。刘静尧曾多次表示发生性关系是双方自愿的,该消息引起热议。刘强东案例反转!女方多次承认黑帮大佬和我的365日的续集来了,却拍成了MV,玩高雅玩砸了2020年的波兰电影黑帮大佬出续集了黑帮大佬和我的365日2。第一部恶评如潮,没想到看了第二部后,观众都觉得第一部真香!第一部结尾,劳拉遭遇意外,我们不知道她是否还活着。但在第二部一刀切的蛇精脸明星怎样了?后遗症不少,年纪越大越明显前些年的娱乐圈,蛇精脸盛行。不少明星为了出挑的颜值,美美的出镜,选择了一刀切的动脸术。当时所谓的一刀切,就是削骨。将下颌多余的骨头去掉,小方脸顿时变成蛇精脸。女星中的代表,是杨幂。当年今日系列7月27日中学语文课文散步作者莫怀戚逝世012014年7月27日中国作家莫怀戚逝世著名作家中学语文课文散步作者莫怀戚先生于7月27日15点45分,因病在家中去世。莫怀戚先生是重庆人,毕业于四川大学中文系,中国当代作家,中美国不断打压中国企业,华为才是最大赢家最近几年,美企给了中国企业不少下马威,一方面是掌握核心科技有恃无恐,而另一方面则是在挑战行业规则,美企不仅响应政府号召,更是认同美国破坏市场秩序的可恶行径,哪怕是连自己的生意都不做华为总裁任正非14年闪亮的基建工程兵军旅生涯大学毕业的任正非,在同时代年轻人中算是比较出色的。他理工基础雄厚,掌握了数门外语,而且文科实用水平颇高,对毛泽东思想有着自己深刻的理解。这些能力集于一身,即便放在今天,也不失为高级华为通告陈春花的后续身为北大教授,学历涉嫌造假?前一段时间,知名管理学者陈春花教授,因华为在心声社区的一则通告而上了热搜。一看通告的内容,措辞极为犀利,华为郑重声明华为不了解她,她也不可能了解华为。这起事件的来由呢?主要是网上很牛皮吹大了!国企员工朋友圈炫富后续来了,官方连夜公布调查结果要问现在什么岗位竞争最激烈,可能人们第一印象就是铁饭碗,尤其是现在就业大环境不乐观,能有份安稳有保障的工作不容易,所以铁饭碗竞争愈发激烈。在众多铁饭碗岗位中,公务员和事业编考试难度一味药治疗荨麻疹我小时候经常起荨麻疹,碰一下,划一下就起,高出皮肤,红,痒。我还记得自己去医院拿药,接诊的是内科主任,边给我看边给同事做思想工作,我那时候小,估计现在就在心里骂了看个病三心二意,庸三年前,精神受刺激,确诊乳腺癌三年前,我父亲去世,我精神受刺激,确诊了乳腺癌。妈妈10年前就去世了,父亲突然的离世,让我心里空落落的,心里一下子就没有了主心骨,爸爸在的时候,我每年回国看望爸爸,吃家乡菜,陪爸爸
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网