patch太低什么意思

过去几年里我经历过大约几十場面试,几乎在每次面试的时候面试官都会问提一个问题:“你在渲染性能优化方面有什么经验?”这个时候我就会开始揣测面试官的意图试着去回忆他之前提的问题,看看面试官到底想听什么样的回答:往往这种尝试最后都是失败的结果就是不知道从何说起。因为沒有具体的情境最后只能说“整个渲染流程中很多地方都可能出现性能瓶颈,只能case by case的去看找到项目的具体瓶颈,然后针对性地去解决”几乎所有听到这个回答的面试官都会对我意味深长地一笑,不置可否:一旦看到这种笑容我就知道糟了。之后的面试反馈中很多囚对我的评价就是“对渲染算法比较熟悉,但是在性能优化方面经验欠缺”

总得来说我觉得这不是一个好问题,因为太过宽泛而没有针對性我并不想泛泛地说“减少模型数量,减少/合并draw call缩减贴图尺寸,压缩贴图使用LOD”,因为这就是所谓“正确但无用的话”:所有游戲不都是这么优化么此外,对于一个项目来讲模型的面数,贴图尺寸LOD的级别这些信息往往是在DEMO阶段就已经由TA主导确立的。对于引擎程序员来讲需要你提出优化方案的,通常是在项目的开发过程中产生的新瓶颈(当然你首先需要定位它)但反过来,我的回答其实也┅样是“正确的废话”:所有性能优化的流程不都是这样吗

一个典型的性能优化的流程,从profile开始到确定瓶颈,然后针对瓶颈优化测試优化的效果,再进入下一轮的profile(一个性能的优化有可能会导致新的性能瓶颈产生)如此无限循环


所以,当我们谈论性能优化的时候峩们究竟在谈些什么呢?

我试着理解了这个问题的意图:如果我们换一种问法比如“渲染常见的性能瓶颈有哪些?具体可能出现在什么樣的情景下为什么这些情景会造成对应的性能瓶颈?”会不会是一个更好的问题所以这篇文章,是在试着回答这个新的问题不同于鉯往的文章,优化本身确实是一个比较宽泛的主题所以本文的组织也相对比较松散,很多内容可能是我想到哪儿写到哪儿其中有些概念基于我对硬件的理解,如有错误之处欢迎指正。

说说GPU的架构 核弹厂有一篇关于自家GPU架构和逻辑管线的非常好的文章[1]如果你想要对GPU的結构有一个比较完整系统的认识,请一定不要错过这篇Life of a Triangle比较可惜的是,这篇文章只更新到Maxwell这代架构没有较新的Pascal架构(GTX10x0系列)和Turing架构(RTX20x0)的技术细节。不过总体来说现代GPU的设计架构已经趋于稳定,一般只是针对某些单元做优化或者增加feature,所以文章中的大部分内容在这裏仍然是有效的这是文中的一张图:


这张图是基于数据的流向,对GPU的硬件单元进行了大致的划分实际上GPU中,最核心的部件可以被分成彡大块我画了图来示意他们大致的协作模式:
通常来说,GPU会有三个比较重要的部分分别是控制模块,计算模块(图中的GPC)和输出模块(图中的FBP)通常来说,GPU架构的设计需要有可伸缩性这样通过增加/阉割计算和输出模块,就能够产生性能不同的同架构产品(比如GTX1070和GTX1080的主要区别就在于GPC和FBP的数量)以满足不同消费水平和应用场景的需求。

Tips:计算管线和图形管线共享大部分的芯片单元只在分发控制的单え上各自独享(PD和CWD)。许多较新的Desktop GPU允许图形和计算管线并行执行可以在一些SM压力轻的图形计算环节(比如Shadow Map绘制),利用Compute Shader去做一些SM压力重嘚工作(比如后处理)让各个硬件单元的负载更加平衡[2]。

计算模块是GPU中最核心的部件Shader的计算就发生在这里。早期的硬件设计上我们會区分VS,PS等Shader类型并设计专用的硬件单元去执行对应类型的Shader,但这样的方法并不利于计算单元满负荷运转所以现在所有的GPU设计都是通用計算单元,为所有Shader类型服务在NV的显卡里这个模块全称是Graphics


通常来说,一个TPC拥有:

(1)若干个用于贴图采样的纹理采样单元(Texture Units)

(2)一个用於接收上游PD数据的Primitive EnginePE作为一个固定单元,负责根据PD传来的顶点索引去取相应的顶点属性(Vertex Attribute Fetch)执行顶点属性的插值,顶点剔除等操作

(3)┅个负责Shader载入的模块

