2020 北京智源大会

本文属于2020北京智源大会嘉宾演讲的整理报道系列。北京智源大会是北京智源人工智能研究院主办的年度国际性人工智能高端学术交流活动,以国际性、权威性、专业性和前瞻性的“内行AI大会”为宗旨。2020年6月21日-24日,为期四天的2020北京智源大会在线上圆满举办。来自20多个国家和地区的150多位演讲嘉宾,和来自50多个国家、超过50万名国内外专业观众共襄盛会。

在第二届北京智源大会“智能体系架构与芯片论坛”上,美国南加州大学钱学海做了题为《去中心化分布式训练系统》的主题演讲。

钱学海,美国南加州大学电子工程系助理教授,于2013年获得伊利诺伊大学香槟分校博士学位,并在加州大学伯克利分校从事过博士后研究工作。曾荣获首届北美计算机华人学者协会新星奖和NSF CAREER AWARD。在ISCA、ASPLOS、MICRO、HPCA四个主要体系结构会议发表论文37篇,并进入ASPLOS和HPCA的名人堂(Hall of Fame)。钱学海研究团队的网站是:http://alchem.usc.edu。

在本次演讲中,钱学海系统地介绍了他和他团队近期关于去中心化的同步和异步算法的分布式训练系统设计的相关研究工作。钱学海介绍,当前流行的机器学习系统大都采用中心化和同步的并行训练,造成了通讯的瓶颈并容易受异构运行环境的影响,针对这个问题,他们提出了有效的去中心化分布式训练的系统设计方法。对同步执行,钱学海团队利用执行状态差别和通信图的关系,设计了系统资源控制的同步协议;对异步执行,他们则提出了一种新的通信原语和避免系统等待的有效方法,使得机器学习系统能有效地消除通信瓶颈并达到和当前集中式训练相当或更好的性能。下面是智源编辑为大家整理的讲座内容。

整理:智源社区 吴继芳

一、研究动机

1.1 背景

图灵奖获得者John Hennessy and David Patterson 在文章“A New Golden Age for Computer Architecture”[1] 中指出:随着摩尔定律和Dennard 定律的终结,我们已经进入计算机体系结构的黄金时代,即无法通过简单的提高系统复杂性和主频来提高计算机系统性能。我们需要深入理解应用特性,通过设计面向特定领域的体系结构(Domain-specific architecture (DSA) )和编程语言(Domain-specific language (DSL) )来实现在不大幅度提高系统复杂性和成本的情况下提高应用的性能。目前,在技术方面,随着许多新技术(比如:NVM, ReRAM, RDMA等)的出现,为计算机体系结构设计带来新的机遇;在应用方面,人工智能和大数据都给系统计算和存储都带来新的挑战。当前的系统都被划分为很多层次(比如:按应用、特定领域语言及执行框架、计算机体系结构和实现技术等划分),在设计软硬件系统的时候有一个重要方法是Vertical Integration [1],即要注意不同层次之间的融合以及交互,从而发现新的机遇。

钱学海本次主要分享的是在软件方面面向特定领域的分布式训练系统。随着深度学习在众多领域的成功应⽤,快速和⾼效的模型训练越来越重要。为了获得高准确率,模型大小和训练数据都日益增加,分布式并行训练成为不可或缺的技术。对于面向深度学习或者人工智能的系统和体系结构,需要考虑下面两个方面:

  • 训练(Training)。在训练过程中需要用到大规模数据集和复杂模型计算,对系统的计算和存储要求比较高,因此通常需要采用分布式和并行性技术,达到在短时间内训练出需要的模型。

  • 推理(Inference)。在推理过程中,运用训练得到的模型处理实际应用中的数据,获得有用的信息。通常推理过程的计算比训练过程的简单一些,但是推理一般部署在低功耗或者资源受限的系统上,能源效率是一个重要挑战。

接下来,钱学海向大家解析了关于训练过程的去中心化的分布式训练系统设计。

1.2 挑战

