Angel是一个基于参数服务器(Parameter Server)开发的高性能分布式机器学习平台,它基于腾讯内部的海量数据进行了反复的调优。
Angel的核心设计理念围绕模型,将高维度的大模型切分到多个参数服务器节点,并通过高效的模型更新接口和运算函数,以及灵活的同步协议,轻松实现各种高效的机器学习算法。
Angel基于Java和scala开发,能在Yarn上直接调度运行,并基于PS Service,支持Spark on Angel,集成了部分图计算和深度学习算法。
Angel-PS实现了基于参数服务器的矩阵计算,将分布在多台PS Server上的参数矩阵抽象为PSModel,只需要完成PSModel的定义、实现其计算过程,就可以实现一个运行在参数服务器上的简单算法。
简单的angel-ps架构如下图所示
  • PS是存储矩阵参数的多台机器,向计算节点提供矩阵参数的拉取、更新服务
  • 每个worker是一个逻辑计算节点,一个worker可以运行一或多个task
机器学习的算法,一般以迭代的方式训练,每次迭代worker从PS拉取最新的参数,计算一个更新值,推送给PS
Angel整体架构
angel的架构分为三大模块:
1、 Parameter Server层:提供通用的参数服务器服务,负责模型的分布存储,通讯同步和协调计算,并通过PSAgent提供PS Service
2、worker层:基于Angel自身模型设计的分布式运行节点,自动读取并划分数据,局部训练出模型增量,通过PS Client和PS Server通信,完成模型训练和预测。一个worker包含一个或多个Task,Task是Angel计算单元,这样设计的原因是可以让Task共享Worker的许多公共资源。
3、Model层,这是一层虚拟抽象层,并非真实存在的物理层。关于Model的Push和Pull,各种异步控制,模型分区路由,自定义函数。。。是联通Worker和PSServer的桥梁。
除了这三个模块,还有2个很重要的类,
1、Client:Angel任务运行的发起者
  • 启动和停止PSServer
  • 启动和停止Angel的Worker
  • 加载和存储模型
  • 启动具体计算过程
  • 获取任务运行状态
2、Master:Angel任务运行的守护者
  • 原始计算数据以及参数矩阵的分片和分发
  • 向Gaia申请Worker和ParameterServer所需的计算资源
  • 协调,管理和监控Worker以及PSServer
 
通过上述设计,Angel实现了可扩展架构
  • PSServer层:通过PS-Service,提供灵活的多框架PS支持
  • Model层:提供PS必备的功能,并支持对性能进行针对性优化
  • Worker层:能基于Angel自主API,进行算法开发和创新的需求
 
Angel代码结构
1、Angel-Core:核心层
Angel的核心层,包含如下组件:
  • PSServer
  • PSAgent
  • Worker
  • AngelClient
  • 网络:RPC & RDMA
  • 存储:Memory & Disk
2、Angel-ML:机器学习层
Angel是面向机器学习的,所以机器学习相关的元素也加入到core层,只是在一个单独的目录下
  • Matrix
  • Vector
  • Feature
  • Optimizer
  • Objective
  • Metric
  • psFunc
要注意的是,在Core包中的ML层,大都是底层的基础接口,而相关的扩展和实现,还是在具体的算法层
3、Angel-client:接口层
基于Angel本身的接口,开发了多个算法:
  • SVM 
  • LR (各种优化方法)
  • KMeans
  • GBDT
  • LDA
  • MF(矩阵分解)
  • FM(因式分解机)
3.0版本又增加了很多算法,后续熟练后再补充
Angel的算法开发思路比较直接,都是围绕着PS上的模型进行,不停更新。算法的实现技巧也比较灵活,追求最优的性能
整体上,通过这4个层级的代码,用户可以全方位的积木式进行代码的设计,开发出高效的机器学习代码
Angel在设计上,考虑到现有的机器学习框架众多的问题,提供了2种模式。Angel支持两种运行模式:ANGEL_PS_WORKER和ANGEL_PS_SERVICE。
通过这2种方式结合Angel本身的worker模式,追求最大化的性能优势,主打速度。而PS-Service模式,主打对接,可以接入Spark,TensorFlow,Torch等平台,主打生态,从而实现最大程度的灵活性
  • Angel_PS_Worker:启动master,PS和Worker,Angel独立完成模型的训练
  • Angel_PS_service:PS Service模式,在这种模式下,Angel只启动Master和PS,具体的计算交给其他计算平台(如Spark,TensorFlow)负责,Angel只负责提供Parameter Server的功能
同步协议:
  • Angel支持多种同步协议:除了通用的BSP(Bulk Synchronous Parallel)外,为了解决task之间互相等待的问题,Angel还支持SSP(Stale Synchronous Parallel)和ASP(Asynchronous Parallel)
易用性:
  • 训练数据和模型自动切割:Angel根据配置的worker和task数量,自动对训练数据进行切分,同样,也会根据模型大小和PS实例数量,对模型实现自动分区。
  • 易用的编程接口:MLModel、PSModel、AngelClient
扩展性:
  • psFunc:为了满足各类算法对参数服务器的特殊需求,Angel将参数获取和更新过程进行了抽象,提供了psf函数功能。用户只需要继承Angel提供的psf函数接口,并实现自己的参数获取/更新逻辑,就可以在不修改Angel自身代码的情况下定制自己想要的参数服务器的接口。
  • 自定义数据格式:Angel支持Hadoop的InputFormat接口,可以方便的实现自定义文件格式。
  • 自定义模型切分方式:默认情况下,Angel将模型(矩阵)切分成大小相等的矩形区域;用户也可以自定义分区类来实现自己的切分方式
