摘要:对网络规模的数据进行训练可能需要数月时间。但大多数计算和时间都浪费在已经学习或无法学习的冗余和噪声点上。为加速训练,本文提出了Reducible Holdout Loss Selection (RHOLOSS),一种简单但有原则的技术,近似地选择那些最能减少模型泛化损失的点进行训练。因此,rho损失缓解了现有数据选择方法的弱点:来自优化文献的技术通常选择“硬”(例如高损失)点,但这些点往往是有噪声的(不可学习)或与任务相关性较低。相反,课程学习优先考虑“容易”的点,但这些点一旦学习就无需再进行训练。相反,RHO-LOSS选择的是可学习的、值得学习的、尚未学习的点。RHO-LOSS的训练步骤比现有技术少得多,提高了准确性,并加快了在广泛的数据集、超参数和架构(mlp、cnn和BERT)上的训练。在大型网络抓取的图像数据集Clothing-1M上,ro - loss训练的步骤减少了18倍,并达到了比均匀数据洗濯高2%的最终精度
许多网络抓取的样本是有噪声的,即它们的标签不正确或本质上是模糊的。例如,与网络抓取的图像相关联的文本很少能准确地描述图像。其他样本被快速学习,然后变得冗余。
对于哪些数据点是最有用的,还没有达成共识。包括课程学习在内的一些工作建议,在对所有点进行同等训练之前,优先考虑具有低标签噪声的容易的点。虽然这种方法可能提高收敛性和泛化性,但它缺乏一种跳过已经学习的点(冗余)的机制。其他工作则建议在模型难以训练的点上进行训练,从而避免无法进一步减少损失的冗余点。在线批量选择方法通过选择具有高损失或高梯度范数的点来实现这一点。
展示了两种优先处理困难例子的失败模式。
- 首先,在现实世界的噪声数据集中,高损失样本可能被错误标记或模糊。实际上,在控制实验中,高损失或梯度范数选择的点绝大多数是那些具有噪声污染标签的点。我们的结果表明,这种失效模式严重降低了性能。
- 更微妙的是,我们表明一些样本是困难的,因为它们是异常值,即具有不寻常特征的点,在测试时不太可能出现。以减少测试损失为目的,这些点不太值得学习。
为克服这些限制,本文提出了可减少的拒绝损失选择(RHO-LOSS)。本文提出一种基于概率建模的选择函数,通过在不进行实际训练的情况下对每个点减少泛化损失的程度进行量化。减少抵制损失的最佳点是无噪声、无冗余且与任务相关的。为了近似最优选择,我们推导了一个高效且易于实现的选择函数:可降低的holdout loss
考虑一个模型p(y|x;θ)使用参数θ对数据D = {(xi, yi)}n i =1使用随机梯度下降法(SGD)进行训练。在每个训练步骤t,我们从D加载大小为nb的批次bt。
在在线批量选择中,我们均匀预采样大小为nB(>nb)的更大批次Bt。然后,构建一个较小的批量bt,由Bt中排名靠前的nb点组成,并通过标签感知选择函数S(xi,yi)进行排序。我们执行梯度步骤以最小化小批量损失L(yi, p(yi|xi;θ))对i∈bt求和。然后从D中预采样下一批Bt+1,D不替换之前的采样点(即随机洗牌:在下一个epoch开始时进行替换)
之前的在线批量选择方法,如损失或梯度范数选择,旨在选择一些点,如果我们要对它们进行训练,则将训练集损失最小化。相反,我们的目标是选择在a holdout set上损失最小的点。单纯地对每个候选点进行训练并每次评估holdout-loss,代价太大。在本节中,我们将展示如何(近似地)找到在不进行实际训练的情况下,在这些点上训练当前模型的情况下,最能减少holdout-loss的点。
为简单起见,我们首先假设在每个时间步t只选择一个点(x, y)∈Bt进行训练(我们在下面讨论多个点的选择)。P(y'|x';Dt)是当前的预测分布模型,其中Dt是在训练步骤t之前训练序列的数据模型。,写成x ho和y ho简洁,是一组holdout来自相同的数据生成分布ptrue(x', y')作为训练集D。我们的目标是获得点(x, y)∈Bt,如果我们要用它来训练,将在holdout set上最小化负对数似然/交叉熵损失:
holdout损失因子分解,并(直到一个常数因子)形成在ptrue下预期损失的蒙特卡罗近似:
利用Bayes准则和条件独立性p(yi|xi, xj;= p(yi | xi;Dt),我们可以从等式(1)推导出一个易于处理的选择函数。为了可读性,我们切换选择函数的符号,稍后将最小化更改为最大化。
由于神经网络中很难进行精确的贝叶斯推理(以Dt或Dho为条件),因此我们用SGD拟合模型。(在4.1节中研究这种近似的影响)。
第一项,L[y|x;Dt],则是使用在Dt上训练的当前模型在点(x, y)上的训练损失。
第二项,L[y|x;Dho,Dt]是在Dt和Dho上训练的模型的损失
尽管Eq.(2)中的选择函数是可处理的,但计算起来仍然有些昂贵,因为在每次获取新点后,两个项都必须更新。然而,我们可以用只在holdout数据集上训练的模型来近似第二项,L[y|x;Dho, Dt]≈ L[y|x;Dho]。这种近似节省了大量计算:现在在第一阶段训练之前计算一次术语就足够了。根据经验,这种近似不会影响任何测试数据集的性能,甚至具有一些所需的属性
我们将L[y|x;Dho]不可减少的抵抗损失(IL),因为它是在抵抗集合Dho上训练后在点(x, y)∈D上的剩余损失;在Dho很大的限制下,这将是模型在不训练(x, y)的情况下可以达到的最低损失
我们将等式(2)的近似称reducible holdout loss-训练损失和irreducible holdout loss(IL)(不可减少的抵抗损失)之间的差异
本文方法仍然需要我们在holdout set上训练模型,但最终的近似大大降低了成本。我们可以使用“不可减少损失模型”(IL模型)有效地计算IL,该模型比目标模型小且精度低(近似为3)。
综上所述,对于在Dt上训练的模型,在Eq.(1)中选择一个最小化holdout loss的点,可近似为以下易于计算的目标:
虽然我们需要额外的数据Dho,但对于大型(第4.0节)或小型(第4.2节)数据集来说,这不是必需的
本文对为什么可减少的hold loss选择(RHOLOSS)可以避免冗余、噪声和不太相关的点提供了直观的认识。
i)冗余点。
当模型已经学习过一个训练点时,我们称它为冗余,即它的训练损失无法进一步减少。由于冗余点具有较低的训练损失,且reducing loss总是小于training loss(式(3)),因此这些点具有较低的reducing loss,因此不被选择。如果模型忘记了它们,它们会在下一个epoch中被重新访问。
ii)噪声点
虽然之前的方法是基于高训练损失(或梯度范数)进行选择的,但并非所有高损失的点都是有信息的——有些可能具有模糊或不正确(即噪声)的标签。使用保留集无法预测这些点的标签。这些点有高的IL,因此,降低损失。与噪声较小的等效点相比,这些噪声点不太可能被选中
iii)相关点较少
基于损失的选择还有一个额外的陷阱。在ptrue(x)下的低输入密度区域中,对于输入空间中的离群点x(值x远离大多数训练数据),训练损失可能更高。在其他条件相同的情况下,ptrue(x)较低的点不应该被优先排序。
考虑一个“异常值”(x, y)和一个非异常值(x',y'), ptrue(x) <ptrue(x'),但训练损失相等L[y|x;Dt] = L[y'|x';Dt]。由于holdout集Dho也来自ptrue,因此与x'附近的区域相比,Dho将包含来自输入空间中x附近区域的更少的点。因此,在(x, y)上训练可能会更少地减少holdout loss(等式(1)),因此我们更喜欢在非异常值(x', y')上训练。在描述的特定意义上,(x,y)因此与holdout set具有低相关性。正如所期望的那样,RHO-LOSS会降低(x, y)的优先级:由于Dho包含来自x周围区域的少量点,因此(x,y)的IL会很大
当选择单个点(x, y)时,我们展示了哪个点是最优的。当选择整个批bt时,我们从随机预采样集Bt中选择具有top-nb分数的点。当假设每个点对其他点的分数几乎没有影响时,这几乎是最优的,这通常用于主动学习中的简化假设。在我们的例子中,这个假设比主动学习更合理,因为在一个小批量上,模型预测不会被一个梯度步骤改变太多。
随着更多的works以同步或异步梯度下降的方式添加,回报减少到一个点,即增加更多的工人并不能进一步改善时钟时间。我们可以通过增加一个新的并行化维度来规避这些收益递减问题,即数据选择
由于并行前向传递不会受到这种收益递减的影响,因此可以使用额外的work来并行评估训练损失。理论上的运行时加速比可以理解为:在Bt上计算选择函数的每个训练步骤的成本是在bt上训练前向后传球所需成本的nB/3nb倍,因为前向传球所需的计算量至少比前向后传球少3倍。人们可以通过添加更多的worker来几乎任意地减少选择阶段的时间,这些worker使用正在训练的模型的副本来计算训练损失。当选择的时间被参数更新与work的通信所支配时,就达到了极限。更复杂的并行化策略可以进一步减少时间开销(第5节)。
官方文档https://dev.mysql.com/doc/如果英文不好的话,可以参考searchdoc翻译的中文版本http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html 服务器参数介绍MySQL获取信息配置领1)命令行mysqld_safe--datadir=/xxx/xxxx复制2)配置文件持久化的配置都要写到配置文件中.MySQL读取的配置文件可以通过如下命令来查看[root@artisanmysql]#mysqld--help--verbose|grep-A1'Defaultoptions' Defaultoptionsarereadfromthefollowingfilesinthegivenorder: /etc/my.cnf/etc/mysql/my.cnf/usr/etc/my.cnf~/.my.cnf [root@artisanmysql]#复制首先从/etc/my.cnf读取,逐步往后找,后面的覆盖前面的。MyS
一、控制台输出 全库监控 ""测试"" bin/maxwell\ --user='maxwell'\ --password='sweet'\ --host='127.0.0.1'\ --port='3306'\ --producer=stdout复制读取指定库 bin/maxwell\ --user='maxwell'\ --password='sweet'\ --host='127.0.0.1'\ --port='3306'\ --filter='exclude:*.*,include:lpc.*'\ --producer=stdout复制库名不能指向maxwellhost可以跨节点指定ip二、输出到kafka测试脚本kafka-1 bin/maxwell\ --user='maxwell'\ --password='sweet'
本文原创首发于今日头条:Python集结号经常要搭建Django的后端服务器,这里将搭建步骤记录下来,需要的同学可以参考一下,仅代表自己的编程习惯。 需要安装的Python库djangodjanglrestframeworkdjango-cors-headersjwt初始化Django工程django-adminstartprojectxingxing复制创建好工程后,我们要对目录和配置进行一些调整,首先在根目录下创建两个目录:apps和settings,将所有的app都存放到apps目录里面,把settings配置存放在settings目录下,这样我们的根目录就更加清晰了.调整settings配置首先将xingxing目录下的settings.py文件拷贝到settings目录下,创建dev.py和pro.py两个文件,主要用于开发配置和部署配置,将settings.py文件中的数据库配置和DEBUG移到这两个文件中,内容如下:在settings.py文件中把apps添加到环境变量中修改语言和时区修改manage.py文件将Django环境变量设置为开发环境修改wsgi.py文件将D
新智元原创【新智元导读】DeepMind和Waymo宣布将合作开发受进化生物学启发的技术,以提高对AI算法训练的有效性和效率,原因是用于无人驾驶的AI模型通常需要无限的测试和微调,不断试验进行提升,DeepMind设计了一款基于进化的方法PBT,可像生物进化一样自动竞争继承,极大提高了训练的有效性和效率。相比特斯拉,Waymo在商业化的道路上一直没有太大的建树,始终徘徊在凤凰城的结界中,未能走向更广阔的天地。去年,WaymoCEOJohnKrafcik曾公开吐槽自动驾驶无法达到L5级,距离真正意义上的“消费级”应用任重而道远。场面一度引发极大反响,同时也引来了大批的反对声浪。尽管前路艰辛,但商业化的步伐不能停下。Waymo在商业化上迈出的一大步,是自动驾驶出租车。Waymo在凤凰城经过6个月7x24小时的运营,乘客数量突破了1000人,平均一天载客不到6个人。上个月,Waymo改装的捷豹电动车进行了上路测试。Waymo和捷豹在合作协议中敲定,在接下来的2年时间投放20000辆I-Pace,继续扩大自动驾驶出租车业务。而DeepMind一直专心打围棋、打夺旗、打星际…以至于提到DeepM
往期系列年度系列一:使用Tensorflow预测股票市场变动年度系列二:全球投行顶尖机器学习团队全面分析年度系列三:2018年学习Python最好的5门课程由于低信噪比和非平稳的价格分布,预测未来股票价格走势是一件十分困难的事。现在流行的机器学习算法通常会给你带来不怎么满意的结果。此篇推文中,我们主要考虑如何标记数据和应用监督学习。这里的大多数方法都是基于最近出版的一本书《AdvancesinFinancialMachineLearning》,安利一下哦!(书籍在文末免费下载)分类的方法预测股票价格的方向是算法交易的信号。分类器预测未来价格的上升或下降。然后,将分类器的结果输出作为信号输入到交易算法中,例如,当预测为正(负)时买入(卖出)股票。要把这个操作当做分类,我们需要根据未来价格来获得标签。经常看到的一种方法就是简单地标注,下一个日期的价格方向。通过这种方法的标签可能由于低信噪比而被噪声污染。 例如,即使下一个日期返回的分布有正的平均值,价格可能会因为噪声而下降。让我们从数学的角度来看:Pn和P0代表未来和当前的股票价格:其中??是每个日期的回报。 如何??<<1,上
在开始之前我们先介绍一下几个概念,什么是微服务,它的特点是什么?SpringCloud都做了那些事情?他们之间又有什么联系?技术背景什么是微服务微服务的概念源于2014年3月MartinFowler所写的一篇文章“Microservices”。微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTfulAPI)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。微服务架构优势复杂度可控:在将应用分解的同时,规避了原本复杂度无止境的积累。每一个微服务专注于单一功能,并
邓开表同学MongoDB系列文章,本文主要讲诉MongoDB的Kerberos配置实战。MongoDBEnterprise版本支持Kerberos服务认证。Kerberos是大型客户端/服务器系统的行业标准认证协议。上一篇文章是:11、环境准备需要事先在机器上安装MongoDBEnterprise版本和Kerberos,在这里安装的是MongoDBEnterprise3.6.2和Kerberos1.10.22、启动mongod服务,并连接到mongoshell。33、在$external数据库下(注意:必须在$external数据库,否则添加用户必须pwd密码键),创建一个用户(这里的用户需要是Kerberos的一个账户)并分配bigdata数据库“读”的权限。use$externaldb.createUser({roles:[]})44、配置mongod服务支持Kerberos认证4.14.1、编辑修改MongoDB配置文件/etc/mongd.confvi/etc/mongod.conf添加以下内容:security:authorization:enabledsetParamete
对于第三方jar包,如果放在project中引入,pom中配置如下<dependency> <groupId>my.communication-protocol</groupId> <artifactId>communication-protocol1.0.0</artifactId> <version>1.0.0</version> <scope>system</scope> <systemPath>${project.basedir}/libs/communication-protocol-1.0.0.jar</systemPath> <version>1.0</version> </dependency>复制但是<scope>system</scope>会有问题,1. 会导致传递依赖中断,比如:假设A项目依赖了m.jar, n.jar,x.jar, 然后我们把A项目打包成了a.jar, 如果
本文旨在让您对Modbus有一个很直观的了解,总结关于Modbus相关的知识,非常适合初学的同学,同时如有错误,欢迎修改意见和建议,将在第一时间修改 什么是协议什么是RS-485RS-232Modbus协议说明Modebus通信过程举例Modbus存储区Modbus协议类型Modbus-RTU协议Modbus报文帧结构Modbus功能码CRC校验Modbus-ACSII协议Modbus-TCP协议什么是协议在了解什么是Modbus之前,我们先来看下什么是协议协议是一个汉语词汇,读音为xiéyì,意思是共同计议,协商;经过谈判、协商而制定的共同承认、共同遵守的文件。 简单地说,在我们的单片机之间互相通信,以及单片机和上位机通信中,规定了不同的内容规范,这个规范是通信的双方都需要遵守的,这样就可以实现两者的通信。而这个协议规范可以有很多种,来适应不同的设备以及通信要求等,我们常见的就有IICSPIUART串口通信协议等等。而Modbus也是一个串行通信协议。什么是RS-485RS-232我们在看Modbus的时候,经常会看到485串口,232串口,这些是什么呢?RS232,RS485是一种
由开源社主办的中国开源年会2016(COSCon'16-ChinaOpenSourceConference2016)即将于今年10月15日-16日在北京举办。微软大咖将为您呈现区块链,容器,大数据,Xamarin等时下热点技术,参会者还可获取价值1,500元Azure服务使用额度的一元账号,玩转Azure云平台。 大会亮点 - 大数据,云计算,操作系统,开源治理,精彩纷呈 - 跨社区,跨技术领域,跨国度,年度盛会 - 与真正的开源贡献者和参与者,直接互动 微软的加入也让这个大会更加多元化,也更丰富多彩。微软热爱Linux。这些年来微软不仅继续承诺对Linux内核的贡献,也开源了.NETCore,VSCode,Office365集成Moodle开源学习平台等等。据全球热门开源代码库GitHub最新公布的一份统计报告,微软名列“对开源贡献人数最多的组织(Organizationswiththemostopensourcecontributors)”的榜首。在过去的一年,有16,419位来自微软的程序员为GitHub开源社区贡献了自己的力量。拥抱
使用@Value注入map、List 实体类 @Value("#{'${list}'.split(',')}") privateList<String>list; @Value("#{${maps}}") privateMap<String,String>maps; 复制 配置文件 list:topic1,topic2,topic3 maps:"{key1:'value1',key2:'value2'}" 复制 ps:注意上面的map解析中,一定要用""把map所对应的value包起来,要不然解析会失败,导致不能转成Map<String,String>。 https://github.com/godmaybelieve
第一章概论1.2.4软件工程的知识领域 问题:既然软件工程的知识领域涉及这么多,应该怎样才学好它呢? 回答:软件工程专业是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。 它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等方面。在现代社会中, 软件应用于多个方面。典型的软件比如有电子邮件,嵌入式系统,人机界面,办公套件,操作系统, 编译器,数据库,游戏等。所以应该认真对待每一门与它有关的课程。 第二章个人技术与流程2.1单元测试2.3个人开发流程 问题:对一个软件工程师来说怎样写好一个单元测试?怎样做到既能让客户满意又能高效地完成项目和提升自己个人开发能力? 回答:写出好的单元测试需要我们不断的积累和完善,需要我们不断的在工作中去总结。写出好的单元测试没有简单的公式或规定可以遵循。 只有理智的分析,才能作为自己行动的指南,必须从内而外的改变和提升。 第3章软件工程师的成长 3.2软件工程师的职业发展3.3技能的反面 问题:如何让自己正确的定位自己的职业发展之路?在现代社会中,作为一名软件
<scripttype="text/javascript"> functionhasClass(elements,cName){ returnelements.className.match(newRegExp("(\\s|^)"+cName+"(\\s|$)")); //(\\s|^)判断前面是否有空格(\\s|$)判断后面是否有空格两个感叹号为转换为布尔值以方便做判断 } functionaddClass(elements,cName){ if(!hasClass(elements,cName)){ elements.className+=""+cName; } } functionremoveClass(elements,cName){ if(hasClass(elements,cName)){ elements.className=element.className.replace(newRegExp("(\\s|^)"+cName+"(\\s|$)"),""); //replace替换class属性 } } </script>复制
名称 定义 适用场景 适用过程 专家判断 对某方面擅长的人就是专家,找专家协助就是专家判断,专家可能是顾问、干系人、PMO、团队成员 制定项目章程、制定项目管理计划、指导与管理项目执行、监控项目工作、实施整体变更控制、结束项目或阶段、规划范围管理、定义范围、创建WBS、规划进度管理、估算活动资源、估算活动持续时间、规划成本管理、估算成本、制定预算、规划人力资源管理、控制沟通、规划风险管理、识别风险、实施定性风险分析、定量风险分析、规划风险应对、规划采购管理、实施采购、识别干系人、规划干系人管理、控制干系人参与 引导技术 引导者帮助团队和个人完成项目活动时用的,比如头脑风暴、冲突处理、问题解决、会议管理等 制定项目章程、制定项目管理计划 项目管理信息系统 属于事业环境因素,进度计划工具,工作授权系统,配置管理系统、信息收集和发布系统等 指导与管理项目执行、监控项目工作 会议 执行三类会议:交换信息、头脑风暴方案评估设计、制定决策,会前议题,会后纪要,跟踪效果;监控时用户小组会、用户审查会;变更时会议:CCB;结束时,经验总结、收尾会、用户小组会、用户审查
一、在https://github.com/happyfish100/fastdfs-client-java 下载客户端,解压后并执行ant命令,在E:\tools\libs\fastdfs\fastdfs-client-Java-master\src\build下会生成fastdfs_client.jar如图示 二、mvn安装fastdfs_client.jar,在cmd中执行命令 mvninstall:install-file-DgroupId=org.csource-DartifactId=fastdfs-client-java-Dversion=5.0.4-Dpackaging=jar-Dfile=D:\fastdfs_client.jar 三、在eclipse中新建maven项目fastdfs-demo,在pom.xml中加入依赖如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
加法进位实验 本题为填空题,填入内容: defcall(self,num1,num2): num1_emb=self.embed_layer(num1)#shape(b_sz,len,emb_sz) num2_emb=self.embed_layer(num2)#shape(b_sz,len,emb_sz) inp_emb=tf.concat([num1_emb,num2_emb],axis=-1) rnn_out=self.rnn_layer(inp_emb) logits=self.dense(rnn_out) returnlogits importnumpyasnp importtensorflowastf importcollections fromtensorflowimportkeras fromtensorflow.kerasimportlayers fromtensorflow.kerasimportlayers,optimizers,datasets importos,sys,tqdm 复制 数据生成 我们随机在start->end之间采样除整数对(num1,
2022DASCTFXSU三月春季挑战赛easyre 前奏 查壳 查壳,asp壳,esp定律脱之,修复可以看我的上一篇文章 main函数 main函数的反汇编代码 int__cdeclmain(intargc,constchar**argv,constchar**envp) { unsigned__int8Dest[50];//[esp+1Ch][ebp-74h]BYREF charStr[50];//[esp+4Eh][ebp-42h]BYREF __time32_tTime;//[esp+80h][ebp-10h]BYREF intv7;//[esp+84h][ebp-Ch] intv8;//[esp+88h][ebp-8h] structtm*v9;//[esp+8Ch][ebp-4h] sub_40DCF0(); time(&Time); v9=gmtime(&Time); sub_47C7D0((int)&dword_487F00,Str); if(strlen(Str)!=42) { sub_47BAB0((int)&dword_4881
Mybatis中使用collection进行多对多双向关联示例(含XML版与注解版) XML版本: 实体类: @Data @NoArgsConstructor publicclassCourse{ protectedIntegerid; protectedStringname; protectedList<Student>students=newArrayList<Student>(); publicCourse(Integerid){ this.id=id; } publicCourse(Stringname){ this.name=name; } publicStringtoLazyString(){ return"Course:{id:"+this.id+";name:"+this.name+"}"; } }复制 @Data @ToString @NoArgsConstructor publicclassStudent{ protectedIntegerid; protectedStringname; protectedLis
提示:本系列笔记全部存在于 Github, 可以直接在 Github查看全部笔记 持续部署概述 持续部署是能以自动化方式,频繁而且持续性的,将软件部署到生产环境。使软件产品能够快速迭代。 在之前部署web项目时,都是手动进行部署 拉取代码--->编译项目--->打包镜像--->推送镜像仓库--->服务器拉取新镜像--->停止和移除旧容器--->启动新容器 这一整套部署步骤枯燥又费时。 持续部署就是使用工具自动处理整套步骤。代码在提交之后自动执行整套流程将项目部署到生产环境,省去繁琐的人工操作。 持续部署整套流程本质上是一个极其简单的东西。可以拆解为两个阶段 打包阶段:拉取代码--->编译项目--->镜像打包--->推送镜像仓库 部署阶段:SSH连接服务器--->拉取新镜像--->停止和移除旧容器--->启动新容器 未使用自动化部署工具时,整套套也可以使用.sh脚本实现半自动化。甚至可以编写一个小程序,自动连接服务器实现全自动化。 而所谓的持续部署工具本质上做的也是这么一件事,只是提供了更强大更丰富的功能。