钱学海认为,分布式训练系统的核心问题是不同计算设备的通信以及由于计算和通讯性能的差异带来的异构性,具体可以看做面临三个方面的挑战,分别是:通信(Communication)、异构性(Heterogeneity)和多种因素交互造成的复杂性 (Complex Trade-offs )。

1.2.1 通信(Communication)

通信与系统结构相关,早期的分布式训练系统Parameter Server (PS)[2] (图1所示)是一个中心化的结构,每一个Worker会把自己计算得到的梯度上传到中心节点,中心节点对所有Worker的梯度做平均化处理后,再传回各个Worker。作为中心化的结构,PS中存在中心节点通信瓶颈问题。第二代分布式训练系统设计方法是Ring All-Reduce [3] (图2所示),采用了节点同步环节采用了并行流水线的工作方式,使得节点间的通信变得更加高效。但是这种方法是同步的,当一个平台上不同的Worker具有不同的运行性能时,整个系统的性能受限于运行效率最低的Worker。

图1: Parameter Server (PS)系统结构

图2: Ring All-Reduce系统结构

1.2.2 异构性(Heterogeneity)

异构性一般主要考虑两种:确定异构性(Deterministic heterogeneity)和 动态异构性(Dynamic heterogeneity )。确定异构性是指不同的设备通常有不同的计算能力(比如:采用不同的GPU或 TPU系列),并且设备或节点具有不同的网络通信性能(比如:同一个节点中的不同GPU的通信速度比不同节点间的通信速度快)。动态异构性是由资源共享(Resource sharing)造成的,即同一个设备对不同的应用提供的计算性能也是不一样的。对于分布式训练系统来说,在一定的情况下会产生Slow Worker,这些Slow Worker被称为Straggler。Straggler问题也被称之为异构性 (Heterogenity)问题,指的是当一个平台上不同的Worker具有不同的运行性能时,整个系统的性能受限于运行效率最低的Worker。

1.2.3 复杂性 (Complex Trade-offs )

由于分布式训练系统多个因素以及它们和算法存在复杂的交互,需要通过全局的方法考虑系统的设计。比如:

  • 并行性和通信之间的关系(Parallelism and Communication )。目前有两种并行方法:Data Parallelism(图3所示) 和 Model Parallelism(图4所示)。采用不同的并行方式,会造成不同的通信行为和性能。因此,如何选择最优的方式,是一个重要的问题。

  • 系统执行和模型训练效率之间的关系(Hardware vs. Statistic efficiency )。能够提高系统吞吐率的设计一定能够使模型训练快速收敛吗?

图3: Data Parallelism

图4: Model Parallelism

近几年来,钱学海针对这些挑战做的研究工作,主要有两个方面:一方面是在通信(communication)和异构性(Heterogeneity)问题方面,研究了去中心化的训练(Decentralized Training);另一方面是并行性和通信之间的关系(Parallelism and Communication ),主要考虑系统具有多个加速器或者GPU的情况下,如何决定并行模型来取得最优的通信量和性能。本次钱学海的分享主要是第一方面的相关研究工作,关于同步和异步算法的去中心化分布式训练系统设计。

图 5:钱学海团队和合作者关于同步和异步算法的去中心化分布式训练系统设计的解决方案

图 6:钱学海团队和合作者深度学习加速器体系结构研究

二、去中心化分布式训练系统

什么是去中心化的分布式训练?如图5所示,去中心化的分布式训练算法的假设是:首先存在一些Worker,这些Worker中没有一个中心节点作为Parameter Server,它们之间是对等的。同时它们之间的通信拓扑结构是可以用户自定义的(即自定义通信图)。如果不考虑算法,可以把PS和Ring All-Reduce看做是这个方法的特殊情况,PS可以看做是一个类似星型的通信图,Ring All-Reduce可以看做是一个 All-to-All的通讯图。在去中心化的方法下,可以定义任何模式的通信图。虽然相关去中心化算法或者理论的论文中对通信图的拓扑结构有一定要求,但是对于给定的Worker可以有很多种选择,这提供了一个更灵活的通讯方式。我们也可以根据系统的配置信息来设计通讯图,这为算法与系统协同设计提供了机会。那么,去中心化得训练方法能不能达到与PS和Ring All-Reduce相类似的效率呢?这个问题在文献 [4] 中已经回答了,答案是肯定的。

