GPU,六角形加速器和线性代数

所有这些词语与移动开发之间的联系远比乍看时看起来要紧密得多:六角形加速器已经帮助在移动设备上训练神经网络。 代数和马坦派上用场了。 GPU编程不仅可以加快应用程序的速度,而且可以教会您了解事物的本质。

无论如何,Prisma移动开发负责人Andrey Volodin如此说。 以及有关想法如何从GameDev流入移动开发,范式有何不同,为何Android没有原生模糊的功能-以及更有效的AppsCast版本已经发布。 在削减的范围内,我们将讨论Andrey关于AppsConf的报告,而不会破坏。



AppsCastAppsConf移动开发者大会的播客。 每期都是新来宾。 每个嘉宾都是会议的发言人,我们将与他讨论报告并讨论与报告有关的主题。 该播客由AppsConf计划委员会成员Alexei Kudryavtsev和Daniil Popov主持。

Alexey Kudryavtsev:大家好! 安德烈,请告诉我们您的经历。

Andrey Volodin :Prisma的产品开发主要涉及照片和视频的处理。 我们的旗舰应用是Prisma。 现在,我们正在为类似于Facetune的功能制作另一个Lensa应用程序。

我负责移动开发,但我是一名游戏教练。 我有整个核心部分,我为所有这些应用程序编写了GPU管道。 我开发了核心框架,以便研发团队开发的算法和神经元可以在移动设备上实时运行。 简而言之,就是要杀死服务器计算等等。

Alexei Kudryavtsev:听起来不像是常规的iOS开发。

安德烈·沃洛丁(Andrey Volodin):是的,我有这样的细节-我每天都在Swift上写东西,但是与此同时,它离iOS开发还很遥远。

Daniil Popov:您提到了GPU管道,这是怎么回事?

Andrey Volodin:制作照片编辑器时,还需要配置体系结构并分解逻辑,因为该应用程序具有不同的工具。 例如,在Lensa中,有一个bokeh工具使用神经元模糊背景,还有一个修饰工具可以使人更加美丽。 所有这些都需要在GPU上更有效地工作。 此外,建议不要每次都在处理器和视频卡之间传输数据,而是要预先构建一组操作,一次运行即可完成操作,并向用户显示最终结果。

GPU管道是“小块”,从中可以组装视频卡的指令。 然后,她可以非常快速有效地完成所有这些操作,您可以一次获得结果,而不必每次都使用仪器。 我确保我们的GPU管道尽可能快,高效且原则上存在。

Alexey Kudryavtsev:告诉我,你是怎么想到的? 一名常规的iOS开发人员从铆接和铸模开始,然后通过API进入某个地方并感到高兴。 您是怎么做的是完全不同的事情?

Andrey Volodin:在大多数情况下,这是一个巧合。 在找到工作之前,我为iOS开发了游戏。 这对我总是很有趣,但是我了解到,在俄罗斯,这个方向尤其无处可发展。 碰巧我们与Prisma结识了。 他们需要一个iOS开发人员,他可以在Swift上进行编写,并且同时了解GPU(尤其是Metal),而后者当时才问世,我绝对符合他的描述。

我对空缺做出了回应,我们产生了协同作用,而现在已经第三年了。 如果现在出了问题,那么我已经在所有这些Viper和MVVM中使用了-我什至不知道它是如何解密的-我将必须从一开始就了解它。

GPU工程师做什么


Daniil Popov:您的AppsConf 个人资料显示工程师GPU。 除了喝咖啡,工程师GPU在一天中的大部分时间里还做什么?

Andrey Volodin:在这里有必要提到处理器与GPU的根本区别。 处理器执行的操作就像顺序执行一样。 甚至我们拥有的多线程也常常是假的:处理器停止并切换以执行不同任务的小片段,并在几片中执行它们。 GPU的工作方式完全相反。 实际上有n个处理器可以并行工作,并且进程之间的并行性与GPU中的并行性。

除了优化内存和组织代码重用之类的普通事情外,我的主要工作是将为CPU编写的算法移植到视频卡上,以便它们并行。 这并不是一件容易的事,因为有非常高效的算法与指令的顺序执行完全相关。 例如,我的工作是针对这种算法得出一个近似值,该算法可能做的并不完全相同,但是在视觉上无法区分结果。 因此,我们可以获得100倍的加速度,但会牺牲一点质量。

我也在移植神经元。 顺便说一下,我们即将发布一个主要的开源版本。 甚至在Core ML出现之前,我们就有自己的对等产品,我们终于成熟了,将其放入Open Source。 它的范例与Core ML略有不同。 我(包括在内)正在开发其核心部分。

通常,我会围绕计算机视觉算法和计算做所有事情。

Alexey Kudryavtsev:一个有趣的公告。