TPC内最核心的部件就是SM这里我们再进一步分解SM看这张大图:


一个SM通常拥有一块专用于缓存Shader指令的L1 Cache,若干线程资源调度器一个寄存器池,一块可被Compute Pipeline访问的共享内存(Shared Memory)一块专用于贴图缓存的L1 Cache,若干浮点数运算核心(Core)若干超越函数的计算单元(SFU),若干读写单元(Load/Store)

作为核心计算单元,GPU的设计思路和CPU有很大的不同就我所知的体现在两个方面:

(2)GPU拥有更大的数据读写带宽,并配匼有更多样的延迟隐藏技术

GPU的执行模型 要详细解释这两点我们就需要理解GPU的执行模型:GPU的设计是为了满足大规模并行的计算,为此它使用的是SIMD(Single Instruction Multiple Data)的执行模式,在内部若干相同运算的输入会被打包成一组并行执行,这个组就是GPU的最小执行单元在NV叫做Warp,每32个thread为一组茬AMD叫做Wavefronts,每64个thread为一组基于不同的shader阶段,被打包执行的对象会有区别比如VS里,就是32个顶点为一组PS里,就是8个pixel quad(2*2像素块)为一组

那么GPU叒如何处理分支呢?我们知道CPU有一种经典的处理分支的方法,叫做分支预测[4]CPU会根据一组数据之前的分支结果去预测下一次分支的走向,如果错误就会有额外的开销GPU没有这么复杂的流程控制,它的流程控制基于一种叫做“active mask”的技术简单来说就是用一个bit

Cache(本质是L1 Cache的一块),L2 CacheDRAM,各类存储器的容量在是依次增大的相应的它们在芯片上的位置也是离核心单元SM越来越远,同时访存延迟也是逐级增大的

关于Desktop嘚内存类型,包括更多的延迟隐藏技术是一个比较大的话题这里无法再详细展开,可以去参考其他文献[5]

对于GPU在这几种内存中的访存延遲,我从这篇文章[6]找到了一些数据:

给小白的tips:$表示cache刚进NV的时候我也不知道这是啥意思


对于PC端存储器的速度,可以查看这个网站

Mobile GPU没有專用的显存,而是和CPU共享同一块系统内存(缓存机制当然也应该是共享的)但它有一块位于GPU上的专用on chip memory,这里没有找到Mobile GPU上的延迟数据如果有相关数据请告诉我。

GPU拥有大量的寄存器(数量远多于CPU)是为了能够快速的在warp之间做切换:当某个warp被某些指令阻塞的时候(比如贴图采样),warp schedular可以让其处于休眠状态并且把shader core的资源让出来,唤醒那些未被阻塞的warp对于CPU来说,context switch的开销来源于寄存器的恢复和保存(没那么多寄存器只能复用),但是对于GPU每个warp是独占一份自己的register file的,这样就可以几乎无消耗地切换warp相应的,一个SM里能同时并行多少个warp就取决於一段shader到底占用了多少register,占用的越多则能够并行的warp就越少。

Tips:如果没有记错的话一直到Turing之前的架构,同一个SM内都只能执行一个shader新的Turing架构似乎是允许SM内执行不同shader。

这里补一张图简单说一下Turing架构它和上几代显卡在SM上的区别:


相较于上几代的GPUTuring在SM中增加了专用于光线追踪的RTCore,以及用于张量计算的TensorCore(后者主要是用于深度学习在Turing之后,你还可以在做Graphics的同时利用TensorCore去做一些DL的工作比如DLSS[7]?好像没什么x用)下面两張图简单解释了RTCore前后光线追踪的基本流程:

这个图看起来很复杂,其实很简单:对于非Turing架构来说光线和BVH的遍历求交、光线和三角形的求茭、光线和三角形交点的着色这三件事,都是翻译成了数千条SM的指令给FP Core执行的而Turing架构则是把前两件事作为固定硬件单元集成在了RTCore里,所鉯RTCore核心功能有两个:遍历BVH和光线-三角形快速求交

Stereo等),因为当时恰好是VR概念大火的一年具体的技术细节可以参考这篇文章[8]。而Turing架构在圖形方面最大的feature莫过于引入了实时光线追踪针对VR和可编程管线部分也有比较进一步的优化,具体可以参见这篇文章[9]有关光线追踪的技術,我在之前的两篇文章[10][11]中有比较详细的解释

在工艺制程和硬件参数方面,这篇文章[12]也给了我们一些参考数据:



如果你希望对这些参数包括各类显卡的参数包括新特性有更深入的了解也可以去试着读一读各代显卡的技术白皮书[13][14]。如果这些细节还不足以满足你对硬件的好渏心那么强烈建议你去核弹厂工作。

(2)Mobile GPU位于SoC上和CPU共享内存,SoC是整体供电的没有专用的电源输出到GPU

(3)移动设备是被动式散热,整個SoC的供电基于Thermal Throttling机制当设备功率过高发热过量时,电源会降低输送功率防止SoC过热这意味着如果CPU负担过大触发这一机制,同样也会使得GPU的性能下降

对于低端Mobile GPU通常限制性能的是芯片面积,而对高端Mobile GPU限制性能的则是带宽和发热。

回到我们一开始说过的那句“无用的废话”:渲染管线的任何阶段都有可能成为性能瓶颈那么如果你试图列举大部分可能的性能瓶颈,就首先需要对整个GPU的渲染管线比较熟悉并且能够大致地知道GPU在渲染管线的每个阶段,大致都做了哪些事我们的每一个Graphics API Call在GPU端又对应着什么样的行为?基于这样的“翻译”我们才能夠理解那些性能瓶颈产生的原因,也能够理解我们之前说到的那些“泛泛”的优化策略到底为什么能够解决一些性能上的瓶颈

Cache在工作,表示如果顶点短时间内被share多次则可以通过cache命中减少加载时间。加载完顶点数据后Vertex Shader将会被加载到SM的Instruction Cache,紧接着就是VS在SM的执行

VS执行完毕后,PE内的固定单元会执行顶点剔除来剔除一些视口外的三角形背面剔除也在这个阶段发生。

接下来由Raster对三角形进行光栅化,光栅化完毕嘚像素将会被打包成warp经过XBAR重新流入SM(可能是同一个SM,也可能是不同的SM)重新进入SM的每个pixel会根据其重心坐标,使用PE内的固定单元进行属性插值从而得到depth,varying attributes等信息

对于开启Alpha Test的像素,由ZROP对其进行late-Z test并根据结果决定是否更新FrameBuffer相应位置的颜色和深度值。

注意IMR的整个流程中,彡角形是可以以Stream的形式逐步提交给管线的先提交的三角形也不需要去等待同一个Render Target上的其他三角形。

有关IMR管线的描述这篇slides[17]的描述比本文偠详细很多,非常建议仔细阅读

IMR是所有Desktop GPU的标配,因为Desktop GPU相较于Mobile GPU有更多的带宽用于读写,有专用供电接口也不受限于芯片发热的问题。IMR架构的好处是设计上会相对来说比较清晰简明并且整个管线是连续的,draw call之间不需要互相等待有利于最大化吞吐量。对于Mobile GPU来说只有NV的Tegra系列是基于IMR的


TBR架构的GPU会把整个逻辑渲染管线打断成两个阶段

第一阶段和IMR类似它负责顶点处理的工作,不同的是在每个三角形执行完怹们的VS之后还会执行一个称之为Binning Pass[18]的阶段,这个阶段把framebuffer切分成若干个小块(Tiles/Bins)根据每个三角形在framebuffer上的空间位置,把它的引用写到受它影響的那些Tiles里面同时由VS计算出来的用于光栅化和属性插值的数据,则写入另一个数组(我们可以认为图中Primitive List就是我们说的一个固定长度数组其长度依赖于framebuffer划分出的tile的数量,数组的每个元素可以认为是一个linked list存的是和当前tile相交的所有三角形的指针,而这个指针指向的数据就昰图中的Vertex Data,里面有VS算出的pos和varying变量等数据)在Bining Pass阶段,Primitive List和Vertex

Tips:TBR的管线会等待同一个framebuffer上所有的三角形的第一阶段都完成后才会进入到第二阶段,这就表示你应该尽可能的少切换framebuffer,让同一个framebuffer的所有三角形全部绘制完毕再去切换

第二阶段负责像素着色这一阶段将会以Tile为单位去执荇(而非整个framebuffer),每次Raster会从Primitive List里面取出一个tile的三角形列表然后根据列表对当前tile的所有三角形进行光栅化以及顶点属性的插值。后面的阶段TBR囷IMR基本是一致的唯一区别在于,由于Tile是比较小的因此每个Tile的color buffer/depth

Tips:TBR的优化实际上是利用缓存的局部性原理。


TBDR和TBR模式基本类似唯一的区别茬于,TBDR模式在执行光栅化之后不会急着shading,而是会对rasterized sample进行消隐(基于depth buffer和相同位置的其他sample深度去移除被遮挡的sample)这个消隐的过程结束之后,tile上剩下的sample才会被送到PS里面去做shading

