
本文介绍GitLab CIPipeline框架,帮助大家理解其架构,以设计适合自己的 CI 环境。
GitLab CI是 GitLab 内置的功能,在你安装好 GitLab 之后,即同时安装了 GitLab CI。
>
开发网络爬虫应该选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector还是其他的?这里按照我的经验随便扯淡一下:上面说的爬虫,基本可以分3类:1分布式爬虫:Nutch
2JAVA单机爬虫:Crawler4j、WebMagic、WebCollector
3 非JAVA单机爬虫:scrapy
第一类:分布式爬虫
爬虫使用分布式,主要是解决两个问题:
1)海量URL管理
2)网速
现在比较流行的分布式爬虫,是Apache的Nutch。但是对于大多数用户来说,Nutch是这几类爬虫里,最不好的选择,理由如下:
1)Nutch是为搜索引擎设计的爬虫,大多数用户是需要一个做精准数据爬取(精抽取)的爬虫。Nutch运行的一套流程里,有三分之二是为了搜索引擎而设计的。对精抽取没有太大的意义。也就是说,用Nutch做数据抽取,会浪费很多的时间在不必要的计算上。而且如果你试图通过对Nutch进行二次开发,来使得它适用于精抽取的业务,基本上就要破坏Nutch的框架,把Nutch改的面目全非,有修改Nutch的能力,真的不如自己重新写一个分布式爬虫框架了。
2)Nutch依赖hadoop运行,hadoop本身会消耗很多的时间。如果集群机器数量较少,爬取速度反而不如单机爬虫快。
3)Nutch虽然有一套插件机制,而且作为亮点宣传。可以看到一些开源的Nutch插件,提供精抽取的功能。但是开发过Nutch插件的人都知道,Nutch的插件系统有多蹩脚。利用反射的机制来加载和调用插件,使得程序的编写和调试都变得异常困难,更别说在上面开发一套复杂的精抽取系统了。而且Nutch并没有为精抽取提供相应的插件挂载点。Nutch的插件有只有五六个挂载点,而这五六个挂载点都是为了搜索引擎服务的,并没有为精抽取提供挂载点。大多数Nutch的精抽取插件,都是挂载在“页面解析”(parser)这个挂载点的,这个挂载点其实是为了解析链接(为后续爬取提供URL),以及为搜索引擎提供一些易抽取的网页信息(网页的meta信息、text文本)。
4)用Nutch进行爬虫的二次开发,爬虫的编写和调试所需的时间,往往是单机爬虫所需的十倍时间不止。了解Nutch源码的学习成本很高,何况是要让一个团队的人都读懂Nutch源码。调试过程中会出现除程序本身之外的各种问题(hadoop的问题、hbase的问题)。
5)很多人说Nutch2有gora,可以持久化数据到avro文件、hbase、mysql等。很多人其实理解错了,这里说的持久化数据,是指将URL信息(URL管理所需要的数据)存放到avro、hbase、mysql。并不是你要抽取的结构化数据。其实对大多数人来说,URL信息存在哪里无所谓。
6)Nutch2的版本目前并不适合开发。官方现在稳定的Nutch版本是nutch221,但是这个版本绑定了gora-03。如果想用hbase配合nutch(大多数人用nutch2就是为了用hbase),只能使用090版本左右的hbase,相应的就要将hadoop版本降到hadoop 02左右。而且nutch2的官方教程比较有误导作用,Nutch2的教程有两个,分别是Nutch1x和Nutch2x,这个Nutch2x官网上写的是可以支持到hbase 094。但是实际上,这个Nutch2x的意思是Nutch23之前、Nutch221之后的一个版本,这个版本在官方的SVN中不断更新。而且非常不稳定(一直在修改)。
所以,如果你不是要做搜索引擎,尽量不要选择Nutch作为爬虫。有些团队就喜欢跟风,非要选择Nutch来开发精抽取的爬虫,其实是冲着Nutch的名气(Nutch作者是Doug Cutting),当然最后的结果往往是项目延期完成。
如果你是要做搜索引擎,Nutch1x是一个非常好的选择。Nutch1x和solr或者es配合,就可以构成一套非常强大的搜索引擎了。如果非要用Nutch2的话,建议等到Nutch23发布再看。目前的Nutch2是一个非常不稳定的版本。
第二类:JAVA单机爬虫
这里把JAVA爬虫单独分为一类,是因为JAVA在网络爬虫这块的生态圈是非常完善的。相关的资料也是最全的。这里可能有争议,我只是随便扯淡。
其实开源网络爬虫(框架)的开发非常简单,难问题和复杂的问题都被以前的人解决了(比如DOM树解析和定位、字符集检测、海量URL去重),可以说是毫无技术含量。包括Nutch,其实Nutch的技术难点是开发hadoop,本身代码非常简单。网络爬虫从某种意义来说,类似遍历本机的文件,查找文件中的信息。没有任何难度可言。之所以选择开源爬虫框架,就是为了省事。比如爬虫的URL管理、线程池之类的模块,谁都能做,但是要做稳定也是需要一段时间的调试和修改的。
对于爬虫的功能来说。用户比较关心的问题往往是:
1)爬虫支持多线程么、爬虫能用代理么、爬虫会爬取重复数据么、爬虫能爬取JS生成的信息么?
不支持多线程、不支持代理、不能过滤重复URL的,那都不叫开源爬虫,那叫循环执行>
十大好用的项目管理软件:1一站式研发项目管理软件PingCode;2通用型项目协作工具Worktile;3开源项目管理软件Redmine;4免费项目管理软件Trello;5无代码项目管理软件Monday;6IT项目追踪管理工具Jira;7小团队项目管理软件Teambition;8适用于跨国团队的项目管理软件Clickup;9工程项目管理软件Oracle Primavera;10为mac打造的项目管理软件OmniPlan。
一、国内外10款优秀的项目管理软件对比1一站式研发项目管理软件PingCode
国内发展最快的研发项目管理软件,PingCode 在2021年入选36氪:项目管理软件金榜-研发项目管理榜单 TOP 1;2022年被选入国内年度口碑产品 TOP 36。适用于十几人到千人规模的的团队。
PingCode 是一款覆盖研发全生命周期的项目管理系统,被广泛用于需求收集、需求管理、需求优先级、产品路线图、项目管理(敏捷/kanban/瀑布)、测试管理、缺陷追踪、项目文档管理、效能度量、目标管理等领域。并且集成了github、gitlab、jinkens、企微、飞书等主流工具,也就是说我们能在需求下面关联代码,关联集成信息,在飞书查看通知等。
软件优势:
产品开箱即用,简单易上手,不需要像Jira 那样经过好几月的培训,以及专门的系统管理专家配置系统才可使用;
为25人以下团队免费提供基础版本,收费版价格仅为国外产品Jira的30%-40%;
国产化,支持信创、麒麟等;
支持私有部署、定制化以及saas等购买方式;
口碑、服务支持好;
软件缺点:
暂未提供多语言版本;
PingCode官网
2通用型项目协作工具Worktile
国内市场占有率最高的项目管理软件之一。被广泛用于电商、市场活动、律所项目、生产制造、行政、财务、设计、工程、教育、科研等几乎包含所有类型的项目。
在功能上Worktile 是一个工具集合,它具备OKR目标管理、项目管理、项目集管理、项目计划、项目风险、项目成本管理、企业网盘、审批、简报等能力。并且具备强大的自定义能力,能够配置出符合各种项目团队的流程、表单、字段、数据报表,以及具备丰富的模板市场。
软件优势:
能够满足绝大部分类型的项目管理需求,自定义能力非常强,可以搭建适合团队的项目模板和管理流程;
开箱即用,上手简单,价格相对便宜;
能够很大程度帮助团队节省成本,因为它是一个工具集合能够同时满足项目、OKR、网盘、OA等需求;
支持saas、私有部署、定制等购买方案;
为10人以下团队提供基础的免费版本
软件缺点:
在软件项目管理的专业度上不如 PingCode 等垂直领域的产品;
Worktile官网
3开源项目管理软件Redmine
Redmine是一款开源的项目管理软件,集成了缺陷跟踪工具,是一款基于web的项目管理工具。其特点是支持多项目和子项目,可以在上面新建多个项目,在一个平台上管理多个项目。由于这款软件是一款开源的软件所以用户可以对软件进行二次编程这样满足了不同公司和项目的发展需要,保证了差异性和扩展性。
软件优点:
开源免费的;多语言支持(已经内置了简体中文);支持多种数据库,如MySQL、SQLite、PostgreSQL;功能丰富,如用户角色控制、问题追踪、自动日历和甘特图绘制、Wiki形式的文档撰写和文件管理,还可以集成其他版本管理系统和BUG跟踪系统,例如Git、SVN等等。
软件缺点:
成本更高:开源软件虽然可以节约一定的开发成本,但却会带来非常高的开发维护成本。我们曾算过一笔账:购买一个在线项目管理系统的成本是约是15万/年(100人团队);开源项目管理系统二开最少需要一个专门的程序员来开发+长期维护,而一个程序员的薪资至少在20W/年,但二开前期人员投入一定不止1个人。
功能有限,系统一直处于“能用”的状态;
安全性可能更低:当软件应用程序的源代码公开可用时,其安全性变得更加脆弱。
官网: >
4免费项目管理软件Trello
Trello 以其简单易用而闻名,非常适合需要易于理解的基本项目管理工具的小型团队。自从被Atlassian 收购之后就免费开放了大部分功能,只有少量高级功能收费。
Trello是典型的看板型项目管理软件,提供一个像是便利墙贴的大看板,我们可以在上面贴上所有的任务、琐事、资料,然后一条一条地依据进度或分组自由排列好,清楚地呈现出整个项目的结构, Trello 可以让你一下子就把琐碎事情也变得井然有序。
软件优点:
简单易上手,开箱即用
绝大部分功能都是免费的
提供丰富的多语言版本
提供丰富的集成软件,当然都是国外的
软件缺点:
在国内不设办事处,不提供原厂的服务支持;
国内访问龟速
官网: >
5无代码项目管理软件Moday
这是由色列著名科技企业研发的一款项目管理软件,2020年曾在专业的软件点评网站G2排第二。Monday可以让中小型企业可以在无代码的环境中构建自定义工作流应用程序以运行项目,流程和日常工作。它能够被用于设计、资讯科技、软件研发、销售、文档、法律、HR等众多的项目类型管理。
软件优点:
优秀的界面和 *** 作体验
适用于大多数项目类型
在全球有众多的知名团队客户
无代码/低代码方式能够满足团队个性化管理需求
软件缺点:
无法完成Scrum等一些对专业、细节要求高的项目管理;
更适合10人以下的小型团队协作,无法满足中大型团队的需求;
官网: >
6IT项目追踪管理工具Jira
全球最早的软件研发过程管理工具之一,但近些年对国内用户的政策并不友好,特别是停售 Server 版。但其仍是全球最知名的IT项目管理软件之一。
IRA 是工程师用来跟踪和管理任务的软件开发工具。您可以将它用于敏捷和瀑布项目管理,以跟踪错误、功能和其他工作项。您还可以将 JIRA 配置为与许多服务管理工具一起使用,使其成为管理任务的多功能工具。
软件优点:
更好的工作流程可见性;
时间跟踪帮助节省资源
提高生产力
为10人以下团队提供基础免费版本;
强大的第三方集成
软件缺点:
国内不支持私有部署版本,只提供saas版本,但国内又不设服务器;
购买成本高昂,百人左右团队动辄上百万;
新人上手使用成本高,需要长达几个月的培训以及专业的系统配置人员才可使用;
访问速度慢
官网: >
7小团队项目管理软件 Teambition
钉钉旗下的一款项目管理软件,更适用于小型团队项目协作,被广泛用于适合产品、研发、设计、市场、运营、销售、HR等各类团队。Teambition 以项目和任务的可视化管理来支撑企业团队协作,含任务、文档、文件、统计、甘特图等丰富应用。
软件优点:
承诺个人版本永不收费;
优秀的产品界面和 *** 作体验;
工具融合,打破信息孤岛,集成了项目管理、文档管理、资源管理、流程管理、沟通协作等工具,支持不同的业务场景;
深度嵌入钉钉,对同时使用钉钉的用户来说非常友好;
软件缺点:
Teambition核心在任务及项目管理,为了追求的“简单易用”,牺牲了项目目标和分层分级权限管理——整体适用场景较为局限,难以实现项目的闭环管理(缺少目标、网盘管理能力)。
自定义能力不强,无法很好的满足团队的个性化需求;
无法与企业微信、飞书等外部工具打通;
官网: >
8适用于跨国团队的项目管理软件Clickup
ClickUp 是近些年一个从国外火到国内的产品,是一个All-In-One 的项目管理应用。和其他产品从单一功能切入不同,ClickUp 拥有强大的功能组合和易用性,包含文档、即时通讯、OKRs、销售自动化、图形设计、视频、白板等几乎所有东西。与国内的飞书、Worktile其实有些类似。
软件优点:
一个软件满足大部分企业管理需求,避免使用多个工具增加成本和造成数据割裂;
功能丰富的免费版本
支持自定义仪表盘(仪表盘在国外使用比较广泛)
软件缺点:
强大、丰富的功能也为团队带来了较高的学习成本;
国内不设团队,访问速度慢,不提供原厂服务支持;
官网: >
9工程项目管理软件Oracle Primavera
Oracle Primavera (P6),前身P3(DOS时代)称得上是项目管理工具鼻祖。P6主要用于项目进度计划编制、资源预测、实际进度跟踪。能支撑企业级项目进度管理方案,适合投资百亿级别的复杂大项目。在工业领域应用较为广泛。
软件优点:
P6 软件比较切合工程的实际,可 *** 作内容多,功能完备。特别是在资产密集型行业中,Oracle Primavera P6 项目管理软件是强大、可靠和易用的解决方案,用于对项目、项目群及项目组合进行优先排序、计划、管理和执行。
软件缺点:
与现在许多工程项目管理软件套件相比,P6 没有合同管理,安全管理,环境管理等新功能。尽管 P6 的项目管理功能十分强大,全面,但是 *** 作比较复杂,相关人员一般需要经过专门培训才能很好的运用 P6 实现工程项目管理;除此以外价格也较高。
官网: >
10为mac打造的项目管理软件OmniPlan
OmniPlan是适用于 macOS 的最流行的原生 Mac 桌面项目管理应用程序之一。它来自 Omni
Group,该团队创建了出色的图表软件Omnigraffle,这是Mac上 Microsoft Visio的流行替代品。Omni Group 产品专为Mac 等Apple 设备制造,没有 Windows 版本。
软件优点:
OmniPlan比 Microsoft Project 更易于使用,可以导入 MS Project 文件(尽管最多只能到 MS Project 2016)并且在 Mac 上看起来很棒,因为它是专为 macOS 设计的。它使用清晰的甘特图布局,让你非常清楚地了解需要完成的工作。你还可以下载并试用 OmniPlan for Mac的全功能免费 14 天试用版。
软件缺点:昂贵的前期成本。
官网: >
以上就是关于10大项目管理软件的全部介绍,希望对大家的项目管理工具选型有所帮助。
1 checkout()、checkoutscm、git是三个不同的概念,有各自的作用和用法。
2 checkout()是Jenkins Pipeline中的一个步骤,用于将Jenkins的工作空间(workspace)更新到指定的版本或分支,以便进行后续的构建、测试等 *** 作。
3 checkoutscm是Jenkins中的一个插件,可以实现对多个源代码管理工具(如Git、SVN等)进行版本控制和更新。
4 Git是一种分布式的版本控制系统,可以用于对代码库进行版本管理、多人协作等 *** 作,与Jenkins的checkout()和checkoutscm可以结合使用,实现自动化构建和持续集成。
原文链接
前面介绍了,在PC上,3D渲染指令在被传递到GPU之前所经历的各个阶段,其中Command Processor一块内容由于太长,只是占了个位,在本文中要开始对这一块的内容做一个稍微详细一点的介绍,当然,由于篇幅有限,也没有办法完全覆盖其所有细节。
Command Buffer的整个处理过程都是跟内存相关的,不管是通过PCI总线访问的系统内存还是local显存等,因此如果我们要按照管线上的顺序来对内容进行陈述,就必须在介绍Command Processor之前先介绍一部分内存相关的内容。
由于GPU的内存子系统是为特殊的目的而设计,因此跟CPU或者其他硬件的常规内存子系统有所不同,主要有如下两个区别:
事实上是,GPU在带宽上的大幅提升,其代价就是时延的增加。而这也是基于实际需要而导致的,GPU对于吞吐量throughput的重视程度要高于时延,有时延没关系,我们可以干点别的。
GPUs don’t have your regular memory subsystem – it’s different from what you see in general-purpose CPUs or other hardware, because it’s designed for very different usage patterns There’s two fundamental ways in which a GPU’s memory subsystem differs from what you see in a regular machine:
这些就是我们需要知道的所有有关GPU内存的内容,另外还有一个关于DRAM(Dynamic Random Access Memory)的重要内容:DRAM芯片是按照2D网格形式组织的,不论是从物理上还是逻辑上来看,都是如此。网格就意味着存在着横竖的行列线条,在这些线条相交的位置就是一个晶体管与电容。这里的重点是,DRAM中某个位置的地址实际上实惠被分割成行地址跟列地址的,而DRAM在进行读写的时候,实际上是会将某一行上的所有列的内容数据都读取出来(缓存行,cache line)。这也就意味着如果想要读取的一票数据正好处于DRAM上的同一行的话,其访问速度要远远高于不在同一行的情况。在目前看来,这个结论好像没什么作用,不过后面要介绍的内容就会逐渐凸显这一点的重要性,如果用前面介绍的GPU/CPU的数据来说明的话,那就是,如果我们只是读取内存上有限的几个字节的话,是很难达到上述的巅峰数值的,比如说,如果你希望以满带宽的方式进行内存访问,那么一次性访问的内容最好对应于DRAM中的一个整行。
从图形程序员的角度来看,PCIe硬件的内容好像没什么意思,而实际上GPU硬件架构同样没啥意思。不过当图形程序运行缓慢的时候,我们就不得不硬着头皮去了解底层的实现方式以期定位到瓶颈,之后呢就找专业的同学帮忙来解决这个问题。否则可能会导致如下的局面,CPU直接访问显存以及GPU上的寄存器,而GPU则直接访问CPU主存,之后由于两者之间超高的访问延迟(因为是跨芯片数据访问),等程序运行完一帧大概是一周以后了(笑)。内存带宽巅峰数值8 GB/s实际上是理论值,对应的是16路的PCIe 20连接时的总带宽,而实际上运行时的数值大概是这个数值的一半或者三分之一,这都是可用的数值比例。不像早期的标准比如AGP,现在的GPU是点对点的对称连接——即带宽数值指的是双向数值,AGP标准则是不对称的,从CPU到GPU的传输带宽要比反过来要高一些。
关于内存,这里还有一点需要介绍清楚。现在我们有两类内存,即local显存与映射后的系统内存。其中一个需要花费一天的时间抵达北极,而另一个则需要花费一周的时间通过PCI总线抵达南极,你会选择哪条路?
最简单的解决方案:额外搭建一条地址线路告诉我们该走哪条路。这个方案很简单,但是已经经过很多次的验证,十分有效。如果我们的硬件(比如部分游戏主机或者手机),采用的是统一的内存架构(unified memory architecture),那么我们没得选,只有一个内存,因此只有一条路可以走。如果你想把事情做得精致一点,那么可以考虑添加一个MMU(内存管理单元,memory manage unit),用于分配一块虚拟地址空间,可以让你玩出一些花样,比如像是将一些频繁访问的贴图资源放置在显存中(因为更快),而其他的资源则放置在系统内存中,之后剩下的大部分资源则直接不做映射,躺在硬盘里(在需要的时候从硬盘读取,当然这个超慢,如果将内存访问时间拉长到一天,那么从HD硬盘读取差不多就相当于需要50年)。
一个MMU允许在显存不足的时候,以不进行实际的拷贝的前提对显存做磁盘整理。此外还可以使得多个进程对GPU的共享变得更为容易。MMU很有必要,不过不确定是否所有GPU都有这么个东西。
此外,还有一个DMA(Direct Memory Access)引擎可以在不占用3D硬件/Shader Cores的前提下进行内存拷贝。通常来说,这个是用于在系统内存与显存之间的拷贝(双向),不过实际上也可以用于显存之间的拷贝(如果要进行VRAM磁盘整理的话,这个功能很有用),但是不能用于系统内存之间的拷贝(因为这个是GPU中的功能单元,如果需要系统内存拷贝,直接在CPU做就完了,不要专门通过PCIe传输到GPU上来进行,这太蠢了)。
Update : 这里画了一张图来给出更进一步的细节 – GPU有多个内存控制器,每个控制器控制着多个内存banks,这个是通过前方的一个较粗的hub来完成的
这里对所有的内容进行梳理,我们在CPU上有一个command buffer,有一个PCIe host interface(PCIe主机接口),CPU通过主机接口来与GPU通信,并将其地址写入到寄存器中。之后在GPU中有相应的逻辑将这个地址通过一个load指令来读取数-如果是系统内存的话,那么数据会通过PCIe传送过来,而如果我们是将command buffer放置在显存中的话,那么KMD会直接架起一个DMA传输进行数据输送。不论是上面的哪种情况,都不需要消耗CPU资源,也不需要消耗GPU上的shader core资源。之后我们就能够在显存上拿到传送过来的数据的拷贝。整条路径基本上就打通了,下面开始进入commands内容介绍。
前面提到,GPU目前的情况是带宽高,延迟高。而应对这个情况的一个方案是执行大量的独立线程。不过由于我们只有一个command buffer,因此需要各个线程按顺序从buffer中将指令读取出来(因为command buffer中包含的状态切换以及渲染指令需要按照正确的顺序执行),因此这里给出的一个较好的解决方案是,设定一个足够大的buffer,并按照一个较大的跨度提前获取需要执行的指令来避免hiccups(性能消耗上的一个尖刺)。
从这个buffer开始,就正式进入了command处理阶段,其本质上是一个状态机,会按照硬件指定的格式来对command进行解析。部分command用于处理跟2D渲染相关的 *** 作(除非专门为2D事务专门设立一个单独的command processor,在这种情况下,3D command processor就不会与这套command产生任何交集),不论是哪种情况,在现代GPU上都仍然存在在隐藏的专属2D command硬件,就像是在这套模具上的某个用于处理text mode(字体模式),4-bit/pixel bit-plane modes,平滑滚动以及其他类似事务的VGA芯片一样。部分command会将面片数据传输到3D shader管线,这个细节后面再讲;部分command会进入到3D shader管线,但是不进行任何绘制处理(情况有很多种,后面再介绍)。部分command用于实现状态切换,从程序员的角度来说,可以直接将状态切换看成是变量修正,其实现逻辑是相似的。不过由于GPU是一个大型的并行处理计算器,因此不能简单的在一套并行系统中对全局变量进行修正并奢望不发生任何问题,关于状态切换有很多套常用的实现方案,而基本上所有的芯片都会根据状态的不同选择不同的实现方案:
从上面可以看到,在应用层面看起来就像是修正了一个变量参数一样简单的 *** 作,在实际上是进行了大量的处理以避免性能消耗的降低。
最后要介绍的一部分指令,是专门用于处理CPU/GPU之间同步的指令。
通常来说,这类指令的格式是“如果发生了X事件,那么执行Y逻辑”。这里先来介绍一下Y逻辑执行部分。对于Y而言,这里有两种执行选项:第一种是推送模型,这种模型中GPU会主动发指令告诉CPU可以做什么事情了 (“Oi! CPU! I’m entering the vertical blanking interval on display 0 right now, so if you want to flip buffers without tearing, this would be the time to do it!”);第二种是拉取模型,GPU将一些关键信息记录下来,之后CPU在合适的时机发消息获取相关数据状态 (“Say, GPU, what was the most recent command buffer fragment you started processing” – “Let me check… sequence id 303”)前者通常是采用中断的方式执行, 因为中断的高消耗,因此主要用于处理一些不常用的高优先级事件;后者的实现需要用到一些CPU可见的GPU寄存器,以及当某个事件发生时,将数据从command buffer中写入到寄存器的方法。
比如我们这里有16个这样的寄存器,之后将 currentCommandBufferSeqIdd 写入到寄存器0。之后为每一个提交到GPU(KMD)的command buffer分配一个序号,并在每个command buffer的开头,添加一个处理逻辑:当抵达这个command buffer的某个位置之后,开始将数据写入到寄存器0。那么现在我们就知道了GPU当前正在处理哪个command buffer,且command processor处理command是严格按照顺序进行的,即如果command buffer中的第一个command的序号是303的话,那么前面的所有指令包括302就都已经被执行了,因此这里可以将这些指令对应的空间重新收回用作他用了。
下面再来看下触发事件X,上面说到的“抵达这个command buffer的某个位置”实际上就是一个X事件,且是其中最简单但是也非常有用的事件;其他的事件还包括“在抵达command buffer的某个位置之前,所有shader完成了从批处理batch中而来的所有贴图读取 *** 作”(用于在某点释放所有的贴图、RT内存),“所有active RT/UAV的渲染过程已经结束”(用于确保当前需要取用的贴图是否有效)等等。
这些 *** 作就是我们平常所说的“fences”。挑选写入到状态寄存器的数值的方法有很多种,但是原文作者认为唯一稳健的一种就是使用一个顺序计数器来完成,不过没有提及具体的原因(说可能会写在其他非本系列的blog中。。)
到目前为止,就已经介绍完了从GPU向CPU的同步机制,但是这并不是全部的内容,目前还欠缺了一块GPU内部的数据同步机制(并行计算)。还是用前面的RT的例子来说明,只有当所有的渲染 *** 作都完成(除此之外还有一些其他的处理步骤)以后才能将RT用作贴图。这个实际上对应的是一个等待类型的指令:等到寄存器M中的数值等于N为止(也可以是其他的指令比如比较指令等)。在这种情况下,就可以保证在提交一个新的batch之前完成RT的同步,同时还可以构建一个纯GPU的flush *** 作。现在GPU之间的数据同步也完成了。在DX11的Compute Shader中的另一种更优秀的同步机制引入之前,这套同步机制就是GPU上唯一的一套同步机制了,对于普通的渲染来说,已经足够使用。
另外,如果在CPU上能实现对GPU寄存器的写 *** 作,那么按照同样的方法,也可以实现CPU到GPU的同步——CPU提交一个partial command buffer,这个buffer包含了对某个特定数值的等待 *** 作,当等待条件达成时,CPU将特定数值写入到GPU的寄存器中。这套逻辑可以用于实现D3D11风格的多线程渲染流程,在这个流程中可以提交一个引用着正被CPU锁定状态的VB/IB(可能正处于另一个线程的写 *** 作中)的batch到GPU。在这种情况下,只需要在正式渲染开始之前等待锁 *** 作解除即可。如果GPU在command buffer中根本就没有走到预设的指令位置,那么这里的这个等待 *** 作就相当于无效的,否则就是花点时间等待数据锁定状态解除了。实际上我们可以在不需要CPU对寄存器的写权限的前提下完成这套方案,只需要能对之前已经提交到command buffer的数据进行修正就行了(只要在command buffer中有一个“jump”指令)。
当然,这里不必一定需要使用上面提到的寄存器设置、等待模型;对于GPU之间的同步,可直接使用一个“RT barrier”指令来确保RT的使用是安全的。不过原文作者认为寄存器设置模型效果会更好一点(将尚在使用中的资源情况报告给CPU,同时完成GPU之间的同步),一石二鸟。
Update: 这里增加了一个流程图,情况看起来比较复杂,后面会注意精简相关细节。基本思想是,command processor在前面哟一个FIFO,之后进入command解码逻辑,指令的执行是通过多个与2D单元,3D渲染单元以及shader单元存在交互的block完成的。之后有一个block用于处理同步/等待等指令(这些指令前面说过,有着可见的寄存器),这里还有一个用于处理command buffer的jump/call指令(改变当前需要获取的FIFO的地址)的单元。所有派发任务的单元都会发回一个指令完成的事件从而让我们知道比如贴图已经不再使用了等信息。
sklearnpipelinePipeline
在Sklearn当中有三大模型:Transformer 转换器、Estimator 估计器、Pipeline 管道
Transformer有输入有输出,同时输出可以放入Transformer或者Estimator 当中作为输入。
y_predict 是估计器的输出模型,估计器输出无法再放入Transformer 或 Estimator当中再获取另一个输出了。
将Transformer、Estimator 组合起来成为一个大模型。
管道: 输入→□→□→□→■→ 输出
□:Transformer ; ■:Estimator ;
Transformer放在管道前几个模型中,而Estimator 只能放到管道的最后一个模型中。
结合:
04 回归算法 - 最小二乘线性回归案例
05 回归算法 - 多项式扩展、管道Pipeline
头文件引入Pipeline:
from sklearnpipeline import Pipeline
其他需要引入的包:
Pipeline 的参数是一个列表,列表中存放着每一个模型的信息。
第0个模型名字: ss,告诉系统我要做 数据标准化 。
第1个模型名字: Poly,告诉系统我要做一个 多项式扩展 。
PolynomialFeatures即进行了ss= StandardScaler()的 *** 作,并做了3阶的扩展
第2个模型名字: Linear,告诉系统进行 模型训练 。
fit_intercept=False 表示截距为0
截距:y=ax+b, b是截距。一般推荐使用fit_intercept=True。
如果输入特征包含x1,x2,将特征放入多项式扩展的图纸后,我们会得到一个针对x1,x2扩展的特征集,并把数据输出出来。因此在多项式扩展的算法中,存储的特征集合将是扩展后的结果。
最后用一张图解释fit、transfrom *** 作在管道和一般模型训练中的区别:
以上就是关于GitLab CI Pipeline框架全部的内容,包括:GitLab CI Pipeline框架、pipeline脚本打包后如何获取jar包的名字、jenkins集群使用k8s部署,pipeline中文乱码的问题解决记录等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)