图7:中心化训练 vs. 去中心化训练

图8:去中心化训练过程中每个节点Worker的操作(计算图)

去中心化训练的执行是Iterative的处理过程,每个Worker保持自己的模型参数和计算梯度。在每一个Iteration中,每个Worker按照通信图进行节点间通信,每个节点Worker的操作如图6所示:

  • 根据Min-batch数据和当前的模型进行梯度计算,并更新模型;

  • 把参数发送给根据通讯图决定的“邻居”Worker;

  • 接收到其他Worker的参数,并对参数进行Reduce操作;

  • 更新模型参数,进入下一个Iteration。

2.1 同步算法的系统设计

在去中心化的分布式训练中的同步是指每个Worker在做Reduce操作时,所有的参数应该出自同一个Iteration。这是在构建去中心化分布式训练系统中独特的一个问题,在PS和Ring All-Reduce中都不存在这样的问题,因为它们有一个非常自然的中心节点或者有一个同步的操作去划分Iteration。

图9:Property of decentralized training

在同步的去中心化的算法中有一个重要的性质。如图7所示,有四个Worker:A、B、C、D,由环形结构的通信图相连,开始它们都处在Iteration(0),执行时每个Worker会先进行梯度计算,然后根据通信图把参数的更新发送到邻居节点,每个节点收到参数的更新后,会进行Reduce操作,并进入下一个Iteration。现在假设Worker A由于某种原因(比如:由于资源竞争,得不到足够的计算资源)停滞不前(Slowdown),没有给Worker D发送参数更新。由于是分布式的协议,D并不知道这个情况,D仍然在进行梯度计算,并且可以将参数更新发送给Worker C,然后C可以给B发送,B可以给A发送。这样B和C可以进入下一个Iteration,D由于没有收到A的参数更新,无法进入下一个Iteration。依次的,这个停滞不前会逐渐传递给所有的Worker。在这里面,有一个重要的概念:Iteration gap。可以看到 A 已经收到4个参数的Update,这4个更新都是从B来的,区别是它们分别来自不同的Iteration。根据同步的条件,在A被唤醒后进行Reduce操作时需要正确的选择更新的版本。所以,A需要有足够的Buffer来保存这些Update,那么这个Buffer的size是跟Iteration gap相关的。在论文[5]中也已经证明了Iteration gap与通信图的拓扑结构有关。比如图7中A到B的最大Iteration gap是由A到B的路径决定的。由图中可以看出A到B的路径长度是3,所以A到B的Iteration gap是3;A到C的路径长度是2,所A到C的Iteration gap是2。Iteration gap的大小,决定了需要的Buffer size的大小。

2.1.1系统挑战

关于同步算法的去中心化分布式训练系统设计,目前面临的挑战是:

  • 如果用户给定一个通信图,Buffer Size是通信图拓扑结构的一个函数。系统应该能够自己决定给应用分配多少资源,而不是根据需求不断的分配

  • 针对于系统的异构性问题,Backup Worker是解决异构问题的一种技术,但是会造成无穷大的Iteration gap(图8所示)

图10:Tolerate heterogeneity with backup Worker

钱学海团队设计系统的思路是:首先系统要能够支持所有的通信图,即使通信图很大,也能够通过分配一定Size的Buffer来支持。其次希望buffer size要能够控制同步的松紧程度(Bounding Iteration Gap)。比如:只分配一个小的Buffer,协议也能够执行,只是对通信和同步要求更严格。针对上面提到的问题,他们提出一个解决方案:基于队列的同步(Queue-based Synchronization)。

2.1.2 基于队列的同步(Queue-based Synchronization)