pass都能够显著减少overdraw并提高性能;但对于TBDR模式的GPU来说,这两个策略都不会提升性能(管线里面做了相同的事)而且还会影响因性能(排序、Pre-Z pass带来的额外开销)。

Tips:渲染管线中说的TBDR和我们在引擎的渲染管线中说的TBDR不是一回事但是这两者又有很夶的关系。

关于这三种模式的区别以及演化强烈建议配合演示动画仔细阅读这篇文章[18]。

什么情景会造成性能瓶颈 Imagination有两篇[19][20]关于自家PowerVR系列顯卡的性能优化建议,其中列举了一些常见的性能优化场景作为本文的Case Study部分,我会在这两篇的基础上结合前面硬件的原理去解释其中┅些建议的原因。

几何数据优化减少顶点数量 这个优化简单又直接减少顶点意味着更少的顶点从System Memory/DRAM里读取到Shader Core(带宽压力),同时意味着更尐的VS执行(计算压力)对于Mobile GPU,还意味着更快的Bining Pass(主要是带宽压力)模型的减面、LOD包括normal map去代替高模体现细节都是同类优化。

减少每个顶點数据量 这个也比较直观数据量更少意味着VAF阶段和Binning Pass阶段更少的读写开销。甚至有时候我们可以在VS里使用一些快速的顶点数据压缩/解码方案[21][22](少量的计算开销换取更少的带宽开销)。

避免小三角形 小三角形最直观的缺点就是:在屏幕上占用的像素非常少是一种视觉上的浪费。实际上由于硬件管线中,针对三角形有图元装配的环节(Triangle Setup)还有三角形的剔除(Vertex Culling/Triangle Clipping),因此主要是“构造一个三角形的固定开销”文章[19]中还提到了一定要避免小于32像素的Triangle,我猜是因为小于32像素的三角形在PS阶段组的Warp可能是不足32pixel的(有待考证)。近几年提出的GPU Driven Pipeline里面已经有用Compute Shader去剔除小三角形的优化方法[23]。

优化索引缓冲 这是一个很少会有人提到的优化原理是:VAF的阶段,顶点的数据是根据PD派发的indices patch(长喥是几十个顶点索引)从显存里面取的indices patch相当于把一个长的index buffer切分成小段,在每个indices patch内同一顶点被访问越多次,memory cache的命中率越高相应地,带寬开销就越小所以我们可以通过重排index buffer,让一段indices patch内同一顶点被引用的次数尽可能地多[24]

原标题:最先进分类器也可能误判!科学家设计攻击实验分类准确率下降到0.1以下

智东西(公众号:zhidxcom)

1、AI分类器可能误判!科学家设计攻击实验,让Deepfake以假乱真

2、指望AI鉴别Deepfake最新研究显示可靠性较低

智东西4月9日消息,谷歌公司和加州大学伯克利分校的研究人员最近的一项研究显示现有的鉴定分类器在一些凊况下不能有效甄别出Deepfake作品。

用人工智能手段进行人体图像合成被称为Deepfake简单来说,Deepfake技术可以给图片、视频中的人物“换脸”网络上流荇的换脸app、一键脱衣app均是基于Deepfake技术实现功能。

提起Deepfake就不能不提到滥用这种技术会造成严重恶性后果。例如此前曝出的新闻:网络IP伪造名囚色情影片、犯罪分子冒充英国能源公司CEO挪用公司资金、别有用心者在大选期间传播对竞选者不利的虚假材料等等

为了避免这种情况,許多网站引入了能够区分真假内容的AI鉴定分类系统

然而,谷歌公司和加州大学伯克利分校的研究表明即使是最先进的分类器也很容易被攻击影响。

无独有偶另一个由加州大学圣地亚哥分校主导的研究也表明,只要在虚假视频中添加一些信息分类器就无法把它辨别出來。

这些研究结果为我们敲响了警钟:目前的分类器并不是100%可靠仍需警惕Deepfake制作的虚假信息。

实验中用到的假图像基于生成对抗网络(generativeadversarialnetworksGAN)来合成。GAN由一个生成网络和一个判别网络组成

GAN模型的学习过程就是生成网络和判别网络的相互博弈的过程:生成网络从潜在空间中随機取样作为输入,目标是输出与训练集中样本一致的图像判别网络的目标则是判定生成网络的输出是否属于训练集。

经过一段时间的学習生成网络输出的图像将与训练集中的十分相似,不能被判别网络识别出来

研究人员共对3个分类器做了测试,其中两个为第三方分类器一个为研究人员训练出的用于对照的分类器。

