关键词:高性能计算;HPC;深度学习;高性能计算机;ChatGPT;大模型训练;量子计算;数据挖掘;GPU;LLM;机器学习;自适应学习;卷积神经网络;神经网络;感测技术;NLP;通用人工智能;AIGC;FFM
摘要:高性能计算机(HPC)是一种性能比普通计算机高的计算机,内部配置多个处理器共同组成高性能计算机。通过多台计算机也可以实现高性能计算操作。在深度学习、ChatGPT、大模型训练、量子计算、数据挖掘、LLM、机器学习、自适应学习、卷积神经网络、神经网络、感测技术、NLP、通用人工智能、AIGC、FFM等领域均有广泛应用。
什么是高性能计算机?
高性能计算机一词源于2018《计算机科学技术名词 》第三版,通常指使用多个处理器作为机器的一部分或某一集群中组织的几台计算机作为单个计算资源操作。高性能计算机是计算机中功能最强、运算速度最快、存储容量最大的计算机,多用于国家高科技领域和尖端技术研究。它对国家安全、经济和社会发展具有举足轻重的意义,是一个国家科研实力的体现。作为高科技发展的要素,HPC早已成为世界各国经济和国防方面的竞争利器。
目前经过中国科技工作者几十年不懈地努力,中国的HPC研制水平显著提高,成为继美国、日本之后的第三大HPC研制生产国。中国现阶段超级计算机拥有量为22台(中国内地19台,香港1台,台湾2台),居世界第2位,就拥有量和运算速度在世界上处于领先地位。随着超级计算机运算速度的迅猛发展,它也被越来越多地应用于工业、科研和学术等领域。
高性能计算机的应用领域
1、气候预测
模拟全球气候系统如大气、海洋、陆地和冰川等要素之间的相互作用,帮助科学家们理解气候变化的机制,预测未来的气候变化趋势,为制定应对气候变化提供科学依据。
2、交通业
模拟交通工具的空气流体动力学、燃料消耗、结构设计、防撞性等方面,帮助改进交通工具的性能,提高乘坐者的舒适度,减少噪音等。
3、生物信息学和计算生物学
分析基因组数据、蛋白质结构和功能等方面,发现新的药物靶点和治疗方法。同时模拟生物体内的化学反应和分子运动,帮助科学家们理解生命的基本原理。
4、社会健康与安全
模拟污染物在大气、水体中的传输和分布,为环境保护和应急管理提供决策支持。
5、地震
模拟地震的发生和传播过程,从而探索地震预测方法,减轻与地震相关的风险。
6、地球物理探测和地球科学
模拟地球内部的物理和化学过程,帮助科学家们理解地球的演化和构造。
7、天体物理学
模拟星系或黑洞等的形成和演化等,为天文学研究提供重要支持。
8、材料科学与计算纳米技术
对物质和能量的模拟,如模拟材料的结构和性质,具有广泛的应用前景。
高性能计算机开发十大核心技术
简单的服务器搭建过程一般是以下几个过程
主线程进入一个循环,等待连接
来一个连接就启动一个工作线程来处理
工作线程中,等待对方请求,然后从磁盘读文件、往套接口发送数据
但是会出现运行慢及卡顿的情况,这个时候就需要通过以下技术对服务器进行优化。
1、I/O优化:零拷贝技术
上面工作线程需要从磁盘中读取文件,然后通过网络发送数据。这里的数据经过四次拷贝,其中两次需要CPU亲自搬运,效率较低。
使用零拷贝技术可以解放CPU,直接将文件数据从内核发送出去,无需再拷贝到应用程序缓冲区,避免了资源的浪费。
经过使用零拷贝技术的改进,web服务器的图片加载速度得到了提升。但是当有多人同时访问时,速度同样会变慢。这就需要多路复用等技术。
2、I/O优化:多路复用技术
每个线程都需要阻塞在recv等待对方的请求。当访问量增加时,线程数量增加,大量线程阻塞导致系统速度下降。使用多路复用技术,如select模型,可以将所有等待(如accept、recv)都放在主线程中,工作线程不需要等待,从而提高系统效率。
随着网站访问量的增加,之前使用的select多路复用技术已经无法满足需求,需要升级为更高效的epoll模型来提高性能。
PS:select底层采用数组来管理套接字描述符,数量上限一般不超过几千个,而epoll使用树和链表来管理,可以管理更大的数量。select需要轮询来确定哪个套接字有消息,而epoll可以直接告诉你哪个套接字有消息,无需轮询。在调用select时,需要将套接字列表在用户空间和内核空间之间来回拷贝,效率较低。而epoll可以统一在内核中管理套接字描述符,无需来回拷贝,效率更高。
使用epoll多路复用技术的改进后,web服务器能够同时处理更多的用户请求。但是老板仍然不满足,要求你进一步提高服务器的吞吐量。你发现之前的方案中,工作线程总是在需要时才创建,用完就关闭,当大量请求到来时,线程不断创建、关闭、创建、关闭,开销很大。这个时候就需要线程池技术来对服务器进行优化。
3、线程池技术
为了进一步提高服务器的吞吐量,可以使用线程池技术。在程序启动时,批量启动一批工作线程,并使用一个公共的任务队列。当请求到来时,将任务投递到队列中,各个工作线程从队列中取出任务来处理,避免了线程创建和销毁的开销。
使用多线程技术可以提升服务器的并发能力,但多个线程之间需要使用重量级的同步手段来保证数据同步,会导致线程频繁切换和系统调用,开销较大。在线程池技术中,使用公共任务队列来存储任务,但多个工作线程对队列的同步操作也需要使用重量级的同步手段。是否有轻量级的方案来实现多线程安全的数据访问呢?这个时候,你需要:
4、无锁编程技术
在多线程并发编程中,当遇到公共数据时需要进行线程同步。同步可以分为阻塞型和非阻塞型。阻塞型同步常用的机制包括互斥体、信号、条件变量等,本质上都是加锁的机制。
与之对应的非阻塞型同步就是在无锁的情况下实现同步,目前有三类技术方案:
Wait-free
Lock-free
Obstruction-free
在多线程并发编程中,同步可以通过算法和技术手段来实现,其中Lock-free技术应用广泛。Lock-free技术能够广泛应用是因为现在的CPU都提供了原子级别的read-modify-write原语,即著名的CAS(Compare-And-Swap)操作。在Intel x86系列处理器上,就是cmpxchg系列指令。
无锁化编程技术可以有效降低多线程阻塞和切换带来的额外开销,提升性能。常见的无锁数据结构包括无锁队列、无锁链表、无锁HashMap等。但如果工作线程存在bug,会导致整个服务崩溃异常,因此可以将工作线程和主线程拆分到不同的进程中,这样工作线程的崩溃就不会影响整个服务的运行。
5、进程间通信技术
提起进程间通信,第一时间想到的大概就是
管道
命名管道
Socket
消息队列
信号
信号量
共享内存
共享内存是本地进程间高频次大量数据交互的首选方案。现代操作系统采用基于虚拟内存的管理方式,各个进程之间被强制隔离。程序中使用的内存地址是虚拟地址,由操作系统的内存管理算法提前分配并映射到对应的物理内存页面。CPU在执行代码时,对访问到的内存地址进行实时的转换翻译。
在现代操作系统中,不同进程之间的虚拟内存地址虽然相同,但实际存储数据的物理内存页面是不同的。共享内存的核心在于,如果让同一个物理内存页面映射到两个进程的地址空间中,就可以直接进行读写,而无需进行数据拷贝。
共享内存只是最终的数据传输载体,实现通信还需要借助信号、信号量等其他通知机制。使用高性能的共享内存通信机制,多个服务进程之间可以愉快地工作,即使有工作进程崩溃,整个服务也不会瘫痪。但随着需求的增加,需要提供动态网页支持,静态服务和动态服务之间需要频繁通信。最初使用基于HTTP的RESTful接口进行通信,但发现使用JSON格式传输数据效率低下,需要更高效的通信方案。
6、RPC & 序列化技术
1)什么是RPC技术?
RPC全称远程过程调用(Remote Procedure Call)指在编程中调用函数时,如果要调用的函数不在本地而在网络上的某个服务器上,就需要使用远程过程调用。
从图中可以看出,远程过程调用涉及参数的打包解包、网络传输、结果的打包解包等工作,其中对数据进行打包和解包需要依赖序列化技术。
2)什么是序列化技术?
序列化是将内存中的对象转换成可传输和存储的数据,反序列化是序列化的逆向操作。序列化技术可以实现在本地和远程计算机上搬运内存对象。衡量序列化框架的指标包括:是否支持跨语言、是否包含RPC框架、序列化传输性能、扩展支持能力和是否支持动态解析。
PS:三大序列化框架protobuf、thrift、avro的对比:
ProtoBuf
厂商:Google
支持语言:C++、Java、Python等
动态性支持:较差,一般需要提前编译
是否包含RPC:否
简介:一款由谷歌开发的序列化框架,被广泛应用于各大厂商。本身只是一个序列化框架,不包含RPC功能,但可以与Google开发的gRPC框架配合使用,这对于后端RPC服务开发来说是一个十分出色的组合。
ProtoBuf的一个缺点是对于动态性的支持相对较弱,尤其是在处理动态的数据结构时可能面临一些挑战。然而,OpenAI正在不断改进更新版本,以提高其对动态性的支持。
Thrift
厂商:Facebook
支持语言:C++、Java、Python、PHP、C#、Go、JavaScript等
动态性支持:差
是否包含RPC:是
简介:由Facebook开发的RPC框架,它内置了二进制序列化方案。与ProtoBuf不同的是,Thrift的RPC和数据序列化是解耦的,用户可以选择使用自定义的数据格式,如XML、JSON等。在国内,也有一些大厂在使用Thrift,并且在性能方面与ProtoBuf不相上下。然而,与ProtoBuf一样,Thrift在对动态解析的支持方面相对较弱。
Avro
支持语言:C、C++、Java、Python、C#等
动态性支持:好
是否包含RPC:是
简介:Avro是一个源自于Hadoop生态的序列化框架,它不仅自带RPC框架,还可以独立使用。与之前提到的ProtoBuf和Thrift相比,Avro最大的优势在于其对动态数据解析的支持。Avro使用了一种基于模式的方法来序列化数据,这意味着它可以在运行时动态地解析和处理数据,而不需要预先生成代码。
ProtoBuf和Thrift都需要通过编译将数据协议定义文件编译成对应的C++/Java源代码,然后将其合并到项目中进行编译和解析。然而,Java项目组强烈反对这种做法,因为编译出来的代码与他们的业务无关的框架服务混合在一起,而业务需求是经常变化的。
随着用户数量的增长,我们发现数据库查询速度变得越来越慢。这促使数据库性能问题得到很大重视。这时就需要:
7、数据库索引技术
在数据库中,如果数据表没有索引,那么要查询满足特定条件的记录行就需要进行全表扫描,这就像是在没有目录的数学教材中一页一页地翻找讲三角函数的那一页一样。这种情况下,查询速度会非常慢。
为了加快查询速度,可以给数据表设置索引,就像给数学教材添加目录一样。索引可以根据不同的字段来建立,这样就能够快速定位到满足特定条件的记录行,而不需要进行全表扫描。就像可以根据教材目录直接翻到讲三角函数的那一页一样,索引可以帮助快速定位到需要的数据。
1)索引的分类
主键索引
聚集索引
非聚集索引
主键
用来唯一标识一条数据记录的字段,可以是单个字段,也可以是多个字段组合而成的联合主键。与主键对应的是主键索引。
聚集索引
指索引的逻辑顺序与表记录的物理存储顺序一致的索引。一般情况下,主键索引符合这个定义,所以主键索引通常也被称为聚集索引。但是,这并不是绝对的,因为在不同的数据库中,或者在同一个数据库下的不同存储引擎中,聚集索引的定义可能会有所不同。
非聚集索引
聚集索引的叶子节点直接存储了实际的数据,也就是说,叶子节点就是数据节点。而非聚集索引的叶子节点则不存储实际的数据,它们只存储了指向实际数据的指针或引用,因此在使用非聚集索引进行查询时,需要进行二次查询,先找到索引,然后再通过索引找到实际的数据。
2)索引的实现原理
索引的实现主要有三种:
B+树
哈希表
位图
B+树
数据库中最常用的索引结构之一。特点是节点数量众多,相较于二叉树,B+树是一棵多叉树,也被称为扁平的胖树。这种结构的优势在于可以减少树的深度,从而降低磁盘I/O的次数,非常适合数据库的存储特点。
哈希表
散列索引也称为哈希表实现的索引,是一种通过哈希函数来实现数据定位的索引结构。哈希算法的特点是速度快,具有常数阶的时间复杂度。然而缺点是它只适合进行准确匹配,不适合进行模糊匹配或范围搜索。
位图
位图索引相对较少见,但在某些场景下非常适用。当某个字段的取值只有有限的少数几种可能(如性别、省份、血型等),如果使用B+树作为索引,会出现大量索引值相同的叶子节点,导致存储浪费。位图索引则是针对这种情况进行优化的一种索引结构。基本思想是对于该字段的每一个取值,建立一个二进制位图来标记数据表的每一条记录的该列字段是否是对应的取值。通过位图索引,可以快速定位到符合特定取值的记录。
虽然索引在提高查询性能方面很有用,但滥用索引也会带来一些问题。比如索引需要存储在磁盘上,会增加存储开销。还有索引的增删操作需要更新索引,会影响数据库的写入速度。
网站访问量越来越大,同时在线人数也大幅增长。然而,大量用户的请求导致后端程序频繁访问数据库。随着时间的推移,数据库的性能瓶颈开始显现,无法再支持不断增长的用户量。
8、缓存技术 && 布隆过滤器
缓存技术在计算机世界中无处不在,从物理CPU对内存数据的缓存到浏览器对网页内容的缓存。当面对数据库瓶颈时,同样可以使用缓存技术来解决问题。每次访问数据库都需要进行表查找,这可能涉及一次或多次的磁盘I/O操作。由于I/O操作相对较慢,会导致性能下降。但是对于一些频繁访问但不经常变化的数据,可以将其缓存在内存中,这样就不必每次都去数据库查询,从而减轻数据库的压力。
通过使用缓存技术,将常用数据缓存在内存中,可以大大提高数据的访问速度,减少对数据库的频繁访问。这不仅可以提升系统的性能,还可以减轻数据库的负载,使其能够更好地应对高并发访问的需求。
有需求就有市场,有市场就会有产品,以memcached和Redis为代表的内存对象缓存系统应运而生。
缓存系统有三个著名的问题
1)缓存穿透
缓存的目的是为了在一定程度上拦截数据库存储层的请求。而穿透则指的是这种拦截没有成功,请求最终仍然直接访问了数据库,导致缓存无法发挥应有的价值。当缓存无法命中时,系统会继续向数据库发起请求。如果这些请求没有经过有效的缓存拦截,直接访问了数据库,那么缓存就无法发挥其提升性能的作用。
穿透问题的出现可能是由于缓存配置不正确、缓存数据过期、缓存未能及时更新等原因导致的。解决穿透问题的方法可以包括设置合理的缓存策略、增加缓存的命中率、使用布隆过滤器等技术手段来过滤无效的请求。
2)缓存击穿
缓存可以被理解为一道墙壁,用来拦截数据库的查询请求,以减轻数据库的压力。而击穿则是指在这道墙壁上打开了一个洞。通常发生在某个热点数据的缓存过期后,此时大量针对该数据的查询请求同时到达,导致这些请求绕过了缓存,直接访问数据库。
击穿问题的出现是由于缓存过期和高并发请求的组合效果。当热点数据的缓存过期后,大量的查询请求会同时到达,由于缓存无法命中,这些请求会直接访问数据库,导致数据库压力骤增。为了解决击穿问题,可以采取一些策略。例如,在缓存过期时使用互斥锁或分布式锁,只允许一个线程去更新缓存,其他线程等待缓存更新完成后再获取数据。这样可以避免大量请求同时访问数据库。
3)缓存雪崩
雪崩是指缓存中的大量数据同时失效,导致大量请求直接访问数据库,从而造成数据库压力剧增,甚至崩溃。可以将缓存比喻为一面墙,而雪崩则是这面墙上到处都是洞。如果墙上有太多洞,那么这面墙将无法屹立。这种情况下,就像是吃枣药丸,缓存的作用几乎没有发挥出来。
为了解决雪崩问题,可以采取一些措施。比如设置缓存数据的过期时间随机化,避免大量数据同时失效;使用多级缓存架构,将请求分散到不同的缓存节点上,减轻单个缓存节点的压力;使用熔断机制,当缓存系统出现故障时,及时切换到备用缓存或者直接访问数据库。
有了缓存系统,就可以在向数据库请求之前,先询问缓存系统是否有我们需要的数据,如果有且满足需要,就可以省去一次数据库的查询,如果没有,再向数据库请求。那么如何判断要的数据是不是在缓存系统中呢?
对于解决查找问题,常用的方案是搜索树和哈希表。但是在数据量很大且需要快速判断的情况下,这两种方案存在一些问题。
搜索树的查找时间复杂度为O(log n),在数据量很大的情况下,查找时间会变得很长,不符合快速查找的要求。哈希表的查找时间复杂度为O(1),但是在数据量很大的情况下,需要巨大的内存空间来存储哈希表,而且设计一个好的哈希算法来处理如此大量的数据也是一个挑战。
布隆过滤器通过将哈希表的表项大小设置为1个bit,将内存消耗降低到最小。对于哈希算法的问题,布隆过滤器使用多个哈希函数,每个哈希函数可以将元素映射到位数组的不同位置。当判断一个元素是否存在时,需要将元素经过多个哈希函数计算得到的哈希值对应的位都置为1,只要有一个位为0,就可以确定元素一定不存在;如果所有位都为1,那么元素可能存在。
布隆过滤器在设置对应的key-value时,通过一组哈希算法计算出多个哈希值,并将对应的比特位置为1。但是当对应的key-value被删除时,不能将对应的比特位置为0,因为可能存在其他的key也映射到了同一个位置。
这也是布隆过滤器的一个重要特点:判定存在的元素实际上不一定存在,但判定不存在的元素一定不存在。这是因为布隆过滤器的哈希函数会将元素映射到多个位置,而删除操作只能将对应位置的比特位置为0,无法区分其他可能映射到相同位置的元素。
对于公司网站内容越来越多的情况下,用户对于快速全站搜索的需求也越来越强烈。布隆过滤器可以作为一种快速判断元素是否存在的工具,可以用于加速搜索过程。通过将网站的内容存储到布隆过滤器中,可以快速判断某个关键词是否存在于网站中,从而提高搜索的效率。
然而,需要注意的是,布隆过滤器判定存在的元素可能并不真正存在,只是有可能存在;而判定不存在的元素一定不存在。因此,在使用布隆过滤器进行搜索时,需要进行进一步的验证,以确保结果的准确性。
9、全文搜索技术
对于简单的查询需求,关系型数据库通常可以胜任。但是当搜索需求变得复杂,比如需要按照文章内容关键词、多个搜索条件的逻辑组合等进行搜索时,传统的关系型数据库就显得力不从心。这时候就需要使用单独的索引系统来支持这些复杂的搜索需求。索引系统可以根据特定的搜索规则和算法,构建索引结构,从而提高搜索的效率和准确性。通过使用索引系统,可以更快速地找到符合搜索条件的数据,满足用户对于快速全站搜索的需求。
目前,ElasticSearch(简称ES)是行业内广泛使用的一套强大的搜索引擎。它集全文检索、数据分析和分布式部署等多种优点于一身,被广泛应用于企业级搜索技术。ES具有以下特点和优势:
1)全文检索
对大量的文本数据进行快速搜索和匹配,提供高效的搜索体验。
2)数据分析
内置强大的数据分析功能,可以对大规模数据进行聚合、统计和可视化分析,帮助用户发现数据中的模式和趋势。
3)分布式部署
采用分布式架构,可以将数据分散存储在多个节点上,实现高可用性和横向扩展能力,提供快速的搜索响应和高吞吐量。
4)实时性
支持实时索引和搜索,可以在数据变化时立即更新索引,保证数据的实时性。
5)可扩展性
具有良好的可扩展性,可以根据需求增加或减少节点,实现系统的弹性伸缩。
但是无论怎么优化,一台服务器的力量终究是有限的。公司业务发展迅猛,原来的服务器已经不堪重负,于是公司采购了多台服务器,将原有的服务都部署了多份,以应对日益增长的业务需求。现在,同一个服务有多个服务器在提供服务了,需要将用户的请求均衡的分摊到各个服务器上。
10、负载均衡技术
顾名思义,负载均衡意为将负载均匀平衡分配到多个业务节点上去。
负载均衡技术在计算机世界中广泛存在,类似于缓存技术。根据实现方式,负载均衡可以分为软件负载均衡(如LVS、Nginx、HAProxy)和硬件负载均衡(如A10、F5)。
根据网络层次,负载均衡可以分为四层负载均衡(基于网络连接)和七层负载均衡(基于应用内容)。
根据均衡策略算法,负载均衡可以采用轮询均衡、哈希均衡、权重均衡、随机均衡或者这几种算法的组合。
对于当前的问题,可以使用Nginx来实现负载均衡。Nginx支持多种负载均衡配置方式,如轮询、权重、IP哈希、最少连接数、最短响应时间等。通过使用Nginx进行负载均衡,可以有效地分发请求到多个服务器,提高系统的性能和可靠性。
高性能是一个永恒的话题,其涉及的技术和知识面其实远不止上面列出的这些。从物理硬件CPU、内存、硬盘、网卡到软件层面的通信、缓存、算法、架构每一个环节的优化都是通往高性能的道路。
蓝海大脑的高性能计算机支持多种硬件加速器,包括CPU、GPU、FPGA和AI等,能够满足大规模数据处理和复杂计算任务的需求。采用分布式计算架构,高效地处理大规模数据和复杂计算任务,为深度学习、高性能计算、大模型训练算法的研究和开发提供强大的算力支持。具有高度的灵活性和可扩展性,能够根据不同的应用场景和需求进行定制化配置。可以快速部署和管理各种计算任务,提高了计算资源的利用率和效率。