Andrey Volodin:这不是一个秘密,我们不会夸张地宣布它,只是可以看到Prisma内部使用的框架的示例。

为什么要针对GPU进行优化


Alexei Kudryavtsev:请告诉我,为什么我们总体上优化GPU的算法? 似乎向处理器添加内核或优化算法就足够了。 为什么是GPU?

Andrey Volodin:在GPU上工作可以极大地加快算法的速度。 例如,我们有神经元将在Samsung S10中央处理器上运行30 s,而在GPU上将有1帧,即1/60 s。 这极大地改变了用户体验。 没有永恒的加载屏幕,您可以看到算法在视频流上运行的结果,或者旋转滑块并在那里查看效果。

完全不是太酷了,无法在CPU上编写,因此我们在GPU上重写了所有内容。 使用GPU有一个透明的目标-加快速度。

Alexei Kudryavtsev: GPU可以很好地并行处理彼此相似的操作。 您是否拥有这样的业务,因此能够成功取得成功?

安德烈·沃洛丁(Andrey Volodin):是的,主要困难不是编写代码,而是创建可以很好地转移到GPU的算法。 这并不总是琐碎的。 碰巧您想出了如何做所有很棒的事情,但是为此您需要太多的同步点。 例如,您将所有内容都写在一个属性中,这清楚地表明它的并行性很差。 如果您在一个地方写很多东西,那么所有线程都需要为此进行同步。 我们的任务是对算法进行近似,以便它们能够很好地并行。

Alexei Kudryavtsev:对我来说,作为移动开发人员,这听起来像火箭科学。

安德烈·沃洛丁(Andrey Volodin):其实并不难。 对我来说,火箭科学是VIPER。

第三芯片


丹尼尔·波波夫(Daniil Popov):似乎在上一届Google I / O会议上,他们宣布为TensorFlow和其他产品使用一块烙铁。 第三种芯片什么时候才能最终出现在手机,TPU中,或者叫什么名字,这也将在设备上发挥所有ML的魔力?

Andrey Volodin:我们拥有这个东西,它通过USB连接,您可以在其中驱动来自Google的神经元。 华为已经拥有了这一功能,我们甚至为其六角形加速器编写了软件,以便分段神经元可以快速追赶P20。

我必须说,在iPhone中它们实际上已经存在。 例如,在最新的iPhone XS中,有一个名为NPU(神经处理单元)的协处理器,但到目前为止,只有Apple可以使用它。 这个协处理器已经在iPhone中削减了GPU。 一些Core ML模型使用NPU,因此比裸机更快。

这很重要,因为除了最低的推理神经元外,Core ML还需要很多其他动作。 首先,您需要将输入数据转换为Core ML格式,它将对其进行处理,然后以其格式返回-您需要将其转换回,然后才将其显示给用户。 这全部需要花费一些时间。 我们编写了从头到尾在GPU上运行的无开销的流水线,而Core ML模型正是由于这种硬件过程而更快。

最有可能的是,他们将在6月的WWDC上展示与NPU合作的框架。

就是说,正如您所说,已经有设备,只是开发人员无法充分使用它们。 我的假设是,公司本身尚不了解如何以框架的形式仔细地做到这一点。 或者他们只是不想为了获得市场优势而放弃。

阿列克谢·库德里亚夫采夫(Alexei Kudryavtsev):我记得,在指纹扫描仪中,iPhone也有相同的东西。

安德烈·沃洛丁(Andrey Volodin):即使现在他也不是那么能负担得起。 您可以在顶层使用它,但无法获取打印内容。 您可以要求Apple让用户使用它。 仍然不能完全访问扫描仪本身。

六角加速器


丹尼尔·波波夫(Daniil Popov):您提到了六角形加速器一词。 我想并不是每个人都知道这是什么。

Andrey Volodin:这只是华为使用的一部分硬件架构。 我必须说,她相当老练。 很少有人知道,但是在某些华为公司中,由于没有硬件故障,这些处理器已被使用,但并未使用。 华为发布了它们,然后发现了一个问题,现在在某些手机中特殊芯片的重量很重。 在新版本中,所有内容均已正常运行。

在编程中,当对不同数据并行执行相同的指令时,就存在SIMD(单指令,多数据)范例。 该芯片的设计方式使其可以一次并行处理多个数据流上的某些操作。 特别地,六边形意味着在六个元素上平行。

Alexei Kudryavtsev:我认为GPU就是这样工作的:它可以矢量化任务并对不同的数据执行相同的操作。 有什么区别?