稳定性:
Angel保证在机器学习过程中,单个worker和PS挂掉,都不会影响整个作业的进度,而且能最快的找到备用的机器,快速启动,加载模型或者数据,继续训练过程。
  • PS容错:PS容错采用了checkpoint模式,也就是每隔一段时间将PS承载的参数分区写到hdfs上。如果一个PS实例挂掉,Master会新启动一个PS实例,新启动的实例会加载挂掉PS实例写的最近的一个checkpoint,然后重新开始服务。这种方案的优点是简单,借助了hdfs多副本容灾,缺点是不可避免的会丢失少量参数更新
  • worker容错:一个worker实例挂掉后,Master会重新启动一个Worker实例,新启动的Worker实例从Master处获取当前迭代轮数等状态信息,从PS处获取最新模型参数,然后重新开始被断掉的迭代。
  • Master容错:Master定期将任务状态写入hdfs,借助于Yarn提供的App Master 重试机制,当Angel的Master挂掉后,Yarn会重新拉起一个Angel的master,新的Master加载状态信息,然后重新启动Worker和PS,从断点出发重新开始计算。
  • 慢worker检测:Master将会收集一些Worker计算性能的一些指标,如果检测到有一些worker计算明显慢于平均计算速度,Master会将这些worker重新调度到其他的机器上,避免这些worker拖慢整个任务的计算进度。
 
Angel拥有两种不同的运行模式:ANGEL_PS_WORKER和ANGEL_PS
在angel_ps_worker模式下,angel可以独立完成模型的训练和预测等计算任务;在angel_ps模式下,angel启动ps服务,为其他的计算平台提供参数的存储和交换服务。目前基于angel_ps运行模式的是spark on angel,而且比较好的解决了Spark ML的单点瓶颈,能够支持很大规模的模型训练
Spark on Angel
 
Angel从1.0开始,就加入了PS-Service的特性,不仅仅可以作为一个完整的PS框架运行,也可以作为一个PS-Service,为不具备参数服务器能力的分布式框架,引入PS能力。Spark就是第一个尝试。spark on angel可以很方便的利用spark在数据分析方面的优势,在一个平台中完成数据预处理和模型训练两阶段的计算任务。
sona架构设计
  • spark RDD是不可变区,Angel PS是可变区
  • Spark通过PSAgent与Angel进行协作和通讯
核心实现:
  • PSContext:利用spark的Context和angel的配置,创建AngelContext,在Driver端负责全局的初始化和启动工作
  • PSModel:PSModel是PS server上PSVector/PSMatrix的总称,包含着PSClient对象,PSModel是PSVector和PSMatrix的父类
  • PSVector:PSVector的申请通过PSVector.dense(dim:Int, capacity: Int=50, rowType:RowType.T_DENSE_DOUBLE)申请PSVector,会创建一个维度为dim,容量为capacity,类型为Double的VectorPool,同一个VectorPool内的两个PSVector可以做运算,通过PSVector.duplicate(psVector)申请一个与psVector在同一个VectorPool的PSVector。
  • PSMatrix:PSMatrix的创建和销毁,通过PSMatrix.dense(rows: Int, cols:Int)创建,当PSMatrix不再使用后,需要手动调用destory销毁该Matrix
