精华内容
下载资源
问答
  • 当GPU资源池化遇到量化

    千次阅读 2021-08-30 10:31:30
    目前已有银行和头部证券公司在量化分析、开发测试、在线推理、离线推理等多个场景采用OrionX vGPU资源,利用GPU池化技术提升AI云管平台的GPU管理能力,实现算力资源的在线分配和回收,GPU总体利用率提升了3~8倍,...

    目录

    01  量化投资的兴起

    02 量化交易与量化分析

    03 人工智能赋能量化金融

    04 量化交易平台 

    05 GPU资源池化赋能AI量化平台 


    01  量化投资的兴起

    20世纪 60 年代,宽客之父爱德华·索普利创立了“科学股票市场系统”,并合伙成立了第一只量化投资基金,且连续 11 年跑赢标普指数;70 年代,“量化对冲之王”詹姆斯·西蒙斯成立了年化收益高达70% 的文艺复兴基金,量化交易开始兴起;90 年代,彼得·穆勒发明了 alpha 系统策略,量化投资进入繁荣期。21 世纪初,随着互联网泡沫破灭和次贷危机,量化基金受到重创。 

    量化投资在中国开始发展要到2010 年,在这之前是非常小众的领域,后来随着沪深300指数期货的出现,量化交易有了合适的对冲工具,各种量化策略才得以执行,无论是中长线CTA策略,还是高频交易策略或股票阿尔法策略,都取得了非常好的业绩。

    随后量化交易在国内高速发展,各大机构都创立了金融工程部。金工部是集量化投资策略(包括金融衍生品、股票等金融品种)研究、开发、应用与一体的新型团队。

    02 量化交易与量化分析

    量化分析和量化交易,听上去差不多一个意思,其实,还是有很大的差异。

    量化交易是指通过建模,回测,然后通过程序化自动交易,取代了人工的买卖。需要较高的专业知识和技能。目前国内大部分构建量化策略的投资机构与投资者,基本上利用了电脑程序进行订单执行。下单程序把订单报到券商柜台,柜台系统通过前置机报到交易所的撮合主机,撮合主机通过撮合规则进行交易撮合并返回成交回报。为了能够最早的进行成交,各大交易相关方在交易速度上进行了孜孜不倦的研发升级。极速交易也成了量化交易的代名词。最著名的例子是北美的Spread Networks公司,耗资3亿美元,从芝加哥到新泽西,笔直地建设了一条1331公里的光缆,唯一的目的是将芝加哥交易所到纽交所机房的数据传输时间从17毫秒减少到13毫秒。

    时至今日,诸如内存柜台、FPGA硬件解码、原子钟等“黑科技”,已逐渐成为各家机构交易服务提供商的“标配”,软硬件多方面的军备竞赛只是为了让自己客户的订单跑的快一点,再快一点。

    量化分析是指数据抓取、数据分析、策略构建、策略回测。在实际应用中,投资者根据以往公司的财务数据和市场以往的表现和数据,进行分析,并建立数学模型,接着利用编程和 AI 等技术进行回测分析,不断优化量化策略,从而来帮助选股、择时、算法交易等目的。该方法能够有效地把握时机和规避风险。

    量化分析策略构建图

    03 人工智能赋能量化金融

    人工智能已经在自然语言处理(语义、语音识别)、图像识别等领域有了成熟的商业应用,也赋能百业,为这些领域带来了技术革新。同样,人工智能也在量化金融领域,利用RNN、LSTM(机器学习)预测股票走势、DL(深度学习)选择买点卖点、RL(强化学习)进行买卖。人工智能改变了传统量化,能发掘出传统量化无法发现的投资机会,投资效率更高。

    目前,无论在券商、公募还是私募领域,在人工智能与量化金融领域结合方面,均进行了大量资本与人力的投入。各家机构在量化金融领域的竞争,是数据、算法与算力的竞争。

    在数据层面,“数据就是新的石油”。各家机构存储了各种市场历年的行情数据:股票、债券、期货、外汇、黄金,以及公司基本面、行业、研报、宏观经济等丰富的财经数据……无数投资者每天都扎在海量数据里,尝试找到某种规律,打磨自己的投资思路,优化自己的投资策略。

    在算法层面,量化金融领域利用开源算法,用于自己的交易研究;另一方面大量头部机构也在高薪吸引顶尖的算法研究人员闭关研究自己的“核心算法”。算法也可以理解为决策、策略。

    在算力层面,模型的回测需要算力支持,当因子越来越多,一般的硬件已经难以满足,需要大量的GPU算力资源。雄厚的金融资本在机房搭建、设备采购方面不惜花费重金,用GPU集群、超算机房等高科技装备武装到牙齿。的确,新研发的策略,回测出结果两三天和两个月,差距是巨大的。

    04 量化交易平台 

    目前国内的量化交易平台主要分为两类,一类是基础量化投资平台,主要使用一些复杂度不高的语言,其框架主要为用户在平台上编译策略,平台提供回测反馈,并用网络连接到股票经纪公司的交易接口,通过普通交易席位进行交易。缺点是功能有限制,交易会有延迟;优点是使用便捷,功能也已满足了绝大多数用户的需求,故普及度较高。

    另一类是专业量化交易平台,其采用复杂的语言,并连接至专门的交易通道,对软件、硬件都有极高的要求。追求的是在市场上通过高频交易等极限方式获取套利和对冲风险的机会,这要求行情和交易命令的延迟都达到最低。其使用者大都为专业投资机构,对成本和技术的要求极为苛刻。

    目前国内市场上大约有超过 30 个在线量化投资平台,它们大多属于基础量化交易平台,主要有聚宽、Bigquant、果仁网、米筐、MInodGo、掘金量化等。提供面向个人用户在线版本,也提供面向券商、基金、期货等专业客户的企业版。功能覆盖数据、策略研究、因子研究、回测、仿真、实盘等。
    目前量化交易平台开始引入人工智能技术,在数据指数级暴发的现今,依靠AI技术,在算力和算法的助力下,快速挖掘有效因子,构建和迭代新的策略,帮助客户实现智能投资

    AI量化分析策略构建图

    05 GPU资源池化赋能AI量化平台 

    OrionX AI量化解决方案

    OrionX GPU资源池化技术为量化交易平台提供动态、灵活的算力分配,为平台的策略模型的研究、训练与预测、回测验证等提供稳定、高效的算力资源。赋能AI量化交易平台,实现算力资源按需供给,有效提升平台GPU资源的利用率,加速量化策略的迭代更新,缩短开发周期。

    对于AI量化平台的使用者、策略分析师和金工部门的研发工程师们,OrionX GPU资源池化解决方案为他们消除算力资源使用障碍。策略分析师们的日常是挖掘和优化因子、调整量化策略,并根据每日盘后数据进行回测分析、参数优化。他们的日常工作离不开算力的支撑。OrionX为他们提供一个便捷使用算力资源的平台,使他们能够专注于真正重要的业务。

    目前已有银行和头部证券公司在量化分析、开发测试、在线推理、离线推理等多个场景采用OrionX vGPU资源,利用GPU池化技术提升AI云管平台的GPU管理能力,实现算力资源的在线分配和回收,GPU总体利用率提升了3~8倍,简化了管理和运维。

    对于金融行业的其他应用场景,趋动科技也在持续探索中。

      


    参考资料及部分图片来源:

    https://emt.18.cn/article/article-info/2

    https://zhuanlan.zhihu.com/p/52972659

    展开全文
  • 对于机器学习/深度学习中的模型训练...OrionX的“化零为整”功能支持将多台服务器上的GPU提供给一个虚拟机或者容器使用,用户可以在一台节点上调用GPU资源池里的任意数目虚拟卡,而无需将单机多卡代码修改为多机多卡。

    目录

    什么是分布式训练

    为什么要分布式训练

    如何做分布式训练

    OrionX 如何支持分布式训练


    什么是分布式训练

    对于机器学习/深度学习中的模型训练任务来说,算力的需求与日俱增。分布式训练采用多个计算节点,利用分布式编程的技术实现远超于单机的计算算力。

    在回答这个问题之前,咱们先看一下深度学习模型常见的训练方式:

    1、单机单卡训练,单GPU方式,这种训练方式常见于个人开发者自己的笔记本/工作站上,或者计算量需求相对较小的训练任务上。

    2、单机多卡训练,仍然是以单机形式,常见于单台企业级服务器里面配置多张GPU卡并行训练。比如我们在一台机器上安装8张GPU卡,都跑一次BP算法计算出梯度,把所有GPU上计算出梯度进行平均,然后更新参数。这样的话,以前一次BP只能喂1个batch的数据,现在就是8个batch。理论上来说,速度提升了8倍(除去GPU通信的时间等等)。这也是分布式训练提升速度的基本原理。

    3、多机多卡训练,对于上述两种单机训练来说,随着数据集的增加以及模型参数量的提升,单机模型训练始终会陷入算力瓶颈。所以对于模型训练,不少企业开始尝试多机多卡分布式训练。相对于上述两种训练方式,多机多卡训练顾名思义就是使用很多台机器,每台机器上都有多张GPU卡,模型跑在所有机器的GPU上以加快训练速度。

    因此,我们总结出分布式训练的基本定义:对于机器学习/深度学习中的模型训练任务,采用多个计算节点,利用分布式编程的技术实现远超于单机的计算算力。

    目前深度学习主流框架全支持分布式训练,甚至有专门为分布式训练打造的框架。目前深度学习主流框架(如TensorFlow, PyTorch, Paddle Paddle, MXNet等)全支持分布式训练,也因为分布式训练性能优化的难题,学术界和业界也有专门为分布式训练设计的框架(如Horovod, DeepSpeed)。

    为什么要分布式训练

    驱动因素一:算力瓶颈

    最简单的理解就是为了解决单机算力的瓶颈问题。

    举个直观的例子:ResNet-50 训练 ImageNet 128 万张图片 90 个 epoch 可以达到 75% 的 Top-1 精度,用一块 P100 的 GPU 需要大概 5 天的时间。

    ①从技术的角度,5 天的时间是非常不利于算法工程师去做一些模型迭代的。

    ②从业务的角度,因为需要经常更新数据,5 天的时间也是一个无法承受的训练成本。

    解决问题的方法:采用分布式训练

    通过叠加大量的GPU,采用分布式训练方式,可以把训练时间缩短到分钟级别。由此可见,分布式训练其实在我们日常AI模型训练、算法升级迭代过程中是非常有用的,很多企业都在探索分布式训练的极限。

    数据引用:Extremely Accelerated Deep Learning: ResNet-50 Training in 70.4 Seconds

    驱动因素二:

    单机环境下会遇到一些问题,例如模型复杂导致GPU放不下,数据量太大无法加载,所以需要进行分布式训练。以一个大规模无监督 NLP 模型:GPT-2来举例。在过去一段时间,GPT-2 凭借其稳定、优异的性能吸引了业界的关注,因此该模型被称为“史上最强通用 NLP 模型”(现在更强的GPT-3已经出现了)。

    优异的表现来源于GPT-2 有着超大的训练规模,它是一个在海量数据集上基于 transformer 训练的巨大模型。

    从占用存储大小的角度进行比较,GPT-2 的最小模型版本有117 million个参数,光模型parameter就要至少 500MB 的空间来存储这些参数;最大版本的 GPT-2 甚至需要超过 6.5GB 的显存空间。雪上加霜的是模型训练时,不仅仅参数会占用GPU显存,网络激活特征图、梯度、优化器状态(比如Adam的momentum和variances)都会占用显存。以典型的混合精度训练的GPT-2 extra large为例,所有的这些参数占用的显存字节数为16倍参数数目,也就是26GB显存,所以一张小卡的显存是很难去满足现在越来越大的模型需求。另一方面,从算法训练的本质上来说的话,适当增大batchsize有助于提升minibatch梯度的准确率,从而提升的模型训练效果(比如图像分割)。

    从下面这个图也可以看出一个非常明显的趋势:越来越大的模型,越来越多的GPU数量需求:

    数据引用:

    1、AI and Compute: 2018

    2、完全图解GPT-2

    如何做分布式训练

    分布式框架是实现分布式训练的基础工具。目前业界主流的深度学习框架基本都支持分布式训练。以市场占有率最高的TensorFlow和PyTorch举例:

    1、TensorFlow1.x原生的PS-Worker架构可以采用分布式训练进而提升模型的训练效果,而TensorFlow 2.x通过tf.distribute.Strategy接口可以定义PS-Worker或collective分布式策略,并通过这些不同的策略,来进行模型的分布式训练。

    2、PyTorch从1.0稳定版本开始,torch.distributed软件包和torch.nn.parallel.DistributedDataParallel 模块由全新的、重新设计的分布式库提供支持。

    但是这两种框架的原生分布式使用起来并不轻松,1) 开发难度上变大,用户需要手写支持分布式训练的全套代码, 2) 在调试和部署上两者都需要在多台机器上a) 同步代码和数据,b) 手动执行训练脚本,这几点给开发者带来了较大难度。 于是,业界也催生了一个更加简单易用、并且兼容主流计算框架的分布式机器学习训练框架Horovod,能改善代码需要修改的难度,优化了框架原生(比如tensorflow)的分布式训练性能,同时减少了上述第2.b点的困扰 。

    Horovod 是一套支持TensorFlow, Keras, PyTorch, 和MXNet 的分布式训练框架,由 Uber 构建并开源,旨在使分布式深度学习变得快速且易于使用,使模型训练时间从几天和几周缩短到数分钟和数小时。使用Horovod,可以将现有的训练脚本扩大规模,使其仅用几行Python代码就可以在跨设备的多个GPU上运行。

    Horovod 的主要优点

    1. 采用Ring-Allreduce算法,提高分布式设备的效率;
    2. 代码改动少,能够简化分布式深度学习项目的启动与运行:
    3. 提供各种框架的支持,适配的成本不高;
    4. MPI的实现方式多,比如OpenMPI 、Nvidia的NCCL、facebook的gloo。

    但是,MPI的启动方式依然不简单:不仅需要在slave机器上启动sshd server,并且配置机器间免密可访问,只是减少了用户在每台机器上启动脚本的困扰;幸运的是,我们看到接下来要介绍的OrionX软件能解决horovod上述多台机器部署的问题,减少horovod部署的难点,轻松实现在一台机器上跨机调用多台机器的GPU资源的功能。

    有了一个好的分布式训练框架之后,我们就可以继续来看具体的训练方案:数据并行(data parallel)和模型并行(model parallel)。

    数据并行:每个工作机器上保留整个模型的完整副本,把数据进行拆分,每台机器只是获取数据的不同部分。比如有8块GPU,batch size=1024,那么每块GPU就是128个数据,分别在每块GPU都跑BP算法,然后组合结果和同步模型参数。

    模型并行:把模型拆分成多个部分,不同机器负责单个神经网络的不同部分的计算。对于很大的网络结构在如此,一般没必要。

    虽然模型并行在实践中可以很好地工作,但数据并行可以说是分布式系统的首选方法,并且一直是更多研究的重点。 一方面,业界使用场景主要面对的是数据量太大的问题,数据并行既能满足用户的需求; 其次数据并行比模型并行性更容易实现,在容错和集群利用率上也容易。

    OrionX 如何支持分布式训练

    OrionX的“化零为整”功能支持将多台服务器上的GPU提供给一个虚拟机或者容器使用,而该虚拟机或者容器内的基于Horovod框架的AI应用无需修改代码。通过这个功能,用户可以将多台服务器的GPU资源聚合后提供给单一虚拟机或者容器使用。

     对多种分布式训练框架的支持:

    1、支持TensorFlow + horovod 方式进行多机多卡训练。

    2、支持 PyTorch Distributed Data Parallel数据并行接口。

    使用OrionX的优势:

    1、编程接口简单,不需要用户准备多个容器/虚机环境。

    2、资源利用率搞,一个业务容器/虚机里面挂载的Orion vGPU可以来自于多个物理机节点,每个节点使用的vGPU数目是动态生成的。因此可以有效使用多个节点中的碎片资源。

    3、降低复杂度,各个节点之间的资源调用实现免密,无需复杂申请。

    展开全文
  • 什么是池化技术

    千次阅读 2020-09-20 12:30:20
    池化技术 (Pool) 是一种很常见的编程技巧,在请求量大时能明显优化应用性能,降低系统频繁建连的资源开销。我们日常工作中常见的有数据库连接池、线程池、对象池等,它们的特点都是将 “昂贵的”、“费时的” 的资源...

    什么是池化技术

    池化技术 (Pool) 是一种很常见的编程技巧,在请求量大时能明显优化应用性能,降低系统频繁建连的资源开销。我们日常工作中常见的有数据库连接池、线程池、对象池等,它们的特点都是将 “昂贵的”、“费时的” 的资源维护在一个特定的 “池子” 中,规定其最小连接数、最大连接数、阻塞队列等配置,方便进行统一管理和复用,通常还会附带一些探活机制、强制回收、监控一类的配套功能。


    池化技术

    简介

    提前保存大量的资源,以备不时之需以及重复使用。池化技术应用广泛,如内存池,线程池,连接池等等。内存池相关的内容,建议看看 Apache、Nginx 等开源 web 服务器的内存池实现。

    由于在实际应用当做,分配内存、创建进程、线程都会设计到一些系统调用,系统调用需要导致程序从用户态切换到内核态,是非常耗时的操作。因此,当程序中需要频繁的进行内存申请释放,进程、线程创建销毁等操作时,通常会使用内存池、进程池、线程池技术来提升程序的性能。

    对连接或线程的复用,并对复用的数量、时间等进行控制,从而使得系统的性能和资源消耗达到最优状态。

    进程池

    进程池与线程池同理。

    线程池

    线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当需要一个开辟一个线程去做具体的工作时,就会唤醒线程池中的某一个睡眠线程,让它去做具体工作,当工作完成后,线程又处于睡眠状态,而不是将线程销毁。

    内存池

    内存池是指程序预先从操作系统申请一块足够大内存,此后,当程序中需要申请内存的时候,不是直接向操作系统申请,而是直接从内存池中获取;同理,当程序释放内存的时候,并不真正将内存返回给操作系统,而是返回内存池。当程序退出(或者特定时间)时,内存池才将之前申请的内存真正释放。

    连接池

    1. 数据库连接池

      数据库连接池的基本思想是在系统初始化的时候将数据库连接作为对象存储在内存中,当用户需要访问数据库的时候,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。在使用完毕后,用户也不是将连接关闭,而是将连接放回到连接池中,以供下一个请求访问使用。这些连接的建立、断开都由连接池自身来管理。

      同时,还可以设置连接池的参数来控制连接池中的初始连接数、连接的上下限数和每个连接的最大使用次数、最大空闲时间等。当然,也可以通过连接池自身的管理机制来监视连接的数量、使用情况等。

    2. HttpClient 连接池

      HttpClient 我们经常用来进行 HTTP 服务访问。我们的项目中会有一个获取任务执行状态的功能使用 HttpClient,一秒钟请求一次,经常会出现 Conection Reset 异常。经过分析发现,问题是出在 HttpClient 的每次请求都会新建一个连接,当创建连接的频率比关闭连接的频率大的时候,就会导致系统中产生大量处于 TIME_CLOSED 状态的连接。这个时候使用连接池复用连接就能解决这个问题。

    优点

    1. 减少内存碎片的产生
    2. 提高内存的使用频率

    缺点

    造成内存的浪费


    池化技术

    概念

    池化技术:把一些能够复用的东西(比如说数据库连接、线程)放到池中,避免重复创建、销毁的开销,从而极大提高性能。

    在开发过程中我们会用到很多的连接池,像是数据库连接池、HTTP 连接池、Redis 连接池等等。而连接池的管理是连接池设计的核心,我就以数据库连接池为例,来说明一下连接池管理的关键点。

    数据库连接池

    数据库连接池有两个最重要的配置:最小连接数和最大连接数,它们控制着从连接池中获取连接的流程:

    • 如果当前连接数小于最小连接数,则创建新的连接处理数据库请求
    • 如果线程池中有空闲连接,则使用空闲连接
    • 如果没有空闲连接,并且当前连接数小于最大连接数,则继续创建新的连接
    • 如果当前连接数大于等于最大连接数,并且没有空闲连接了,则请求按照超时时间等待旧连接可用。、
    • 超时之后,则获取数据库连接失败

    对于数据库连接池,根据我的经验,一般在线上我建议最小连接数控制在 10 左右,最大连接数控制在 20~30 左右即可。

    数据库故障的原因可能有下面几种:

    • 数据库的域名对应的 IP 发生了变更,池子的连接还是使用旧的 IP,当旧的 IP 下的数据库服务关闭后,再使用这个连接查询就会发生错误;
    • MySQL 有个参数是“wait_timeout”,控制着当数据库连接闲置多长时间后,数据库会主动的关闭这条连接。这个机制对于数据库使用方是无感知的,所以当我们使用这个被关闭的连接时就会发生错误。

    那么怎么去避免这种错误呢?

    • 启动一个线程来定期检测连接池中的连接是否可用,比如使用连接发送“select 1”的命令给数据库看是否会抛出异常,如果抛出异常则将这个连接从连接池中移除,并且尝试关闭。目前 C3P0 连接池可以采用这种方式来检测连接是否可用,也是我比较推荐的方式。
    • 在获取到连接之后,先校验连接是否可用,如果可用才会执行 SQL 语句。比如 DBCP 连接池的 testOnBorrow 配置项,就是控制是否开启这个验证。这种方式在获取连接时会引入多余的开销,在线上系统中还是尽量不要开启,在测试服务上可以使用。

    线程池

    JDK 1.5 中引入的 ThreadPoolExecutor 就是一种线程池的实现,它有两个重要的参数:coreThreadCount 和 maxThreadCount,这两个参数控制着线程池的执行过程。它的执行原理类似如下:

    • 如果线程池中的线程数少于 coreThreadCount 时,处理新的任务时会创建新的线程
    • 如果线程数大于 coreThreadCount 则把任务丢到一个队列里面,由当前空闲的线程执行
    • 当队列中的任务堆积满了的时候,则继续创建线程,直到达到 maxThreadCount
    • 当线程数达到 maxTheadCount 时还有新的任务提交,那么我们就不得不将它们丢弃了

    在这里插入图片描述

    这个任务处理流程看似简单,实际上有很多坑,你在使用的时候一定要注意。

    首先, JDK 实现的这个线程池优先把任务放入队列暂存起来,而不是创建更多的线程,**它比较适用于执行 CPU 密集型的任务,也就是需要执行大量 CPU 运算的任务。**这是为什么呢?因为执行 CPU 密集型的任务时 CPU 比较繁忙,因此只需要创建和 CPU 核数相当的线程就好了,多了反而会造成线程上下文切换,降低任务执行效率。所以当当前线程数超过核心线程数时,线程池不会增加线程,而是放在队列里等待核心线程空闲下来。

    但是,我们平时开发的 Web 系统通常都有大量的 IO 操作,比方说查询数据库、查询缓存等等。任务在执行 IO 操作的时候 CPU 就空闲了下来,这时如果增加执行任务的线程数而不是把任务暂存在队列中,就可以在单位时间内执行更多的任务,大大提高了任务执行的吞吐量。所以你看 Tomcat 使用的线程池就不是 JDK 原生的线程池,而是做了一些改造,当线程数超过 coreThreadCount 之后会优先创建线程,直到线程数到达 maxThreadCount,这样就比较适合于 Web 系统大量 IO 操作的场景了,你在实际运用过程中也可以参考借鉴。

    其次,线程池中使用的队列的堆积量也是我们需要监控的重要指标,对于实时性要求比较高的任务来说,这个指标尤为关键。

    我在实际项目中就曾经遇到过任务被丢给线程池之后,长时间都没有被执行的诡异问题。最初,我认为这是代码的 Bug 导致的,后来经过排查发现,是因为线程池的 coreThreadCount 和 maxThreadCount 设置的比较小,导致任务在线程池里面大量的堆积,在调大了这两个参数之后问题就解决了(任务早早被放到队列中堆积着,并且由于coreThreadCount比较小,导致工作线程比较少,处理速度较慢)。跳出这个坑之后,我就把重要线程池的队列任务堆积量,作为一个重要的监控指标放到了系统监控大屏上。

    最后,如果你使用线程池请一定记住不要使用无界队列(即没有设置固定大小的队列)。也许你会觉得使用了无界队列后,任务就永远不会被丢弃,只要任务对实时性要求不高,反正早晚有消费完的一天。但是,大量的任务堆积会占用大量的内存空间,一旦内存空间被占满就会频繁地触发 Full GC,造成服务不可用,我之前排查过的一次 GC 引起的宕机,起因就是系统中的一个线程池使用了无界队列。

    这时,你回顾一下这两种技术,会发现它们都有一个共同点:它们所管理的对象,无论是连接还是线程,它们的创建过程都比较耗时,也比较消耗系统资源。所以,我们把它们放在一个池子里统一管理起来,以达到提升性能和资源复用的目的。

    这是一种常见的软件设计思想,叫做池化技术,它的核心思想是空间换时间,期望使用预先创建好的对象来减少频繁创建对象的性能开销,同时还可以对对象进行统一的管理,降低了对象的使用的成本,总之是好处多多。

    不过,池化技术也存在一些缺陷,比方说存储池子中的对象肯定需要消耗多余的内存,如果对象没有被频繁使用,就会造成内存上的浪费。再比方说,池子中的对象需要在系统启动的时候就预先创建完成,这在一定程度上增加了系统启动时间。

    可这些缺陷相比池化技术的优势来说就比较微不足道了,只要我们确认要使用的对象在创建时确实比较耗时或者消耗资源,并且这些对象也确实会被频繁地创建和销毁,我们就可以使用池化技术来优化。

    总结

    连接池和线程池你并不陌生,不过你可能对它们的原理和使用方式上还存在困惑或者误区,我在面试时,就发现有很多的同学对线程池的基本使用方式都不了解。借用这节课,我想再次强调的重点是:

    • 池子的最大值和最小值的设置很重要,初期可以依据经验来设置,后面还是需要根据实际运行情况做调整。
    • 池子中的对象需要在使用之前预先初始化完成,这叫做池子的预热,比方说使用线程池时就需要预先初始化所有的核心线程。如果池子未经过预热可能会导致系统重启后产生比较多的慢请求。
    • 池化技术核心是一种空间换时间优化方法的实践,所以要关注空间占用情况,避免出现空间过度使用出现内存泄露或者频繁垃圾回收等问题。

    参考

    池化技术

    展开全文
  • 池化技术

    2019-09-13 18:31:44
    常用的软件技术思想 池化技术 简单来说就是提前保存大量的资源,以备不时之需 核心是复用 池化技术作用 ...java中所有的池化技术都有一个好处,就是通过复用池中的对象,降低系统资源消耗。设想一下如...

    常用的软件技术思想

    池化技术
    简单来说就是提前保存大量的资源,以备不时之需

    核心是复用

    池化技术作用
    复用相同的资源,减少浪费,减少新建和销毁的成本;
    减少单独管理的成本,统一交由"池";
    集中管理,减少"碎片";
    提高系统响应速度,因为池中有现成的资源,不用重新去创建;
    使用池化技术的例子
    java线程池
    java中所有的池化技术都有一个好处,就是通过复用池中的对象,降低系统资源消耗。设想一下如果我们有n多个子任务需要执行,如果我们为每个子任务都创建一个执行线程,而创建线程的过程是需要一定的系统消耗的,最后肯定会拖慢整个系统的处理速度。而通过线程池我们可以做到复用线程,任务有多个,但执行任务的线程可以通过线程池来复用,这样减少了创建线程的开销,系统资源利用率得到了提升!

    通俗一点,线程池,就是提前创建 n 个线程在池中等待执行,当有任务过来时,直接从池中捞一个线程负责执行这个任务,执行完成之后,再放回池中,等待执行新的任务。 池中的线程可以多次利用,提高了资源利用率。 因为会预制 n 个线程,所以提高了响应速度。

    数据库连接池
    数据库连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等,也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等

    java 内存池
    如果每次需要内存时都是重新申请,会产生很多内存碎片,影响内存的利用率。 如果一开始就申请一大块内存,按需使用,那么就会减少内存碎片。

    计算系统池化技术
    不同类型资源之间也存在生命周期不同步的问题。譬如,CPU 是发展速度最快的,每两三年就性能翻倍,然而存储的技术发展相对缓慢,从而会造成CPU性能和功耗的浪费。  服务器资源池化技术,除了能够带来灵活、弹性的资源部署,提高资源利用率这个优势,还能够更有效的提高服务器的故障修复能力,提升服务器运营效率。硬盘是故障率最高的部件之一,在实现存储池化技术后,多盘存储资源池为单体硬盘提供了很好的冗余设计能力。当单个硬盘出现故障后,可以及时使用其他硬盘资源进行无损恢复,无需立即现场更换硬盘

    展开全文
  • 1.1卷积参数量计算 2、池化后输出尺寸大小 3、感受野的计算 鉴于网上资源比较混乱,而且笔试考的多,故作此总结。希望能帮到大家。 1、卷积后输出尺寸的大小 输入:L*L*D 卷积核: 大小size=F*F*d,滑动步长...
  • Java池化技术

    2020-07-01 10:24:14
    池化(pool)技术的本质是通过复用对象、连接等资源,减少创建对象/连接,降低垃圾回收(GC)的开销,适当使用池化相关技术能够显著提高系统效率,优化性能。 线程池 Java ThreadPoolExecutor 线程池通过减少频繁...
  • JAVA池化

    2021-02-27 13:53:48
    ThreadPoolService类包含state,ThreadCount,一个线程容器,一个任务容器等成员变量,初始化时在线程容器中添加一定数目的线程(线程的初始化传入一个this参数,说明他属于的线程池),对于每个线程,run方法内获得...
  • 池化层 pool

    千次阅读 2018-12-03 12:26:09
    池化层,可以降低数据体的空间尺寸,这样的话就能减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。 最常见的形式是池化层使用尺寸 2×22 \times 22×2 的滤波器,以步长为 222 来对每个深度切片...
  • 大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第6课中两节,介绍如下:第1节:激活函数与参数初始化第1节课内容为:卷积神经网络的上篇,简单介绍卷积神经网络的生...
  • 在Power小型机虚拟化中部署Oracle数据库RAC集群,通常一台物理机上运行的Oracle数据库分区数量都比物理机会大大增加,将会面临几个问题,一是不同RAC集群节点间的心跳交互数据流量会叠加,二是主机CPU、内存的资源较...
  • Pooling(池化)的好处以及CNN优缺点

    千次阅读 2020-08-21 09:32:00
    CNNs可以自动从(通常是大规模)数据中学习特征,并把结果向同类型未知数据泛化。 选用卷积的原因: 局部感知: 简单来说,卷积核的大小一般小于输入图像的大小(如果等于则... 参数共享最大的作用莫过于很大限度地减少.
  • 各位读者大家好,上周...池化层放在连续的卷积层中间,用于压缩数据和参数的量,防止过拟合。其具体操作与卷积层的操作基本相同,只不过池化层的卷积核只取对应位置的最大值、平均值等(最大池化、平均池化),且...
  • 一、池化技术 业务场景:电商系统大量的请求到来后,不可避免的需要进行与数据库的交互,而我们的数据库调用方式是先获取数据量的连接,然后依赖这条连接从数据库查询数据,最后关闭释放连接。这种调用方式,每次...
  • 池化技术可在一定场景下很好的规避这些问题,如对象(内存)池,线程池,连接池等; 本文讲几个典型案例; 一. 规避GC--对象池 apache common-pool对象池,对象复用,完整的状态管理; 二. 规避线程上下文切换...
  • JAVA池化技术

    2020-11-21 16:33:07
    程序的运行,本质:占用系统的资源 优化资源的使用 =》 池化技术 线程池、连接池、内存池、对象池。。。 池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还我。 线程池好处: 降低资源的消耗 ...
  • 软件设计思想:池化技术 先举个例子 一种简单的架构:前端一台 Web 服务器运行业务代码,后端一台数据库服务器存储业务数据。 系统上线时,用户量不大,运行平稳,但是随着流量的提升,系统访问速度会变慢。 分析...
  • 池化运算:对信号进行 “收集”并 “总结”,类似水池收集水资源,因而得名池化层 “收集”:多变少 “总结”:最大值/平均值 最大值池化: import os import torch import random from PIL import Image import...
  • 常见池化技术

    2019-07-17 00:02:00
    在系统开发过程中,我们经常会用到池化技术来减少系统消耗,提升系统性能。对象池通过复用对象来减少创建对象、...线程、内存、数据库的连接对象都是资源,在程序中,当你创建一个线程或者在堆上申请一块内存的时候...
  • 池化技术(JAVA)分析

    2021-03-08 23:25:23
    简介池化技术能够减少资源对象的创建次数,提高程序的性能,特别是在高并发下这种提高更加明显。使用池化技术缓存的资源对象有如下共同特点:1,对象创建时间长;2,对象创建需要大量资源;3,对象创建后可被重复...
  • 卷积与池化

    2021-10-14 14:18:23
    局部连接(稀疏连接):可以提取局部特征 权值共享:减少参数数量,降低训练难度,避免过拟合,提升模型“平移不变性” 降维:通过池化或卷积stride实现 多层次结构:将低层次的局部特征组合成较高层次的特征,不同...
  • Java 数据持久化系列之池化技术

    千次阅读 2020-02-03 21:30:49
    在上一篇文章《Java 数据持久化系列之JDBC》中,我们了解到使用 JDBC 创建 Connection 可以执行对应的SQL,但是创建 Connection 会消耗很多资源,所以 Java 持久化框架中往往不直接使用 JDBC,而是在其上建立数据库...
  • 可这些缺陷相比池化技术的优势来说就比较微不足道了,只要我们确认要使用的对象在创建时确实比较耗时或者消耗资源,并且这些对象也确实会被频繁地创建和销毁,我们就可以使用池化技术来优化。 摘自亿级高并发系统...
  • 堆外内存和堆内内存池化和非池化我们在利用Netty做底层通信框架的时候,会默认给我们的到底是哪一种组合了?分析池化分析Netty的Boostrap启动类按照标准模板,通常会添加这个配置option(ChannelOption.ALLOCATOR, ...
  • 池化作用 (1) 增大感受野 感受野就是一个像素对应的原来特征图的区域大小,假设最后一层特征图大小不变,在某种卷积setting下,要想看到原来大小为224*224的图像,就需要很多卷积层。而使用pooling也可以达到增大...
  • 常用池化技术

    千次阅读 2017-09-25 13:38:15
    通过数据库连接池、HttpClient连接池、Tomcat线程池这三个最常用的案例不难看出,这几个池化技术共同点实现的原理都是类似的,通过对连接或线程的复用,并对复用的数量、时间等进行控制,从而使系统的性能和资源消耗...
  • 最近从头捋一下R-CNN系列的目标检测算法,在R-CNN首次将CNN与目标检测练习到一起之后,为了弥补它效率慢、不是端到端的神经网络、输入图片大小...SPP Net的核心思想是空间金字塔池化(Spatial Pyramid Pooling, S...
  • Mysql 中提供了查看当前锁情况的方式: 通过在命令行执行图中的语句,可以查看当前运行的事务情况,这里介绍几个查询结果中重要的参数: 当前事务如果等待时间过长或出现死锁的情况,可以通过 「kill 线程ID」 的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,959
精华内容 6,383
关键字:

参数资源池化