基于队列的同步[5]是指每个Worker有两个队列,一个是Update Queue(UQ), 用来存储邻居发送来的信息,一个是Token Queue(TQ), 用来控制同步。如图9所示,假设在部署协议时,设定Iteration Gap的最大容忍是2(即Iteration Gap<=2),则TQ的Token数最多为2。协议开始执行以后,每一个Worker都可以向其他Worker发送参数更新。Worker要想进入下一个Iteration,必须要从邻居的TQ中获取Token放入自己的TQ当中。图9中如果C要进入下一个Iteration,必须先从TQ_A->C和TQ_B->C中获取token,分别放入TQ_C->A和TQ_C->B中。其他节点也是做同样的操作。

图11:Queue-based Synchronization without backup Worker

假设系统设计中采用Backup Worker 技术,那么是怎么实现Bounding Iteration Gap呢?如图10所示,设定Backup Workder的数量为1(Number of backup = 1),如果节点A出现Slowdown,B和C仍然可以继续进行。当B和C进入Iteration(2)之后,由于A仍然在Iteration(0)且A的TQ中已经没有token了,所以B和C也会停止。这样就确定了Iteration gap的边界。这个边界值是由TQ的长度决定的。

图12:Queue-based Synchronization with backup Worker

2.1.3 实验

前面提到可以根据系统的设置来设计通讯图,钱学海团队通过设计实验比较了三种通讯图(图11所示),得到了一个比较有趣的实验结果。这三个通信图连接的是在三个Node中的Worker,不同Node上的Worker用不同颜色表示,分别为:灰色、红色和蓝色。图中可以看出第一个通信图(Setting 1)中的Worker间的通信很充足,从原理上来讲,它的收敛应该很快。Setting 2和Setting 3的区别是不同Node之间只有一个Worker互相通讯。原理上来讲,它们的收敛应该是慢的。但是实验之后发现,第一个通信图的收敛速度比第二、三个通信图要慢。原因是一般节点的带宽是有限的,所以不断得增加通讯图中Worker间的连接,并不一定能够达到很好的效果。反之,Setting 2和Setting 3是根据硬件平台的结构进行设计,节点内的Worker可以多通信,节点间的则少通信。这样反而能达到比较好的效果。

图13:三种不同通信图效率比较

2.2 异步算法的系统设计

同步算法的系统设计虽然可以通过一些机制(比如:TQ)来容忍一定的异质性问题,但是根据这些协议,如果有一个Worker特别的慢,那么最终一定会影响到其它Worker。从本质上来说,前面提到的方法是运用了系统的技术来容忍一定的异质性,其实还可以从算法的角度来解决这个问题。发表在ICML 2018上的AD-PSGD [6] 是去中心化异步训练的一个代表算法。它的核心思想是基于随机的通信,即每个Worker执行完一个Iteration以后需要通信,这个通信是随机的从邻居Worker中选择一个,而不是按照固定的通信图进行通信。同时,要求通信的Worker对之间进行原子性的模型参数平均化操作。

图14:原子性操作的必要性

为什么需要原子性操作呢?简单来说就是可以确保参数在Worker之间更好的传播。如图12所示,当两个Worker w(1)和w(2)同时选择了w(3)进行通信时,如果进行原则性操作是指w(1)和w(3)之间的同步与w(2)和w(3)之间同步必须串行执行。从图中简单的原子性计算公式中可以看出,两个串行操作执行完以后,w(2)的模型更新中也包含w(1)的模型更新。如果不进行原子性操作,w(1)的模型更新就不能传递到w(2)的模型更新中。钱老师和他的团队也做了相关实验证明,如果没有原子性操作,模型的收敛速度会大大降低。

2.2.1 系统挑战

在异步算法的去中心化分布式训练系统设计中面临的挑战是:在分布式的情况下,如何高效的实现原子性操作。如果直接按照AD-PSGD算法来实现原子性操作,在分布式系统中性能会受到很大影响,具体表现在两个方面:原子性操作会导致大量同步成本。如图13(a)中的实验结果所示,在整个训练过程中,AD-PSGD在不同的数据集上训练的同步开销都比Ring All-Reduce要大。