使用Spark on angel的简单代码如下:
PSContext.getOrCreate(spark.sparkContext)
val psVector = PSVector.dense(dim, capacity)
rdd.map{
    case (label, feature) => psVector.increment(feature)
}
println(“feature sum=”, psVector.pull.mkString(“ "))
 
启动流程:
spark on angel本质上是一个spark任务,spark启动后,driver通过Angel PS的接口启动Angel PS,必要时将部分数据封装成PSVector丢给PS node管理。因此,整个Spark on Angel的执行过程与Spark差不多,driver负责启动、管理PS node,executor在需要的时候向PS node发起对PSVector操作的请求。
Spark driver的执行流程:
  • 启动SparkSession
  • 启动PSCont
  • 申请PSVector/PSMatrix
  • 执行算法逻辑
  • 终止PSContext和SparkSession
 
Spark executor的执行流程:
  • 启动PSContext
  • 执行driver分配的task
 
模型存储格式
Angel的模型是以矩阵为单位来保存的,每一个矩阵在模型保存路径下对应一个以矩阵名命名的文件夹,里面包含矩阵的元数据文件和数据文件。一个矩阵只有一个元数据文件,但是一般有多个数据文件,因为angel的大部分算法模型都是从PS导出的
 
元数据文件
元数据采用json格式保存,矩阵元数据主要由矩阵特征,分区索引和行相关索引组成:分别由MatrixFilesMeta,MatrixPartitionMeta和RowPartitionMeta类来描述
MatrixFilesMeta
用途:矩阵相关信息  具体字段:
  • matrixId:矩阵ID
  • rowType:矩阵类型,可参考RowType类
  • row:矩阵行数
  • blockRow:矩阵分区块行数
  • col:矩阵列数
  • blockCol:矩阵分区块列数
  • matrixName:矩阵名字
  • formatClassName:矩阵存储格式
  • options:其他矩阵参数
  • partMetas:矩阵分区索引
MatrixPartitionMeta
用途:分区元数据    具体字段:
  • startRow:分区起始行行号
  • endRow:分区结束行行号
  • startCol:分区起始列列号
  • endCol:分区结束列列号
  • nnz:分区非零元素个数
  • fileName:分区数据所在文件名
  • offset:分区数据在文件中的位置
  • length:分区数据长度(字节数)
  • saveRowNum: 分区中保存的行数
  • saveColNum:分区中保存的列数(只在列主序格式中有用)
  • saveColElemNum:每一列保存的元素个数(只在列主序格式中有用)
  • rowMetas:分区行索引
RowPartitionMeta
用途:分区的某一行分片对应的元数据  具体字段:
  • rowId:行号
  • offset:行数据在文件中的位置
  • elementNum:该行包含的元素个数
  • saveType:该行保存的文件格式
模型数据文件格式
Angel采用了用户自定义的模型格式,即,可以根据实际需求定制模型输出格式。一般情况下,使用angel的默认模型输出格式即可。由于angel默认的输出格式比较简单,大部分并不需要依赖元数据就可以直接解析。
默认格式说明
angel提供了8种默认的模型输出格式:ValueBinaryRowFormat, ColIdValueBinaryRowFormat,  RowIdColIdValueBinaryRowFormat, ValueTextRowFormat, ColIdValueTextRowFormat, RowIdColIdValueTextRowFormat, BinaryColumnFormat和TextColumnFormat。。
下面分别介绍这8种格式:
  • ValueBinaryRowFormat:二进制格式,只包含模型的值,只适合单行稠密的模型,数据文件中没有列号(特征索引),需要从模型元数据中获取索引范围,  格式:| value | value | 。。。|
  • ColIdValueBinaryRowFormat:二进制格式,包含特征索引和对应的值。适合单行模型例如LR等, 格式: | index | value | index | value| 。。。|
  • RowIdColIDValueBinaryRowFormat:二进制格式,包含模型行号,特征索引和对应的值,可以表示多行模型,格式: | rowid | index | value | rowid | index | value | … |
  • ValueTextRowFormat:文本格式,只包含模型的值,每个值是一个单独的行,与ValueBinaryRowFormat类似,只适合单行稠密的模型,数据文件中没有列号(特征索引),需要从模型元数据中获取索引范围,格式:value\n   value\n   value\n    。。。。
  • ColIdValueTextRowFormat:文本格式,包含特征索引和对应的值,每一行是一个特征id和值的对,特征id和值之间的分隔符默认是逗号。适合单行模型,如LR等, 格式: index,value\n    index,value\n    index,value\n …..
  • RowIdColIdValueTextRowFormat: 文本格式,包含行号,特征索引和对应的值,每一行是一个行号,特征id和值的三元组。行号,特征id和值之间以逗号分隔,可以表示多行模型   格式:rowid,index,value\n    rowid,index,value\n     rowid,index,value\n …..
  • BinaryColumnFormat:二进制格式,以列主序输出一个矩阵,目前只用于embedding相关的输出(例如DNN,FM等算法中的embedding层)。模型格式为:| index | row1 value | row2 value | ….. | index | row1 value | row2 value | …. |
  • TextColumnFormat: 文本格式,这种格式以列主序输出矩阵,目前只用于embedding相关的输出(例如DNN,FM等算法中的embedding层),每一行是一列数据,默认逗号分隔,格式:index,row1 value, row2 value, …. \n index, row1 value, row2 value, …. \n index, row1 value, row2 value,...
具体算法输出格式:
angel的算法目前基本都是基于新的计算图框架实现的,计算图中的每一层都可以单独设置模型格式。在默认的情况下,SimpleInputLayer使用的是ColIdValueTextRowFormat,Embedding层使用的是TextColumnFormat,FCLayer使用的是RowIdColIdValueTextRowFormat
  • LR,线性回归,SVM:默认的模型保存格式为ColIdValueTextRowFormat
  • GBDT:RowIdColIdValueTextRowFormat
  • FM:线性部分使用的是ColIdValueTextRowFormat,Embedding层使用的TextColumnFormat
  • DeepFM,DNN,Wide&Deep,PNN,NFM等:线性部分使用的是ColIdValueTextRowFormat,Embedding层使用的是TextColumnFormat,全连接部分使用的是RowIdColIdValueTextRowFormat
如果不想使用默认格式,可以通过参数配置模型输出格式:
  • ml.simpleinputlayer.matrix.output.format:SimpleInputLayer使用的输出格式
  • ml.embedding.matrix.output.format:Embedding使用的输出格式
  • ml.fclayer.matrix.output.format:FClayer使用的输出格式
 
如果angel提供的8种格式仍然无法满足要求,可以扩展RowFormat类或者ColumnFormat类来自定义需要的格式。
具体实现可参考已有的8种类型。实现完成后,编译打包并通过angel提供的参数加入angel的依赖路径,同时通过上面提到的四个参数进行配置使用自定义的输出格式。
 
模型分区(model Partitioner)
为了支持超大模型,无论是宽模型还是深模型,angel都需要将模型切分为多个部分,存储在不同的PSServer节点上,并提供方便的访问服务,这是参数服务器的本质。
好的模型划分要能保证PS负载均衡,降低PS单点性能瓶颈,关联的数据在同一个PS上,但实际应用中各个算法以及一个算法的不同实现对划分方式的要求都不一样。angel既提供了默认划分算法满足一般划分需求,也提供了自定义划分功能。
整体设计
angel的模型分区设计如下:
 
要注意的点:
  • 对于用户来说,入口类是PSModel,尽量通过它操作
  • 默认的模型分区算法类RangePartitioner,但是它可以被替换
  • 分区(Partition)是最小的单位,每个分区对应着PSServer上具体的Model Shard
 
PSServer会在Load Model阶段,根据传入的Partitioner进行Model Shard的初始化,因此,Model Partitioner的设计,和运行时的真实模型数据,会影响PS Server上的模型分布和行为。
默认的模型分区(RangePartitioner)
RangePartitioner使用模型的index下标范围来划分模型:即将模型的index范围切分成一个个不重合的区间,这样做的好处是在划分应用层请求时可以快速的计算出需要的模型部分落在哪个区间上。在angel中,模型使用Matrix来表示。当应用程序没有指定Matrix划分参数或者方法时,angel将使用默认的划分算法。默认的划分算法遵循以下几个原则:
  • 尽量将一个模型平均分配到所有PS节点上
  • 对于非常小的模型,将它们尽量放在一个PS节点上
  • 对于多行的模型,尽量将同一行放在一个PS节点上
自定义的模型分区
为了实现更加复杂的模型分区方式,适用于复杂的算法。angel允许用户自定义矩阵分区的大小,并且有两种方法。
1.简单方法:在定义PSModel时,传入blockRow和blockCol
val sketch = PSModel[TDoubleVector](modelName, sampleNum, featNum, blockRow, blockCol)
 
通过这种方式,用户可以轻松控制矩阵分区的大小,满足需求,但不够灵活
2.高阶方法,设置自定义的Partitioner
应对定制化需求,如矩阵各部分访问频率不一样,不同的分区有不同的大小,将某些存在关联的分区放到同一个PS上等
angel抽象了一个分区接口Partitioner,PSPartitioner只是其中一个默认实现,用户可以通过实现Partitioner接口来实现自定义的模型分区方式,并注入到PSModel中,改变模型的分区行为。
 
异步控制(Sync Controller)
在分布式计算系统中,由于多个计算节点计算进度不可能完全一致,会导致在汇总结果时需要等待那些计算速度较慢的节点,即慢节点会拖慢整个计算任务的进度,浪费计算资源。
考虑到机器学习的特殊性,系统其实可以适当放宽同步限制,没有必要每一轮都等待所有的计算节点完成计算,部分跑得快的Worker,其实完全可以先把训练好的增量push上去,然后进行下一轮的训练。这样可以减少等待时间,让整个计算任务更快。
angel提供了三个级别的异步控制协议:BSP(Bulk Synchronous Parallel),SSP(Stalness Synchronous Parallel)和ASP(Asynchronous Parallel),它们的同步限制依次放宽。为了追求更快的计算速度,算法可以选择更宽松的同步协议。
 
 
协议介绍
1.BSP:默认的同步协议。也是一般的分布式计算采用的同步协议,每一轮迭代中都需要等待所有的task计算完成。
  • 优点:适用范围广;每一轮迭代收敛质量高
  • 缺点:但是每一轮迭代都需要等待最慢的task,整体任务计算时间长。
  • 使用方式:默认的同步协议
 
2.SSP:允许一定程度的task进度不一致,但这个不一致有一个上限,称为staleness值,即最快的task最多领先最慢的task staleness轮迭代。
  • 优点:一定程度减少了task之间的等待时间,计算速度较快
  • 缺点:每一轮迭代的收敛质量不如BSP,达到同样的收敛效果可能需要更多轮的迭代,适用性也不如BSP,部分算法不适用
  • 使用方式:配置参数angel.staleness=N, 其中N为正整数
 
3.ASP:task之间完全不用相互等待,先完成的task,继续下一轮的训练
  • 优点:消除了等待慢task的时间,计算速度快
  • 缺点:适用性差,在一些情况下并不能保证收敛性
  • 使用方式:配置参数angel.staleness=-1
只要设置不同的staleness,就能以不同的异步模型运行,但是同步限制放宽后可能导致收敛质量下降甚至任务不收敛的情况,需要在实际算法中,需要指标的变化情况,调整同步协议以及相关的参数,以达到收敛性和计算速度的平衡。
 
实现原理—向量时钟
angle中,通过向量时钟实现异步模型控制
步骤如下:
  1. 在server端为每个分区维护一个向量时钟,记录每个worker在该分区的时钟信息
  2. 在worker端维护一个后台同步线程,用于同步所有分区的时钟信息
  3. task在对PSModel进行get或其他读取操作时,根据本地时钟信息和staleness进行判断,选择是否进行等待操作
  4. 每次迭代完,算法调用PSModel的Clock方法,更新向量时钟
默认调用:
psModel.increment(update)
….
psModel.clock().get()
ctx.incIteration()
通过这样的方式,angel实现了灵活多变的异步控制模式,为用户的算法,提供了最大化的便利,也解决了大规模机器学习中,由于个别机器故障,引起严重的性能问题。
 
定制函数—psFunc
作为标准的参数服务器,正常都会提供基本的参数获取(pull)和更新(push)功能。但有些场景需要的不止这些接口。
angel引入和实现psFunc的概念,对远程模型的获取和更新的流程进行了封装和抽象。它也是一种用户自定义函数(UDF),但都和PS操作密切相关,被称为psFunc,简称psf。架构如下:
 
随着psFunc的引入,模型的计算,也会发生在PSServer端,PSServer也有一定的模型计算职责,而不是单纯的模型存储功能。合理的设计psFunc,可以大大加速算法的运行。
随着psFunc的引入和强化,在很多复杂的算法实现中,降低了worker要把模型完整的拖回来进行整体计算的可能性,从而间接地实现了模型并行。
分类
angel的psFunc分成两大类,一类是获取型,一类是更新型
  • GetFunc(获取类函数)
  • UpdateFunc(更新类函数)
PSF从数据交互角度可以分成Worker-to-PSServer和PSServer-to-PSServer两种。
  • worker-to-PSServer是指worker的数据和PSServer的数据做运算。如Push、Pull,将worker本地的Vector PUSH给PS,或者将PS上的Row Pull到worker上。
  • PSServer-to-PSServer是指PSServer上的Matrix内部row直接发生的运算。如Add,copy等。Add是将matrix两行数据相加,将结果保存在另外一行;Copy是将某行的内容copy到另外一行。
 
GetFunc(获取型函数)
原理
  1. 请求划分
参数服务器的接口,操作的是整个模型参数。而模型参数是被划分成多个分区存储在不同的PS实例中的,因此在请求阶段,就要进行划分了。
  • PS client(参数服务器客户端)进行请求划分,生成一个请求列表,其中每个请求都和一个模型参数分区对应
  1. 请求发送
  • angel将请求列表中的所有请求,发送给模型参数分区所在的PS实例
  • PS实例以模型参数分区为单位执行参数获取和更新操作,并返回相应的结果
  1. 结果合并
  • 合并所有的模型分区级别结果,得到最终的结果并返回
定义:
接口:GetResult get(GetFunc get) throws AngelException;
 
参数:
get型psFunc的参数类型是一个GetFunc对象,该对象封装了get psf方法的参数和执行流程:
 
GetFunc对象的参数类型为GetParam
  • GetParam实现了ParamSplit接口,ParamSplit接口定义了一个split方法,该方法的含义是将一个针对整个矩阵的全局的参数划分成一个矩阵分区参数列表
  • GetParam类型提供了一个默认的split接口实现,即针对该矩阵的每一个分区都生成一个矩阵分区的参数
  • get psf的矩阵分区参数是一个PartitionGetParam类型
 
执行流程
get型psFunc的执行流程分为两步,分别由接口partitionGet和merge方法表示
  • partitionGet方法定义了从一个矩阵分区获取所需结果的具体流程,它的返回结果类型为PartitionGetResult
  • merge方法定义了如何将各个矩阵分区的结果合并得到完整结果的过程,完整的结果类型为GetResult
这2步分别需要Worker端和PSServer端完成:
  • 参数划分和merge方法在worker端执行
  • partitionGet是在PS端执行
具体的流程如下图所示,左子图表示worker端处理流程,右子图表示PS端处理流程:
 
由于getFunc的接口太底层,建议普通用户从AggrFunc开始继承编写psFunc,这样需要cover的细节比较少
将代码编译后打成jar包,在提交任务时通过参数—angel.lib.jars上传该jar包,然后就可以在应用程序中调用了。
 
UpdateFunc(更新型函数)
原理
  1. PS client(参数服务器客户端)进行请求划分,生成一个请求列表,其中每个请求都和一个模型参数分区对应
  2. 将请求列表中的所有请求发送给模型参数分区所在的PS实例。PS实例以模型参数分区为单位执行参数获取和更新操作,并返回相应的结果。
  3. 等待所有请求完成后返回
执行流程
与get psf不同,update psf的执行流程只有一步:
  • 即以矩阵分区为单位分别进行update操作,这个过程由partitionUpdate方法执行
update psf没有具体的返回值,只返回给应用程序一个Future,应用程序可以选择是否等待操作完成。
update型psFunc执行流程需要PS Client和PS共同完成。
  • UpdateParam划分是在Worker执行
  • partitionUpdate方法在PSServer端执行
流程如下,左子图表示worker处理流程,右子图表示PSServer处理流程:
 
核心接口类
如上图所示,angel的核心接口类,在train的过程中,按照调用的流程,分为:
1、MLRunner(启动器)
  • MLRunner根据Conf,从工厂类,创建AngelClient,按照标准的Train流程开始依次调用AngelClient的各个接口
  • 所有的算法的启动入口类,定义了启动angel任务的标准流程,封装了对AngelClient的使用
  • 在angel中,启动类需要继承MLRunner,并实现train和predict两个方法
  • 一般情况,应用程序直接调用它的默认实现,不必重写
 
2、AngelClient
  • 启动PSServer
  • 在PSServer上进行初始化,加载空白的模型,启动worker运行指定任务
  • 训练完成后,将模型从多个PSServer,保存到HDFS
 
3、TrainTask / Predict task(任务类)
  • 被Angel Client调用后,开始train过程
  • 作用类似mapper和reducer,将任务封装好,传给远程的worker去分布式启动和执行
  • 这两个task都是BaseTask的子类,angel会负责透明的数据切分和读取,并feed给这些task类,用户需要定义2个公共操作:
  • 解析数据(parse):将单行数据解析为算法所需的数据结构(如用于LR/SVM算法的LabeledData),必须实现
  • 预处理(preProcess):读取原始数据集,按行调用parse方法,将数据进行简单预处理,包括切分训练集和检验集
  • task是angel的元计算类,所有的机器学习算法都要通过继承它实现训练或者预测过程,它运行于worker之内,task可以共享一个worker的某些资源
  • task中,完成对数据的读取和训练两个动作,一个Task只负责它自己读取到的数据的训练
  • 中间结果不落地,不对外界开放,不同的task计算时不会互相传输数据,它们都只和PSServer打交道
一个task的执行流程如图:
task基本流程主要有2步:
  • 训练数据读取:原始的数据存在分布式文件系统之上,且格式一般不能直接被机器学习算法使用。所以angel抽象出了训练数据准备这一过程:在这个过程中,task将分布式系统上的数据拉取到本地,然后解析并转换成所需的数据结构,放入DataBlock中。这一步包括preProcess和parse
  • 计算(训练or预测):对于一般的模型训练,这一步会进行多轮的迭代计算,最后输出一个模型;对于预测,数据只会被计算一次,输出预测结果。这一步一般叫run
为了让应用程序定制所需的计算流程,angel抽象出了BaseTaskInterface接口,并在其基础上提供了BaseTask、TrainTask和PredictTask等基类。应用程序可以根据自己的需求扩展这些基类。
Task在计算过程中,需要用到一些系统配置信息和控制迭代进度等,这些是通过TaskContext来提供的。
 
4、DataBlock
  • 数据块管理和存储的基类,提供基本的数据存取接口,适合一次写入,多次读取的场景
  • 可以看做是一个可以动态增长的数组,新加入的对象只能放置在数组的末尾,它在内部维护了读写索引信息
  • TrainTask调用parse和preProcess方法,将数据从HDFS中读取,并组装成多个LabeledData组成的DataBlock
  • TrainTask调用Train方法,创建MLLearner对象,并将DataBlock传给MLLearner
 
5、MLLearner
  • 模型训练的核心类,理论上,angel所有模型训练核心逻辑,都应该写在这个类中。通过这个类实现和调用,它是train的核心类
  • MLLearner调用自己的Learn方法,不断读取DataBlock,计算出模型的更新,并通过MLModel中的PSModel,和PSServer进行不停的Push和Pull,最终得到一个完整的MLModel
 
6、MLModel(模型集)
  • 根据算法的需要,创建并容纳多个PSModel,MLModel表示一个机器学习算法中,需要用到的完整模型集合,是angel所有模型的基类
  • 一个复杂的机器学习算法,往往需要多个远程模型PSModel协作,需要一个类,来对这些模型进行统一操作
  • 作为一个容器类,管理具体算法中的所有PSModel,作为一个整体模型被加载,训练和保存
  • 整体性的操作,包括predict,setSavePath,。。。都是统一通过MLMole进行,但算法对远程模型的具体操作,都是通过PSModel来进行的
 
7、PSModel(远程模型)
  • 封装了AngelClient中和PSServer的所有通信接口,方便MLLearner调用,也是angel的核心抽象
  • 封装了远程参数服务器的Context和client细节,提供了常用的远程矩阵(Matrix)和向量(Vector)的获取和更新接口,使得算法工程师可以如同操作本地对象一样的操作参数服务器上的分布式矩阵和向量,是一个可以进行反复迭代更新的可变模型对象
  • 是一个远程模型的概念,对于client来说是一个类似模型代理的类,PSModel是分布式可变的,这种可变是线程安全的。
  • 通过它可以在每个worker上像操作本地模型一样操作模型,但实际上是一个均匀切分在远程多个PSServer上的分布式模型切片,所有操作透明并发
  • PSModel中包含了MatrixContext,MatrixClient,TaskContext这3个核心类,可以对远程的参数服务器进行任意的操作。
 
Angel中的计算图
计算图是主流深度学习框架普遍采用的,如TensorFlow,Caffe和Mxnet等。与TensorFlow相比,angel的计算图更轻量,主要表现在:
  • 粗粒度:angel的计算图中的节点是层(layer),而不是TensorFlow中的操作(operator)
  • 特征交叉:对于推荐系统相关的算法,特征embedding后往往要通过一些交叉处理后再输入DNN,angel直接提供了这种特征交叉层
  • 自动生成网络:angel可以读取json文件生成深度网络,借鉴Caffe,不编写代码就可以生成网络,减轻工作量
angel目前不支持CNN,RNN等,只关注推荐领域的常用算法
计算图的基本结构
层的基本结构
  • status:angel计算图中的节点是有状态的,用一个状态机处理
  • input:用以记录本节点/层的输入,用一个ListBuffer表示,一个层可以有多个输入层,可以多次调用addInput(layer:Layer)加入
  • outputDim:在Angel中最多只能有一个输出,outputDim用于指定输出的维度
  • consumer:层虽然只有一个输出,但输出节点可以被多次消费,因此用ListBuffer表示,在构件图时调用input层的addConsumer(layer : Layer)告诉输出层哪些层消费了它
AngelGraph的基本结构
通过input/consumer构建起了一个复杂的图,虽然可以从图中的任意节点对图进行遍历,但为了方便,在AngelGraph中还是存储verge节点,便于对图的操作
verge有两大类
  • inputLayer:这类节点的输入是数据,AngelGraph中存储这类节点是方便反向计算,只要依次调用inputLayer的calBackward。在InputLayer的基类中都会调用AngelGraph的addInput方法将自己加入AngelGraph
  • lossLayer:目前Angel不支持多任务学习,所以只有一个lossLayer,这类节点主要方便前向计算,只要调用它的predict或calOutput即可。由于lossLayer是linearlayer的子类,所以用户自定义lossLayer可手动调用setOutput(layer: LossLayer),但用户新增lossLayer的机会不多,更多的是增加lossfunc
有了inputLayers,lossLayer后,从AngelGraph中遍历图十分方便,正向计算只需要调用lossLayer的predict方法,反向计算只要调用inputLayer的calBackward。但是梯度计算,参数更新不方便,为了方便参数更新,AngelGraph中增加了一个trainableLayer的变量,用以保存带参数的层。
数据入口PlaceHolder
Angel中的PlaceHolder在构建AngelGraph时传给Graph,而Graph又作为隐式参数传给layer,所以在所有的layer中都可以访问PlaceHolder(即数据)
目前angel中只允许有一个PlaceHolder,以后会支持多种数据输入
PlaceHolder只存放一个mini-batch的数据,
通过feeddata,将Array[LabeledData]类型的数据给PlaceHolder后,便可以从其中获得:
  • 特征,特征维度,标签,batchsize,特征索引
Angel中计算图的运行原理
angel的运行状态机有如下几个状态:
  • Null:初始状态,每次feedData后都会将Graph置于这一状态
  • Forward:这一状态表示前向计算已完成
  • Backward:表示后向计算已完成,但还没计算参数的梯度
  • Gradient:表示梯度已经计算完成,并且梯度已经推送到PS上了
  • Update:表示模型更新已经完成
状态机的引入主要是为了保证计算的顺序进行,减少重复计算,例如有多个层消费同一层的输出,在计算时,可以根据状态进行判断,只要计算一次。
 
Angel中Graph的训练过程
步骤如下:
  • feedData:这个过程会将Graph的状态设为Null
  • 拉取参数:会根据数据,只拉取当前mini-batch计算所需要的参数,所以angel可以训练非常高维的模型
  • 前向计算:从LossLayer开始,级联地调用它的inputLayer的calOutput方法,依次计算output,计算完后将它的状态设为forward。对于状态已是forward的情况,则直接返回上一次计算的结果,避免重复计算
  • 后向计算:依次调用Graph的inputLayer,级联调用第一层的CalGradOutput方法,完成后向计算。计算完成后将它的状态设为backward。对于状态已经backward的情况,则直接返回上一次计算的结果,避免重复计算
  • 梯度计算与更新:计算backward只计算了网络节点的梯度,并没有计算参数的梯度。这一步计算参数的梯度,只需调用trainable的pushGradient即可。这个方法会先计算梯度,再讲梯度推送到PS上,最后将状态设为gradient
  • 梯度更新:梯度更新在PS上进行,只要发送一个梯度更新的PSF即可,因此只需一个worker发送(Spark on Angel中是通过Driver发送)。不同的优化器的更新方式不一样,在angel中,优化器的核心本质是一个PSF。参数更新前要做一次同步,保证所有的梯度都推送完成,参数更新完成也要做一次同步,保证所有worker拉取的参数是最新的,参数更新完成后状态被设成update
 
Angel中的层
angel中的层按照拓扑结构可分为三类:
  • verge:边缘节点,只有输入或输出的层,如输入层与损失层,输入层主要由SimpleInputLayer,embedding,损失层主要是SimpleLossLayer,SoftmaxLossLayer
  • linear:有且仅有一个输入与一个输出的层,主要由全连接层(FCLayer),各种特征交叉层
  • join:有两个或多个输入,一个输出的层,主要有ConcatLayer,SumPooling,MulPooling,DotPooling
输入层
angel的输入层有两类:
  • SimpleInputLayer
  • Embedding
线性层
线性层指有且只有一个输入一个输出的层。主要包括全连接层FCLayer和各种特征交叉层
Join层
join层是指有多个输入一个输出的层,主要有:
  • ConcatLayer:将多个输入层拼接起来,输入一个Dense矩阵
  • SumPooling:将输入元素对应相加后输出
  • MulPooling:将输入元素对应相乘后输出
  • DotPooling:先将对应元素相乘,然后按行相加,输出n行一列的矩阵
损失层
在网络的最上层,只有输入层,没有输出层,用于计算损失。SimpleLossLayer
 
虽然不同的层有不同的参数,但它们有一些共性:
  • 每个layer都有一个名称(name)和一个类型(type),name是layer的唯一标识不能重复,type是layer的类型,实际就是Layer对应的类名
  • 除了输入层(DenseInputLayer,SparseInputLayer,Embedding)外,linear或loss层要指定“inputLayer”参数,值是输入层的name,对于join layer有多个输入,用“inputlayers”一个列表指定,值是输入层的name
  • 除Loss层外,其他层都有输出,但angel中不用显式指出,因为指定了输入关系就同时指定了输出关系,但要显式指定输出维度outputdim
  • 对于trainable层,由于它有参数,所以可以指定优化器,以“optimizer”为key,值与“default_optimizer”一样
  • 对于某些层,如DenseInputLayer,SparseInputLayer,FCLayer还可以有激活函数,以“transfunc”为key,值与“default_transfunc”一样
  • 对于loss层,需要“lossfunc”指定损失函数
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
zhongrui_fzr
发布了141 篇原创文章 · 获赞 8 · 访问量 20万+
私信关注
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 微服务的发展

    微服务 1、什么是微服务? 微服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持为服务。一个为服务的策略可以让工作变得更为简便,它可以扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。 简单举例:一艘航空母舰作战能力虽强,…...

    2024/4/25 7:37:49
  2. 涂鸦智能传感合作伙伴大会圆满落幕,打造安防传感新生态

    12月10日,涂鸦智能传感合作伙伴大会在深圳举行,国内知名房地产公司、设备制造供应商以及行业客户受邀参加本次大会。在会上,涂鸦智能与豪恩安全科技共同发布T3系列传感器套装新品。涂鸦智能副总裁孙新涛、涂鸦智能海外拓展华南区总经理陈涛、涂鸦智能产品高级专家赵海艳、深…...

    2024/4/23 5:17:26
  3. mat格式数据集转换为arff与txt格式

    本文共239个字,预计阅读时间需要1分钟。 下面的代码给出了将mat格式数据集转换为arff与txt格式的matlab代码。 注意,每个.mat文件中只有一个数据集,其中共有m+1列,最后一列是label。 转为arff: mat2arff.m代码 % % This function is used to convert the input data to .ar…...

    2024/4/19 23:57:59
  4. 分布式系统

    第一章 分布式计算 定义: 分布式计算是研究把一个需要非常巨大的计算能力解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把各部分的计算结果合并起来得到的最终成果(分而治之)。 分布式计算的优缺点: 优点: 1、低廉的计算机价格和网络访问的可…...

    2024/4/23 5:16:30
  5. 营业执照识别

    市场上最新推出了营业执照识别SDK,对于每一个企业而言,营业执照就如“身份证”一般,是企业的唯一ID,在办理和企业相关的业务中,经常涉及到对企业营业执照信息的录入。因为企业营业执照的文字信息非常多,录入起来费时费力。针对这些问题,我们开发出营业执照 识别产品,只…...

    2024/4/25 6:06:16
  6. ubuntu16.0.4 设置固定ip地址 + centos7设置静态ip 对比

    .ubuntu系统因为每次开机后,ip都可能发生变化,所以最好固定,注意16版本和 18版设置有区别, 我这用的是16版, 一:对于ubuntu16设置固定ip:先确定网卡名称:ifocnfig命令查看 我的机子的网卡名称为ens33,有些机子的网卡名称可能是enp0s25/ eth0;2.明确自己的所设定的是 na…...

    2024/4/25 6:20:41
  7. 分布式计算范型

    第二章 分布式计算范型: 1、客户/服务器范型 客户/服务器范型是网络应用中使用最多的一种分布式计算范型,该模式将非对称角色分配给两个协作进程。其中,服务器进程扮演服务器提供者角色,被动地等待请求的到达,客户进程向服务器发起请求,并等待服务器响应。 2、P2P范型 P2…...

    2024/4/23 4:40:50
  8. Java面试

    Java 基础 1. 什么是面向对象(OOP)? 面向对象编程是使用类,对象,继承性,多态性,封装性和抽象的一种程序设计方法。 首先我们要区分一下“基于对象”和“面向对象”的区别。基于对象,通常指的是对数据的封装,以及提供一组方法对封装过的数据操作。 面向对象,则在基于对…...

    2024/4/22 23:22:23
  9. 什么是(功能)反应式编程?

    我已经读过关于反应式编程的维基百科文章。 我还阅读了关于功能反应式编程的小文章。 描述非常抽象。 功能反应式编程(FRP)在实践中意味着什么? 反应式编程(与非反应式编程相反?)由什么组成? 我的背景是命令式/ OO语言,因此可以理解与此范例相关的解释。 #1楼 好的,…...

    2024/3/31 14:51:53
  10. MyBatis-Plus中关联属性的查询(1对1,1对n,ResultMap)

    近来在重构前面写的自用系统,重新写开发文档,接口文档,并使用新的技术。关于Mybatis,新学了Mybatis-Plus(MP)框架,MP框架方便了很多数据库的操作,但是灵活性还是有些不足,特别是关联属性的查询(1对1,1对n)其中并没有封装,试验了一天,终于找到一个解决方法了,此贴也…...

    2024/4/24 4:42:14
  11. 使用SSH访问远程命令行

    使用SSH访问远程命令行 1、什么是OpenSSH Secure Shell(SSH) OpenSSH是指系统中使用的Secure Shell软件的软件实施 。 OpenSSH Secure Shell(ssh)用于在远程系统上安全运行shell。如果在可提供ssh服务的远程Linux系统中拥有用户账户,则ssh是通常用来远程登录到该系统的命令…...

    2024/4/25 22:39:56
  12. iOS 真机模拟器framework合并

    lipo -create 真机路径 模拟器路径 -output 真机路径点赞收藏分享文章举报黄权浩发布了109 篇原创文章 获赞 4 访问量 5万+私信关注...

    2024/4/24 8:57:45
  13. Golang中间件【转】

    本章将对现在流行的 web 框架中的中间件技术原理进行分析,并介绍如何使用中间件技术将业务和非业务代码功能进行解耦。代码泥潭先来看一段代码:// middleware/hello.go package mainfunc hello(wr http.ResponseWriter, r *http.Request) {wr.Write([]byte("hello"…...

    2024/4/15 10:04:06
  14. PyTorch & PyTorch Geometric图神经网络(GNN)实战

    mark一下,感谢作者分享! http://www.360doc.com/content/19/0601/13/7673502_839610173.shtml http://www.jintiankansha.me/t/OsNpfQP895 github: https://github.com/khuangaf/Pytorch-Geometric-YooChoose点赞收藏分享文章举报法相发布了60 篇原创文章 获赞 54 访问量 …...

    2024/3/29 4:42:58
  15. Java中关于static静态关键字

    在Java语言中,static表示“静态”的意思,使用场景可以用来修饰成员变量和成员方法,当然也可以是静态代码块。static的主要作用在于创建独立于具体对象的域变量或者方法。本文主要来去讲解一下static的来龙去脉。static要解决什么问题?我们知道,当我们通过new关键字去创建对…...

    2024/4/25 13:27:50
  16. js版本基于链表法的散列表

    let getWords=require("./1.js").getWords //导入1.js,代码见字符串部分的文章 let char2int=require("./1.js").char2intwords=getWords(maxcount=555,minlen=1,maxlen=5,R=26) words=Array.from(new Set(words)) //去重 console.log(words) let M=…...

    2024/4/20 3:33:30
  17. Vue父子组件相互传值

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>父子组件相互传值</title><!--<script src="vue.js"></script>--><script type="text/javascript"…...

    2024/4/19 23:40:12
  18. [SpringCloud]~常用架构分层

    目录常用架构分层commom(公共业务代码层)config(配置层)controller(控制层)DTO(Data Transfer Object 数据传输对象)mapper(数据持久层)VO(Value Object 值对象)domain/model(数据模型层)service(业务层)Impl(业务实现层)task (定时任务)util(工具类) 常…...

    2024/4/17 18:23:23
  19. leetcode-124-二叉树中的最大路径和-java

    题目及测试package pid124;/*二叉树中的最大路径和给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入: [1,2,3]1/ \2 3输出: 6示例 2:输入: [-10,9,20,null…...

    2024/4/23 2:34:48
  20. ABAP 内表 排序

    将内表 it_ebtable字段按照升序和降序进行排列SORT it_ebtable BY budat ASCENDING belnr DESCENDING.(将内表 it_ebtable 中 budat字段按照升序排列 并且 belnr按照降序进行排列 )点赞收藏分享文章举报粨毐不侵发布了3 篇原创文章 获赞 0 访问量 7私信关注...

    2024/4/23 5:05:27

最新文章

  1. Emby for Mac 1.9.9中文激活永久使用(多媒体影音库)

    Emby 是一款流媒体服务器软件&#xff0c;可以用于在不同设备上共享音乐、电影、电视节目和照片等多媒体资源。用户可以将自己的媒体文件添加到Emby服务器中&#xff0c;并通过网络将它们发送到其他设备&#xff0c;如电视、手机、平板电脑等。 Emby for Mac 1.9.9中文激活下载…...

    2024/4/25 23:46:17
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. C++ //练习 11.14 扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair的vector,保存孩子的名和生日。

    C Primer&#xff08;第5版&#xff09; 练习 11.14 练习 11.14 扩展你在11.2.1节练习&#xff08;第378页&#xff09;中编写的孩子姓到名的map&#xff0c;添加一个pair的vector&#xff0c;保存孩子的名和生日。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#x…...

    2024/4/22 21:19:28
  4. [Spring Cloud] gateway全局异常捕捉统一返回值

    文章目录 处理转发失败的情况全局参数同一返回格式操作消息对象AjaxResult返回值状态描述对象AjaxStatus返回值枚举接口层StatusCode 全局异常处理器自定义通用异常定一个自定义异常覆盖默认的异常处理自定义异常处理工具 在上一篇章时我们有了一个简单的gateway网关 [Spring C…...

    2024/4/23 6:25:55
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/25 11:51:20
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/25 18:39:24
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/25 18:38:39
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/25 18:39:23
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/25 18:39:22
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/25 18:39:22
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/25 18:39:20
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/25 16:48:44
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/25 13:39:44
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/25 0:00:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/25 4:19:21
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/25 18:39:12
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/25 13:19:01
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/25 18:38:58
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/25 18:38:57
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57