Andrey Volodin :GPU更通用。 尽管GPU的编程相当底层,但就协处理器的使用而言,却是相当高级的。 为了在GPU上进行编程,使用了类似C的语言。 在iOS上,无论如何,代码仍会使用LLVM编译成机器指令。 而且,协处理器的这些东西通常是直接写在硬盘上的-在汇编程序中,在机器指令上。 因此,生产率的提高更为明显,因为对于特定操作,生产率的提高更为明显。 您根本无法指望它们,但只能指望它们最初的用途。

Alexei Kudryavtsev:为什么通常设计它们?

Andrey Volodin:现在主要用于神经网络中最常见的操作:卷积-卷积或某种中间激活。 它们具有预接线功能,可以超快速地工作。 因此,它们在某些任务上比GPU快得多,但在其他所有任务中根本不适用。

Alexei Kudryavtsev:看起来像DSP处理器,曾经用于音频,并且所有插件和效果都可以很快地在它们上起作用。 出售了昂贵的特殊硬件,但是处理器长大了,现在我们直接在笔记本电脑上录制和处理播客。

Andrey Volodin:是的, 差不多

GPU不仅用于图形


Daniil Popov:我正确理解,现在在GPU上您可以处理与图形不直接相关的数据了吗? 事实证明,GPU正在失去其最初的目的。

安德烈·沃洛丁(Andrey Volodin):好的。 我经常在会议上谈论这个。 首先是NVidia,他介绍了CUDA。 这项技术使GPGPU(图形处理单元上的通用计算)更加简单。 您可以在其上编写在GPU上并行化的C ++算法的超集。

但是人们以前已经做到了。 例如,在OpenGL或什至更老的DirectX上的工匠只是将数据写入纹理-每个像素都被解释为数据:第一个像素的前4个字节,第二个像素的后4个字节。 他们处理了纹理,然后提取并解释了纹理中的数据。 这是非常残酷和复杂的。 现在,视频卡支持通用逻辑。 您可以在GPU中提供任何缓冲区,描述您的结构,甚至包括它们将相互引用的结构的层次结构,计算并返回给处理器。

Daniil Popov:也就是说,我们可以说GPU现在是Data PU。

安德烈·沃洛丁(Andrey Volodin):是的,有时对GPU上的图形进行的处理少于常规计算。

Alexei Kudryavtsev: CPU和GPU 体系结构本质上是不同的,但是您可以在任何地方都可以考虑。

Andrey Volodin :的确,在某些方面CPU更快,在某些方面GPU。 这并不是说GPU总是更快。

丹尼尔·波波夫(Daniil Popov):据我所记得,如果任务是计算非常不同的东西,那么在CPU上可以更快。

Andrey Volodin:这也取决于数据量。 从CPU到GPU传输数据总是存在开销,反之亦然。 例如,如果考虑一百万个元素,则通常需要使用GPU。 但是计算CPU上的一千个元素比将其复制到图形卡要快得多。 因此,您必须始终选择任务。

顺便说一下,Core ML做到了。 据Apple称,Core ML可以在运行时选择计算速度更快的位置:在处理器上还是在视频卡上。 我不知道这是否行得通,但他们说是的。

适用于移动开发人员的核心GPU工程师知识


Alexey Kudryavtsev:让我们回到移动开发。 您是一名GPU工程师,您拥有大量的核心知识。 如何将这些知识应用于移动开发人员? 例如,您在UIKit中看到了别人看不到的东西?

Andrey Volodin:我将在AppsConf上详细讨论这一点。 您可以在很多地方申请。 例如,当我看到UIKit API的工作方式时,我可以立即理解为什么这样做以及为什么。 观察渲染某些视图时的性能下降,我可以理解原因,因为我知道渲染是如何编写的。 我了解:为了显示高斯模糊实际上在帧缓冲区顶部上产生的效果,您首先需要缓存整个纹理,对其进行大量的模糊操作,返回结果,完成渲染其余视图,然后将其显示在屏幕上。 所有这些都必须在1/60秒内适应,否则会变慢。

对我来说,这很长一段时间是绝对显而易见的,但是对于我的同事来说,这还不清楚。 这就是为什么我想分享我们在GameDev中经常使用的设计技巧,以及我对如何看待问题并尝试解决问题的见解。 这将是一个实验,但我认为这应该很有趣。

为什么Android没有原生模糊


丹尼尔·波波夫(Daniil Popov):您提到了模糊性,我想让所有Android开发人员都担心:为什么在iOS而非Android中会有原生的Blueer

Andrei Volodin:我认为这是因为建筑。 Apple平台使用Tiled Shading渲染体系结构。 使用这种方法,不是渲染整个帧,而是渲染小块-正方形,即屏幕的一部分。 这使您可以优化算法的操作,因为使用GPU时的主要性能提升可以有效利用缓存。 在iOS上,通常会渲染框架,以使其完全不占用内存。 例如,在iPhone 7 Plus上,分辨率为1920 * 1080,大约为200万像素。 我们将每个通道乘以4字节,则得出每帧大约20兆字节。 20 MB,仅用于存储系统帧缓冲区。