在异构环境下,AD-PSGD的收敛速度比Ring All-Reduce要快;在同构环境下,Ring All-Reduce比AD-PSGD要快很多(如图13(b)所示)。那么,能不能够设计一个协议,在同构和异构环境下都能达到很好的效果呢?

图15:AD-PSGD vs. Ring All-Reduce

针对以上问题,钱学海团队主要从两个方面考虑:(1)如何让同步操作本身更快;(2)如何减少冲突,降低由于串行操作带来的延迟。鉴于此,钱学海团队提出了Partial All-Reduce [7]。

2.2.2 Partial All-Reduce

接下来,钱学海介绍了Partial All-Reduce 的工作原理。

假设有n个Worker,每个Worker有N个参数,则全部Worker的参数可以表示成 N x n 的矩阵 X。同步的操作可以表示 n x n 的同步矩阵 W,则原子同步操作可以表示成两个矩阵相乘。如图14所示,有两个冲突的同步操作,Worker0和Worker4同时选择了Worker3做参数平均化。因为参数平均化操作的原子性,同一时间Worker0和Worker4中只能有一个和Worker3进行参数平均化,两次同步可能以任意的顺序发生。正是这类因冲突而串行化的过程使得AD-PSGD具有较大的通信开销。针对这个问题,他们提出一个近似同步,即基于组的Worker同步机制,也就是Partial All-Reduce (简称为P-Reduce) 机制。如图14中所示,不单独依次考虑节点对的同步,而是把两个同步当成一个操作,采用参数平均化矩阵。这样操作不会影响收敛速度,同时还有一个重要的好处是可以用现有的All-Reduce的相关库高效实现方案。

图16:AD-PSGD中的同步操作与Partial All-Reduce中的同步操作

在P-Reduce中,一组Workers 作为同步的基本单元。Prague系统的设计思路如下:

  • 每个Worker在本地训练模型,进行梯度计算及更新模型参数,

  • 从Group Generator(GG)中获得自己的分组信息,

  • 同一组中的Worker统一进行P-Reduce操作。

Group Generator(GG)是一个独立中心化部件,专门用于为Worker集群生成组,当Worker想要同步的时候,只需要联系GG,GG会返回代表当前Worker的组信息(即针对每个Worker接下来将进行的操作),同时将生成的组信息放入组内相关成员各自对应 的Group Buffer(GB)中。每个Worker 发送请求给GG时,如果GG总是仅生成一个组,则可能会产生很多冲突(图15(a)所示)。针对这个问题,他们提出Global Division(GD)方法,让GG在第一次收到请求分组的时候,进行全局划分,提前为Worker生成多个没有冲突的分组(图15(b)所示)。

图17:Random Selection vs. Global Division

图18:Inter-Intra Synchronization

一个节点上可以运行多个Worker,且不同节点之间的带宽是有限的。为了能够平衡不同节点之间的带宽,Prague 提出Inter-Intra Synchronization(图16所示)。在Inter Phase,每个节点上选择一个Worker作为Head Worker,这些head Worker之间采用全局划分(GD)进行跨节点的同步操作。由于不同节点间只有一个Worker进行同步,所以这样可以避免网络拥塞。在Intra Phase,节点内部的Worker之间进行同步操作,不存在节点间的通讯,可以加快执行速度。

2.2.3 实验

钱学海团队设计了实验,对比验证Prague分别在同构和异构环境下的执行效果。Prague基于TensorFlow实现,实验在 Maverick2集群上运行。采用的模型和数据集分别是:

  • VGG-16 on CIFAR-10

  • ResNet-50 on ImageNet

实验结果如图17、18所示,在同构和异构环境下,Prague都能获得最好的训练性能。

图19:Speedup in Homogeneous Environment

图20:Speedup in Heterogeneous Environment

三、结语

