技术教程

AI加速器与机器学习算法:协同设计与进化-CDN-服务器-VPS优惠/促销/测评-撸主机评测

AI加速器与机器学习算法:协同设计与进化

作者|Shashank Prasanna 翻译|胡燕君 此刻,你应该是在电脑或手机上看这篇文章。不管怎样,这些机器都属于现代计算机,它们都有中央处理器(CPU)和其他为特定功能服务的专用芯片,例如显卡、声卡、网卡、传感器融合等。处理特定任务时,专用处理器往往比通用CPU更快更高效。 计算机发展早期,CPU都会和专用处理器配合使用。1970年代的8位和16位CPU需要依赖软件来模拟浮点指令,因此执行浮点运算非常慢。而由于计算机辅助设计(CAD)和工程模拟等应用对浮点运算的速度要求较高,于是人们开始用数学协处理器(math coprocessor)辅助CPU,让数学协处理器分担所有浮点运算任务,它的浮点运算速度和效率都比CPU更高。这就是专用处理器的一个例子。 关注AI和半导体行业的朋友近来可能听说过“机器学习(ML)专用处理器”(即AI加速器)。最常见的AI加速器莫过于NVIDIA GPU,此外还有Intel的Habana Gaudi处理器、Graphcore的Bow IPU、Google的TPU、AWS的Trainium和Inferentia芯片等。 为什么如今有这么多AI加速器可供选择?它们和CPU有什么不同?算法如何改变才能适应这些硬件?硬件又该如何发展才能支持最新的算法?本文将一一解答。本文主要内容包括: 为什么需要专用AI加速器? ML硬件的分类:CPU、GPU、AI加速器、FPGA和ASIC “硬件感知(Hardware-aware)”的算法和“算法感知(Algorithms-aware)”的硬件 AI加速器与高效ML算法的协同进化 针对推理的AI加速器与高效算法 针对训练的AI加速器与高效算法 AI加速器的未来 1 为什么需要专用AI加速器? 构建ML专用处理器有三个方面的原因:能效、性能、模型大小及复杂度。近来,要提高模型准确率,通常做法是扩大模型参数量,并用更大型的数据集训练模型。计算机视觉、自然语言处理和推荐系统都采用这种做法。 语言模型方面,前几年诞生的GPT-3有1750亿参数,当时被视为大模型的“天花板”,但后来又出现了GLaM和NVIDIA MT-NLG,参数量分别达到1.2万亿和5300亿。按照历史规律,模型将越来越大,而现有处理器的算力将无法满足大模型在训练时间和推理延迟方面的要求。 不过,构建AI专用加速器的最重要原因还是能效,开发AI专用芯片可节省巨大的能源,可覆盖研发投入有余。 为什么需要高能效的处理器? ML模型越大,需要执行的内存访问操作就越多。与内存访问相比,矩阵-矩阵运算和矩阵-向量运算的能效高很多。根据斯坦福大学韩松博士的论文(https://arxiv.org/pdf/1506.02626v3.pdf),读取内存的能耗比加/乘运算操作的能耗高出好几个数量级。大型神经网络由于无法片上存储,需要执行更多DRAM读取操作,因此能耗还要更高。 图源:https://arxiv.org/pdf/1506.02626v3.pdf 用通用处理器运行深度神经网络时,扩大处理器规模可以带来性能提升,但即便只是小幅提升也须以大量能耗和巨额设备成本为代价。 CPU等通用处理器牺牲低能耗换取通用性,AI加速器等专用处理器则牺牲通用性换取低能耗。 使用AI加速器则不一样。AI加速器通过改进设计,可以减少内存访问,提供更大的片上缓存,还可以具备特定的硬件功能(如加速矩阵-矩阵计算)。由于AI加速器是基于特定而构建的设备,可根据算法进行适配改进,因此其运行效率会比通用处理器更高。 2 ML硬件的分类——CPU、GPU、AI加速器、FPGA和ASIC 接下来我们谈谈加速器的不同种类,以及它们的通用和专用程度。   如上图所示,最具通用性的是CPU,可以运行任意代码。专用芯片可执行的任务,CPU也能执行,如图像处理、语音处理、机器学习等。然而,CPU的性能和能效都比较低。 专用性最强的是专用集成电路(ASIC),又称固定功能芯片,因为它只能执行一种或几种任务,而且通常不可编程,也没有面向开发者的API。耳机中的降噪处理器就是一种ASIC芯片,它需要同时具备低能耗和高性能,这样才能既延长耳机电池使用时间,又能实现低延迟,以免用户看节目时遇到声画不同步的糟糕体验。 上图中,越靠左代表通用性和可编程性越强;越靠右代表专用性和效率越高。那么GPU、FPGA和AI加速器分别处于图中什么位置呢? 答案是:它们都处在这两个极端之间。    靠近ASIC一端的是现场可编程逻辑门阵列(FPGA)。顾名思义,FPGA是可编程的,但编程人员需要具备硬件设计知识,还须对Verilog、VHDL等硬件描述语言(HDL)有一定了解。换言之,FPGA编程与硬件关联度太高,而软件开发人员缺乏这方面的编程技能和工具,因此难以对它进行编程。 靠近CPU一端的是GPU。GPU是面向特定目的处理器,擅长处理并行任务,例如图形着色器计算和矩阵乘法。CPU更适合延迟敏感型应用,GPU则更适合要求高吞吐量的应用。GPU与CPU的相似之处在于它们都可编程。而作为并行处理器,GPU使用NVIDIA CUDA和OpenCL等语言,虽然能处理的任务种类比CPU少,但在运行包含并行任务的代码时极高效。 Intel的Habana Gaudi处理器、AWS的Trainium和Inferentia芯片等AI加速器则处在GPU的右侧。Habana Gaudi处理器具备可编程性,但通用性比GPU更低,所以应处GPU右侧。AWS的Inferentia芯片不可编程,但可以加速多种操作,如果你的ML模型不支持这些操作,Inferentia就会执行CPU回退(fallback)模式。综上,Inferentia应处Habana Gaudi的右侧。 3 “硬件感知(Hardware-aware)”的算法 和“算法感知(Algorithms-aware)”的硬件 通过以上分类,我们对各种处理器有了大致认识。下面我们来谈谈这些处理器如何与软件互相配合。 通用计算模型有两个组成部分:(1)软件与算法;(2)运行软件的硬件处理器。一般而言,这两部分互相独立——编写软件时很少会考虑软件会在什么硬件上运行;而硬件设计的出发点则是让硬件尽可能支持更多种类的软件。 通用计算模型逐渐演进,需要应用于深度学习等要求高性能和高能效的领域,因此需要加强算法设计和硬件设计之间的联系。现代ML计算模型同样包含两个组成部分:(1)ML算法与软件框架;(2)与AI加速器配合使用的通用处理器。 不同于通用计算模型的开发,ML研发人员会针对特定硬件设计ML算法。比如,编写代码时可以充分利用硬件的特定功能(如支持多种精度:INT8、FP16、BF16、FP32)实现特定的芯片功能(混合精度、结构化稀疏)。然后,用户就可以通过常见的ML软件框架使用这些功能。同理,硬件设计师会针对特定算法构建AI加速器。比如,为加速ML矩阵计算而设计专门的芯片功能(如NVIDIA在Volta GPU架构中引入Tensor Core)。 这就是AI加速器和ML算法的协同进化。硬件设计师为AI加速器增加ML算法可以使用的功能,而ML研发人员则利用AI加速器的硬件功能量身设计新的算法。 硬件和软件的协同可以带来更好的性能和更高的能效。 4 AI加速器与高效ML算法的协同进化 AI加速器分为两类:(1)用于训练的AI加速器;(2)用于推理的AI加速器。由于训练和推理的目标不同,而AI加速器是针对特定工作负载的专用处理器,因此有必要为不同类型的工作负载分别设计处理器。 用于训练的AI加速器的目标是减少训练时间,而且应具备能配合训练算法的硬件特点。因此,AI训练加速器的功率通常较大,内存空间也较大,以满足较高的吞吐量(每秒处理的数据)要求。由于AI训练加速器注重吞吐量,因此提高吞吐量和利用率有助于降低能耗成本(即通过扩大吞吐量降低“能耗/吞吐量”之间的比率)。AI训练加速器还支持混合精度训练,使用较低精度以加快计算速度,使用高精度累积计算结果,从而实现比通用处理器更高的能效。(后文还将详谈AI加速器的混合精度训练。) AI推理加速器的目标是,在运行大量独立数据批次时降低预测延迟,因此需要具备高能效特点,需要降低“能耗/预测”之间的比率。虽然也可将训练加速器用于推理加速(毕竟训练中的前向传播过程本质上即是一种推理任务),但使用训练加速器时,“能耗/推理”之比会大很多,因为训练加速器处理小型数据批次的推理请求时利用率较低。 训练加速器就像公交车,只有保持乘客满员才能实现高能效(油耗/乘客数之比低)。如果偌大的公交车每次只载一个人,其油耗/乘客数之比将变得极高。而推理加速器就像跑车,其速度比公交车快,只载一人时能效比公交车高(跑车的单名乘客油耗比公交车低)。但如果想用跑车一次载50个人,它就会跑得极慢(何况超载违法)。 下文将分别谈论训练和推理的工作流,以及AI加速器和软件应具备什么特点才能在训练和推理中实现高性能和高能效。 5 针对推理的AI加速器与高效算法 ML推理即是根据新的数据使用训练好的模型以输出预测结果。本节将讨论AI加速器上运行的可提升推理性能和效率的算法。   提升机器学习效率最重要的方法是量化。要充分理解量化,首先须了解计算机硬件中的数字表示方法。浮点数是数字计算机中用以表示连续实值的离散表示形式。ML算法通常基于IEEE 754标准用单精度(FP32)储存和处理数字。IEEE 754还规定了AI加速器支持的其他常见浮点类型,如半精度(FP16)和双精度(FP64)。 现代AI加速器也支持IEEE 754以外的数字格式,例如BF16(由Google Brain引进;NVIDIA Ampere GPU、AWS Inferential、AWS Tranium、Intel Habana Gaudi和Google TPU均支持此格式)和TF32(NVIDIA Ampere架构和AWS Tranium芯片支持此格式)。推理加速器还支持整数精度,如INT8和INT4。 量化在推理中的优势 在推理任务中,模型权重和激活函数输出均可被量化,例如可将FP32(训练常用精度)转化为更低精度的表示形式(FP16、BF16和INT8)。使用较低精度可以获得更高的性能和能效。当把FP32转化为FP16操作时,数据大小可减半,能耗可减少约75%(数据来源:https://arxiv.org/pdf/1506.02626v3.pdf) ,使用的硅面积(silicon area)也可减少约75%。 如果仅从推理的角度考虑硬件设计,可以构建仅供推理使用、仅支持较低精度的加速器,这样就可以缩小加速器的尺寸,并提高能效。将运算结果从FP32转化为INT8数据还可进一步减少能耗,因为数据大小减少到原来的1/4。 然而,通过量化方法提升计算效率会损失一定的预测准确性。因为将高精度表示形式转化为低精度本质上是一种压缩,压缩意味着会损失部分数据。FP32的动态范围比FP16和INT8更大,因此,推理中,量化的目的是保留数据中的“信号”,去除数据中的“噪声”,为实现这个目的可以有多种方法。 使用NVIDIA GPU进行量化 NVIDIA的Ampere和Turing等较新GPU架构均支持多种精度类型。2016年,NVIDIA在Pascal架构中首次引进了FP16精度类型,而最新的Ampere和Turing架构GPU均体现了“硬件与算法的协同进化”。我之前写过一篇文章介绍GPU的完整发展史和不同架构的GPU及其特点:Choosing the right GPU for deep learning on AWS(https://towardsdatascience.com/choosing-the-right-gpu-for-deep-learning-on-aws-d69c157d8c86)。 本节将聚焦硬件和软件层面如何支持GPU进行量化。 以NVIDIA 的Ampere架构为例。你可以在AWS云服务器上通过启动Amazon EC2 p4d实例或G5实例体验Ampere架构的性能。p4d和G5实例分别使用NVIDIA的A100和A10G GPU,两款GPU都基于Ampere架构,都支持FP64、FP32、FP16、 INT8、BF16和TF32精度类型,也都包含一种被NVIDIA称为“Tensor Core”的运算单元,用于混合精度计算。推理时用到的重点精度类型只有FP16和INT8两种(其他精度类型将在下一节中提到训练时详谈)。 大多数深度学习框架都使用NVIDIA GPU和FP32格式训练模型,因此NVIDIA 推出TensorRT编译器,用以加快推理速度。TensorRT可将FP32格式的模型权重和激活函数量化为FP16和INT8格式。量化时,TensorRT先确定一个比例因子(scaling factor),然后根据该系数将FP32的动态范围映射到FP16或INT8的动态范围。映射到INT8的难度尤其高,因为INT8的动态范围比FP32小太多。INT8仅能表示256个数值,而FP32足足能表示4.2×109个数值。 如何在通过量化提高推理速度的同时减少精度损失?一般有两种方法: 训练后量化(PTQ):使用一个训练好的、以FP32格式计算的模型,确定比例因子,然后将FP32映射为INT8。确定比例因子的方法是:TensorRT衡量每个神经网络层中激活函数输出的分布,然后找到一个使参考分布(reference distribution)和量化分布(quantized distribution)之间信息损失(KL散度)最小的比例因子。 量化感知训练(QAT):在训练中计算比例因子,使模型可以适应信息损失并将信息损失降到最低。 可见,硬件不断发展,具备更多可提升效率的功能(如降低精度)。同时,算法也不断进化,可以更好地利用硬件的功能。 我的另一篇文章提供了NVIDIA TensorRT在GPU上实行量化的代码示例(https://towardsdatascience.com/a-complete-guide-to-ai-accelerators-for-deep-learning-inference-gpus-aws-inferentia-and-amazon-7a5d6804ef1c)。 使用AWS Inferentia芯片进行量化...

网站搭建教程(详细步骤 )-CDN-服务器-VPS优惠/促销/测评-撸主机评测

网站搭建教程(详细步骤 )

网站组成 一、服务器 什么是服务器? 我们可以理解为一个容器,用来存放网站的内容部分,我们在互联网上能够看到的网页信息都是存储在服务器上,服务器的本质其实是一台电脑主机,只是这台主机它需要24小时不关机,不断电,不断网。 二、网站程序 什么是网站程序? 网站程序是由程序员编写的一个网站安装包,程序是网站内容的载体。 常见的网站程序有: dedecms , phpcms ,帝国cms ,米拓cms , WordPress , discuz , ECShop ,shopex , z-blog等,根据不同类型的网站我们来选择不同的网站程序。 比如说搭建一个企业网站可以选择dedecms ;搭建一个自己的个人网站可以选择WordPress、z-blog程序;搭建一个论坛网站可以选择discuz 程序;搭建商城网站可以选择 ECShop ,shopex程序;在我的测试网站上面我什么程序都没用,就几个简单的html表白页面。 三、域名 域名是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。域名是一个网站最基础的,因为只有有了域名才能方便人们快速的在互联网这个”汪洋大海”里找到你的网站。IP 地址跟域名有异曲同工的地方,不过,IP 是针对计算机、互联网之间识别网站的标记,域名是针对人类的。一个好的域名的选择可以有效的提高网站被关注的程度。 域名的选择可以分为国内和国外,国内的域名以及国内的主机空间需要备案才可以正常使用,而国外的域名和空间就免去了备案的麻烦。如果购买国内的域名平台选择也很重要的,因为这个涉及到域名备案环节,现在网站备案都需要由运营商来提交申请了,也就是说你的域名要解析到哪个服务器,就由那个服务器的运营商来负责提交备案申请到相关单位审核、审查。购买域名的时候小编建议大家选择实力雄厚的运营商,比如阿里云域名,腾讯云域名,不要因为的小便宜选择那些不出名的运营商,因为域名是个长久的事儿,“持续性”很重要,专业实力雄厚的运营商可以在这方面有很好的”保障力”。域名备案,是我们国内必须的一个步骤,只有在国内相关部门备案的域名才可以选择使用国内服务器运营商提供的服务器和优化加速( CDN )服务以及等等相关的国内网站服务支持。现在运营商都会帮你准备好相关备案的流程,只要照着指示做就可以了,无需操心。 阿里云域名注册(抢先注册你钟意的域名) 腾讯云域名注册(抢先注册你钟意的域名) 买了域名一定要备案吗? (一文解答关于域名与网站是否备案的问题) 四、空间基本介绍 网站空间:建立于服务器.上,是搭建网站所需的最小单位,相当于一个文件夹。 网站空间还有很多其他名字,比如网站主机,云主机,虚拟主机云虚拟主机。 常见的空间服务商:华为云,阿里云,腾讯云,百度云 搭建网站的基本步骤流程(教程解说) 大家在网上自行搜索相关题目,会有很多的文章啦。那,如果你跟我一样。作为一个小白,没有专业知识,但热衷想体验一番。可以看看以下内容,这是我刚踩完坑后的(粗略)经验,分享给大家。   经历昨天几个小时的研究,终于实现了创建网站的第一步。先给个截图,证明一下,有效!嘻嘻~                                          由于刚创建,还没有开始写代码,所以就比较简陋啦 ok,咱们废话不多说,直奔主题。到达创建成功这一步,大概需要以下流程: 购买域名 购买服务器 相关配置 一、购买域名 购买域名你需要知道以下内容: 在哪里购买 如何买 买后需要干嘛 现在我按顺序给大家讲一波~ 1.在哪里购买 购买域名的网站有很多,分为国内 and 国外。简单举几个例子: 国内:阿里,腾讯,万网等 国外:Namesilo,Godaddy,Wealthyaffiliate等 2.那么如何选择呢? 价格:国内域名商,价格比较良心,在接受范围。国外,Namesilo价格最低,Godaddy首年很低,但续费超贵,另外一个居中。 备案:国内,国外购买的域名都不需要备案,但是,如果使用国内服务器,则需要备案。国外服务器则不需要。多说两句,如果你购买了国外的域名,想搭在国内服务器上面,过程很麻烦!!首先,你需要把域名商转到国内(前提是,域名购买已有60天),然后在国内进行实名认证,2-3天后才可以备案。如果大家想在国内购买服务器,最好在国内购买域名!! 安全性:所有域名最好都应该拥有隐私保护。从学生档的角度考虑,可以参考Namesilo和Wealthyaffiliate,因为这两者提供免费的隐私保护。不一定很好,但作为刚入手的新手是可以考虑的。 大家可以根据自己需求,自行选择! 3. 如何买 好哒,我们进入第二个环节。我根据自己选择的购买方式给大家做演示,希望能够帮到您! 首先:我们进入华为云网站 华为云-提供云计算服务 +智能,见未来-华为云 (huaweicloud.com)  然后注册你钟意的域名 这里需要跳过一个小环节,也就是 解析域名环节!这一步,需要先购买域名后,才能进行。那我们现在跳到下面一个环节 二、购买服务器 购买服务器你需要知道以下内容 在哪儿买 如何买 买后干嘛  1.在哪儿买   这里跟购买域名一样,建议选择大的品牌商,因为安全,稳定和售后服务强大。这里推荐推荐阿里云、腾讯云、华为云. 2、如何买 我现在的是华为云的免费试用服务器,就用这个给大家演示   在购买选择里面,其他的基础配置不用变,在云服务器镜像中选择合适的系统,这里我选择的是CentOS,原因就是这个系统搭建的网站性能更好,为了避免后面系统不一样建议购买CentOS系统  如何登陆服务器 在华为云官网里面点击控制台 进入到控制台之后左边有一个列表菜单,选择云耀云服务器 这个时候你看到的就是你先前购买的服务器 最重要的就是公网IP,就是你服务器的地址(如果没有绑定域名的话),再有就是远程登录(一般不会在这里远程登录),和重置密码(忘记密码直接重置,重置完之后一定要重启服务器,重装系统(搞坏的服务器直接重装不解释),更过操作里面可以对服务器进行关机,重启操作。 然后进行下一步操作 打开宝塔的端口和访问端口 按图操作就完了 1、 2、 3、添加8888端口,并允许所有其它端口   然后进行下一步配置 三、相关配置 1、宝塔+云虚拟创建属于你的网站 宝塔:宝塔Linux面板是提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功 进入宝塔官网这个页面宝塔linux面板,一键安装LAMP/LNMP/SSL/Tomcat (bt.cn) 按图操作 等待加载完成,弹出 宝塔Linux面板的登录地址新开浏览器窗口访问登陆地址,下面有登录账号和密码直接登录就好了 登陆过后: 修改账号密码 登陆之后可以修改下账号密码   安装软件 我们需要安装Apache、MySQL、等软件 如果是你自己配置信息的话,不太懂的人光安装这些软件就各种报错,这里宝塔就很人性化,弄了个软件商城,一键安装,第一次进入软件商城会给你推荐要安装的软件,点击安装即可 安装过程也比较慢,如果网速ok的同学几分钟就可以搞定,我安装的时候用来大概8分钟吧,要耐心点哦。 创建站点 这个就比较简单了,由于环境都已经配置好了,直接选择站点,创建站点就可以了 这个时候我们就可以通过公网ip地址访问网站了, 不过目前访问的是默认的页面,不好看,没关系,下面教大家把自己的页面加到服务器上 上传程序 下载拥有SSH连接功能的软件 在这里我用的是MobaXterm去连接服务器,因为MobaXterm兼具第三部的全部功能,不用即装xshell又安装FileZilla,方便快捷...

Nginx配置-CDN-服务器-VPS优惠/促销/测评-撸主机评测

Nginx配置

一、nginx常用配置命令 配置命令路径 1/usr/local/nginx/sbin   查看nginx版本 1./nginx -v   停止nginx服务 1./nginx -s stop   启动nginx服务 1./nginx   重新加载nginx,适用于当nginx.conf配置文件修改后,使用下面命令可以使得配置文件生效 1./nginx -s reload   查看nginx服务是否运行 1<span class="token function">netstat</span> -ntlp   二、nginx配置文件 由三部分组成 (一)、第一部分:全局块 nginx服务器全局生效的配置命令 1worker_processes  1;   # 服务器并发处理能力,值越大并发能力越强(受自身配置限制)   (二)、第二部分:events块 影响nginx和用户网络的连接 1worker_connections  1024; #最大连接数1024个,需灵活配置   (三)、第三部分:http块 nginx配置最频繁的部分,比如代理,日志,缓存、第三方模块等等。 需要注意的是http块可以包括http全局块和server块 1、http全局块 包括文件引入、MIME-TYPE定义,日志自定义、连接超时等等 123http {     include       mime.types;      #文件扩展名与文件类型映射表     default_type  application/octet-stream;  # 访问到未定义的扩展名的时候,就默认为下载该文件   2、server块 与虚拟主机有密切关系,主要是为了节省硬件成本 一个http块可以包含多个server块,而一个server块就等于一个虚拟主机 server块又包含全局server块和location块 全局server块 123server {     listen       8012;       #  目前监听的端口号     server_name  localhost;  # 主机名称   3、location块 123   location / {     #表示默认首页             root   html;             index  index.html index.htm;  ...

LINUX挂载硬盘教程-CDN-服务器-VPS优惠/促销/测评-撸主机评测

LINUX挂载硬盘教程

1. 查看没有挂载的硬盘 可以使用fdisk -l命令来查看,具体如下: 可以看到/dev/sdb硬盘是没有被挂载的。 2. 格式化硬盘 在挂载之前,首先要格式化这块硬盘。我们选择的是ext4格式。关于ext4格式的具体信息,可以参考http://www.cnblogs.com/cobbliu/archive/2012/01/07/2388998.html 格式化硬盘使用的命令是mkfs.ext4,具体如下: 这里需要注意的是上面的图片中使用红色标注的部分。我们没有对硬盘进行分区,直接对整块硬盘进行格式化。如果需要分区的话,可以使用fdisk先分区,再格式化 3. 挂载硬盘 要挂载硬盘,首先我们要创建挂载的目的目录。我们要挂载到/data目录下。使用mkdir /data来创建目录。 然后,使用mount命令挂载硬盘。具体如下: 再使用df -h命令,可以看到如下的信息: 可以看到,/dev/sdb被挂载到了/data目录。 4. 启动时自动挂载 事情还没有完。现在的状态是,如果我们重启系统,这个挂载就会丢失。我们需要配置系统,使得每次启动的时候自动挂载。这个是通过修改/etc/fstab文件完成的,需要在该文件的最后添加一行,具体如下: 上面的过程都是很粗陋的,都是使用的默认的设置,没有做细节上的调整。作为一个非系统管理员,也只有这一点能力了。好在配置的是开发和测试使用的服务器,真正的生产环境的服务器,就需要招聘一个真正的系统管理员了。 本文转自 Centos挂

宝塔面板纯净版在线安装命令(宝塔官方面板一键升级为宝塔企业非官方纯净版)-CDN-服务器-VPS优惠/促销/测评-撸主机评测

宝塔面板纯净版在线安装命令(宝塔官方面板一键升级为宝塔企业非官方纯净版)

宝塔纯净版介绍: 1.安全:剥离了所有与宝塔官方的通信、上报、下发;并且不与本站纯净版服务器通信,再也不用绑定账号了! 2.免费:提升为企业会员,免费使用软件商店中的所有[企业版插件]、[专业版插件]、[运行环境]、[免费插件]、[宝塔插件];部分[第三方应用]安装可能会失败; 3.解决方案:所有功能与原版一致,如有任何问题请参考宝塔官方解决方案 4.面板修复:纯净版不与官方通信,所以无法判断贵站情况,建议使用升级代码修复/或安装宝塔官方版再安装纯净版(小概率出现异常,大概率只重装面板不影响网站运行);本站声明:纯净版基于官方代码、仅做通信剥离、代码未加密、未添加任何新增代码! 注意:纯净版存在风险,切勿在生产环境中使用,安装前先备份重要数据 (图:宝塔面板纯净版) 宝塔纯净版 7.6.0版本 [稳定版本/推荐] Centos全新安装命令: 根据系统执行框内命令开始安装(大约2分钟完成面板安装)升级后可能需要重启面板 yum install -y wget && wget -O install.sh http://v7.hostcli.com/install/install_6.0.sh && sh install.sh Ubuntu/Deepin全新安装命令: wget -O install.sh http://v7.hostcli.com/install/install-ubuntu_6.0.sh && sudo bash install.sh Debian全新安装命令: wget -O install.sh http://v7.hostcli.com/install/install-ubuntu_6.0.sh && bash install.sh Fedora全新安装命令: wget -O install.sh http://v7.hostcli.com/install/install_6.0.sh && bash install.sh 官方版本升级代码/修复面板: 已经安装官方面板,执行下列命令升级到7.6.0纯净版:(老吴站长亲测,完美转换!不过还是要提前备份好所有数据) curl http://v7.hostcli.com/install/update6.sh|bash 其他非官方版本升级: (含开心版、快乐版、纯净版等 7.4.5至7.6.0版本之间所有版本均可),执行下列命令升级到7.6.0纯净版: curl http://v7.hostcli.com/install/update6.sh|bash 任意非官方版本还原到官方最新版: curl http://download.bt.cn/install/update6.sh|bash 注意事项: 纯净版不支持更换版本和右上角的修复功能,如果装了宝塔官方的插件被强制升级到了最新版,重新执行“官方版本升级代码/修复面板”即可 END!!!资源来自互联网,请自行鉴别其安全性!(请收藏本文章,资源不定期更新!)

Python获取时光网电影数据的实例代码-CDN-服务器-VPS优惠/促销/测评-撸主机评测

Python获取时光网电影数据的实例代码

一、前言 有时候觉得电影真是人类有史以来最伟大的发明,我喜欢看电影,看电影可以让我们增长见闻,学习知识。从某种角度上而言,电影凭借自身独有的魅力大大延长了人类的”寿命”。 一部电影如同一本故事书,我可以沉迷到其中,来的一个新的世界,跟着电影主角去经历去感悟。而好的电影是需要慢慢品尝的,不仅提供了各种视觉刺激和情感体验,更能带来思考点,也让我可以懂得在现实生活中穷尽一生也无法明白的道理。电影比书本更直接、更有趣、更精彩。 好的电影可以在潜移默化中塑造我们的三观,在电影中我们可以获得平静、满足和温和,学会坚强、勇气和努力。电影延展了无聊单调、枯燥又稀松平常的生活,让我可以在对现实生活厌倦或失望时至少有一个地方可以逃离。 正因为电影有诸多好处,并且比书本和说教能更好的塑造三观,因此,家长们可以陪同小孩看电影,鼓励孩子从电影中学会坚强和勇敢等优良品质。 既然要看看电影,就要去看优秀的作品,时光网是一个电影各方面素材都比较全面的网站,本次的项目就是要从该网站上获取到指定年份的所有电影数据,并导出成excel表格以供参考。 注意:请勿使用该技术获取网络上敏感、隐私、非公开等数据。 1电影推荐(爱情类): 假如爱有天意:缘,妙不可言,或许一切早已注定。 灵魂摆渡·黄泉:为情甘愿赴死,为爱执守千年。 你的名字:世上所有的相遇都是久别重逢。 1电影推荐(亲子类): 机器人总动员:孩子看到的是友情,大人看到的是爱情。很有爱的一部动画片。 寻梦环游记:死亡并不是终点,被人忘却才是真正的 1死亡 。 1电影推荐(悬疑类): 小岛惊魂 异次元骇客 恐怖游轮 二、准备 2.1 安装库 requests:网络数据请求并获取,安装方式:pip install requests threading:多线程处理(数据量比较大),Python自带库,无需安装。 json:数据处理,Python自带库,无需安装。 pandas:将数据导出成excel表格,安装方式:pip install pandas 2.2 原理介绍 1、先通过requests库,通过时光网自带的电影数据API接口,获取到指定的电影数据。 2、将获取到的数据经过简单的加工,通过pandas库存入到excel表格中。 三、实例 3.1 完整代码 # Encoding: utf-8 # Author: furongbing # Date: 2021-11-19 20:54 # Project name: FrbPythonFiles # IDE: PyCharm # File name: Mtime import requests import pandas as pd from threading import Thread import time import json # 模块说明: """ 从时光网上按年代获取指定年份电影的数据 """ # 更新日志: """ 1、2021-11-19: a、完成初版 """ # 待修改: """ """ # 请求头数据 headers = {"Accept": "application/json, text/plain, */*", "Accept-Encoding": "gzip, deflate", 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie': '_tt_=FB8A3FAD4704D42543B7EC121C2565AA; __utma=196937584.1082595229.1637326918.1637326918.1637326918.1; __utmz=196937584.1637326918.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); Hm_lvt_07aa95427da600fc217b1133c1e84e5b=1637241042,1637326637,1637374129; Hm_lpvt_07aa95427da600fc217b1133c1e84e5b=1637374170', 'Host': 'front-gateway.mtime.com', 'Origin': 'http://film.mtime.com', 'Referer': 'http://film.mtime.com/', 'User-Agent': 'Mozilla/5.0 (Windows...

在C#程序中注入恶意DLL的方法详解-CDN-服务器-VPS优惠/促销/测评-撸主机评测

在C#程序中注入恶意DLL的方法详解

一、背景 前段时间在训练营上课的时候就有朋友提到一个问题,为什么 Windbg 附加到 C# 程序后,程序就处于中断状态了?它到底是如何实现的?其实简而言之就是线程的远程注入,这一篇就展开说一下。 二、实现原理 1. 基本思路 WinDbg 在附加进程的时候,会注入一个线程到 C# 进程 中,注入成功后,会执行一个  1DbgBreakPoint()  函数,其实就是  1int 3  ,这时候 CPU 就会执行 3 号中断函数,将当前进程的所有线程进行暂停,文字不好理解的话,画一个图大概就是这样。 口说无凭,接下来用上一个简单案例演示一下。 2. 案例演示 首先写一个简单的 C# 程序,不断的输出时间和标号,代码如下:     internal class Program     {         static void Main(string[] args)         {             for (int i = 0; i < 10000; i++)             {                 Console.WriteLine($"{DateTime.Now},i={i}");                 Thread.Sleep(1000);             }         }     } 把程序跑起来后,使用 WinDbg 附加,你可以发现 Command 自动切换到了  18  号线程,通过 k 命令可以看到最上面是一个 int 3 中断,截图如下: 这里就有一个想法了,既然 WinDbg 可以注入,为何我的程序就注入不得呢?既然我的程序可以注入,那就可以做一些我想做的事情。 3. 自定义注入 有了自定义注入的想法,接下来的实现步骤大概是这样的。 注入一个线程到 C# 程序中。 让程序加载一个 dll 文件。 在 dll 中做一些我想做的业务逻辑。 接下来新建一个 C++ 的动态链接库,在 DLLMain 入口函数的   1DLL_PROCESS_ATTACH  事件中写一个 printf 函数,如果在 C# 程序中输出来了,就算成功注入了,参考代码如下: #include <Windows.h> #include <stdio.h> BOOL APIENTRY DllMain(HMODULE hModule,  DWORD  ul_reason_for_call,  LPVOID lpReserved ) {  switch (ul_reason_for_call)  {  case DLL_PROCESS_ATTACH:   printf(" 总部,总部,我已经成功打入内部!ul_reason_for_call=%d\n ", ul_reason_for_call);   break;  }  return TRUE; } 要被加载的  1MyInject.dll  已经构建完毕,接下来就用 Win32 API 的  1CreateRemoteThread()  实现远程注入,但注入之前需要做三件事情。 获取 C# 程序的 进程句柄。 在 C# 进程中申请一块内存空间,存放加载的 path 路径。 调用 LoadLibraryW 函数在 C# 进程中实现 dll 加载。 过程有了,新建一个 C++ 控制台程序 ...

食之无味?App Startup 可能比你想象中要简单-CDN-服务器-VPS优惠/促销/测评-撸主机评测

食之无味?App Startup 可能比你想象中要简单

1. 认识 AppStartup 1.1 App Startup 解决了什么问题? App Startup 是 Google 提供的 Android 轻量级初始化框架: 优点:使用 App Startup 框架,可以简化启动序列并显式设置初始化依赖顺序,在简单、高效这方面,App Startup 基本满足需求。 不足:App Startup 框架的不足也是因为它太简单了,提供的特性太过简单,往往并不能完美契合商业化需求。例如以下特性 App Startup 就无法满足: 缺乏异步等待: 同步等待指的是在当前线程先初始化所依赖的组件,再初始化当前组件,App Startup 是支持的,但是异步等待就不支持了。举个例子,所依赖的组件需要执行一个耗时的异步任务才能完成初始化,那么 App Startup 就无法等待异步任务返回; 缺乏依赖回调: 当前组件所依赖的组件初始化完成后,未发出回调。 1.2 App Startup 如何实现自动初始化? App Startup 利用了 ContentProvider 在应用启动的时候初始化的特性,提供了一个自定义 ContentProvider 来实现自动初始化。很多库都利用了 ContentProvider 的启动机制,来实现无侵入初始化,例如 LeakCanary 等 使用 AppStartup 还能够合并所有用于初始化的 ContentProvider ,减少创建 ContentProvider,并提供全局管理。 1App Startup 示意图 详细的源码分析下文内容。 2. App Startup 使用方法 这一节,我们来总结 App Startup 的使用步骤。 2.1 基本用法 1、添加依赖 在模块级  1build.gradle  添加依赖: 1模块级 build.gradle 1implementation "androidx.startup:startup-runtime:1.0.0" 2、实现 Initializer 接口 1Initializer  接口是 App Startup 定义组件接口,用于指定组件的初始化逻辑和初始化顺序(也就是依赖关系),接口定义如下: 1、create(…) 初始化操作: 返回的初始化结果将被缓存,其中  1context  参数就是当前进程的  1Application  对象; 2、dependencies() 依赖关系: 返回值是一个依赖组件的列表,如果不需要依赖于其它组件,返回一个空列表。App Startup 在初始化当前组件时,会保证所依赖的组件已经完成初始化。 1Initializer.java 12345678910public interface Initializer&lt;T&gt; {     // 1、初始化操作,返回值将被缓存??     @NonNull     T create(@NonNull Context context);     // 2、依赖关系,返回值是一个依赖组件的列表     @NonNull  ...

大小端存储是什么鬼?-CDN-服务器-VPS优惠/促销/测评-撸主机评测

大小端存储是什么鬼?

大小端存储的划分是为了解决长度大于一个字节的数据类型内容在存储地址上以不同顺序分布的问题。 比如16位的short整形,32位的int整形,64位的long整形,它们在存储地址上,其实最小的划分单位是字节,那么高低位的字节排列在从低到高的存储地址上有什么规定呢? 如果最高位的字节数据存在最低地址上,而次高位的字节数据按次序排列在次低的地址上,那么这种存储方式就叫 1大端存储 。 如果最低位的字节数据存在最低地址上,而次低位的字节数据按次序排列在次低的地址上,那么这种存储方式就叫 1小端存储 。 那么怎么去判断当前系统属于大端存储还是小端存储呢? 判断方法一:利用单字节类型强制转换多字节类型变量获取返回值比较 下面让我们看看实例代码: 1234567891011121314151617181920212223#include &lt;iostream&gt; using namespace std; bool IsSystemBigEndianStorage() {     short src = 1;     char comp = (char)src;     return (comp == 0); } int main() {     bool ret = IsSystemBigEndianStorage();     if (ret) {         cout &lt;&lt; "big endian" &lt;&lt; endl;     } else {         cout &lt;&lt; "small endian" &lt;&lt; endl;     }     return 0; } 首先把单字节范围内的数据值(比如1)赋给更大长度的类型(比如2个字节的short)变量 1src ,然后利用单字节长度的数据类型(char)强制转换变量 1src ,会在内存空间上截取变量 1src 对应存储在最低地址的一个字节数据并返回。 1234567bool IsSystemBigEndianStorage() {     short src = 1;     char comp = (char)src;     return (comp == 0); } 可以看到变量src的高位字节数据为0,低位字节数据为1,各不相同。 如果 1(char)src 的返回值等于0,就表示存储在最低地址的字节数据等于高位字节数据0x00,属于 1大端存储 ,否则表示属于...

Linux常用基础命令三-CDN-服务器-VPS优惠/促销/测评-撸主机评测

Linux常用基础命令三

一、ln 软链接 软链接也称为符号链接,类似于 windows 里的快捷方式,有自己的数据块,主要存放 了链接其他文件的路径。 在查看文件目录中,软连接是以‘l’开头 创建软链接 ln -s [原文件或目录或文件名] [软链接名] —–(功能描述:给原文件创建一个软链接) 删除软链接 rm -rf 软链接名 注意: 而不是 rm -rf 软链接名/ ,如果使用 rm -rf 软链接名/ 进行删除,会把软链接对应的真实目录下内容删掉 ,目录并不会删除 拓展:硬链接,不加-s ln [原文件或目录或文件名] [软链接名] —–(功能描述:给原文件创建一个软链接) 二、history查看已经执行过历史命令 基本语法 history ——(功能描述:查看已经执行过历史命令) 查询近n条历史指令 history n 清空历史指令 history -c 三、时间命令 获取系统当前时间 date 格式化语法 (1)date (功能描述:显示当前时间) (2)date +%Y (功能描述:显示当前年份) (3)date +%m (功能描述:显示当前月份) (4)date +%d (功能描述:显示当前是哪一天) (5)date “+%Y-%m-%d %H:%M:%S” (功能描述:显示年月日时分秒) %s 代表是时间戳 %S 代表秒 显示前一天 date -d ‘1 days ago’ (功能描述:显示前一天时间) 显示明天 date -d ‘-1 days ago’ (功能描述:显示明天时间) 显示前一个小时 date -d ‘1 hours ago’ (功能描述:显示前一天时间) 显示后一个小时 date -d ‘-1 hours ago’ (功能描述:显示前一天时间) 设置系统时间 date -s ”2032-01-01 12:00:00 ” 查看日历 cal —当前月 cal -3 —-当月、前后一个月 查看本年度日历 cal -y 查看某一年的全年日历 cal 2023 —-直接命令后面加年份 调整日历的星期显示 cal -m ——每月周一排列第一位 cal -s —–每月的周日排第一位 同步时钟时间...

登录

找回密码

注册