Tiled Shading方法允许您将该缓冲区分成小块并进行一些渲染。 这极大地增加了缓存访问的次数,因为要进行模糊处理,您需要读取已经绘制的像素并计算其上的高斯分布。 如果您读取整个帧,则缓存速率将非常低,因为每个流将读取不同的位置。 但是,如果您阅读小片段,则缓存率将非常高,并且生产率也将很高。

在我看来,Android中缺乏本机模糊与体系结构功能有关。 虽然,也许这是一个产品解决方案。

丹尼尔·波波夫(Daniil Popov):在Android中,有用于此的RenderScript,但是您需要用手混合,绘制,嵌入。 这比在iOS中设置一个复选框要复杂得多。

Andrey Volodin:最有可能的是,性能也会降低。

丹尼尔·波波夫(Daniil Popov):是的,为了满足设计师的愿望清单,我们必须缩小图片大小,对其进行上蓝处理,然后再放大以某种方式保存。

安德烈·沃洛丁(Andrey Volodin):顺便说一下,您可以做一些不同的技巧。 高斯分布是一个模糊的圆圈。 高斯西格玛取决于您希望它们收集的像素数。 通常,作为一种优化,您可以缩小图像的比例并稍微缩小sigma,并且当返回原始比例时,不会有任何区别,因为sigma直接取决于图像的大小。 我们经常在内部使用此技巧来加速模糊。

丹尼尔·波波夫(Daniil Popov):但是,Android中的RenderScript不允许使半径大于30。

Andrey Volodin:实际上,半径30很大。 同样,我知道在每个线程上使用GPU收集30个像素非常昂贵。

移动开发与GameDev有何相似之处


Alexei Kudryavtsev:在您的报告中,您说移动开发和GameDev有很多共同点。 告诉我一点,到底是什么?

Andrey Volodin: UIKit 体系结构非常让人想起游戏引擎和旧的游戏引擎。 现代的系统已经朝实体组件系统的方向发展,这也将在报告中。 UIKit也有这方面的内容,有一些文章介绍了如何设计组件视图。 GameDev, Component System Thief 98 .

, , Cocos2d, , , , . , Scene graph — , -, , iOS CGAffineTransform. 4*4, , . .

, UIKit . - — . : GameDev , UIKit setNeedsLayout, layoutIfNeeded.

— , - , , Apple. AppsConf .

: , API Cocos2d iOS ( UI). , ?

: , - . Cocos2d 2008-2009 , UIKit UIKit, . , - , , .

, : core- Cocos2d Apple, Apple Cocos2d, . SpriteKit , Cocos2d. Apple .

: , , UIKit 2009, MacOS, . setNeedsLayout, layoutIfNeeded , .

: , GameDev , MacOS.

: !

: Cocos2d Apple, , GameDev. GameDev , — . , GameDev , , . , , .

: , - , — .

: , , , , — . Protocol-Oriented Programming Swift, , - . GameDev .

: : , . , , , .

GameDev


: : GameDev , GameDev ?

: , , . « , ». , . : , , .

GameDev- . : 30 60 , , , . , . — . -- 1/60 1/30 . , , , GPU , CPU . , .

: ?

: . - , , , . — . , , , — - , - , . , , .

. , GPU float, double, - . , , , . CPU , , , GPU .

, , — .

GameDev,


: , « GameDev, ». , , . , GameDev — . , . GameDev.

: , enterprise- , GameDev . . , , GameDev, .

, . , 4*4. CGAffineTransform — , - , .

, , , , .


: ? , UIKit, , ? , , , . , ?

: — pet project.

, : GPU , . iOS GPU , . iOS , - NVidia AMD- . . API , , .

: API, , Cocos2d Unity, — - . , , , UIKit ?

: Cocos2d — Open Source . , , , , . objective-C, .

pet project, , , API, , , -. , API, VHS-. , GPU. , . , . , : « saturation Instagram, lightroom!» , , 4 — .

, .

— , , . , , - , , , .

: , - . , Cocos2d - — 5 , , , , . , , , ..

: . , . , , , , , , , , , .

: , . , , .

: . , , . , Apple, ARKit. , , . , , , , .

, , : «, IDE, , , , . ».

: — ?

: , , , .

: , , .

: , , , VR . Project Template Xcode, , , - . , .

: .


: - , GameDev GPU.

: . - , , , . , , , , , UI: , , runtime Objective-C — , , . . , : , — , X Y, !

, , - , GameDev GPU- — .

, . AppsConf 22 23 .

Source: https://habr.com/ru/post/zh-CN448222/


All Articles