本次演讲中,钱学海主要分享了他团队最近的两个研究工作:Hop [5] 和 Prague [7]。这两个工作主要是针对去中心化的同步和异步算法的分布式训练系统设计思路。分布式训练系统的核心问题是不同计算设备的通信以及由于计算和通讯性能的差异带来的异构性。针对这个问题,他们提出了有效的去中心化分布式训练的系统设计方法。对同步算法,他们利用执行状态差别和通信图的关系,设计了基于队列的同步协议。对异步算法,他们设计了由Partial All-Reduce,Group Buffer和Group Division等一些列问题解决和优化方案组成的分布式训练方法,基于它们实现的系统有效的消除了通信瓶颈并达到和当前中心化训练相当或更好的性能。演讲最后,钱学海再次强调:算法和系统紧密相连,算法和系统的协同设计非常重要。

最后,下面这张图呈现了近期用于图计算的DSA和DSL相关的一些论文之间的关系。

图 21:钱学海团队和合作者关于图计算的DSA和DSL近期相关论文之间的关系

Q&A

Q:去中心化的分布式训练非常有意思,未来有没有可能像网格一样,每个人的手机都能参与一部分训练,做特别多的机器、特别大范围连接的训练?

A:这个是有可能的。这个场景跟谷歌提出的联邦学习比较类似,他们的思想是说可以在众多的移动设备上随时进行训练。后来我们也研究一下他们的论文,发现很多思路是相通的,所以我们认为有可能把这些移动设备应用到这个场景上。但是,我想说这两个场景在实际考虑的问题上可能有所不同,在这里面我们主要考虑的是性能。在那种情况下,我觉着主要考虑的是隐私和安全。因为如果每个用户或者设备都能够更新模型,会存在一些恶意的用户,从而影响训练结果。

参考文献

[1] Hennessy J L, Patterson D A. A new golden age for computer architecture[J]. Communications of the ACM, 2019, 62(2): 48-60.

[2] Li M, Andersen D G, Park J W, et al. Scaling distributed machine learning with the parameter server[C]//11th {USENIX} Symposium on Operating Systems Design and Implementation ({OSDI} 14). 2014: 583-598.

[3] Sergeev A, Del Balso M. Horovod: fast and easy distributed deep learning in TensorFlow[J]. arXiv preprint arXiv:1802.05799, 2018.

[4] Lian X, Zhang C, Zhang H, et al. Can decentralized algorithms outperform centralized algorithms? a case study for decentralized parallel stochastic gradient descent[C]//Advances in Neural Information Processing Systems. 2017: 5330-5340.

[5] Luo Q, Lin J, Zhuo Y, et al. Hop: Heterogeneity-aware decentralized training[C]//Proceedings of the Twenty-Fourth International Conference on Architectural Support for Programming Languages and Operating Systems. 2019: 893-907.

[6] Lian X, Zhang W, Zhang C, et al. Asynchronous decentralized parallel stochastic gradient descent[C]//International Conference on Machine Learning. 2018: 3043-3052.

[7] Luo Q, He J, Zhuo Y, et al. Prague: High-Performance Heterogeneity-Aware Asynchronous Decentralized Training[C]//Proceedings of the Twenty-Fifth International Conference on Architectural Support for Programming Languages and Operating Systems. 2020: 401-416.

点击阅读原文,进入智源社区参与更多讨论。

