Hello 大家好欢迎来到今天的视频的分享我们今天分享的是关于在Kubernetes机讯上用Kubu Ray 和Q来管理Kubu Ray Drop 和Kubu Ray 相关的一些overload然后先简单地自我介绍一下我叫Ena来自于Docload然后目前主要是在做Kubernetes平台然后方向的话就是AR这一块的方向同时到位在Kubernetes上游设讯同时也是像Q的服务然后平时的话比较奇怪大家好 我是胡彦哲我是来自自业跳动火箭以行的公司我们P式计算团队主要是会做自截战类外Kubu Ray的一些生态的建设那今天就开始我们今天的演讲今天的演讲我会分三个部分第一部分是Ray这个框架它是如何被AI的研究者们所侵略的第二部分是在自截跳动我们是如何使用Kubu Ray去托管Ray的相关应用第三部分是如何使用Q去托管Ray Drop去做一些调度相关的一些能力最后是Kubu Ray第一个部分我们介绍一下Ray它对于AI的研究者来说它有一些什么样的优势首先什么是RayRay它是UZ Berkeley的Ryne计论室所同学所提出的一个通用的一个风式框架它可以提供一些简单的API可以将你的Python代码的一些AI的代码甚至是Java C++可以快速的变成一个风式程序它对于它本身可以分为两层第一个是Ryko层它提供了一些low-level的一些计算与法比方说Remote FunctionRemote Class它的上方还有RayalRayal这一层它主要是提供一些AI相关的一些likeware它可以将用户的一些训练推理的一些代码简单的丰富实话并放在Ray几条可以去跑Ray它自己有一个商业化公司叫Angle Scale就在上周也刚刚举行2023年的Ray Summit在公开资料显示Ray现在它是已经有OpenAIGoogle 亚马逊影包括国内的蚂蚁 字节等等包括众多大厂都在使用RayRay它自己的Angle Scale自己也在做一些AI相关的一些商业化的一些工作它的Ray Pro现在已经有27000个star我们先来简单介绍一下Ray首先我们看一下右图它是一个Ray集群的架构可以看到它分Hand node和Walk node这个node它是个虚拟的概念如果在KBS这个环境当中它就是个炮的Hand node它是一个Ray集群的中心化的一个概念它其中会有GCSGCS主要是存出一些Ray集群的一些Metadata而每个node它本身还有存在Railet的一个概念Railet它主要是做一些这个node本地的一些调度一些逻辑除此之外ObjectStockObjectStock它会去相当于这个分布式存储它在一样的过程当中所产生的中心结果它会放在ObjectStock当中大家看到这个Raycast的时候可能会觉得它比较负担当然我们今天不会去过多去深究其中的一些架构我们看一下左边让途这个代码那么这是一个Passing代码它可以将表上Square这个方式比如说下一个Counter这个Class直接通过Ray.Remote语法堂包起来之后它的这些方式和Class都相当于都会放在一个远程的节点去运行这样就可以简单的实现了分布式的一个效果然后最后呢这个结果它是会存在ObjectStock当中的通过Ray.Gat它会可以一步的把这个结果盖到本地那么其实Ray除了Raycast之外它在上层还骑过Ray.L这一层它就是一个专门给训练这方面去做了一个一些库我简单介绍一下然后Ray.Data它主要是提供一些数据读写流适处理下方等等的能力它在去如果你要去做一些理先推理预处理的一些成绩上它就有一些一购调度不同从你算的一些优势RetrendRESO它可以将比如说你的ChartBoss拍套的这些代码可以通过它这一套库可以分非常简单的改写成能在Ray的分布式换一下去使用的一个训练代码最后还有RESORESO它是专门给在线用手做的一个空架它可以比如说你可以用它去做一些复杂的模型部署还有一些灵活的一些模型编排等那么Ray它你可以发现如果你是传统这种AI的一些Wogelos的话你想到数据处你可能能想到Spot你想到那个训练你可能能想到Touch的DDPMPI的这些逻辑你想到去做Service模型部署你可能能想到我要去在Qubes上寄一些Depoints那么这一些其实Ray它是给你很大的这种想象力和自由度你可以将整个AI拍摄通过这些固放在同个Ray的框架上甚至是一拍在网上同时去执行那么Ray它所提供的这种非常灵活的这种以及它的依购调度的能力我觉得主要现在大家在AI的统一者喜欢去用Ray的一个原因OK所以第二部分我会去介绍在自己跳动我们是如何使用Qubes去托改Ray的相关应用的首先我想去表明一下就是如果我们在用物理机或者是不用Qubes的场景我们要是搭建Ray集群它会存在一些什么问题的从这个图当中大家可以看到就是如果我要如果我要去寄个Ray集群那么我首先我在Head节点我要去WayStart刚刚Head寄个Pod所有的Walker节点它需要去指明说我的Head节点是哪一个我要知道Head节点的IP和Pod然后它之间就会连接成一个Ray集群那这个有一些什么问题呢因为你可以发现它之间它要通过这个IPPod的这个连接这样的话你表说你要去增山节点你要去做节点恢复这种你在物理机场已经有很麻烦其次的话表说我要去做做作业体交那么大家用Ray都知道它用RayJobFarmit是个脚本形式它也需要讲一讲口那么这种你在生上生产环境的时候它就会显得有些不太方便那么稳定其次的话在KBS这个环境大家可以想到了一些Matrix报警还有HBAVPA这些东西它都是你在非那个云烟圣环境所不具有的那么所以这就是为什么对于Ray开业社区它需要提出Kubway这样一个框架那么Kubway它也是一个非常经典的Upright的一个设计它在在Upright的设计地址上它提出了三个CRD第一个CRD是RayClusterRayCluster它主要是负责做集群的一些创建outscaling以及一些容错的能力第二个的RayJob它主要是会去帮忙去做锐的提交并且它会去帮助你去创建一个锐Job专属的一个集群去做集群的一些生命周期的管理Reservice它是专门给Reserv这个库去所做的一个云烟圣画部署的一个方案大家可以看到RayClusterCtrl它跟专注于说我如何把这个集群建出来以及如何去保证这个集群的一个稳定性那么RayJob和Reservice它其实可以理解为一个是更偏离线RayJob它更偏离线Reservice它更偏一个在线的应用当然它库位还提供了一些其他的一些API Server一些Client去做一些CRD的去操作这些CRD的一些操作这样的话它方便在上层去集成一些上层平台下面我会简单介绍一下这三个CRD的一些内部一些细节首先是RayCluster如果说如果大家用了Ray知道Ray它自己有一些Act的重启Task重视的一些机制它其实能让你的代码变成一个高可用的一个程序那么其实CoopRay通过RayCluster的CRD它就会真正的把Ray变成一个高可用的一个集群真正高可用的一个应用那么可以看到RayCluster它做了一些什么东西它首先它支持了一些POD的一些恢复和热更新它就基于你当前所拍的这个页面它会去决定我到底要去增节点还是删节点还有我要去更新哪些POD的镜像那么它的Head节点和Work节点当然在KBus环境肯定是拿Service去做连接了那么Service的连接它除此之外还有什么好处呢就是我们可以做Head节点的高可用我们可以将GCS当中一些Meta信息放到外部存土上那么在Head节点它重启的时候它可以做到无感知的一个恢复除此之外的话Ray的一个AutoScanner这个能力也可以通过RayCluster的CRD去做一个实现Ray自己的AutoScanner在感知到承受集群内部某些节点的控语它会去修改ClusterCRD上的内容那么Operator它在坚定到这个变化之后它会去选择说我到底需要去删除哪些Uconode或者说当前的集群它的字件非常紧缺我是不是需要去扩一些当然除此之外的话承受Metrox还有一些Status的这些透出都是Cluster所可以去CRD所可以给予的第二个的话是RayJobRayJob的话它主要是增加了一些去在生产环境去将作业进行提高的一些能力它可以首先它会去等待比如说上层的P4掉落器是否Ready然后在Ready之后它可以去创建RayJob一个半生集群装成集群之后它会去做一些作业起交以及状态的一些状态一些更新最后去删除这个集群那么再来自己跳动其实我们还对RayJob这个CRD做了一些优化比如说它的一个状态机的一些转移以及做了一些比如说是等待节点处还有一些Timeout超时的一些功能RayService的话刚才也提到它是专门做了一个运营生方案它可以将CRD上面的一些配置直接部署到RayJob群上除此之外它其实还做了一个Panning Class跟Active Class之前的一个无感的一些迁移比如说用户它去更新压抹了一些Set配置的时候它可以去创建一个Panning Class然后等Panning Class这个设备好之后它还会做一个Service一个切换OK所以后面介绍这些之后我会介绍一下在自己的一些真实的一些应用场景那么在自己跳动我们是提供了一个非常完整的一个生态给用户去使用Ray那么首先我们在自己跳动所有的RayJob群都是拿Cruway去做管理的我们在平台层我们还给了用户很多不同的使用姿势首先用户可以去创建一个程度集群还可以在程度集群上通过Notebook或者说其他一些方式去在这个程度集群上去做一些调试和运行其次的话它做完调了之后它可以把自己的作业通过平台直接做一个提交这个提交之后它就是通过Cruway的SingleJob去直接SingleJob直接提交到做一个RayJob的CRD提交到Cruway这里除了之外还有就是包括一些Metrix还有一些报警的一些能力都是有的我们现在承接业务化大体是有图计算理线推理大模型相关还有并行计算包括理线载线什么应用都有并且我们在QB测验再尝试一些新的一些方向这张图是想介绍一下就是我们在内场的一个具体的应用场景这个场景是说这个业务它希望我用尽可能多的去用一些DO的spot资源但是同时我又希望说我在用DOspot资源的时候用户它是大模用户是感知不到这个集群的就是QBAR集群上面一些斗动的对此我们的结法是说我们首先在多个QBAR集群创建了各自创建了一个非常大的一个只使用DOspot的一个锐集群那么我们在operator这一层我们首先做了一些优化我们会去动态去调整每个operator一个规模我们去看这个每天可能比较规律一个水位并且去看这个autoscaler所给出的一个每个节点信息然后去每天动态调整这个集群的规模然后能做到说尽量少的让QBAR是那边主动去驱逐这边锐集群的一些泡的那么在用户的脚本测我们还做了两层的一个调度首先用户的脚本它会去基于每个大集群的一个水位去判断说我需要把自己的作业其他哪个集群上然后第二层我们在锐这一步我们自己还做了一个比较简单的排队功能每个作业它在进入锐集群之后不会立马运行它会首先去通过去做一个刚调度的一个请求当这个作业它所需要的GPU跟CPU资源它真的ready的时候才会去真正把这个作业提要到这个集群当中这样就实现了刚才所说的大部分用户其实他在用spot资源的时候他一眼不感觉到这个资源的一些斗动那么用户它在使用完这些资源去做调整之后它可以将这个自己的作业通过single job形式旗钥的平台上那么它最后会展化为cube为了一个way job我们每天有非常大规模的way job在我们整个KBS集群当中去运行这些way job它在运行完运行的过程中它会将其中一些event它档跑到远程存土上这里我们也是仿造了spark黑锤server的一些设计思路它的这些event它可以通过ray UI我们只是经过一些优化之后它可以原生进益重放就算这个ray job已经结束了集群已经销毁了用户依然可以去从中看到一些act日致matrix的一些信息它基于这些信息它可以去再去做提交或者是去做tbal都是可以的OK所以后面我还会去介绍一下两个在自己挑逗两个场景第一个场景是图计算的一个场景然后这个场景的话是这个场景是我们会使用会将act使用vcode将图计算的operator做一个改造改造完之后每个act是有ray去起的每个图算是有ray去起的它们之间是使用MPI进通信那么上位之后的优势是说它可以做一些failover的一些能力比方说你在一个work被挂掉之后它可以直接通过本级的一些存储和一些rank的一些信息去做恢复第二个case的话是在大规模这个理线推理这个场景这里所使用raydata的一个我们的一个考虑是它相比spark它是有更有一些灵活变成的一些优势吧然后它并且它在做一些比方说你既有数据处理又推理的话那你可以去将这些逻辑放在不同的arcts上你可以做一些流水线并行和模型并行这是只有在ray上面才可以去做的这两个场景我们也是在andscale的官网有发表相关人章然后大家感兴趣可以去看OK所以大家可以看到我们也在这个ray枯位的角度上做了很多工作也存在很多问题那么下面有请英娜去介绍一下Q的一些工作感谢原则带来这个字节吩咐的这种生产的一些实践其实刚才在这个原则讲的过程中大家会发现其实在在字节内部他们对ray job也有一些管理上的一些问题总结的来说主要是三个点其实这是所有的P处理字位都有的问题第一个就是资源是有限的那比如说对于一个标准的KBS集群来说它是吧现在最多是五千个节点那另外现在AR这么火GPU卡公布应求那GPU资源也是非常有限的那怎么样去更好地做一个资源的划分然后然后提高资源的整个利用率是一个很大的问题然后第二个是关于这个Job的优先级那我们制造比如说一些在离线的混布的场景下在线作业它肯定是那在这个情况下我们需要有一个作业优先级这样一个管理的能力然后第三块是关于这个Job的饥饿的问题那有时候我们在集群中会运行一些高优的一些长作业然后它会把集群资源全部都吃死然后这个时候有一些短作业可能永远都没法运行那我们就希望能够提供一种机制来保证让所有的作业都有公平调度的机会那这是一个三个比较通用的问题开源的解法是什么呢Connected上游的解法是什么呢那我们就推出了一个项目叫Q然后让Q来管理解决这个问题那Q其实它不只是单单的针对Rajob去做这个适配它其实对所有的Job都有这个能力那今天可能更多的是关注在它怎么去帮助Rajob来做一个管理然后首先的话可能其实这是其实Q的话是去年就开源的然后但是在国内宣发的机会不是很多然后这次是第一次大规模的这么大的规模下做一个宣发然后首先它是在Connected上游发起的这样一个项目它提供很多能力比如说第一个就是对作业的一个管理能力然后包括很多的这个陆列策略像Five for Best Effort然后还有居于优先级的这样一个抢占那第二个是关于它一个多致负的这个能力那我们知道其实在一些企业架构比较复杂的这个企业内部这个多致负其实是不能满足的那所以我们需要有个层级对列管理的能力那目前的话Q还不支持但是它已经在设计中了应该很快也会就是开发完成然后第三块是关于这个资源的这个配合管理那同时除了管理这个整个资源的配合我们还提供了这个资源之间这种Fair sharing的一些能力然后第四个的话就是关于资源的可替代性这个怎么理解呢就是很多的作业它可能比如说用GPU它跑得会更快一点然后跑得比如说更快一点是吧但是当GPU资源不足的时候那我们说那我们可不可以换到CPU来运行呢其实也是可以的它只能过更慢一点那所以Q提供了这样一种资源的这种降级的一个策略来实现这样一个能力然后最后一个是关于这个准路的一个能力就是什么叫两阶段准路呢是第一阶段就是Q本身会对这个job的它能否运行它能否被调度做一层管理那同时我们知道比如说一上有些企业他们可能会用一些公用云那公用云的话它可能就是它是有配合上线的比如说我这个月只能用多少钱来用公用的资源那这个时候我们Q就会提供了一个接口当你的Budget达到预算之后你可以中断这一次的job运行然后就是做到一个预算的这样一个就是不超我们的预算吧这样一个能力吧那同时的话比如说像节点伸缩这一块那当你的节点在伸缩的时候那我们不希望这个job的运行而是等节点资源全部都释放出来之后我们的job在继续运行那Q也提供了然后下面的话是关于Q整个设计的一个原则那我们其实知道在现在的现在的开源社区里面其实除了Q以外有很多的调度器它其实本身也集成了一些Q的能力然后但是Q作为在这个Q的上游发起了一个项目那我们希望Q它不要去重复造轮子所以我们的就是说希望和其他组建各自做自己的事情但是他们需要实现一个无缝的集成所以这是Q整个设计的原则然后下面的话是Q的一个整体的一个架构吧我们可以从下往上看那最下面的话是一些节点然后在节点之上我们有一层抽象叫Resource Flavor那它其实是对所有节点一层抽象所以在Q的系统里面我们是不关心节点的我们只关心Resource Flavor我们可以看到就是说最左边那个Resource Flavor它通过Node Lab的方式和对应的一些节点做了一些绑定然后再往上层就是我们可以看到有一个叫ClassQ那ClassQ的话就是我们可以把它理解成一种资源池的概念那ClassQ里面可以定义说你这个Q里面有多少个CPU有多少个Memory有多少个GPU用它来做一个资源的扩查管理然后ClassQ里面有很多的Local Queue然后不同的Local Queue可以在共享整个ClassQ里面的一些资源然后再往左边的话我们说是叫WalkloadWalkload其实是对所有job的一个抽象把它们串起来的话大概就是说首先用户提交一个job然后这个job的话会被Q抽象成一个Walkload这个Walkload会提交到对应的对应的Local Queue里面去然后Local Queue之间它会共享整个ClassQ的一个资源大概是这样子一个流程那同时除了ClassQ可以做一个资源的共享之外然后不同的不同的这个ClassQ通过同属于一个CoreHot我们叫CoreHot那不同的ClassQ之间也可以做一个资源的一个共享所以在Q里面有两层的这个资源共享的能力这是一整个这是整个的一个Q的一个架构然后下面的话我们看一下整个Q的这个API然后因为时间关系就只讲简单的两个第一个叫ClassQ那ClassQ我们可以看到其实它在最左边通过这个Flavor自转来管理了整个集群的资源比如说我们这边定义的CPU然后这个Nominal Quota代表的是它这个ClassQ里面至少有多少个CPU然后这个Borown Limit代表它可以就是借用多少个CPU所以总的来说对于这个Flavor它可以拥有60盒的这个CPU它可以拥有192G的内存就是通过这样一种方式来定义这个集群的一个资源词然后第二个API是对用户来说的那其实对用户来说其实很简单就是你只要定义比如说你再跑一个Job然后你只要定义你的Level是指向这个ClassQ指向这个LocalQ那你就可以把这个作业提交到Q的系统里面去Q就会接管整个Job那它在Kubernetes的环境上它怎么运行呢我们把它封城了两块第一块是叫Q应的能力第二块叫Schedule的能力那所以顺序真的方向首先就是管理员可能会去创建Q相关的一些API对象比如说SourceFlavorClassQ和LocalQ这样它就可以搭建起一个Q应的系统然后普通用户的话就可以通过提交Job然后通过指定这个Level的名称让Q来接管这个Job第三階段就是第三階段就是说Q会去接管这个Job的调度它会去检测整个集群的Quasa是否满足需求如果满足需求的话就会放行这个Job当然这里面逻辑很多我这边只是简单的介绍一下所以当Job被准入成功之后它就会走到一个正常的调度流程就是首先它会创建对应的Port然后Scheduling去监听到对应的Port的时候它就会去调度这个Port然后当集群发现Port的Pending集群资源不够的时候它就会去调用Auto Scala去伸缩这是一个大致的一个流程然后因为因为时间关系本来是有一个Live Demo的就是演示Q它怎么样去这个我看一下应该应该来几吧那我就简单那我就简单Demo一下先简单介绍一下这个集群的话是有一个CubeRay它是用的是0.6也0的然后Q的话是Mate分支的版本然后Ray的话用的是2.5也0的版本然后在集群里面我创建了两个優先级一个叫高优一个叫低优这个是为了演示这个基于優先级的抢占然后的话我是在本地起的一个集群叫Kan的集群然后一个Master 两个Work然后两个Work的話分别是4和16G然后我们可以看到其实现在在这个集群里面我已经创建了两个能看见吗Hemm件是吧因为自己调查了后面那个建具它又有点小所以不好意思所以现在我这个集群里面有有两个ClassQ后面叫ClassQ1和ClassQ2的然后他们都是分别是4和16G的然后这个时候我创建了两个LocalQ他们分别指向对应的ClassQ我们可以通过名字就可以把它区分出来然后这边的话是整个集群我closed的一个状态然后这边是Raid Job的一个状态现在我没有提交任何的作业所以它都是空的然后这个时候假设我要提交一个作业假设我提交一个Q1的Raid Job然后它是一个Low Plurality的然后它提交到ClassQ1因为它是3和3G的所以它肯定是可以运行成功的我们看一下我提交完之后立马我closed就已经被准入成功了所谓的准入成功就是说Q已经放心了这个Job可以运行然后这边的话它应该已经在创建Port了可以看它Port在创建Port创建成功了我们这边状态会发生一些更新它会从Panel变成Rawling状态好 这是然后第二块就是我现在假设我又新加一个Raid Job进去这个Raid Job可能又是一个3和3G的也是提交到这个Class Q1然后加起来就是6和6G它已经超过了这个集群的4和16G的这样一个上限那它会发生什么呢那它就会发生一个抢占因为这两个Job是不同的优先级的然后我们发现这个提交这个高优的JobRaid Job之后它就会立马原先这个低优的Raid Job就会被这个抢占掉它就会失败然后它会被装断住然后我们发现这个高优的Raid Job已经在运行中了对这个Terminating比较慢这其实演示的就是一个在同样一个Class Q里面当集群资源不够的时候高优的作业会去强占掉低优的作业我们发现它已经在Rawling状态了然后这个时候我们就会说那我现在有两个Class Q是吧我现在你只用了Class Q1那Class Q1里面4和16G的资源浪费掉了那怎么办呢那其实我们也可以通过它们属于同样一个Core Hout然后让它们实现一个资源的共享所以我现在只要把这个Class Q1 也加入到这个Core Hout里面就可以了Apply一下我们发现它们实施属于同样一个Core Hout然后就会发现另外一个之前被Stop住的这个低优的Raid Job已经被准入成功了它已经在起泼了好我们稍微等一等到它的状态变更它已经运行成功了然后这个时候又会有人问我说那我这个Class Q2本来属于另外一个组织的那是吧那我现在我要这个资源本身属于我的现在被你借用了那现在我想用我的资源怎么办呢它其实它只是只要提交自己的资源它就会把被其它的Class Q1债用的资源也强占掉我们可以演示一下就哪怕你是个低优的低优优先级的作业你也会把别人的就别人的作业给强占掉我们发现现在就是说我提交给Q2的作业它一提交成功之后就会把原来倾正它的Q1的低优的Raid Job就强占掉它就开始运行了那当这个 Job 运行完之后继续自然又回说了所以原来这个低优的Raid Job又会被重新拉起来就实现这样一种资源的Fair-sharing的能力然后提高自己的资源我们可以稍微等一等它应该当然就是Q 本身它能力就是还是有很多的我这边可能就只是演示关于它资源强占这一块的能力我们可以说它已经在Rawling了它应该会运行几秒它就结束了它运行结束我们就发现原来被强占的Raid Job它又开始被ADM 成功了大概就是这样一个demo 说的一个demo然后后面很快然后下面的话就是我们刚才有说的Raid Job它只是Q 集成了一部分那其实我们还有很多其他的一些集成了一些 Job这个图展示的就是绿色的就代表已经集成成功了然后灰色的代表是正在运行中比如说对上游苦闻第四来说我们集成了它本身的这个Job另外的话它也集成了Job SetJob Set是我们在上游发起的另外一个项目它就是因为现在的很多Job比如说NPI JobPattage Job然后Tensor Flow Job它每个Job的这个API都不一样所以它有每个它每个都有一个operator来去做这个调鞋那我们就把它们抽象成了一种API对象以后的话就可以用一个API来管理所有的大数据AI相关的一些Job后面我们也会对是破的阵营支持那锐的生态的话就是支持了锐Job然后Coop Flow生态的话基本上大部分的Job都已经支持了这也非常感谢Coop Flow社区对Q的一个支持另外如果你自己想实现自己的这个你想自己把自己的Job集成到Q这个系统里面也是很简单的其实就是说你只要实现这样一套Job Framework就可以了然后就可以很快的快速的创建一个你的自己的一个一个系统好差不多就是这么多内容然后大家如果有什么问题可以进行提问应该时间不是很多了是吧那就提问一次你好我有两个关于那个Coop Q的问题就是Q的问题一个是这边是否提供那个Burst的能力比如说你现在资源可能不够但是我来了一堆任务我想让你帮我缓冲一下然后等有资源的时候这个就是它最基础的能力就是Q的能力这肯定是支持的像刚才那种你不是提交了第二个任务然后他就没有Admit那这种是它只是它已经入入了但是它不会暂时掉度是吧不是就是如果你很多Job需要去运行如果你集群资源够的那我就会就是让你全部的运行起来如果你集群资源不够就会进行一个排队比如说让高优的优先跑或者说你可以严格执行它的这个就是创建顺序这都是可以的就是看你怎么去配置OK第二个问题是那个像刚才如果他一个任务被抢占之后他就Stop了然后当有资源的时候他就重新拉起所以这个时候如果我们我们其实就需要用户的任务具有密等性是吗就是他执行到一段时间然后被终止了下一次又能重新拉起可能一部分的状态已经已经执行过了就是在我看来因为Kubernetes的破的本身基本上都是一种密定的一种概念因为破的可以被重视所以说你提交的所以最好也是这样子的但是一些就是比较好的时间就是说你需要自己去实现一个 Checkpoint 这种能力当你运行到一半你被终止之后你通过 Checkpoint把它的一些比如说如果你在模型训练是吧一些权重的参数保存下来等你下次拉起的时候你从上次的状态里面恢复过来这样一个这是一种比较好的时间对当然你至于具体怎么做其实完全看你自己的实现就是 Q 其实是它把实现的细节留给了用户它只是说做了一层这种框架层面的一些支持不好意思就是因为时间关系但是我们现在可以继续交流好谢谢大家