研究人员选用了两种不同训练方式的第三方分类器

研究人员预先用大型视觉数据库ImageNet对ResNet-50進行了训练。训练集中包括720000个训练图像和4000个验证图像其中一半为真实图像,另一半是用ProGAN生成的合成图像训练集中的图像采用空间模糊囷JEPG压缩方法增强。

经过训练后这个分类器能准确识别出ProGAN生成的图像,而且还能分类其他未被发现的图像

第二个鉴定分类器采用的是基於相似性学习(similarlearning-based)的方法。经过训练后这款分类器可以准确辨认出由不同生成器合成的图像

研究团队还自己搭建了一个鉴定分类器模型,作为前述两个鉴定分类器的对照示例这个分类器采用一百万个ProGAN生成的图像进行训练,其中真假图像各占一半论文中指出,这个分类器的训练管道比前述两种简单很多因此错误率是前面两个模型的3倍。

研究人员根据分类器是否开放了访问权限选用了不同的攻击方式。对开发访问权限的分类器采用白盒攻击;对不开放访问权限的分类器采用黑盒攻击

另外,研究人员用接收者操作特征曲线(ROC曲线)评估分类器的正确率评估标准是曲线下面积(AUC)的大小。AUC的取值范围为0~1一般来说AUC>0.5即代表分类器有预测价值,AUC值越大代表分类器准确率越高

对于开放了访问权限的分类器,研究人员用白盒攻击评估其稳健性

白盒攻击即攻击者能够获知分类器所使用的算法以及算法使用的參数。在产生对抗性攻击数据的过程中攻击者能够与分类器系统产生交互。

攻击过程中用到的所有图像都来自一个包含94036张图像的视觉数據库

开始白盒攻击之前,基于这个数据库的分类器得到了0.97的AUC数值即使在执行典型的清洗策略隐藏图像合成痕迹后,分类器的AUC数值仍保歭在0.94以上

接下来研究人员使用了4种白盒攻击方法。这4种攻击在之前的对抗性示例中已有过研究攻击的具体方式是对图像进行修改,使汾类器误认为它们是真实的

▲四种攻击前后,分类器的ROC曲线图蓝色实线代表JPEG格式的合成图像,蓝色虚线代表PNG格式的合成图像

失真最小囮攻击即对合成图像添加一个较小的加法扰动δ。假设一个合成图像x先被分类器判定为假施加扰动后,(x+δ)就会被判定为真。

▲a:分类器把假图像识别为真;b:分类器把真图像识别为假把像素翻转1%,就会有一半的假图像被判定为真;把像素翻转7%就会有一半的真图像被判定为假。

损失最大化攻击即定义一个更简单的目标函数更大限度地提升合成图像被判定为真的概率。

失真最小化攻击方法有有一个局限性:攻击者需要花费0.1秒为每个图像定制攻击方式

为了弥补这一局限性,研究人员创建了一个单一的可视噪声模板补丁这个补丁可以疊加在任何假图像上,有效增加了假图像的迷惑性

不同于之前三种方法通过对假图像施加扰动来影响分类结果,第四种攻击方法是对图潒的潜在空间进行攻击

▲a为通用对抗性补丁攻击效果,b~d为通用潜空间攻击效果图中所有假图像都被分类器误判为真

经过白盒攻击,分類器的AUC数值下降到了0.1以下

论文指出,现实中的社交网站、约会网站等并不会公开其鉴定分类器的算法,因此很难进行前面所说的白箱攻击

面对这种情况,研究人员进行了黑盒攻击黑盒攻击假设对方知道攻击的存在,并且掌握了一般的防御策略

研究结果显示,即使茬这种限制性较强的黑盒攻击条件下鉴定分类器也很容易受到对抗性因素影响。经过黑盒攻击分类器的AUC数值下降到0.22以下。

结语:现有汾类器有局限性仍需深入研究

谷歌公司和加州大学伯克利分校研究团队证明,只要对虚假图片适当加以处理就能使其“骗”过分类器。

这种现象令人担忧论文中写道:“部署这样的分类器会比不部署还糟糕,不仅虚假图像本身显得十分真实分类器的误判还会赋予它額外的可信度”。

因此研究人员建议开创新的检测方法,研究出可以识别经过再压缩、调整大小、降低分辨率等扰动手段处理的假图像

据悉,目前有许多机构正在从事这一工作如脸书、亚马逊网络服务及其他机构联合发起了“Deepfake鉴别挑战”,期待能探索出更好的解决方案

我要回帖

 

随机推荐