南加州大学钱学海:去中心化分布式训练系统的最新突破相关推荐

  1. 利用IPFS构建自己的去中心化分布式Wiki系统

    IPFS全称InterPlanetary File System,中文名:星际文件系统,是一个旨在创建持久且分布式存储和共享文件的网络传输协议. 它是一种内容可寻址的对等超媒体分发协议.在IPFS网络 ...

  2. 区块链去中心化分布式_为什么渐进式去中心化是区块链的最大希望

    区块链去中心化分布式 by Arthur Camara 通过亚瑟·卡马拉(Arthur Camara) 为什么渐进式去中心化是区块链的最大希望 (Why Progressive Decentraliz ...

  3. 完全去中心化的调度系统Tiger

    1. 背景介绍 本人参与过国内两家大银行的系统开发,其中参与最多的是批量任务,虽然两个行的批量架构有所不同,但有一点相同的是它们都依赖其它组件,比如依赖调度,依赖MQ等等. 这样做的好处明显,符合架构 ...

  4. Neutrino追问AMA第14期 | MYKEY CEO George:去中心化的身份系统是未来网络的一个核心基础设施

    在2月27日 Neutrino 追问 AMA 第14期交流中,我们邀请到了基于多条公有区块链的自主身份系统 MYKEY CEO  George Sheng 进行了一场关于<如何通过数字钱包降低使 ...

  5. 维基链锚定行业缺口,定位发展一体化DeFi,持续开发出各类产品应用,包括去中心化抵押借贷系统Wayki-CDP(含稳定币WUSD)、去中心化交易所Wayki-DEX、去中心化合成资产协议Wayki-X

    维基链锚定行业缺口,定位发展一体化DeFi,持续开发出各类产品应用,包括去中心化抵押借贷系统Wayki-CDP(含稳定币WUSD).去中心化交易所Wayki-DEX.去中心化合成资产协议Wayki-X ...

  6. 去中心化稳定币系统Venus Protocol即将推出v2

    官方消息,基于币安智能链的去中心化稳定币系统Venus Protocol表示,即将推出v2.此次升级部署了一个提案,包括:使用Venus市场费用从SwipeSwap回购和销毁XVS,VAI清算和铸造费 ...

  7. QQ:一个服务器,无数个客户端-中心化结构。新技术:去中心化-分布式

    科普 我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去<[区块链]什么是去中心化?>, 一起来围观吧 https://blog.csdn.net/TGBTrial/arti ...

  8. uPort:去中心化的身份系统试用

    uPort ( http://uport.me/ ) 是基于以太坊的去中心化身份系统,用于去中心化应用(Dapp).最近在以太坊测试网络上发布了测试版本. 下面介绍如何使用uPort. 注册申请,提交 ...

  9. 酷链网络——新一代去中心化分布式公有链平台

    2018年被称为是公有链发展的元年,这一年,应用与技术发展突飞猛进,区块链技术正在加速革新中来,高速发展的同时也呈现全球化的特征.但是随着行业内技术瓶颈的问题,搭建一个与时俱进的基础性服务开发平台,保 ...

最新文章

  1. java 倾斜校正_简述Java图像倾斜方法及实例
  2. 横河压力变送器选型_压力变送器的原理和选型技巧
  3. 计算机网络相关的知识,计算机网络知识整理
  4. MySQL复习资料——用于突击考试总结
  5. html js url 跳转页面内容,js跳转页面方法总结
  6. tf 矩阵行和列交换_tf.transpose函数的用法讲解
  7. python创建虚拟环境失败_virtualenv 创建虚拟环境不成功
  8. amd编码器 hevc_【硬件资讯】8K实时渲染?AMD做到了,但代价是……
  9. 如何在 Safari 下载 ZIP 文件后不自动解压?
  10. 【生活相关】实验室专题研讨PPT模板说明备忘
  11. ogg是什么格式的文件后缀
  12. 【博学谷学习记录】超强总结,用心分享 | 产品经理电商项目知识点总结与回顾
  13. [zz]u盘做系统启动盘后容量变小的解决方法 8GU盘变成2G 或 xG变成2G
  14. 2020Google开发者大会总结
  15. 恢复出厂设置 LED灯闪烁
  16. 内网ip映射到外网(路由器是tp-link)
  17. 认知世界(2)--心理暗示
  18. 外汇投资策略——超短线策略
  19. 【Web技术】1555- Web Component 探索之旅
  20. XDOJ--P177累加和校验

热门文章

  1. 【vue3】远程组件加载
  2. 阿里云Maven仓库地址及设置
  3. Apache Hadoop
  4. Kafka Broker
  5. 解析某个94aw演示备忘
  6. 解锁京东云底层技术密码:京东四大数智供应链技术亮相
  7. Zigbee安全概述
  8. BCB操作EXCEL
  9. CFileDialog控件ID值
  10. 如何用Python爬取网易云歌曲?秘诀在这~