Quantcast
Viewing all 583 articles
Browse latest View live

Unreal* Engine 4 VR应用的CPU性能优化和差异化:第一部分

作者:王文斓

虚拟现实(VR)能够带给用户前所未有的沉浸体验,但同时由于双目渲染、低延迟、高分辨率、强制垂直同步(vsync)等特性使VR对CPU渲染线程和逻辑线程,以及GPU的计算压力较大[1]。如何能有效分析VR应用的性能瓶颈,优化CPU线程提高工作的并行化程度,从而降低GPU等待时间提升利用率将成为VR应用是否流畅、会否眩晕、沉浸感是否足够的关键。Unreal* Engine 4 (UE4) 作为目前VR开发者主要使用的两大游戏引擎之一,了解UE4的CPU线程结构和相关优化工具能够帮助我们开发出更优质基于UE4的VR应用。本文将集中介绍UE4的CPU性能分析和调试指令、线程结构、优化方法和工具、以及如何在UE4里发挥闲置CPU核心的计算资源来增强VR内容的表现,为不同配置的玩家提供相应的视听表现和内容,优化VR的沉浸感。

为何要把PC VR游戏优化到90fps

Asynchronous Timewarp(ATW),Asynchronous Spacewarp(ASW)和Asynchronous Reprojection等VR runtime提供的技术可以在VR应用出现掉帧的时候,以插帧的方式生成一张合成帧,等效降低延时。然而,这些并不是完美的解决方案,分别存在不同的限制:

ATW和Asynchronous Reprojection能够补偿头部转动(rotational movement)产生的 Motion-To-Photon(MTP)延迟,但如果头部位置发生改变(positional movement)或者画面中有运动对象,即使用上ATW和Asynchronous Reprojection,也无法降低MTP延迟; 另外ATW和Asynchronous Reprojection需要在GPU的drawcall之间插入,一旦某个drawcall时间太长(例如后处理)或者剩下来给ATW和Asynchronous Reprojection的时间不够,都会导致插帧失败。而ASW会在渲染跟不上的时候将帧率锁定在45fps,让一帧有22.2ms的时间做渲染,两张渲染帧之间则以传统图像运动估算(motion estimation)的方式插入一张合成帧,如图1所示。但合成帧中运动剧烈或者透明的部分会产生形变(例如图1中红圈框起来的部分),另外光照变化剧烈的时候也容易产生估算错误,导致持续用ASW插帧的时候用户容易感觉到画面抖动。这些VR runtime的技术在频繁使用的情况下都不能够很好解决掉帧问题,因此开发者还是应该保证VR应用在绝大部分情况下都能够稳定跑在90fps,只有偶然的掉帧才依赖上述的插帧方法解决。

Image may be NSFW.
Clik here to view.

图 1.ASW插帧效果。

UE4性能调试指令简介

用UE4开发的应用可以通过控制台命令(console command)中的“stat”指令查询各种实时性能数据[2-3]。其中“stat unit”指令可以看到一帧渲染总消耗时间(Frame)、渲染线程消耗时间(Draw)、逻辑线程消耗时间(Game)以及GPU消耗时间(GPU)。从中可以简单看出哪部分是制约一帧渲染时间的主要原因,如图2所示。结合“show”或“showflag”指令动态开关各种功能(features)来观察分别对渲染时间的影响,找出影响性能的原因,期间可以用“pause”指令暂停逻辑线程来观察。需要注意的是其中GPU消耗时间包括了GPU工作时间和GPU闲置时间,所以即使在“stat unit”下看到GPU花了最长的时间,也并不代表问题就出在GPU上,很有可能是因为CPU瓶颈导致GPU大部分时间处于闲置状态,拉长了GPU完成一帧渲染所需时间。因此还是需要结合其他工具,例如GPUView[4]来分析CPU和GPU的时间图,从中找出实际瓶颈位置。

Image may be NSFW.
Clik here to view.

表 1.stat unit”统计数字。

另外,因为VR是强制开启垂直同步的,所以只要一帧的渲染时间超过11.1ms,即使只超过0.1ms,也会导致一帧需要花两个完整的垂直同步周期完成,使得VR应用很容易因为场景稍微改变而出现性能大降的情形。这时候可以用“–emulatestereo”指令,同时把分辨率(resolution)设为2160x1200,屏幕百分比(screenpercentage)设为140,就可以在没有接VR头显及关闭垂直同步的情况下分析性能。

而渲染线程相关的性能数据可以通过“stat scenerendering”来看,包括绘制调用(drawcall)数目、可见性剔除(visibility culling)时长、光照处理时间等。其中可见性剔除又可以通过“stat initviews”指令进一步了解和分柝各部分的处理时长,包括视锥剔除(frustum culling)、预计算遮挡剔除(precomputed visibility culling)和动态遮挡剔除(dynamic occlusion culling)等,用以判断各剔除的效率; 输入“stat sceneupdate”指令查看更新世界场景例如添加、更新和移除灯光所花费的时间。另外,也可以通过“stat dumphitches”指令,指定一帧的渲染时间超过t.HitchThreshold时把渲染帧信息写进日志。

如果要使游戏效果能够适配不同等级的PC,那么“stat physics”,“stat anim”和“stat particles”会是三个经常用到跟CPU性能相关的指令,分别对应到物理计算时间(布料模拟,破坏效果等)、蒙皮网格(skin meshing)计算时间和CPU粒子计算时间。由于这三个计算在UE4里都能够分到工作线程作并行处理,因此对这些部分进行扩展能够把VR应用有效适配到不同等级的硬件,使VR体验以及效果能够随着CPU的核数增加而增强。

另外,可以直接输入控制台命令“stat startfile”和“stat stopfile”采集一段实时运行的数据,然后用UE4 Session Frontend里的Stats Viewer查看运行期间各时间段CPU线程的利用率和调用堆栈(call stack),寻找CPU热点并进行相应的优化,如图3所示,功能类似Windows* Assessment and Deployment Kit(ADK)里的Windows* Performance Analyzer(WPA)。

Image may be NSFW.
Clik here to view.

图 2.UE4 Session Frontend里内建的Stats Viewer。

点击访问Unreal* Engine 4 VR应用的CPU性能优化和差异化:第二部分


Unreal* Engine 4 VR应用的CPU性能优化和差异化:第二部分

作者:王文斓

虚拟现实(VR)能够带给用户前所未有的沉浸体验,但同时由于双目渲染、低延迟、高分辨率、强制垂直同步(vsync)等特性使VR对CPU渲染线程和逻辑线程,以及GPU的计算压力较大[1]。如何能有效分析VR应用的性能瓶颈,优化CPU线程提高工作的并行化程度,从而降低GPU等待时间提升利用率将成为VR应用是否流畅、会否眩晕、沉浸感是否足够的关键。Unreal* Engine 4 (UE4) 作为目前VR开发者主要使用的两大游戏引擎之一,了解UE4的CPU线程结构和相关优化工具能够帮助我们开发出更优质基于UE4的VR应用。本文将集中介绍UE4的CPU性能分析和调试指令、线程结构、优化方法和工具、以及如何在UE4里发挥闲置CPU核心的计算资源来增强VR内容的表现,为不同配置的玩家提供相应的视听表现和内容,优化VR的沉浸感。

UE4 VR应用的CPU优化技巧

当VR开发的过程中遇到CPU性能问题时,除了需要找出瓶颈所在,还要掌握UE4里能够帮助优化这些瓶颈的工具,熟知每个工具的用法、效果和差异才能选取最合适的优化策略,快速提高VR应用的性能。在这个章节我们会集中讲解和介绍UE4的这些优化工具。

渲染线程优化

由于性能、带宽和MSAA等考虑因素,目前VR应用多采用前向渲染(Forward Rendering)而非延迟渲染(Deferred Rendering)。但在UE4的前向渲染管线中,为了减少GPU overdraw,在basepass前的prepass阶段会强制使用early-z来生成depth buffer,导致basepass前的GPU工作量提交较少。加上目前主流的DirectX* 11基本上属于单线程渲染,多线程能力较差,一旦VR场景的drawcalls或者primitives数目较多,culling计算时间较长,基本上在basepass前的计算阶段就很可能因为渲染线程瓶颈而产生GPU闲置(GPU bubbles),降低了GPU利用率而引发掉帧,所以渲染线程的优化在VR开发中至关重要。

由于性能、带宽和MSAA等考虑因素,目前VR应用多采用前向渲染(Forward Rendering)而非延迟渲染(Deferred Rendering)。但在UE4的前向渲染管线中,为了减少GPU overdraw,在basepass前的prepass阶段会强制使用early-z来生成depth buffer,导致basepass前的GPU工作量提交较少。加上目前主流的DirectX* 11基本上属于单线程渲染,多线程能力较差,一旦VR场景的drawcalls或者primitives数目较多,culling计算时间较长,基本上在basepass前的计算阶段就很可能因为渲染线程瓶颈而产生GPU闲置(GPU bubbles),降低了GPU利用率而引发掉帧,所以渲染线程的优化在VR开发中至关重要。

如果我们用GPUView分析图3的场景,会得到图4的结果,图4中红色箭头指的位置就是CPU渲染线程开始的时间。由于running start,第一个红色箭头在垂直同步前3ms就开始计算,但显然到了垂直同步时GPU还没工作可以做,一直到3.5ms后GPU短暂工作了一下又闲置了1.2ms,然后CPU才把prepass工作提交到CPU context queue,prepass完成后又过了2ms basepass的工作才被提交到CPU context queue给GPU执行。图4中红圈圈起来的地方就是GPU闲置的时间段,加起来有接近7ms的GPU bubbles,直接导致GPU渲染无法在11.1ms内完成而掉帧,需要2个垂直同步周期才能完成这帧的工作,实际上我们可以结合Windows* Performance Analyzer(WPA)分析GPU bubbles期间的渲染线程调用堆栈并找出瓶颈是由哪些函数引起的[1]。另外第二个红色箭头指的位置是下一帧渲染线程开始的时间,由于这一帧出现掉帧,所以下一帧的渲染线程多了整整一个垂直同步周期作计算。等到下一帧的GPU在垂直同步后开始工作时,渲染线程已经把CPU context queue填满了,所以GPU有足够多的工作可以做而不会产生GPU bubbles,只要没有GPU bubbles一帧的渲染在9ms内就能完成,于是下一帧就不会掉帧。3个垂直同步周期完成2帧的渲染,这也是为什么平均帧率是60fps的原因。

从图4的分析结果可以发现在这例子中,GPU实际上并不是性能瓶颈,只要把真正的CPU渲染线程瓶颈解决,该VR游戏就能够达到90fps。而事实上我们发现大部分用UE4开发的VR应用都存在渲染线程瓶颈,因此熟练掌握下面几种UE4渲染线程优化工具可以大大提升VR应用的性能。

Image may be NSFW.
Clik here to view.

图 3.一个存在CPU渲染线程瓶颈的VR游戏例子,上面显示了SteamVR对每帧CPU和GPU消耗时间的统计。

Image may be NSFW.
Clik here to view.

图 4.图3例子的GPUView时间视图,可以看到CPU渲染线程瓶颈导致了GPU闲置,从而引发掉帧。

实例化立体渲染(Instanced Stereo Rendering)

VR由于双目渲染的原因导致drawcall数目增加一倍,容易引发渲染线程瓶颈。实例化立体渲染只要对对象提交一次drawcall,然后由GPU分别对左右眼视角施加对应的变换矩阵,就能够把对象同时画到左右眼视角上,等于把这部分的CPU工作移到GPU处理,增加了GPU vertex shader的工作但可以节省一半drawcall。因此,除非VR场景的drawcall数目较低(< 500),否则实例化立体渲染一般能够降低渲染线程负载,为VR应用带来约20%的性能提升。实例化立体渲染可以在项目设置中选择打开或关闭。

可见性剔除(Visibility Culling)

在VR应用中渲染线程瓶颈通常由两大原因造成,一个是静态网格计算另一个是可见性剔除。静态网格计算可以通过合并drawcall或者mesh来优化,而可见性剔除则需要减少原语(primitives)或者动态遮挡剔除(dynamic occlusion culling)的数目。可见性剔除瓶颈在VR应用中尤其严重,因为VR为了减低延时强制每帧CPU渲染线程计算最多只能提前到垂直同步前3ms(running start/queue ahead),而UE4里InitViews(包括可见性剔除和设置动态阴影等)阶段是不会产生GPU工作的,一旦InitViews所花时间超过3ms,就必定会产生GPU bubbles而降低GPU利用率,容易造成掉帧,所以可见性剔除在VR里需要重点优化。

在UE4里可见性剔除由4个部分组成,按照计算复杂度从低到高排序分别是:

  1. 距离剔除(Distance culling)
  2. 视椎剔除 (View frustum culling)
  3. 预计算遮挡剔除(Precomputed occlusion culling)
  4. 动态遮挡剔除(Dynamic occlusion culling): 包括硬件遮挡查询(hardware occlusion queries)和层次Z 缓冲遮挡(hierarchical z-buffer occlusion)

所以设计上尽可能将多数的primitives由1-3的剔除算法处理掉,才能减少InitViews瓶颈,因为4的计算量远大于前3个。下面会集中讲解视椎剔除和预计算遮挡剔除:

视椎剔除

UE4里VR应用的视椎剔除是对左右眼camera各做一次,也就是说需要对场景里所有primitves历遍2次才完成整个视椎剔除。但事实上我们可以通过改动UE4代码实现超视椎剔除(Super-Frustum Culling)[5],即合并左右眼视椎并历遍1次场景就能完成视椎剔除,大致可以节省渲染线程一半的视椎剔除时间。

预计算遮挡剔除

经过距离剔除和视椎剔除后,我们可以用预计算遮挡剔除进一步减少需要发送到GPU做动态遮挡剔除的primitives数目,以减少渲染线程花在处理可见性剔除的时间,同时也可以减少动态遮挡系统的帧跳跃(frame popping)现象(由于GPU遮挡剔除查询结果需要一帧后才返回,所以当视角快速转动的时候或者在角落附件的对象容易产生可视性错误)。预计算遮挡剔除相当于增加内存占用以及建构光照的时间换取运行时较低的渲染线程占用,场景越大内存占用和译码预存数据的时间也会相对增加。然而,相对于传统游戏来说VR场景一般较小,而且场景大部分对象都属于静态对象,用户的可移动区域也有一定限制,这对于预计算遮挡剔除来说都是有利因素,因此这也成为开发VR应用时必须做的一项优化。

做法上,预计算遮挡剔除会根据参数设置自动把整个场景切割成相同大小的方块(visibility cell),这些cell涵盖了view camera所有可能出现的位置,在每个cell的位置预先计算遮挡剔除并储存在该cell里会100%被剔除的primitives,实际运行时以LUT(Look Up Table)的形式读取当前位置所在cell的剔除数据,那些被预存下来的primitives在runtime时就不需要再做动态遮挡剔除了。我们可以通过控制台命令“Stat InitViews”查看Statically Occluded Primitives来得知多少primitives被预计算遮挡剔除处理掉,用Decompress Occlusion查看每帧预存数据的译码时间以及用“Stat Memory”中的Precomputed Visibility Memory查看预存数据的内存占用。其中Occluded Primitives包括了预计算及动态遮挡剔除的primitives数目,将Statically Occluded Primitives / Occluded Primitives的比例提高(50%以上)有助于大大减少InitViews花费时间。预计算遮挡剔除在UE4里的详细设置步骤以及限制可以参考 [6-7]。

Image may be NSFW.
Clik here to view.

图 5.预计算遮挡剔除例子。

静态网格体Actor合并(Static Mesh Actor Merging)

UE4里的“Merge Actors”工具可以自动将多个静态网格体合并成一个网格体来减少绘制调用,在设置里可以根据实际需要选择是否合并材质、光照贴图或物理数据,设置流程可以参考[8]。此外,UE4里有另一个工具-分层细节级别(Hierarchical Level of Detail,HLOD)也有类似的Actor合并效果[9],差别在于HLOD只会对远距离发生LOD的对象做合并。

实例化(Instancing)

对于场景中相同的网格体或对象(例如草堆、箱子)可以用实例化网格体(Instanced Meshes)来实现。只需提交一次绘制调用,GPU在绘制时会根据对象的位置做对应的坐标变换,假如场景中存在不少相同的网格体,实例化能有效降低渲染线程的绘制调用。实例化可以在蓝图里进行设置(BlueprintAPI -> Components -> InstancedStaticMesh(ISM))[10],如果想对每个实例化对象设不同的LOD可以用Hierarchical ISM(HISM)。

单目远场渲染(Monoscopic Far-Field Rendering)

受限于瞳距,人眼对于不同距离的对象有不同的立体感知程度(depth sensation),按照人均瞳距65mm来看,人眼对于立体感受最强烈的距离大约在0.75m到3.5m之间,超过8m人眼对立体就不太容易感知,而且灵敏程度随着距离越远而越弱。

基于这个特性,Oculus*和Epic Games*在UE 4.15的前向渲染管线中引入了单目远场渲染,容许VR应用分别根据各对象到view camera的距离设置成用单目还是双目渲染[11],如果场景中存在不少远距离对象,这些远距离对象用单目渲染就可以有效降低场景的绘制调用和pixel shading成本。例如Oculus*的Sun Temple场景采用单目远场渲染后每帧可以减少25%的渲染开销。值得注意的是目前UE4中的单目远场渲染只能用在GearVR*上,对PC VR的支持要后面的版本才会加入。

在UE4里单目远场渲染的详细设置方法可以参考[12],另外可以在控制面板输入指令“vr.MonoscopicFarFieldMode [0-4]”查看stereoscopic buffer或monoscopic buffer的内容。

逻辑线程优化

在UE4的VR渲染管线中,逻辑线程比渲染线程提早一帧开始计算,渲染线程会基于前一帧逻辑线程的计算结果生成一个代理(proxy)并据此进行渲染,确保渲染过程中画面不会发生变化; 同时逻辑线程会进行更新,更新结果会通过下一顺的渲染线程反映到画面上。由于逻辑线程在UE4里是提前一帧计算的,除非逻辑线程耗时超过一个垂直同步周期(11.1ms),否则并不会成为性能瓶颈。但问题在于UE4的逻辑线程跟渲染线程一样只能运行在单一线程上,蓝图里的gameplay,actor ticking和AI等计算都是由逻辑线程处理,如果场景中存在较多的Actor或者交互导致逻辑线程耗时超过一个垂直同步周期,那么便需要进行优化。下面介绍两个逻辑线程的性能优化技巧。

Blueprint Nativization(蓝图原生化)

在UE4预设的蓝图转换过程中,需要使用虚拟机(Virtual Machine, VM)将蓝图转化为C++代码,其间会因为VM的开销而造成效能损失。在UE 4.12开始引入了蓝图原生化,可以事先将所有或者其中一部分蓝图(Inclusive/Exclusive)直接编译成C++代码,运行时以DLL形式动态加载,避免VM开销而提高逻辑线程效率,详细设置可参考[13]。需要注意的是,如果蓝图本身已经做过优化(例如将计算较重的模块直接用C++实现),蓝图原生化能够提高的性能有限。

另外蓝图里的函数UFUNCTION是不能inline的,对于反复多次调用的函数可以用蓝图里的Math Node(可inline)或者通过UFUNCTION调用inline函数实现,最好的方法当然是直接把工作分到其他线程处理[14-15]。

骨骼网格(Skeleton Meshing)

如果场景中因为Actor太多而产生逻辑线程瓶颈,除了可以降低骨骼网格体及动画的更新频率(ticking)外,也可以用骨骼网格体LOD(Skeletal Mesh LODs)或者根据距离远近用分层(hierarchical)方法来处理跟Actor之间的交互行为。数个骨骼网格体之间共享部分骨架资源也是另一种可行办法[16]。

点击访问Unreal* Engine 4 VR应用的CPU性能优化和差异化:第三部分

2017英特尔® 软件大会

Image may be NSFW.
Clik here to view.

2017英特尔® 软件大会介绍

2017英特尔® 软件大会于2017年5月在上海、北京和深圳三地隆重举行。 本次大会由英特尔资深专家深入分享软件开发工具与技术,机器学习以及数据中心和IoT领域软件发展的未来趋势。内容涉及英特尔® Parallel Studio XE 2017概述和新功能,DC和IoT的功能,HPC、嵌入式IoT以及IoT 开发工具概述,英特尔® 编译器中的新功能和SDTL等等。

精彩视频

Image may be NSFW.
Clik here to view.

最优英特尔软硬件组合助力你的工作(中文)(27'56") 作者:Eric Tang

 

Image may be NSFW.
Clik here to view.

未来并行计算和市场趋势(中文)(55'30") 作者:Henry A Gabb

 

Image may be NSFW.
Clik here to view.

英特尔® Parallel Studio XE 综述和新特性(中文)(41'22") 作者:EGreg S Anderson

 

Image may be NSFW.
Clik here to view.

深入洞悉英特尔® VTune Amplifier 的性能和扩展性(中文)(52'44") 作者:Colt Gan

 

Image may be NSFW.
Clik here to view.

英特尔® Parallel Studio XE 综述和新特性(中文)(36'44") 作者:Colt Gan

 

Image may be NSFW.
Clik here to view.

深挖至强和至强融核处理器调优性能(中文)(54'19") 作者:Colt Gan

 

Image may be NSFW.
Clik here to view.

利用英特尔® 微控制器开发工具构建创新解决方案(中文)(50'24") 作者:Chao Yu, Yang Wang

 

Image may be NSFW.
Clik here to view.

应用英特尔® VTune™ 放大器 进行性能分析(中文)(1:41'14") 作者:Chao Yu, Yang Wang

 

Image may be NSFW.
Clik here to view.
性能分析概念和方法简介(中文)(35'56") 作者:Chao Yu, Yang Wang

 

Image may be NSFW.
Clik here to view.

加速英特尔® Media SDK和英特尔® Media Server Studio的代码转换(中文)(41'19") 作者:Zachary Zhou

 

Image may be NSFW.
Clik here to view.

介绍英特尔® Computer Vision SDK(中文)(28'31") 作者:Zachary Zhou

 

 

 

沉浸式虚拟现实体验指南

查看 PDF [134 KB]

Image may be NSFW.
Clik here to view.

简介

近年来,虚拟现实 (VR) 技术取得显著发展,沉浸式环境成为现实,在该环境中,用户能够感受到更加逼真的真实感,在创造的环境中有一种“真的置身此地”的感觉。CPU 性能、GPU 性能、VR 头盔的视觉保真度和支持 VR 的软件均取得长足发展。

很明显,游戏是 VR 技术的最大受益行业,并且已经开始充分利用该技术。其他软件类别也可以从 VR 的沉浸式功能中受益,包括教育、培训和治疗应用。

然而,与许多新技术一样,外表看起来酷炫十足的 VR 易于实施,但同样存在致命缺陷,会让您脱离沉浸式体验,或者最终,您会感到困惑,好奇为什么有人要如此麻烦地开发该软件。人们最初看到该技术时会由衷地发出赞叹“哇哦!”,但很快就会质疑“有什么意义?”,这正是开发人员面临的风险。

幸运的是,该风险可以规避。我们对 VR 开展了深入研究,并且关于生理机能以及最终用户对多类 VR 软件的反应的一系列研究表明,可遵循一组明确的指南,以成功创建充分利用该技术的 VR 体验。

此外,英特尔完成了扩展 VR 研究的重要工作。在该工作中,研究人员观察了终端用户对多种 VR 活动的最初和后续体验,然后开展详细汇报会议及问卷调查,以了解哪些特定因素能使VR体验令人沉于享受。一个关键的调查结果是,享受和沉浸度之间存在高度统计相关性。研究还表明,游戏和环境的多个方面与沉浸密切相关,因此,它们是加深该感觉的关键。

我们从已有研究与新研究的综合调查结果中总结出了这些指南,以创造沉浸式 VR 体验。这些指南互为基础,只有完成每一级别才能进入下一级别。指南自然地分成三类:

身体基础

通过使用可保护 VR 用户在佩戴头盔时免受伤害的技术,在虚拟世界里实现沉浸;保证舒适度,避免因硬件人体工程学而产生的疼痛,避免晕动病;不因外界的不相关景象与声音而分心。

基本真实感

通过在虚拟世界里提供流畅的 3-D 视频、真实声音、直观的环境操作控件以及对用户行为的自然反应,让虚拟世界变得真实。

不只是新鲜

通过与虚拟世界里的几乎所有事物进行交互,保持沉浸持续存在且引人入胜,而不只是令人印象深刻。VR 还可提供不依赖技术的优质内容或游戏玩法,使 VR 交互成为体验的核心,让用户能够轻松、快速、顺利地进入虚拟世界。

本白皮书描述了所有这三个类别中的指南,以使 VR 软件产品符合现有技术提供的沉浸感潜力。本白皮书还参考了其他可用的详细技术指南。

注意:本白皮书的目标读者是需求各异的广泛 VR 软件开发人员和硬件制造商。您可以跳过与您的生态系统无关的部分。

Image may be NSFW.
Clik here to view.
  
带有该符号的元素表示关于可通过提高 CPU 功率改进VR体验的指南。

身体基础

Image may be NSFW.
Clik here to view.
身体基础指南是在 VR 体验中建立任何沉浸感的基本要求。要使玩家足够信任系统以体验沉浸感,玩家必须感到安全、舒适,且不受外界干扰因素的影响。Oculus*、Microsoft* 和 HTC* 等硬件提供商制定的许多技术指南均属于此类别。

 

 

安全性

人身安全

确保整个系统可支持用户在体验虚拟世界的时候能够在现实世界中安全移动。负责任的开发人员应该:

  • 在开始任何 VR 体验之前,告知用户潜在风险。
  • 在用户戴上头盔之前,提供有关系统(支持运动边界)对身体要求的明确指导。
  • 在虚拟视角中,在用户快要撞到边界1之前,提供“边界”反馈。反馈可以是视觉反馈、声音反馈、触觉反馈或任意组合。
  • 提供校准步骤,以准确定义可达边界,确保为不同体型的玩家定义合理准确的边界。

社交安全

确保用户了解他们在虚拟世界里的行为所产生的社会影响,并确保用户不会进入有损人格或危险的社交情境。负责任的开发人员应该:

  • 在进入在线社会环境之前,征得用户的同意。如果社交环境中既有画面,又有声音,确保用户在进入之前知道两种模式都将激活。
  • 让用户控制其在线头像的外观和身份。例如,不要假设用户希望其 Steam 帐户名是其在社会虚拟世界中的网名;在进入社会情境之前,允许他们确认(或更改)自己的网名。
  • 切勿纵容在线社会环境下用户之间的有损人格或危险的人际交流。
  • 为用户提供方法,以鼓励良好的社交礼仪。例如,有时候,以可见的方式标记表现糟糕的人员足以在开始时避免不良行为。

Image may be NSFW.
Clik here to view.
  
舒适性

人体工程学

戴上头盔或握住手柄后,当用户开始感觉不适时,他们不再体验到沉浸感。负责任的开发人员应制造可调节的硬件,以适应不同体型的玩家。例如:

  • 合适的头盔表示,头盔不会重重压在鼻梁或颧骨上,否则时间一长,便会引起疼痛。
  • 一副好手柄应适合不同手掌大小。例如,手柄应该适合第 5 百分位的女性(宽度 = 7.34 cm 或 2.89 in)的手,这样一来,当第 95 百分位的男性(宽度 = 9.76 cm 或 3.84 in)使用时,便不会意外按错按钮。
  • 通过参考军方2发表的人体测量数据表等,针对不同人体尺寸进行设计。

VR 疾病

过去,VR 引起的晕动病(模拟器病、电脑病等)是一大问题。1999 年发表的一项研究发现,在 148 位参与者中,80% 的参与者表示遇到了 VR 引起的症状,5% 的参与者受到严重影响3。现代 VR 系统虽已经过长时间发展,但电脑病的风险仍是主要问题。

当然,有些人更容易患上电脑病。研究表明,女性、儿童以及患有轻微疾病或失眠症状的群体更容易出现电脑病4。但如果 VR 系统的目标是让想要使用该系统的任何人都可以享受到 VR 体验,那么对于任何开发工作而言,预防此类症状应该是优先考虑的事项。关于该主题,有许多优秀的资源,包括 Oculus“最佳实践”5、Google Cardboard 指南6和伊利诺伊大学的 Steven LaValle 编写的名为“虚拟现实”的教材7

这些只是专家为了预防电脑病而提出的一些指南示例。请查阅参考文献,以获取更多详细信息。

  • 始终以等于或接近标准人类运动的速度如实回应用户的运动。争取实现零延迟,尤其是在头部跟踪时。
  • 以等于或大于硬件刷新速度的帧速率运行代码,以避免颤抖。
  • 确保眼睛视点定位准确,考虑到立体偏移。
  • 避免出现会占据大部分用户视野的物体,以防止出现自动的感觉。
  • 确保加速少且时间短,最好是瞬间完成。
  • 在瞬间转移时,提供适当的视觉提示以保持方位感,如果可能,保持原来的方向。

阻挡现实世界

要在虚拟世界里体验到沉浸感,物理系统需充分防止现实世界进入虚拟体验,以免造成干扰。

  • 在头盔四周提供足够的衬垫,避免光线泄漏。
  • 提供与虚拟世界一致的音频声道,以设定环境,并避免外界环境中的声音干扰因素。

基本真实感

Image may be NSFW.
Clik here to view.
安全和健康得到保证后,营造沉浸式体验的下一步是创造一个令人信服的世界,以供用户探索。在最好的情况下,用户期望和虚拟世界之间的明显不匹配将在潜意识里阻止他们完全沉浸其中。在最坏的情况下,这些不匹配成为明显的干扰因素,破坏沉浸感,就像是电影剪辑师没有将电影场景中的麦克风架或摄像机支架剪掉。

 

画面完整性

虚拟世界中的画面将是用户体验的主要方式。虽然高度逼真的画面很重要,但是画面的一致性和流畅度比真实感更加重要。沉重像素化、撕裂、不一致的细节层次等缺陷都是会导致用户脱离 VR 世界的人为视觉效果。

  • 确保虚拟世界正确呈现,关于是否可能会被用户发现,没有技术欺骗5
  • 即使是在大范围行动和移动时,一致的帧速率对于保持玩家在虚拟世界中集中注意力仍至关重要1
  • 最好的环境是有趣的地平线和精致的天空,以及平静或深色地面8
  • 考虑一个因素:代表玩家现实世界环境的虚拟网格将如何并入视觉体验。例如,当地板网格边界下方的图像充满细节时,会使网格看起来与地面悬浮8
  • 确保任何背景全景图像无缝拼接,因此在图像左侧和右侧交汇处没有不自然的过渡8
  • 由于“恐怖谷理论”,如果增加人物角色或玩家头像的图形清晰度,则收益递减。该理论假设,当机器人接近令人信服的逼真度(但还有一点差别)时,观察者对机器人的厌恶感比卡通人物更大。

Image may be NSFW.
Clik here to view.
  
真实的声音

空间声音

将声音与位置相关联的能力是用户导航虚拟世界的重要提示。缺少空间声音或者感知到的声音来源不匹配将转移用户对虚拟世界的注意力。为此,大部分或者所有声音应该进行空间化处理。

  • 帮助用户确保其耳机和声音设置均正确配置,以优化声音体验。
  • 与环绕声相反,音乐也应该进行空间化处理,尤其是当音乐与菜单或 UI 元素相关联时9
  • 最好接受用户对声音的期望,而非颠覆期望。例如,由于现实世界中的经历,当用户听到鸟叫时,他们可能会抬头,即使该声音来自他们下方9
  • 当用户逐渐靠近声源时,声音应该越来越大。这包括头部前倾,不只是用户头像的移动5
  • 用户的方向也会影响声音的质量和大小(例如,面对声音或者背对声音)。
  • 包括多普勒效应,因为这会提供有价值的动作提示7
  • 避免不可见或无法识别的声音来源,除非目标是创造错乱感,故意使玩家变得焦躁9

周围环境

声音的另一个重要作用是为场景创造条件,并从感知和情绪上将玩家带入虚拟世界。例如,鬼屋里的咯吱声和咆哮声可以丰富环境,而恐怖音乐可以制造情绪,将氛围传达给用户。

  • 低水平的环境噪声也可以用于掩盖来自用户真实环境中的环境噪声,减少干扰因素。
  • 然而,环境声音不能盖过空间声音,这一点非常重要。如果环境噪声占据主导地位,用户将难以找到其他角色或活动的声音。

无处不在的音效

用户希望环境中的所有事物可以在视觉上对他们的互动做出响应,同样,他们也希望所有事物做出真实的声音响应。抓住、抛下、扔出或操作某个物体时,用户会希望出现与之匹配的音效。

  • 音效的特殊性非常重要。不同物体被抓住或者碰撞时,会产生不同的噪音,用户将适应期望听到的声音与真实听到的声音之间的任何不匹配。
  • 真实声音比合成或不自然的声音更好。用户对该声音越熟悉,就会感觉越真实,他们将越容易在环境中辨别该声音并维持真实的幻觉9

Image may be NSFW.
Clik here to view.
  
响应式世界

环境中的提示

如果 VR 用户真正沉浸于虚拟世界,他们将希望与环境交互。每个行为应该获得听觉、视觉和触觉上的适当响应。

开始使用 VR 时,用户将希望环境中的几乎所有事物都可以进行交互。如果环境中只有特定事物可以进行交互,请务必向玩家解释清楚,让他们可以准确预测能够与虚拟世界的哪些部分进行交互。这样一来,用户无需猜测,也无需对 VR 世界中看起来真实但却一动不动的物体感到失望,从而避免了令人沮丧的经历。这一沟通和“培训”应尽早开始,因为用户将从体验初期开始形成有关交互性的心理模式。

目前,VR 中的触觉反馈缺乏忠实性和特殊性,但通过使体验变得更加切实明显,仍然增添了沉浸感。每个 VR 世界需要发展其触觉语言,以通过不同模式进行沟通。例如,快速轻微的振动可表示用户捡起物体,而猛烈的脉冲振动可表示游戏玩家受伤。

无明显滞后

要维持用户在虚拟世界里的沉浸感,保持用户头部和手部运动的高度准确性与零延迟跟踪至关重要。时间不匹配或延迟不仅不和谐,而且会产生晕动病,造成用户身体不适。

Image may be NSFW.
Clik here to view.
  
直观的控件

“比现实世界更好”的交互

选择、抓取、操作、携带、抛投和放置物体或其他环境特征应该可以轻松完成。交互程度并非总是需要完全真实,因为如果太过真实,可能会导致小任务变得异常沉闷和困难。

事实上,现实世界中要求的精度不是虚拟世界中要求的精度,因为玩家对这些操作的练习和反馈比现实生活中少得多。真实感来自于所有这些物体响应交互的独特方式、它们所产生的独特音效以及可行的物体组合方式。

关于如何操作物体,利用“吸引区域”等特征可为玩家留出更大的回旋余地,这样一来,简单任务屡次失败便不会使他们分心。在这一方面,吸引区域代表将产生预期行为的一组用户输入。例如,如果玩家尝试将瓶子直立放在桌子上,VR 应用程序应该接受更大范围的方向来使瓶子保持直立,而非应用极其真实的物理引擎来查看瓶子是否保持直立7

限制大动作

避免要求用户通过手臂做出许多大动作,否则用户可能会变成“猩猩手臂”。一些 VR 产品中存在这一现象,在这些作品中,玩家在玩游戏时需要一直伸展双臂、做出大动作,这样会使用户迅速感到疲劳。

不只是新鲜

Image may be NSFW.
Clik here to view.
人们很容易就会认为上述良好设备和沉浸式 VR 功能是软件产品成功所需的全部要素。虽然此类产品具备显著优势,但还不够。我们可以用电影院的 3-D 效果进行类比。无论雪花飘落或岩石向观众砸来的效果多么酷炫,如果电影无法提供值得观看的体验(即,好的角色、有趣的故事框架和观众想听的对话),这些新鲜感将很快消失。

在 VR 的世界里,该类比同样适用。要想超越与虚拟世界交互的吸引力,打造用户享受的体验,存在一些特定于 VR 的原则。本节也将描述这些原则。

优质内容

首先是优质内容。如果没有提供有价值的内容,即便是世界上最令人兴奋的交互,也将很快变得索然无味。该原则不是 VR 所特有的,但说明了该原则为何重要:VR 是实现目标的绝佳途径,包括出色的游戏或教育或培训体验,但不是目标本身。

根据类别不同,自然有所差异。对于游戏,优质内容表示趣味十足的游戏玩法、越来越困难的挑战、奖励机制、引人入胜的画面、有趣的故事线以及多年来经过彻底研究的精彩游戏的其他基本方面。对于教育软件,优质内容表示准确的信息、搜索信息的不同方式、评估学习的一些方法等。对于培训和治疗应用,成功因素同样众所周知。

只要 VR 开发人员记住,技术是与优质内容交互的工具,而不是弥补普通内容的支柱,他们便会取得最大的成功。

顺利的培训

虽然虚拟世界与现实世界大不相同,但也足够可信,因此许多最成功的 VR 产品采取措施,向虚拟世界顺利过渡。下面是提供培训的两种方法,无论单独或同时使用,均有效:

综合教程

优秀的教程在虚拟环境中进行,而非在纯粹的 2-D 教学空间中进行,因此在游戏或活动开始后,可迅速为用户提供视觉熟悉感。教程应涵盖手柄硬件(例如,手部的指挥棒)的使用、专业操作(如捡起或抛掷物体)和动作。动作非常重要,因为虽然在先进的 VR 系统中您可以向前和向侧面移动,但这些移动受到房间大小的限制,而 VR 环境可能有数英里宽。因此,大部分游戏将配备一些系统,以实现瞬间转移或者将用户移动到超出其在真实房间内移动范围的地方。在真实 VR 环境中,这些姿势需要教程帮助。在标准游戏中,综合教程已成为最著名的方法,但有了 VR,它们变得更加重要。

温和但快速过渡

为了减少进入新环境的冲击,软件可以帮助用户逐步过渡到虚拟世界。例如,在启动时,通过淡入环境声音和图像,VR 产品可避免突然且令人困惑的晃动。SteamVR 教程使用该方法,让用户在修改环境时观看。经过该简短但有意义的过渡之后,教程才会要求用户开始与虚拟世界交互。

Image may be NSFW.
Clik here to view.
  
无处不在的交互性

在 VR 环境中,用户假设所有事物的存在都是有目的的,因此希望与周围的所有事物进行交互。在 2-D PC 视频游戏中,通常可以让一些物体“有生命”并进行交互,而其他物体保持静态,不能触摸或移动。开发人员可能会假设,VR 游戏也是如此,但其实不是。

交互的动作

对最终用户进行的研究表明,加强的 VR 环境真实感让用户想要触摸、捡起或检查周围的环境,原因很简单,只是因为一切看起来如此真实。用户迅速意识到,他们的动作(选择交互对象和交互方式的能力)将被认真对待。当多个物体交互,然后其中一个“死去”且无法操作时,该侵入式提醒表明这是虚拟世界。此缺陷造成的不幸影响是,用户可能会脱离沉浸式体验。相反,在虚拟环境中,物体的交互越多,用户继续参与的机会就越大。

足够的内容来维持兴趣

无处不在的交互性中的一个方面是充足性。内容不仅应该持续交互(即使在某些小方面),而且必须提供足够的内容来保持用户的兴趣。由于 VR 是高度感官体验,因此成功的产品将达到平衡,提供足够的内容来维持该感官体验,但也不会多到让人感觉压抑。

VR 交互的主导性

优秀的 VR 软件旨在充分利用 VR 功能。不难想象,一些活动可能会以比较有趣但还是肤浅的方式使用 VR。例如,VR 阅读应用,用户可以在图书馆里成排的书籍之间走过、聆听脚步声、选书,然后坐下来阅读。在这种情况下,VR 交互可能比较新奇,但随着时间过去,它们开始被视为表面功夫,阻碍主要活动。

相反,在维持用户的兴趣和继续使用方面,强调 VR 的独特功能并在主要交互中开始使用 VR 功能的软件将更加有效。

斯坦福大学虚拟人类交互实验室主任 Jeremy Bailenson 表示,值得在 VR 中开发的体验可用下列一个或多个形容词来描述:罕见、无法实现、危险、昂贵10。要判断 VR 是否适合,一条经验法则是,确定下列任何问题的答案是否为肯定答案:

  • 罕见。活动是否不经常发生(例如,观看超新星或鲜为人知的海洋生物),在现实生活中开展此活动不切实际?
  • 无法实现。是虚构的吗(例如,怪物世界),或者是否违反物理定律(例如,人类像蜂鸟一样飞翔),无法做到?
  • 危险。如果您开展此活动,是否会受伤或发生更糟糕的结果?例如,新手的外科手术、在雪崩前高速滑雪、或者开车穿过城市街道时扔手榴弹。
  • 昂贵。如果大部分人去做,是否要花很多钱(例如,环游世界,或者重建泰姬陵)?

如果至少有一个答案是肯定答案,那么该活动或许适用于创造 VR 体验的软件。要想创造真实感以模拟大部分人无法体验的活动,这种情况十分理想。

结论

虚拟现实的功能经过长时间发展,现在已经可以提供相当令人信服的沉浸感。若要以可持续的方式实现这一目标,VR 开发人员需要特别留意多个潜在干扰类别:安全性和舒适性、基本感官真实感及实施(不只是 VR 的新鲜感)的基本问题,以真正维持用户参与。

遵循上述指南以创建可为用户提供重要沉浸式体验的 VR 软件产品,这样开发人员将能够更好的借助该新技术实现真正的成功,而不只是虚拟成功。

鸣谢

十分感谢 Thug Design 的 Elise Lind 和 Colin Bay 帮助完成本文章。

参考资料

1.HTC Corporation (2016)。开发 Vive 和 SteamVR。HTC Vive 开发人员门户,地址为 https://developer.viveport.com/us/develop_portal/

2.部队人体测量数据表,节选自 Gordon, Claire C. 等人。1988 年美国人体测量调查:概要统计临时报告。1989 年 3 月。地址为 http://www.mcieast.marines.mil/Portals/33/Documents/Safety/OSH/Anthropometry%20Data%20Tables.pdf

3.Sharples, S.、Cobb, S.、Moody, A. 和 Wilson, J.R.(2008)。虚拟现实引起的症状和影响 (VRISE):对比头戴式显示器 (HMD)、台式机与投影显示系统。Displays 29,第 58-69 页。(Elsevier: 2008) 地址为 https://pdfs.semanticscholar.org/2a88/a274795c76b41583a595a7cc6181aaf064b3.pdf

4.LaViola, J.J.(2000)。探讨虚拟环境里的电脑病。SIGCHI Bulletin 第 32/1 卷,2000 年 1 月,第 47-56 页。地址为 http://graphics.cs.brown.edu/~jjl/pubs/cybersick.pdf

5.Oculus VR,LLC (2016)。Oculus 最佳实践。地址为 https://developer3.oculus.com/documentation/intro-vr/latest/concepts/bp_intro/

6.Google (2016)。设计 Google Cardboard。来自 Google 设计中心,地址为 https://www.google.com/design/spec-vr/designing-for-google-cardboard/a-new-dimension.html

7.LaValle, S. M. (2016)。虚拟现实(教材)。将由剑桥大学出版社出版,下载地址为 http://msl.cs.uiuc.edu/vr/vrbook.pdf。© Steven M. LaValle,2015 年,2016 年。

8.Valve Corporation (2016)。如何制作舒适的 SteamVR 背景(会员贡献指南)。地址为 http://steamcommunity.com/app/250820/guides/

9.Microsoft Corporation (2017)。Windows Holographic 文档。Windows 开发人员中心,地址为 https://developer.microsoft.com/en-us/windows/mixed-reality/design

10.Oremus, Will(2016 年 8 月)。虚拟现实的好处,Slate,2016 年 11 月,访问地址:http://www.slate.com/articles/technology/future_tense/2016/08/the_only_good_reasons_to_use_virtual_reality_and_the_current_vr_renaissance.html

深度学习为何奏效以及何时奏效:深入了解深度学习

Ronny Ronen
英特尔计算智能协同研究院 (ICRI-CI)1

近年来,深度学习脱颖而出,成为完成各项人工智能任务的领先技术(LeCun 等(2015 年);Goodfellow 等(2016 年))。深度学习是一种十分先进的方法,适用于多个领域,包括对象识别与验证、文本理解与翻译、问题回答等。此外,深度学习还有望在多种(以前认为不可能的)全新用途中发挥重要作用,比如全自动驾驶。

尽管深度学习解决复杂问题的能力一次次得到了充分的验证,但在深度学习为何奏效、具备哪些真正的能力、何时奏效(以及何时不奏效)等方面依然存在许多谜团。无论是理论研究还是用于实践,都必须首先解开这些谜团,才能了解如何安全有效地使用这些方法。尽管人们对此展开了深入研究,并获得了重要洞察,但大部分谜团依然没有解开。我们普遍认为深度学习就像是一种“神奇的魔法”,但我们其实并不了解个中原理。缺乏真正的了解将导致科学家无法深入探索,开发人员也因此而担忧大家会不会让运行机制和弱点都不得而知的系统来驱动自动驾驶汽车?

自 2012 年成立以来,英特尔计算智能协同研究院 (ICRI-CI) 一直大力支持机器学习和深度学习方面的研究。我们集合了六位最优秀的 ICRI-CI 深度学习研究人员解决“深度学习为何奏效以及如何奏效”的挑战,旨在深入了解深度学习、提供有关深度网络运行原理的洞察,并展示他们在深度学习的表现方式、局限性和潜能等方面的重要研究成果。

这次挑战取得了可喜的成果,他们撰写了五篇报告,介绍如何解决深度学习的各种难题。报告总结了研究人员在重大会议和期刊上发布的著作内容,以及专为撰写此文所收集的最新研究成果。相关难题包括深入了解深度网络为何奏效,何时奏效(以及何时不奏效),深度网络的几何表达方式所产生的影响,以及实现的深度网络的可理解性。

了解深度网络为何奏效,何时奏效(以及何时不奏效)

  1. Naftali Tishby 和 Ravid Schwartz-Ziv 通过信息打开深度神经网络黑匣子一文中对深度网络进行了深入研究,采用的方法包括分析信息理论属性、查看各层关于输入输出的信息内容,以及建议网络在每一个层级都明确尝试优化压缩与预测之间的信息瓶颈 (IB) 折衷。另外文中指出,用于培训网络的随机梯度下降 (SGD) 时代可划分成两个明显的阶段:缓慢表现压缩和快速经验错误最小化。之后他们在关于隐藏层的计算优势方面提出了一个新的理论论据。
     
  2. Shai Shalev-Shwartz、Ohad Shamir 和 Shaked Shamma基于梯度的深度学习的失败中尝试深入了解与常用方法和算法相关的困难和局限性。文中列举出四类导致现有算法失败或遭遇重大困难的问题、通过实际体验证明这些问题的失败之处、提供相关的理论洞察解释问题来源,并提出解决这些问题以提升性能的补救措施。
     
  3. Amnon Shashua、Nadav Cohen、Or Sharir、Ronen Tamari、David Yakira 和 Yoav Levine通过层级张量分解分析和设计卷积网络中分析了深度卷积网络的表现属性。他们通过层级张量分解的等价性,研究卷积网络中不同架构特性(深度、宽度、池化几何体、互联、重叠操作等)的表现效率和归纳偏置。他们的研究结果为验证卷积网络的有效性指明了方向,并提供了新的网络设计工具。

    几何体对深度网络表现的影响
     
  4. Nathan Srebro、Behnam Neyshabur、Ryota Tomioka 和 Ruslan Salakhutdinov深度学习中的几何优化和隐式正则化中指出,用于神经网络培训的优化方法通过隐式正则化对深度学习模型的泛化能力起着关键的作用。他们经过论证表明,泛化能力不取决于网络规模,而是取决于部分其他的隐形控制。他们之后对深度网络的参数空间几何体进行了研究,建议根据该几何体调整优化算法,并因此证明了不断变化的实证优化程序可显著提高泛化性能。

    深度网络的可解释性
     
  5. Shie Mannor、Tom Zahavy 和 Nir Baram灰色化黑匣子:了解 DQN中展示了以非盲法分析深度 Q 网络 (DQN) 的方法和工具。他们建议采用一种新模型 — 半聚合马尔可夫决策过程 (SAMDP),和一种可自动学习的算法。他们使用这些工具,表明 DQN 学习的特性能够以层级的方式聚合状态空间,进而解释其成功之处。另外,他们还能够深入观察网络,了解和描述 DQN 针对三款不同的 Atari2600 游戏所学习的策略,并提供在增强学习过程中解释、调试和优化深度神经网络的方法。

参考资料

Ian Goodfellow、Yoshua Bengio 和 Aaron Courville.深度学习.麻省理工学院出版社,2016 年。

Yann LeCun、Yoshua Bengio 和 Geoffrey Hinton.深度学习.Nature,521(7553):436–444,2015 年。

1 工作在进行的过程中得到了英特尔计算智能协同研究院 (ICRI-CI) 的大力支持。本文属于《深度学习为何奏效以及何时奏效:深入了解深度学习》 ICRI-CI 论文集的前言部分。

 

Image may be NSFW.
Clik here to view.

立即注册,获得独家
AI 信息

订阅

一个面向图像超高分辨率的低级视觉任务示例

卷积神经网络 (CNN) 正成为计算机视觉的主流。CNN 在高级视觉任务中的应用尤其广泛,如包括 AlexNet* 在内的图像分类。本文(及相关教程)介绍了一个面向图像超高分辨率 (SR) 的 CNN 示例(低级视觉任务)以及如何使用英特尔® Caffe* 分发包框架和英特尔® Python* 分发包进行实施。该 CNN 基于  Chao Dong、Chen Change Loy、Kaiming He 和 Xiaoou Tang1,2的成果,提供了使用 CNN 执行单图像 SR 的新方法。

简介

现代摄像头传感器在数码相机、手机、平板电脑等日常电子设备中无处不在,这些设备能产生高分辨率 (HR) 图像和视频。这些图像和视频的分辨率多数情况下可满足普通用途。

但是,在以下情况下,这些图像和视频被视作低分辨率 (LR):

  1. 设备不生成 HR 图像或视频(某些监控系统中的设备)。
  2. 查看的对象占整个图像或视频帧的一小部分,如距离摄像头较远的人脸或车牌。
  3. 模糊或噪声图像。
  4. 使用图像或视频的应用要求高于摄像头显示的分辨率。
  5. 在预处理阶段改善分辨率有助于提升利用这些图像的其他算法的性能,如面部检测。

超高分辨率是从 LR 图像中获取 HR 图像的一种方法。SR 可基于单张图像或视频序列的某几帧。

单图像(或单帧)SR 使用 LR 和 HR 图像对学习两者间的映射。为此创建了包含 LR 和 HR 对的图像数据库3,并用作训练集。经过学习的映射可预测新图像中的 HR 详细信息。

另一方面,多帧 SR 基于在同一场景中选取的几张图像,但是环境略有差别(如角度、照明和位置)。这一方法使用多张图像(或图像序列中的帧)中的非冗余信息改善 SR 性能。

本文将重点介绍单图像 SR 方法。

使用卷积神经网络实现单图像超高分辨率

该方法利用训练集训练神经网络 (NN),以学习训练集中 LR 和 HR 图像的映射。文献中有许多关于 SR 的参考资料。30 年以来,各种方法被提出并采纳。使用深度 CNN 的方法是最近几年发展起来的。第一批方法的创建者1描述了一个三层 CNN,并把它命名为超高分辨率卷积神经网络 (SRCNN)。他们对该领域的开创性贡献除了证明从 LR 到 HR 的映射可以被配置为 CNN 之外,还在于创建了一个通常被用作参考的模型。新方法比较它的性能与 SRCNN 结果。这些创建者最近根据原始 SRCNN 开发了一个修改版本,并将其命名为快速超高分辨率卷积神经网络 (FSRCNN),恢复质量和运行速度2得以显著改善。

在本文中,我们将详细介绍 SRCNN 和 FSRCNN,在另一个单独教程中,我们将展示改进后的 FSRCNN 的实施。SRCNN 和 FSRCNN 均可和其他已发布的网络架构(或读者想要尝试的其他架构)结合使用,成为深入实验的基础。尽管 FSRCNN(及面向 SR 的其他新型网络架构)相比 SRCNN 有明显改善,本文仍介绍了原始 SRCNN,以展示这款开创性网络如何由创建之处发展为可利用不同拓扑优化结果的新网络。在本教程中,我们将使用英特尔 Caffe 分发包深度学习框架和英特尔 Python 分发包实施 FSRCNN 网络,然后充分利用英特尔® 至强® 处理器、英特尔® 至强融核™ 处理器和英特尔® 库加快训练和测试该网络的速度。

超高分辨率卷积神经网络 (SRCNN) 结构

SRCNN 的创建者介绍了他们的网络,指出他们的方法等同于稀疏编码方法4,后者是一种广泛应用于图像 SR 的学习方法。由于基于示例的学习方法可以在 CNN 模型中调整与推广,可见他们的工作非常重要,而且具有教育意义。

SRCNN 包含以下操作1

  1. 预处理:将 LR 图像放大到所需的 HR 尺寸。
  2. 特性提取:从放大的 LR 图像中提取一系列特性图。
  3. 非线性映射:将代表 LR 的特性图映射到 HR 块。
  4. 重构:从 HR 块中产生 HR 图像。

操作 2–4 可被配置为 CNN 中的卷积层,输入第 1 步的预处理图像,输出 HR 图像。该 SRCNN 结构包含 3 个卷积层:

  • 输入图像:上采样 LR 图像,得到所需的高分辨率和 c 通道(图像的色彩成分)
  • 卷积层 1:补丁提取
    • n1个过滤器,尺寸为 c× f1× f1
    • 激活函数:ReLU(修正线性单元)
    • 输出:n1个特性图
    • 优化参数:c× f1× f1× n1个权重和 n1个偏差
  • 卷积层 2:非线性映射
    • n2个过滤器,尺寸为 n1× f2× f2
    • 激活函数:ReLU
    • 输出:n2个特性图
    • 优化参数:n1× f1× f1× n2个权重和 n2个偏差
  • 卷积层 3:重构
    • 1 个过滤器,尺寸为 n2× f3× f3
    • 激活函数:身份
    • 输出:HR 图像
    • 优化参数:n2× f3× f3× c个权重和 c 个偏差
  • 损失函数:训练集中 N 个重构的 HR 图像和 N 个原始真实 HR 图像之间的均方误差 (MSE)(N 是训练集中图像的数量)。

在本文中,SRCNN 的创建者改变了过滤器的数量,在若干设置中实施并测试了 SRCNN。他们增加了参过滤器的数量,提升了 SR 性能,但是优化参数的增加(权重和偏差)导致计算成本升高。下图是他们的参考模型,在准确性/性能方面显示了出色的整体结果(图 1):

  • 输入图像:LR 单通道图像上采样为所需的高分辨率
  • 卷积层 1:补丁提取
    • 64 个过滤器,尺寸为 1 x 9 x 9
    • 激活函数:ReLU
    • 输出:64 个特性图
    • 优化参数:1 x 9 x 9 x 64 = 5184 个权重和 64 个偏差
  • 卷积层 2:非线性映射
    • 32 个过滤器,尺寸为 64 x 1 x 1
    • 激活函数:ReLU
    • 输出:32 个特性图
    • 优化参数:64 x 1 x 1 x 32 = 2048 个权重和 32 个偏差
  • 卷积层 3:重建
    • 1 个过滤器,尺寸为 32 x 5 x 5
    • 激活函数:身份
    • 输出:HR 图像
    • 优化参数:32 x 5 x 5 x 1 = 800 个权重和 1 个偏差

Image may be NSFW.
Clik here to view.

图 1. 显示参考模型参数的 SRCNN 结构。

快速超高分辨率卷积神经网络 (FSRCNN) 结构

SRCNN 创建者最近开发了一款全新 CNN,可加快训练和预测任务,同时获得与 SRCNN 不相上下甚至更出色的性能。新 FSRCNN 包含以下操作2

  1. 特性提取:直接从 LR 图像中提取一系列特性图。
  2. 缩小:通过使用少量的过滤器(相比特性提取使用的过滤器数量),减小特性向量的维度(因此降低参数数量)。
  3. 非线性映射:将代表 LR 的特性图映射至 HR 补丁。使用若干映射层执行该步骤,小于 SCRNN 中使用的过滤器尺寸。
  4. 扩大:增大特性向量的维度。为了更准确地生成 HR 图像,该操作执行与缩小层相反的操作。
  5. 去卷积:根据 HR 特性生成 HR 图像。

创建者详细介绍了 SRCNN 和 FSRCNN 的差别,与快速实施和实验(在本文和相关教程讨论范围内)最为相关的信息如下所示:

  1. FSRCNN 在非线性映射操作中使用了多个卷积层(SRCNN 中仅有一层)。可针对实验更改层数(相比创建者的版本)。重构后的性能和准确性可能根据上述更改而有所差异。它也是调整 CNN 的最佳示例,具体方法是将一定比例的 FSRCNN 固定在非线性映射层,然后添加或改变这些层,在非线性 LR-HR 映射操作中试验各种长度。
  2. 输入图像直接是 LR 图像。和 SRCNN 不同的是,不需要对它进行上采样,也能达到预期的 HR 图像尺寸。这就是网络速度变快的部分原因,和 SRCNN 相比,特性提取阶段使用的参数数量更少。

如图 2 所示,之前显示的 5 个操作可以被配置为 CNN,利用卷积层配置操作 1–4,利用去卷积层配置操作 5。通过参数修正线性单元 (PReLU) 层(请参见5)引入非线性,该模型的创建者选择了该层,这是因为它的性能比修正线性单元 (ReLU) 层更卓越、更稳定。请参阅附录 1,了解关于 ReLU 和 PReLU 的简要说明。

Image may be NSFW.
Clik here to view.

图 2. FSRCNN(56, 12, 4) 的结构。

根据创建者的反馈,整体性能最佳的模型是 FSRCNN (56, 12, 4)(图 2),该网络的 LR 特性维度为 56(第一层卷积层和去卷积层的过滤器数量),包含 12 个缩小过滤器(网络中间层的过滤器数量,执行映射操作),映射深度为 4(在 LR 和 HR 特性空间内执行映射的卷积层数量)。因此,该网络看上去像一个沙漏;两端粗(参数多),中间细(参数少)。该参考模型的整体形状对称,结构如下所示:

  • 输入图像:LR 单通道。
  • 卷积层 1:特性提取
    • 56 个过滤器,尺寸为 1 x 5 x 5
    • 激活函数:PReLU
    • 输出:56 个特性图
    • 参数:1 x 5 x 5 x 56 = 1400 个权重和 56 个偏差
  • 卷积层 2:缩小
    • 12 个过滤器,尺寸为 56 x 1 x 1
    • 激活函数:PReLU
    • 输出:12 个特性图
    • 参数:56 x 1 x 1 x 12 = 672 个权重和 12 个偏差
  • 卷积层 3–6:映射
    • 4 x 12 个过滤器,尺寸为 12 x 3 x 3
    • 激活函数:PReLU
    • 输出:HR 特性图
    • 参数:4 x 12 x 3 x 3 x 12 = 5184 个权重和 48 个偏差
  • 卷积层 7:扩大
    • 56 个过滤器,尺寸为 12 x 1 x 1
    • 激活函数:PReLU
    • 输出:12 个特性图
    • 参数:12 x 1 x 1 x 56 = 672 个权重和 56 个偏差
  • 去卷积层 8:去卷积
    • 1 个过滤器,尺寸为 56 x 9 x 9
    • 激活函数:PReLU
    • 输出:12 个特性图
    • 参数:56 x 9 x 9 x 1 = 4536 个权重和 1 个偏差

权重总数:12464(PReLU 层中还有少量参数)

图 3 显示在某个测试图像上使用经过训练的 FSRCNN 的示例。描述该网络的 protobuf 文件、训练和测试数据准备以及实施详情将在相关教程中详细探讨。

Image may be NSFW.
Clik here to view.

图 3. 使用经过训练的 FSRCNN 进行推断的示例。左图为原始图像。中图显示对原始图像进行下采样和模糊处理。右图是使用该网络重构后的 HR 图像。

总结

本文简要介绍了面向单图像超高分辨率的两个新型 CNN。我们选取的网络代表了实现 SR 的一流方法,也是首批发布的基于 CNN 的方法,提供了关于非 CNN 方法(稀疏编码)如何启发基于 CNN 的方法的有趣见解。在本教程中,借助英特尔® Caffe* 分发包框架和英特尔® Python* 分发包框架显示了 FSRCNN 的实施。该参考实施可以用作对该网络的变化进行试验,也是实施最近发布的新网络(以实现超高分辨率)的基础。它是调整网络的绝佳示例。最近发布了配备不同架构的新网络,这些网络改善了重构或训练/推断速度,某些网络试图解决多帧 SR 问题。鼓励读者对新网络进行实验。

附录 1:修正线性单元(整流器)

神经网络中的修正线性单元(整流器)是一种在网络中引入非线性的方法。非线性层(也称作激活层)在防止 NN 变成学习功能有限的纯线性模型方面必不可少。其他可能出现的激活层包括 sigmoid 函数或双曲正切 (tanh) 层。但是,整流器的计算效率更高,有助于改善 CNN 的整体训练。

传统修正线性单元 (ReLU) 的最常用的整流器,它执行以下数学运算:

Image may be NSFW.
Clik here to view.

xi是 i-th 通道上的输入。

参数修正线性单元 (PReLU) 是最近发布的另一个整流器5,被定义为:

Image may be NSFW.
Clik here to view.

其中,参数 pi控制代表负输入的直线斜率。这些参数将在训练阶段和模型共同学习。为了减少参数数量,pi参数可被压缩为面向所有通道的可学习参数。

leaky ReLU (LReLU) 是 PReLU 的一个特例,它的 pi被定义为面向所有输入通道的小常量 k

在 Caffe 中,PReLU 层可以被定义为(在 protobuf 文件中)

layer {
 name:"reluXX"
 type:"PReLU"
 bottom:"convXX"
 top:"convXX"
 prelu_param {
  channel_shared:1
 }
}

在这种情况下,跨多个通道共享负斜率。也可以使用固定斜率的 LReLU:

layer {
 name:"reluXX"
 type:"PReLU"
 bottom:"convXX"
 top:"convXX"
 prelu_param {
  filler:0.1
 }
}

参考资料

1. C.Dong,C. C. Loy,K. He 和 X. Tang,“学习面向图像超高分辨率的深度卷积网络”,2014 年。

2. C.Dong,C. C. Loy 和 X. Tang,“加速超高分辨率卷积神经网络”,2016 年。

3. P.B. Chopade 和 P. M. Patil,“单帧和多帧图像超高分辨率及其性能分析:综合调查”,2015 年 2 月。

4. J.Yang,J. Wright,T. Huang 和 Y. Ma,“通过稀疏表示实现图像超高分辨率”,《IEEE图像处理汇刊》,第 2861-2873 页,2010 年。

5. K.He,X. Zhang,S. Ren 和 J. Sun,“深入探讨整流器:ImageNet 分类性能超越人类水平”,arxiv.org,2015 年。

6. A.Greaves 和 H. Winter,“借助卷积神经网络实现多帧视频超高分辨率”,2016 年。

7. J.Kim,J. K. Lee 和 K. M. Lee,“使用深度卷积网络的准确的图像超高分辨率”,2016 年。

在英特尔® 架构上构建和安装 TensorFlow*

简介

TensorFlow* 是一款领先的深度学习和机器学习框架。截至 2017 年 5 月,该框架集成了面向英特尔® 至强® 处理器和英特尔® 至强融核™ 处理器的多项优化。本文是教程系列的第一部分,旨在提供相关信息帮助开发人员通过 GitHub* 存储库中可用的资源构建、安装和探索使用在英特尔® 架构上优化的 TensorFlow*。

资源

The TensorFlow 网站提供有关各组件的信息概述、教程和技术信息,是了解该框架的主要来源。感兴趣的开发人员可从此处着手,全面了解 TensorFlow 在深度学习领域的优势。

文章 TensorFlow 基于现代英特尔® 架构的优化介绍了具体的图形优化、性能试验,以及借助 CPU 优化构建和安装 TensorFlow 的详细信息。强烈建议开发人员阅读这篇文章,详细了解如何面向不同的拓扑结构全面优化 TensorFlow,以及进行优化后所实现的性能提升。

安装概述

本文所述的安装步骤源于 TensorFlow 网站中的 通过资源安装 TensorFlow指南提供的信息。下文中的步骤仅供大致了解安装流程;由于第三方信息可能随时更改,因此建议您同时回顾 TensorFlow 网站提供的信息。

本文所提供的安装指南仅针对安装带有 CPU 支持的 TensorFlow。目标操作系统和 Python* 分发版分别为 Ubuntu* 16.04 和 Python 2.7。

安装 Bazel* 构建工具

Bazel* 是 Google* 公开提供的构建工具。如果系统已安装 Bazel,请跳过此部分。如果尚未安装,请输入以下指令添加 Bazel 分发版 URI、执行安装并更新系统中的 Bazel:

echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
sudo apt install curl
curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
sudo apt-get update && sudo apt-get install bazel
sudo apt-get upgrade bazel

安装 Python* 相关性

如果系统已安装 Python* 相关性,请跳过此部分。输入以下命令安装 Python 2.7 所需的软件包:

sudo apt-get install python-numpy python-dev python-pip python-wheel

构建安装所需的 TensorFlow* Pip 软件包

如果系统未安装程序 Git*,请发布以下命令:

sudo apt install git

发布以下命令,克隆 GitHub 存储库:

git clone https://github.com/tensorflow/tensorflow

克隆期间创建的 tensorflow目录中包含一个名为 configure的脚本,该脚本必须在创建 pip 软件包和安装 TensorFlow 之前执行。该脚本支持您识别路径名称、相关性和其他构建配置选项。对于在英特尔架构上优化的 TensorFlow,该脚本还支持您设置英特尔® 数学核心函数库(英特尔® MKL)的相关环境设置。执行以下命令:

cd tensorflow
./configure

重要:选择 ‘Y’ 构建支持英特尔 MKL 的 TensorFlow,并选择 ‘Y’ 从 Web 下载 MKL LIB。选择其他配置参数的默认设置。脚本运行完成后,发布以下命令构建 pip 软件包:

bazel build --config=mkl --copt="-DEIGEN_USE_VML" -c opt //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

安装 TensorFlow—本地 Pip 选项

此时,新创建的 pip 软件包位于 tmp/tensorflow_pkg之中。接下来安装 TensorFlow,既可采用本地 pip 安装,也可在下文所述的 Anaconda* 虚拟环境中完成。如果采用本地 pip 安装,只需输入以下命令:

sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.0rc1-cp27-cp27mu-linux_x86_64.whl

(注:本轮的名称(上述斜体)可能因特定构建的不同而有差异。)

完成上述步骤后,务必在进行下一步之前验证安装。注:运行链接中提供的 Python 验证脚本时,务必换成不同的目录,例如:

cd ..

安装 TensorFlow—Conda* 环境选项

注:如果系统已安装 Anaconda ,请跳过此部分。

下载页面中下载 Anaconda,并按照说明运行安装程序脚本。(在本教程中,我们使用的 Anaconda 为 64 位 x86 Python 2.7 版本。)在安装过程中,你需要同意许可协议,选择默认设置,并选择 'yes'以将 Anaconda 添加到路径中。安装完成后,关闭终端,然后打开一个新的终端。

接下来我们将通过 tmp/tensorflow_pkg中新创建的 pip 软件包创建 conda 环境和安装 TensorFlow。运行以下命令,创建 TensorFlow 环境 "inteltf",并发布以下命令:

conda create -n inteltf
source activate inteltf
pip install /tmp/tensorflow_pkg/tensorflow-1.2.0rc1-cp27-cp27mu-linux_x86_64.whl

(注:本轮的名称(上述斜体)可能因特定构建的不同而有差异。)

source deactivate inteltf

进行下一步之前关闭当前终端,然后打开一个新的终端。

运行网站中的下列 Python 代码,重新启动 inteltf环境并验证 TensorFlow 安装:

source activate inteltf
	python>>> import tensorflow as tf>>> hello = tf.constant('Hello, TensorFlow!')>>> sess = tf.Session()>>> print(sess.run(hello))

如果安装成功,Python 程序将输出 “Hello, TensorFlow!”。

后续文章

本教程系列的下一篇文章将介绍如何安装 TensorFlow Serving* — 专为生产环境设计的高性能机器学习服务系统。

现代英特尔® 架构上的 TensorFlow* 优化

英特尔:Elmoustapha Ould-Ahmed-Vall,Mahmoud Abuzaina,Md Faijul Amin,Jayaram Bobba,Roman S Dubtsov,Evarist M Fomenko,Mukesh Gangadhar,Niranjan Hasabnis,Jing Huang,Deepthi Karkada,Young Jin Kim,Srihari Makineni,Dmitri Mishura,Karthik Raman,AG Ramesh,Vivek V Rane,Michael Riera,Dmitry Sergeev,Vamsi Sripathi,Bhavani Subramanian,Lakshay Tokas,Antonio C Valles

谷歌:Andy Davis,Toby Boyd,Megan Kacholia,Rasmus Larsen,Rajat Monga,Thiru Palanisamy,Vijay Vasudevan,Yao Zhang

作为一款领先的深度学习和机器学习框架,TensorFlow* 对英特尔和谷歌发挥英特尔硬件产品的最佳性能至关重要。本文 向人工智能 (AI) 社区介绍了在基于英特尔® 至强和英特尔® 至强融核™ 处理器的平台上实施的 TensorFlow* 优化。在去年举办的首届英特尔人工智能日上,英特尔公司的柏安娜和谷歌的 Diane Green 共同宣布了双方的合作,这些优化是英特尔和谷歌工程师密切合作取得的成果。

我们介绍了在优化实践中遇到的各种性能挑战以及采用的解决方法,还报告了对通用神经网络模型示例的性能改进。这些优化带来了多个数量级的性能提升。例如,根据我们的测量,英特尔® 至强融核™ 处理器 7250 (KNL) 上的训练性能提升了高达 70 倍,推断性能提升了高达 85 倍。基于英特尔® 至强® 处理器 E5 v4 (BDW) 和英特尔至强融核处理器 7250 的平台为下一代英特尔产品奠定了基础。用户尤其希望今年晚些时候推出的英特尔至强(代号为 Skylake)和英特尔至强融合(代号为 Knights Mill)处理器将提供显著的性能提升。

在现代 CPU 上优化深度学习模型的性能面临众多挑战,和优化高性能计算 (HPC) 中其他性能敏感型应用所面临的挑战差别不大:

  1. 需要重构代码,以利用现代矢量指令。这意味着将所有关键基元(如卷积、矩阵乘法和批归一化)被向量化为最新 SIMD 指令(英特尔至强处理器为 AVX2,英特尔至强融核处理器为d AVX512)。
  2. 要想实现最佳性能,需要特别注意高效利用所有内核。这意味着在特定层或操作实施并行化以及跨层的并行化。
  3. 根据执行单元的需要,提供尽可能多的数据。这意味着需要平衡使用预取、缓存限制技术和改进空间和时间局部性的数据格式。

为了满足这些要求,英特尔开发了众多优化型深度学习基元,计划应用于不同的深度学习框架,以确保通用构建模块的高效实施。除了矩阵乘法和卷积以外,创建模块还包括:

  • 直接批量卷积
  • 内积
  • 池化:最大、最小、平均
  • 标准化:跨通道局部响应归一化 (LRN),批归一化
  • 激活:修正线性单元 (ReLU)
  • 数据操作:多维转置(转换)、拆分、合并、求和和缩放。

请参阅 本文,获取关于面向深度神经网络的英特尔® 数学核心函数(英特尔® MKL-DNN)的优化基元的更多详情。

在 TensorFlow 中,我们实施了英特尔优化版运算,以确保这些运算能在任何情况下利用英特尔 MKL-DNN 基元。同时,这也是支持英特尔® 架构可扩展性能的必要步骤,我们还需要实施大量其他优化。特别是,因为性能原因,英特尔 MKL 使用了不同于 TensorFlow 默认布局的另一种布局。我们需要最大限度地降低两种格式的转换开销。我们还想确保数据科学家和其他 TensorFlow 用户不需要改变现有的神经网络模型,便可使用这些优化。

Image may be NSFW.
Clik here to view.

图形优化

我们推出了大量图形优化通道,以:

  1. 在 CPU 上运行时,将默认的 TensorFlow 操作替换为英特尔优化版本。确保用户能运行现有的 Python 程序,在不改变神经网络模型的情况下提升性能。
  2. 消除不必要且昂贵的数据布局转换。
  3. 将多个运算融合在一起,确保在 CPU 上高效地重复使用高速缓存。
  4. 处理支持快速向后传播的中间状态。

这些图形优化进一步提升了性能,没有为 TensorFlow 编程人员带来任何额外负担。数据布局优化是一项关键的性能优化。对于 CPU 上的某些张量运算而言,本地 TensorFlow 数据格式通常不是最高效的数据布局。在这种情况下,将来自 TensorFlow 本地格式的数据布局转换运算插入内部格式,在 CPU 上执行运算,并将运算输出转换回 TensorFlow 格式。但是,这些转换造成了性能开销,应尽力降低这些开销。我们的数据布局优化发现了能利用英特尔 MKL 优化运算完全执行的子图,并消除了子图运算中的转换。自动插入的转换节点在子图边界执行数据布局转换。融合通道是另一个关键优化,它将多个运算自动融合为高效运行的单个英特尔 MKL 运算。

其他优化

我们还调整众多 TensorFlow 框架组件,以确保在各种深度学习模型上实现最高的 CPU 性能。我们使用 TensorFlow 中现成的池分配器开发了一款自定义池分配器。我们的自定义池分配器确保了 TensorFlow 和英特尔 MKL 共享相同的内存池(使用英特尔 MKL imalloc 功能),不必过早地将内存返回至操作系统,因此避免了昂贵的页面缺失和页面清除。此外,我们还认真优化了多个线程库(TensorFlow 使用的 pthread 和英特尔 MKL 使用的 OpenMP),使它们能共存,而不是互相争夺 CPU 资源。

性能实验

我们的优化(如上述优化)在英特尔至强和英特尔至强融核平台上实现了显著的性能提升。为了更好地展示性能改进,我们提供了以下最佳方法(或 BKM)和 3 个通用 ConvNet 性能指标评测的基准和优化性能值。

  1. 以下参数对英特尔至强(代号为 Broadwell)和英特尔至强融核(代号为 Knights Landing)的性能非常重要,建议您针对特定的神经网络模型和平台优化这些参数。我们认真优化了这些参数,力求在英特尔至强和英特尔至强融核处理器上获得 convnet 性能指标评测的最佳性能。
    1. 数据格式:建议用户针对特定的神经网络模型指定 NCHW 格式,以实现最佳性能。TensorFlow 默认的 NHWC 格式不是 CPU 上最高效的数据布局,将带来额外的转换开销。
    2. Inter-op / intra-op:建议数据科学家和用户在 TensorFlow 中试验 intra-op 和 inter-op 参数,为每个模型和 CPU 平台搭配最佳设置。这些设置将影响某层或跨层的并行性。
    3. 批处理大小 (Batch size):批处理大小是影响可用并行性(以使用全部内核)、工作集大小和总体内存性能的另一个重要参数。
    4. OMP_NUM_THREADS:最佳性能需要高效使用所有可用内核。由于该设置控制超线程等级(1 到 4),因此,对英特尔至强融核处理器的性能尤为重要。
    5. 矩阵乘法中的转置 (Transpose in Matrix multiplication):对于某些矩阵大小,转置第二个输入矩阵 b 有助于改进 Matmul 层的性能(改进高速缓存的重复使用)。以下 3 个模型所用的所有 Matmul 运算亦是如此。用户应在其他尺寸的矩阵中试验该设置。
    6. KMP_BLOCKTIME:用户应试验各种设置,以确定每个线程完成并行区域执行后等待的时间,单位为毫秒。

英特尔® 至强® 处理器(代号为 Broadwell - 双插槽 - 22 个内核)上的示例设置

Image may be NSFW.
Clik here to view.

英特尔® 至强融核™ 处理器(代号为 Knights Landing - 68 个内核)上的示例设置

Image may be NSFW.
Clik here to view.

  1. 英特尔® 至强® 处理器(代号为 Broadwell – 双插槽 – 22 个内核)的性能结果

    Image may be NSFW.
    Clik here to view.

  2. 英特尔® 至强融核™ 处理器(代号为 Knights Landing – 68 个内核)的性能结果

    Image may be NSFW.
    Clik here to view.

  3. 英特尔® 至强® 处理器(代号为 Broadwell)和英特尔® 至强融核™ 处理器(代号为 Knights Landing)上不同批处理尺寸的性能结果 - 训练

    Image may be NSFW.
    Clik here to view.

    Image may be NSFW.
    Clik here to view.

    Image may be NSFW.
    Clik here to view.

利用 CPU 优化安装 TensorFlow

按照“现已推出英特尔优化型 TensorFlow 系统” 中的指令安装包含 pip 或 conda 的预构建二进制软件包,或按照以下指令从源构建:

  1. 运行 TensorFlow 源目录中的 "./configure",如果您选择了使用英特尔 MKL 的选项,将自动下载 tensorflow/third_party/mkl/mklml 中的面向机器学习的最新版英特尔 MKL。
  2. 执行以下命令创建 pip 程序包,以安装经过优化的 TensorFlow 创建。
    • 可更改 PATH,使其指向特定 GCC 编译器版本:
      export PATH=/PATH/gcc/bin:$PATH
    • 也可以更改 LD_LIBRARY_PATH,使其指向新 GLIBC:
      export LD_LIBRARY_PATH=/PATH/gcc/lib64:$LD_LIBRARY_PATH.
    • 专为在英特尔至强和英特尔至强融核处理器上实现最佳性能而创建:
      bazel build --config=mkl --copt=”-DEIGEN_USE_VML” -c opt //tensorflow/tools/pip_package:
      build_pip_package
  3. 安装优化版 TensorFlow 系统
    1. bazel-bin/tensorflow/tools/pip_package/build_pip_package ~/path_to_save_wheel
      pip install --upgrade --user ~/path_to_save_wheel /wheel_name.whl

系统配置

Image may be NSFW.
Clik here to view.

对人工智能意味着什么

优化 TensorFlow 意味着高度可用、广泛应用的框架创建的深度学习应用现在能更快速地运行于英特尔处理器,以扩大灵活性、可访问性和规模。例如,英特尔至强融核处理器能以近乎线性的方式跨内核和节点横向扩展,可显著减少训练机器学习模型的时间。我们不断增强英特尔处理器的性能,以处理更大、更困难的人工智能工作负载,TensorFlow 也能随着性能的进步而升级。

英特尔和谷歌共同优化 TensorFlow 的合作体现了双方面向开发人员和数据科学家普及人工智能的不懈努力,力求在从边缘到云的所有设备上随时运行人工智能应用。英特尔相信这是创建下一代人工智能算法和模型的关键,有助于解决最紧迫的业务、科学、工程、医学和社会问题。

本次合作已经在基于英特尔至强和英特尔至强融核处理器的领先平台上实现了显著的性能提升。这些优化现已在谷歌的 TensorFlow GitHub 存储库中推出。我们建议人工智能社区尝试这些优化,并期待获得基于优化的反馈与贡献。


《Sundered》中的独立 Metroid-vania 元素

原文由 Intel Game Dev 发表于 VentureBeat*:《Sundered》中的独立 Metroid-vania 元素。请访问 VentureBeat 的英特尔页面,了解更多游戏开发新闻和相关主题。

Image may be NSFW.
Clik here to view.
Screenshot of game Sundered

我们会惊讶地发现,独立游戏公司的许多管理人员和游戏开发人员在没有制定清楚、简明与周详的设计和执行计划或具有成功把握的前提下,便开启项目。这正是游戏开发独一无二的美妙之处 - 游戏开发人员的梦想。投身于此的原因是您想打造梦寐以求的游戏,各个业务部门就位后,所有成员竭尽所能地完成这些目标。有些项目顺利问世,有些尽管目标完善,仍以失败告终。

对 Thunder Lotus Games* 的总裁兼首席执行官 Will Dubé 而言,他们的项目正朝着成功的方向发展。尽管简历上写着“移动游戏开发人员”,他在转型 PC 后遇到了转机。“2014 年 1 月,我辞职并在 Kickstarter* 上发布了一个 PC 独立游戏。那时,我对游戏的前景一无所知,唯一明确的是必须在 Kickstarter 上发布,因为它是检验游戏是否出众的一个可靠平台。”Dubé 解释道。该项目最终演化为《Jotun*》,一个以挪威神话为背景的手绘动作游戏。这并不是因为 Dubé 熟悉挪威文化或与挪威有任何历史渊源,而是挪威神话与游戏中野蛮的人物设置相配。

“奶牛流出有毒的液体,并汇聚成河,人类源自巨人的腋窝,太疯狂了……但是非常激动人心。”Dubé 边笑边说。结果显示,没有人能预测从何处获得启发,这是该团队首款独立游戏获得成功的原因。

“在 Steam* 上收获了大量好评,商业回报也很丰厚,所以我们开发了街机版本。”他补充道。

借助朋友(政府)的力量

尽管 Kickstarter 用于获取社区反馈,以显示社区对游戏的充分关注,但是它不是新工作室募集资金的唯一来源。“加拿大政府和其他机构为我们提供了额外的资助,”他特别提到了加拿大媒体基金 (Canadian Media Fund)。“我们非常幸运地获得了魁北克(其他省也有各自的扶持计划)支持,但是 CMF 资助的是独立开发人员。可能多数加拿大独立游戏公司都获得了 CMF 的资助,不是全部,而是多数。”

移动游戏开发经历为 Dubé 提供了宝贵的经验,他身边全是行业资深人士,他表示“我能在很短时间内学到很多东西。尽管有些项目最终落空,但是我见证了一家公司由 10 人增长到 50 人,经历了工作室发展的所有阶段。”

Image may be NSFW.
Clik here to view.
Screenshot of game Sundered

上图:体型庞大的敌人展现了恢弘的气势。

《Jotun》的成功为他们积累了宝贵的经验,既有正面经验,也有反面教训,使他们了解第二个项目《Sundered》中哪些方面需要特别注意。

“艺术风格、与大反派的史诗级对决和出色的沉浸式体验均获得了成功。某些情况不太顺利:我们发现尽管我们和 YouTube 用户以及主播互动频繁,但是玩家只会玩 4 到 5 个小时,仅此而已。由于这是一款线性模式的叙事单人游戏,在游戏中个人发挥的余地不大,用户通过观看游戏视频便可以获得所有体验。”Dubé 表示。

Image may be NSFW.
Clik here to view.
Grayscale photo of Will Doube

上图:Thunder Lotus Games 总裁兼首席执行官 Will Dubé

这些重要的经验教训将直接用于《Sundered》的某些特性设计。这个唯美的手绘横向卷轴游戏引入了名为 Metroid-vania 类别中的元素,此类游戏融合了横向卷轴动作和对传统游戏《银河战士》《恶魔城》的探索。

“我们想增加游戏时间、重复游戏性和玩家选择……但是我们不想完全从零开始创建。”他表示。

“我们针对《Sundered》中的重复游戏性和玩家选择发明了邪恶能量 (eldritch power)。但是我们需要创建这些特性,以避免画蛇添足。

“我们发现与众不同的想法将使人们重拾兴趣,前提是这些想法可行,基于这一概念,我们提出了‘抗拒或接受’创意。因此,我们赋予玩家新的能力,使他们可以解锁更多区域。将产生新的能量,您可以选择破坏这些能量,会对游戏产生影响。能量暴走支持您在空中躲避,如果您破坏了能量,可以 360 度躲避,攻击系数大大增强,但会影响技能树。”

Image may be NSFW.
Clik here to view.
Screenshot of game Sundered

上图:《Sundered》每个场景的艺术风格都令人叹为观止。

我们的团队由 12 位全职员工(其他兼职员工也提供了很多帮助)组成,难度系数并没有降低。“相比《Jotun》,《Sundered》就是一只野兽。由程序生成的怪兽、地下城、技能树、打开游戏时显示的整体 Metroid-vania 风格、以及多个结局—它就是一只十足的怪兽。”Dubé 承认。

在经过 18 个月的开发后,这个新成立的小规模独立工作室已经为我们提供了宝贵的经验。“我们从生产周期中了解到,即使在您已经意识到特性蠕变,认为已经将其控制时,它仍旧会产生。”

如果您在游戏中扮演 Eshe,“洛夫克拉夫特式的疯狂不断上演”,游戏在重要意见领袖的观众群体中引发了强烈反响,这便是我们期待的回报。

借助意见领袖的强大影响力

“我们将意见领袖和主播视作整体市场营销策略的组成部分。市场营销对我们非常重要,您的游戏可能是全球最伟大的游戏,但是如果没人知道这个游戏,也无济于事。我们的公关全部在内部进行。”他表示。

“我们为某些社区用户提供 24 小时独家报道《Jotun》的特权,以提高曝光率,”他还表示,当时积累的知名度为目前《Sundered》的推广提供了帮助,他们能更轻松地得到反馈,意见领袖也愿意花时间玩这款游戏。

“我们授权 [YouTube* 知名人士] Jesse Cox 独家播出关于《Sundered》的游戏视频。他的粉丝非常喜欢这个游戏,拥有大批粉丝的主播不断推出此类视频。我们的目的就是最大范围推广游戏。”

Dubé 马上补充道,传统媒体和基层社区的参与依旧非常重要,这也是《Sundered》回归 Kickstarter 意义非凡的主要原因。通过知名度的提升和良好的反馈,该团队动用基金,根据建议调整游戏,使游戏更加卓越。

以上因素有助于 Thunder Lotus Games 在独立游戏开发行业内保持成功。什么最有利于玩家?什么最有利于团队?这是他们做出每个重要决定前必须考虑的问题。

“我们想要玩家在游戏中投入 20 美元,并认为‘这是我今年玩的最棒的游戏,只需 20 美元”,我们将确保始终如一的质量。”Dubé 承诺。感谢加拿大政府对游戏的支持!

《流放之路》著名的成功之路

原文由 Intel Game Dev 发表于 VentureBeat*:《流放之路》著名的成功之路。请访问 VentureBeat 的英特尔页面,了解更多游戏开发新闻和相关主题。

Image may be NSFW.
Clik here to view.
Screenshot of game Path of Exile

如果您的独立开发工作室刚刚成立,正在到处寻找创作灵感、好的选择和角色模型,可以说很难找到比动作 RPG《流放之路》的创建者 Grinding Gear Games 更好的榜样。2006 年年底,该工作室在新西兰奥克兰成立,历时多年发布了这款游戏,但是他们的耐心和持久努力得到了回报,游戏取得了巨大的商业成功,并收获了众多铁杆粉丝。

该工作室的员工数量由最初的 3 名猛增至 100 名,目前所有开发人员专注于同一个项目。他们现在仍在创建新的内容,鼓励新玩家的加入,借助精心部署的方法维持游戏体验的新奇,从而吸引老玩家的回归。

一切源于对《暗黑破坏神* II》的热爱

“我们玩了许多在线动作 RPG,如《泰坦之旅》《地牢围攻》,最喜欢的是《暗黑破坏神* II》,”制片人兼首席设计师 Chris Wilson 表示,“2006 年来临之际,没有工作室制作此类通过出售装备获得高额经济回报的游戏,尤其是在线游戏,这让我们感觉很奇怪。”Wilson 和他的早期团队知道其他工作室正借鉴《暗黑破坏神 II》等动作 RPG 制作游戏,但是无论他们的用意何在,最后的产品都是单人游戏。

Image may be NSFW.
Clik here to view.
Screenshot of game Path of Exile

上图:《流放之路》在动作 RPG 游戏中加入了壮观的视觉效果。

“我们认为《暗黑破坏神 II》的玩家正寻求更新颖的体验,因此,我们天真地想,为什么我们不制作这样的游戏?”Wilson 表示。由于他们中没有人成立过游戏工作室,因此,他们的想法显然很疯狂。“市场中存在空白,数千万玩家期待新的游戏,我们有信心做好。”Wilson 补充道。发现市场空白,确定该市场已形成需求未充分满足的粉丝群,这个核心概念对《流放之路》的成功至关重要。当然成功不仅在于理念,也需要一些才能。

开始创建

早期阶段最为艰难。“我们投入了毕生的积蓄,在车库内成立了工作室,我们 3 人便开始制作《流放之路》。我们需要学习如何创建游戏,将工作室的规模扩大到 100 人,这是一个关乎生死存亡的问题,我们还是取得了成功,这得益于我们心怀填补市场空白的愿望。”Wilson 表示。“我们相信产品的理念是正确的,但是不知道是否有能力开发这样的游戏。”他补充道。

从设计的角度看,这个团队建立了游戏成功必需遵循的要点。“我们知道只有在线游戏才能取得成功,而且装备需要存储在服务器上。这些游戏大受欢迎的原因在于在线获得装备的难度很大,玩家愿意花大量时间获取它们。”Wilson 表示。

Image may be NSFW.
Clik here to view.
Screenshot of game Path of Exile

上图:游戏极具吸引力的装备经济是《流放之路》设计和成功的关键。

下一个要点是利用随机级别和装备长远地留住玩家。“等级由程序生成对于重复游戏性非常重要,这样玩家打通关时,会有很特别的感觉。”Wilson 表示。此外,近身格斗类游戏也会有非凡的反响,Wilson 表示,“激烈”打斗是《暗黑破坏神》玩家公认的带来绝妙体验的关键。

在这些因素的影响下,他们设立了一个重要目标。“我们希望玩家能连续十年玩这个游戏。已经有玩家坚持了 6 年,这样看来 10 年的目标有望实现。”Wilson 表示。

众所周知,创建游戏的同时开发技术绝非易事。Grinding Gear 团队也没有任何捷径可走。“同时,不存在购买后即时可用的在线游戏后端。我们需要游戏支持数万名玩家同时在线。因此,我们参考了其他游戏的架构,并设计了一个混合体。”Wilson 表示。

我们根据游戏的要求,定制了每个系统。Wilson 还透露,该团队今年才开始研究有助于增强新特性(如在游戏中插入视频)的中间件选项。

Image may be NSFW.
Clik here to view.
Screenshot of game Path of Exile

上图:利用程序生成系统创建地图确保提供不重样的游戏体验。

慢速发展

考虑到团队的庞大工作量,2013 年游戏才得以完整发布不足为奇。尽管积极的社区在内部测试阶段已经形成,传统的媒体参观引发了许多赞赏和积极反馈,但是在此基础上进一步发展非常困难,随后仅有 2,000 人加入论坛。“2,000 人在目前看来也不少,但是现在随便发条推特便能收获 2000 人关注,”Wilson 表示。

缓慢的发展令人沮丧,但是他们对核心产品的信念从未动摇。“注定的成功最终来临,游戏超过了一定的质量阙值,人们自发地向朋友推荐游戏。”Wilson 表示。因为许下了凭质量取胜的承诺,Grinding Gear 没有启动向朋友推荐的程序,也没有利用类似的市场推广技巧来吸引玩家。相反,他们偏爱更自然的方式,如 Wilson 所讲,“您有朋友已经很久没见,您好奇他们在哪里,然后发现他们消失的原因是他们每天花 6 小时玩这款炫酷的游戏!”

随机化系统是重复游戏性的核心,在社区和 YouTube 用户中反响非常好。“我们将它称作 reddit 时刻,”Wilson 表示,“当游戏推出足够有趣的内容时,玩家会说:‘太酷了,我要把它发布到 reddit。’”

这些可能源自动作场景,但是随机命名装备和怪兽可能会非常搞笑,甚至无礼。“系统将一只怪兽随机命名为臭臭,无疑在社区内掀起了一股模仿热潮。

我们很快发现名字前面加上“黑”字听起来很酷,如黑毒药,但是极其容易生成侮辱性词汇,因此,在早期测试版中移除了该选项!”Wilson 补充道。

Image may be NSFW.
Clik here to view.
Screenshot of game Path of Exile

上图:游戏明显从《暗黑破坏神* II》中获得风格和设计方面的灵感。

《流放之路》开发和发布阶段恰逢主播和 YouTube* 社区兴起,他们对提高游戏的知名度非常有效,但是没有影响任何核心设计或功能理念。即便如此,Wilson 表示团队考虑联系帮助提高玩家认可度以及推广游戏的人。

“我们研究了一个面向主播(或任何用户)的游戏模式,进入游戏后,两位主播以某种方式竞争,可能是非直接的方式,类似于比赛谁先走出迷宫。然后他们的观众将通过某种机制打赏主播或进行投票,降低另一位主播的胜算。因此,两位主播会在友好的竞争中获得乐趣。”Wilson 解释道。

免费的游戏业务

《流放之路》完整发布已经过去了整整 4 年,现在游戏仍在蓬勃发展,新内容、每日一更的帖子和每 3 个月更新的服务器推动了游戏的发展,赢得了玩家的青睐。Wilson 承认游戏目前盈利,得益于开发团队内 100 名开发提供的强大支持。当这家新工作室刚开始追寻游戏设计之梦时,盈利能力并不明显。“这是一个靠梦想支撑的项目。从事这一行是因为‘玩家期待这样的游戏’,稍后才思考‘那么,游戏怎样才能盈利’。”Wilson 表示。

“我们见证了《Maple Quest》在韩国的成功,但是西方没有人尝试免费的游戏模式,”Wilson 表示“我们最大的创新在于查看是否能在西方推出首款免费游戏。我们不会这样做,因为游戏开发周期太长。”

Wilson 和他的团队运用“粗略猜量数学”来确定早期的商业模式。“通过调查其他游戏,我们得出每个普通的并发用户每天为公司贡献 50 分的利润。那么,如果平均每天登录 1000 人,公司将获利 500 美元。很明显,只够支付几名员工的工资。我们开始研究如何精简员工,发布较少的内容,同时运行在线游戏,结论是平均每天需要登录 10,000 名付费玩家,从而确立了我们的目标 — 10,000 名并发玩家。”Wilson 透露。

结果发现,Wilson 和他的团队算错了。错得离谱!“实际的盈利比预想的高很多,需要更多的员工。我们组建了 100 人的团队,曾经我们认为运行在线游戏仅需 6 人!”Wilson 表示。幸运的是,Grinding Gear 的粉丝享受精彩的游戏体验,愿意为这项娱乐活动付费,并且并发玩家人数突破了 10,000 的大关,游戏能负担 100 人的团队。

Image may be NSFW.
Clik here to view.
Screenshot of game Path of Exile

上图:随着游戏并发玩家的增多,实际经济模式与预期差别较大。

未来计划

Wilson 非常清楚短期内《流放之路》仍是 Grinding Gear Games 的全部重心,他们无意开发其他类型的游戏。“对于《流放之路》,我们还有许多想法尚未实施。”他补充道,“我们经常听到各种游戏创意,有人认为‘我们的游戏将超越《Dota 2》’,我摇了摇头,回到自己的办公室!”

如果工作室正寻求新的机会(实际上并没有),仍需遵守相同的原则,即寻找未被过度开发、有一定粉丝基础的游戏类别。“类似于经典的点击式冒险游戏或指挥与 &征服 RTS。这些领域是我们所考虑的范围,”Wilson 表示,同时明确声明工作室没有宣布启动此类项目。

“我们不会制作虚拟现实游戏,也不会创建类似于《DayZ》的生存类游戏,避免开发《我的世界》*那样的游戏。我们不会追赶任何潮流,将寻找未被充分发掘的领域。”Wilson 补充道。

继续专注于《流放之路》仍可带来可观的回报,同时,作为主要游戏平台,PC 势头不减,这点与报道背道而驰。每个游戏开发工作室都应从中得到重要启示。

借助 Anaconda* 安装英特尔® Python* 分发包和英特尔® 性能库

我们与 Continuum Analytics* 公司通力合作,致力于使用 Conda* 软件包管理器和 Anaconda 云* 简化英特尔® Python* 分发包和社区论坛支持的英特尔® 性能库(如英特尔® 数学核心函数库(英特尔® MKL))。最低版本要求为 conda 4.1.11,所以,请首先更新您的 conda。

conda update conda

通知 conda 选择英特尔软件包(如果可用的话),而非默认软件包。

conda config --add channels intel

安装英特尔® Python* 分发包

建议您在安装时创建一个新环境。执行以下命令,安装核心 python3 环境:

conda create -n idp intelpython3_core python=3

如欲安装 python 2,请执行以下命令:

conda create -n idp intelpython2_core python=2

如欲安装完整的英特尔分发包,将“核心”软件包名称替换为“完整”,以 python3 为例:

conda create -n idp intelpython3_full python=3

然后遵循常用说明激活环境。Linux/macOS 用户执行以下命令:

source activate idp

Microsoft Windows 用户执行以下命令:

activate idp

您现在已经创建了核心环境,包括 python、numpy、scipy 等。使用常用 conda 安装命令安装额外的软件包。例如,执行以下命令便可安装英特尔 sympy:

conda install sympy

非英特尔软件包的安装方式和往常一样。例如,执行以下命令便可安装 affine:

conda install affine

在此处查看可用的英特尔软件包:https://anaconda.org/intel/packages

安装社区论坛支持的英特尔® 性能库

可以将英特尔性能库安装至现有的 Conda* 环境。

确保英特尔通道被添加至 conda 配置(见上文)中。然后使用“conda install”按惯例安装任意可用的性能库:

conda install mkl-devel

下表列出了可用软件包,并简要描述了它们的内容:

软件包名称Lin 64Lin 32Win 64Win 32macOS 64描述
mklXXXXX英特尔® 数学核心函数库(英特尔® MKL) 动态运行时
mkl develXXXXX英特尔® MKL 动态运行时和创建软件的头文件
mkl staticXXXXX英特尔® MKL 静态库和创建软件的头文件
mkl includeXXXXX仅包含英特尔® MKL 头文件。与开发套装一同自动安装
mkl micX X  英特尔® MKL 英特尔® 集成众核架构(英特尔® MIC 架构)动态库,用于自动卸载
mkl mic staticX X  英特尔® MKL 英特尔® MIC 架构 静态库和头文件
mkl-lb  X  英特尔® MKL 动态库,用于启动 英特尔® 至强融核™ 处理器
mkl lb static  X  英特尔® MKL 静态库,用于启动英特尔® 至强融核™ 处理器

使用配备 Continuum Python* 的英特尔 Conda* 软件包

如果您想在包含 Continuum Python* 的环境中安装英特尔软件包,请勿将“英特尔”通道添加至配置文件,因为会导致所有 Continuum 软件包被替换为英特尔软件包(如果可用的话)。正确的做法是利用“-c intel”参数和“--no-update-deps”标记指定命令行上的“英特尔”通道,以避免其他软件包(如 python)被替换为英特尔软件包:

conda install mkl -c intel --no-update-deps
conda install numpy -c intel --no-update-deps

面向英特尔 Python* 分发包的 Docker 映像

我们发布了面向英特尔 Python 的 Docker 映像。如欲获取映像,请访问Docker Hub,访问 GitHub获取 Dockerfile。我们为 Python 2 和 Python 3 提供映像,映像分为核心配置和完整配置。核心配置包含 NumPy/Scipy 和关联组件,完整配置包含我们所有分发包。 如果您想自定义 Docker 映像,可以从我们发布的 Dockerfile 入手,也可以使用 Docker FROM 命令,将映像用作基础。

入门知识:

Docker 是一项热门的 Linux 容器技术,通过一个简单的命令行接口,支持服务和应用的部署与可重复性。 更多信息详见 Docker 官方网站,https://www.docker.com/

获取面向分发包的 Docker 映像:

请访问 Docker Hub链接并使用 docker pull命令获取所需的分发版本和配置。 

使用 Docker 映像:

可以通过几个选项使用这些 Docker 映像, 运行映像时,本机命令为用户提供用于运行分发包的 shell。 如欲使用 shell,执行以下命令:

docker run -it intelpython/intelpython3_core

如欲在启动时立即使用 Python,请执行以下命令:

docker run -it intelpython/intelpython3_core python

执行以下命令,便可利用一台 Jupyter 笔记本电脑:

docker run -p 8888:8888 intelpython/intelpython3_full jupyter notebook --ip='*' --port=8888 --no-browser

转至浏览器的http://localhost:8888,如果您正在使用 Docker 设备虚拟机,转至http://<DOCKER-MACHINE-IP>:8888,便可打开 Jupyter 笔记本电脑。

对于需要加载卷的任务,请参考 卷加载上的 Docker 文档。

虚拟现实简介:创建一款面向 Oculus Rift* 的第一人称游戏

查看 PDF [12,544KB]

简介

本文介绍了虚拟现实 (VR) 概念,讨论了如何将 Unity* 应用集成至 Oculus Rift*,添加 Oculus 第一人称玩家角色至游戏以及将玩家远距传动至场景。本文的目标受众是想要将 Oculus Rift 集成至 Unity 场景的 Unity 开发人员。假定前提是读者的装备能够创建面向 Oculus 的虚拟现实游戏,拥有一台面向 Oculus 的 PCOculus Rift 以及触摸控制器

开发工具

  • Unity 5.5 或更高版本
  • Oculus Rift 和触摸控制器

在 Unity 中创建地形

可获取多个在线资源,了解如何在 Unity 中创建一个基本地形。我参阅的是《Unity 手册》。在场景中添加大量树木和草地将影响性能,导致每秒帧数 (FPS) 大幅下降。确保您的树木数量达到最佳值,如需要,最大限度降低草地的最小高度/最大高度以及最小宽度/最大宽度,以减轻对 FPS 的影响。为了改进游戏的虚拟现实体验,建议 FPS 最低为 90。

设置 Oculus Rift

本章节介绍了如何设置 Oculus Rift,将 Oculus 第一人称角色置于场景,以及将玩家从一个场景远距传动至另一个场景。

从 Oculus 网站下载说明,并按照说明进行操作。

完成设置后,确保 Oculus 已集成至设备,然后执行以下操作:

  1. 下载面向 Unity 5 的 Oculus 实用程序
  2. 将 Unity 程序包导入您的 Unity 项目。
  3. 从您的场景中移除主摄像头对象。该摄像头没有必要保留,因为 Oculus OVRPlayerController 预制件自带了定制虚拟现实摄像头。
  4. 导航至 Assets/OVR/Prefabs 文件夹。
  5. 将 OVRPlayerController 预制件拖放到您的场景。您可以使用 OVRCameraRig 预制件。如欲了解这些预制件和它们之间的差别,请访问本链接。使用 OVRPlayerController 实施以下示例。

Image may be NSFW.
Clik here to view.

Image may be NSFW.
Clik here to view.

将头戴式设备调整为最佳状态,您便可以清晰看到整个场景。设置 Oculus Rift 时,根据需要和提供的说明调整设置。单击 Stats按钮观察场景的 FPS。如果 FPS 低于建议的 90 FPS,减少 Unity 场景中的细节,或排除故障,以了解场景中哪些部分消耗了过多 CPU/GPU,以及为什么会影响 FPS。

Image may be NSFW.
Clik here to view.

现在我们看一下如何利用 Oculus 触摸控制器与场景中的对象交互。我们在场景中添加一个猎枪模型,玩家便可以攻击敌人。您可以自行创建模型,也可以从 Unity Asset Store 中下载。我从 Unity store 中下载了一个模型。

  1. 如下所示,将该模型置于 OVRPlayerController 的 RightHandAnchor 下。
  2. 调整模型的尺寸和方向,使其适合场景且符合您的要求。

移动右触摸控制器后,将直接控制场景中的猎枪。

Image may be NSFW.
Clik here to view.

添加代码,以操控 Oculus 触摸控制器

在如下的代码片段中,我们检查了 OVRInput,根据在 Oculus 触摸控制器中按下的按钮,执行以下三项之一:

  • 如果 Primary Index Trigger按钮(即右控制器的触发按钮)被按下,将调用 RayCastShoot 函数,远距传动选项被设置为 false。在这种情况下,玩家对象将向敌人以及场景中搭建的任何目标开火。我们还确保在特定时间内仅开火一次,通过检查 Time.Time > nextfire 条件,可以更改间隔的时间。
  • 如果控制器中的 A按钮被按下,将调用 RayCastShoot 函数,将远距传动选项设置为 true。该选项将玩家远距传动至地形中不同的点。既可以远距传动场景中设置的预定义点,也可以直接将玩家远距传动至命中点。开发人员基于游戏的要求,决定将玩家远距传动至场景的哪个位置。
  • 在游戏中,无论何时按下控制器的 B按钮,玩家将重置于初始位置。
void Update () {

        if (OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger) && (Time.Time > nextfire))

        {
            //If the Primary Index trigger is pressed on the touch controller we fire at the targets
            nextfire = Time.Time + fireRate;
            audioSource.Play();

            // Teleporting is set to false here
            RayCastShoot(false);        }
        else if (OVRInput.Get(OVRInput.RawButton.A) && (Time.time > nextfire))
        {

            // Teleporting is set to true when Button A is pressed on the controller
            nextfire = Time.time + fireRate;

            RayCastShoot(true);

        }

        else if (OVRInput.Get(OVRInput.RawButton.B) && (Time.time > nextfire))
        {
            // If Button B is pressed on the controller player is reset to his original position

            nextfire = Time.time + fireRate;
            player.transform.position = resetPosition;

        }
    }

在以下示例中,我将僵尸添加为敌人(僵尸可以从 Unity Asset Store 中下载),还添加了一些目标,如岩石和手榴弹,以增加场景的粒子效果,如爆炸、岩石撞击等。我还根据该教程创建了一个简单的僵尸动画。

Image may be NSFW.
Clik here to view.

Image may be NSFW.
Clik here to view.

现在,我们来看一下 RayCastshoot 函数。Physics.Raycast从 gunTransform 位置正向发射一条光线,指向场景中的碰撞器。在 weaponRange 变量中规定了范围。如果光线击中某物,将被存储在命中变量。

RaycastHit hit;

        if (Physics.Raycast(gunTransform.position, gunTransform.forward, out hit, weaponRange))

RayCastshoot 函数接收一个布尔值。如果该值为 true,函数远距传动玩家;如果该值为 false,则检查场景中的所有对象,如僵尸、岩石、手榴弹等,撞击并摧毁敌人和目标。

首先处理僵尸对象。添加 Physics rigid body 组件,并将 kinematic 值设置为 true。我们还添加了一个名为 Enemy.cs 的小脚本,并将其连接至敌人对象。以下脚本接收一个函数,并检查敌人的生命值。每调用 1 次 enemyhit 函数(每当向敌人开火使)将减少敌人的 1 个生命值。敌人被击中 5 次后,将被摧毁。

在 RayCastshoot 函数中调用该函数,以处理僵尸对象,并确定是否瞄准了僵尸。

Enemy enemy = hit.collider.GetComponentInParent<Enemy>();

如果敌人对象不是 null,将调用 enemyhit 函数,敌人的生命值将减少 1。如下所示,每次击中僵尸时,我们都会实例化血液效果预制件。我们检查敌人的完整生命值,如果低于零,将毁灭僵尸对象。

Image may be NSFW.
Clik here to view.

//Enemy.cs
public class Enemy :MonoBehaviour {

    //public GameObject explosionPrefab;
    public int fullLife = 5;


    public void enemyhit(int life)
    {
        //subtract life  when Damage function is called
        fullLife -= life;

        //Check if full life has fallen below zero
        if (fullLife <= 0)
        {
            //Destroy the enemy if the full life is less than or equal to zero
            Destroy(gameObject);

        }
    }

}

// if the hit object is the enemy
//Raycastexample.cs from where we are calling the enemyhit function
if (enemy != null)

            {
                enemy.enemyhit(1);

                //Checks the health of the enemy and resets to  max again
                //Instantiates the blood effect prefab for each hit

                var bloodEffect = Instantiate(bloodPrefab);
                bloodEffect.transform.position = hit.point;

                if (enemy.fullLife <= 0)
                {

                    enemy.fullLife = 5;
                }
            }

如果被击中的对象不是僵尸,通过为场景中不同对象添加标记来访问对象。例如,我们为地面添加了名为“Mud”的标记,为岩石添加了“Rock”标记等。如以下代码示例所示,我们可以通过对比标记与被击中的对象,针对这些对象实例化各自的预制件效果。

//If the hit targets are the targets other than the enemy like the mud, Rocks , Grenades on the terrain
else
            {
                var impactEffect = Instantiate(impactEffectPrefab);
                impactEffect.transform.position = hit.point;
                Destroy(impactEffect, 4);

                // If the Target is the ground
                if ((hit.collider.gameObject.CompareTag("Mud")))
                {

                    var mudeffect = Instantiate(mudPrefab);
                    mudeffect.transform.position = hit.point;


                }

                // If the Target is  Rocks
                else if ((hit.collider.gameObject.CompareTag("Rock")))
                {

                    var rockeffect = Instantiate(rockPrefab);
                    rockeffect.transform.position = hit.point;
                }

                // If the Target is the Grenades

                else if ((hit.collider.gameObject.CompareTag("Grenade")))
                {

                    var grenadeEffect = Instantiate(explosionPrefab);
                    grenadeEffect.transform.position = hit.point;
                    Destroy(grenadeEffect, 4);

                }
            }

        }

远距传动

远距传动是虚拟现实游戏的一个重要方面,建议使用远距传动,避免用户在场景中移动时产生眩晕感。以下示例在 Unity 中实施了一个简单的远距传动机制。借助代码,我们可以将玩家远距传动至“命中”点,也可以在地形中创建多个点,将玩家远距传动至这些点。

  1. 创建一个空的游戏对象,将它命名为“Teleport”。

    Image may be NSFW.
    Clik here to view.

  2. 创建一个名为“Teleport”的标记。

    Image may be NSFW.
    Clik here to view.

  3. 如下所示,将 Teleport 标记分配给 teleport 对象。

    Image may be NSFW.
    Clik here to view.

  4. 按下 CTRL+D 并复制点,在场景中创建更多的远距传动点。调整点的位置,使其跨越整个地形。我将 y 位置设置为 OVR 玩家预制件的位置,那么,这些点的 y 值和我的摄像头位置相同。

    Image may be NSFW.
    Clik here to view.

根据以下代码,如果远距传动被设置为 true,在 teleportPoints 变量中得到所有点的阵列,随机选取一个点用于玩家进行远距传动。

var newPosition = teleportPoints[Random.Range(0, teleportPoints.Length)];

最后,将玩家的变换位置设置为新位置。

player.transform.position = newPosition.transform.position;
if (teleport)
            {
                //If the player needs to be teleported to the hit point
                // Vector3 newposition = hit.point;
                //player.transform.position = new Vector3(newposition.x, player.transform.position.y, newposition.z);


                //If the player needs to be teleported to the teleport points that are created in the Unity scene.Below code teleports the player
                // to one of the points randomly

                var teleportPoints = GameObject.FindGameObjectsWithTag("Teleport");
                var newPosition = teleportPoints[Random.Range(0, teleportPoints.Length)];


                player.transform.position = newPosition.transform.position;

                return;
            }

创建设置和部署虚拟现实应用

完成游戏后,部署面向 PC 的虚拟现实应用。

  1. 转至 File > Build Settings,然后转至 Target Platform,选择 Windows。

    Image may be NSFW.
    Clik here to view.

  2. 转至 Edit > Project Settings > Player,然后单击 Inspector选项卡。
  3. 单击 Other Settings,然后选择 Virtual Reality Supported复选框。

    Image may be NSFW.
    Clik here to view.

  4. 编译并创建最终的虚拟现实应用。

结论

创建一款虚拟现实游戏非常有趣,但是需要极高的准确性。如果您是一位 Unity 开发人员,您的游戏不是专为虚拟现实设计,也可以与 Oculus Rift 集成,作为虚拟现实游戏导出。本文结尾处列出了许多关于虚拟现实最佳实践的参考文献。

以下是本文所讨论的示例场景的完整脚本。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Raycastexample :MonoBehaviour {


    //Audio clip to play
    public AudioClip clip;
    public AudioSource audioSource;

    //rate of firing at the targets
    public float fireRate = .25f;
    // Range to which Raycast will detect the collision
    public float weaponRange = 300f;

    //Prefab for Impacts at the target
    public GameObject impactEffectPrefab;
    //Prefab for Impacts for grenade explosions
    public GameObject explosionPrefab;

    //Prefab at gun transform position
    public GameObject GunfirePrefab;

    //Prefab if the target is the terrain
    public GameObject mudPrefab;
    // Prefab when hits the Zombie
    public GameObject bloodPrefab;

    // prefabs when hits the rocks
    public GameObject rockPrefab;

    // Player transform that is used in teleporting
    public Transform player;
    private float nextfire;

    //transform at the Gun end to show some muzzle effects when firing
    public Transform gunTransform;
    // Position to reset the player to its original position when "B" is pressed on the touch controller
    private Vector3 resetPosition;

    // Use this for initialization
    void Start () {

        // Play the Audio clip while firing
        audioSource = GetComponent();
        audioSource.clip = clip;
        // Reset position after teleporting to set the position to his original position
        resetPosition = transform.position;

    }

	// Update is called once per frame
	void Update () {
        //If the Primary Index trigger is pressed on the touch controller we fire at the targets
        if (OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger) && (Time.time > nextfire))
        {
            nextfire = Time.time + fireRate;
            audioSource.Play();
            // Teleporting is set to false here
            RayCastShoot(false);
        }
        else if (OVRInput.Get(OVRInput.RawButton.A) && (Time.time > nextfire))
        {

            // Teleporting is set to true when Button A is pressed on the controller
            nextfire = Time.time + fireRate;

            RayCastShoot(true);

        }

        else if (OVRInput.Get(OVRInput.RawButton.B) && (Time.time > nextfire))
        {
            // If Button B is pressed on the controller player is reset to his original position

            nextfire = Time.time + fireRate;
            player.transform.position = resetPosition;

        }

    }

    private void RayCastShoot(bool teleport)
    {
        RaycastHit hit;
        //Casts a ray against the targets in the scene and returns the "hit" object.
        if (Physics.Raycast(gunTransform.position, gunTransform.forward, out hit, weaponRange))
        {

            if (teleport)
            {
                //If the player needs to be teleported to the hit point
                // Vector3 newposition = hit.point;
                //player.transform.position = new Vector3(newposition.x, player.transform.position.y, newposition.z);


                //If the player needs to be teleported to the teleport points that are created in the Unity scene.Below code teleports the player
                // to one of the points randomly

                var teleportPoints = GameObject.FindGameObjectsWithTag("Teleport");
                var newPosition = teleportPoints[Random.Range(0, teleportPoints.Length)];


                player.transform.position = newPosition.transform.position;



                return;
            }

            //Attach the Enemy script as component to the enemy

            Enemy enemy = hit.collider.GetComponentInParent();

            // Muzzle effects of the Gun and its tranfrom poisiton is the Gun

            var GunEffect = Instantiate(GunfirePrefab);
            GunfirePrefab.transform.position = gunTransform.position;



            // if the hit object is the enemy

            if (enemy != null)

            {
                enemy.enemyhit(1);

                //Checks the health of the enemy and resets to  max again
                //Instantiates the blood effect prefab for each hit

                var bloodEffect = Instantiate(bloodPrefab);
                bloodEffect.transform.position = hit.point;

                if (enemy.fullLife <= 0)
                {

                    enemy.fullLife = 5;
                }
            }

            //If the hit targets are the targets other than the enemy like the mud, Rocks , Grenades on the terrain

            else
            {
                var impactEffect = Instantiate(impactEffectPrefab);
                impactEffect.transform.position = hit.point;
                Destroy(impactEffect, 4);

                // If the Target is the groud
                if ((hit.collider.gameObject.CompareTag("Mud")))
                {
                    Debug.Log(hit.collider.name + ", " + hit.collider.tag);
                    var mudeffect = Instantiate(mudPrefab);
                    mudeffect.transform.position = hit.point;


                }

                // If the Target is  Rocks
                else if ((hit.collider.gameObject.CompareTag("Rock")))
                {

                    var rockeffect = Instantiate(rockPrefab);
                    rockeffect.transform.position = hit.point;
                }

                // If the Target is the Grenades

                else if ((hit.collider.gameObject.CompareTag("Grenade")))
                {

                    var grenadeEffect = Instantiate(explosionPrefab);
                    grenadeEffect.transform.position = hit.point;
                    Destroy(grenadeEffect, 4);

                }
            }

        }
    }
}
//Enemy.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy :MonoBehaviour {

    //public GameObject explosionPrefab;
    public int fullLife = 5;

    // Use this for initialization
    void Start () {

	}


    public void enemyhit(int life)
    {
        //subtract life  when Damage function is called
        fullLife -= life;

        //Check if full life has fallen below zero
        if (fullLife <= 0)
        {
            //Destroy the enemy if the full life is less than or equal to zero
            Destroy(gameObject);

        }
    }


}

英特尔® 开发人员专区上关于虚拟现实的参考文献

VRMonkey 提供的虚拟现实用户体验技巧:https://software.intel.com/zh-cn/articles/virtual-reality-user-experience-tips-from-vrmonkey

《亚利桑那阳光》的临场感、逼真性和震撼性:https://software.intel.com/zh-cn/blogs/2016/12/01/presence-reality-and-the-art-of-astonishment-in-arizona-sunshine

利用用户体验设计对抗虚拟现实眩晕:https://software.intel.com/zh-cn/articles/combating-vr-sickness-with-user-experience-design

对 Well Told Entertainment 及其虚拟现实密室逃脱游戏的采访:https://software.intel.com/zh-cn/blogs/2016/11/30/interview-with-well-told-entertainment-about-their-virtual-reality-escape-room-game

虚拟现实体验的下一个飞跃是什么?:https://software.intel.com/zh-cn/videos/what-is-the-next-leap-in-vr-experiences

来自 Underminer 工作室的虚拟现实优化建议:https://software.intel.com/zh-cn/articles/vr-optimization-tips-from-underminer-studios

利用英特尔® 图形性能分析器优化虚拟现实性能:https://software.intel.com/zh-cn/videos/vr-optimizations-with-intel-graphics-performance-analyzers

利用最新款 CPU 创建沉浸式虚拟世界:https://software.intel.com/zh-cn/articles/creating-immersive-virtual-worlds-within-reach-of-current-generation-cpus

关于作者

Praveen Kundurthy 任职于英特尔® 软件和服务事业部。他主要专注于移动技术、Microsoft Windows*、虚拟现实和游戏开发领域。

使用可视化制定令人信服的数据案例

目前,数据无处不在。 从网络日志、传感器、网络设备、社交媒体等收集的数据多达每秒数 TB。 数据量非常庞大,只要我们能将无处不在的复杂数据网所隐藏的能力释放出来, 数据可以发挥巨大作用。

我们怎样才能释放并利用这个能力? 使其不仅是为少数的聪明人所用,而是在所有人、所有领域以及各个级别中普及。 答案在于数据可视化。

在本文中,我们将通过案例研究解释数据案例的核心因素,展示数据科学家如何解释、销售以及激励观众。 本文阐述了数据生产者常犯的错误以及这些错误引起的困惑,这些错误通常让人误以为真正的问题从未解决。 本文提供了一个有助于避免这些错误的框架。

 

案例研究

WeTrainYou 是一个总部位于伦敦的虚构的培训公司,计划在加利福尼亚州成立一家本地培训机构。 它正在寻找一座能提供充足 Salesforce* 开发岗位的城市。 他们的目标是培训工程师以及完成全职和兼职工作。 WeTrainYou 聘请您来确定创办企业的地址。 您需要回答以下问题:加州哪座城市拥有最多的 Salesforce 开发人员岗位?

了解挑战

我们看一下问题陈述的核心元素,以更好地了解挑战。

  • WeTrainYou
    • 一家基于伦敦的培训公司,
    • 雇用了 58 位持有 Salesforce 证书的全职培训师。
    • Salesforce 平台是它的核心竞争力。
    • 擅长培训工程师,将其培养为全职或兼职 Salesforce 开发人员。
  • WeTrainYou 想要在加利福尼亚州成立一家本地培训机构。
    • 根据维基百科的定义,加利福尼亚州共分为 58 个县,包含 482 个区。
    • 加州法律没有明确区分“市” (city) 和“镇” (town),区可以任选一种作为官方名称。
    • 根据 2010 年人口普查,加州的总人口为 37,253,956 人,城市居民为 30,908,614 人,占总人口的 82.97%。
  • 我们的难点是发现:
    • 加州哪座城市提供最多的 Salesforce 开发人员岗位?

优秀解决方案的标准

  • 我们的任务:
    • 使用数据确定加州哪座城市能提供最多的 Salesforce 开发人员岗位。
    • 找到一个易于决策制定者理解的方法
  • 我们的利益相关者可以是
    • 高管和董事会成员
    • 销售和市场营销人员
    • 法务和公共关系人员
  • 高效的解决方案应:
    • 展现简单、可行的视觉内容
    • 提供选址建议,即加州哪个城市提供最多的 Salesforce 开发人员岗位

数据案例解析

我们检查一下解决这个挑战的框架。

图 1 显示了数据科学流程,包含从数据获取到数据可视化的所有步骤。

Image may be NSFW.
Clik here to view.
图 1

图 1.数据科学流程。

数据科学流程始于数据。 分为 3 个步骤,总结为以下问题,为了克服数据挑战,需要我们在寻找最佳答案的过程中解决这些问题。

  1. 数据从何而来以及如何获取数据
  2. 获取数据后,如何清理数据如何关联数据?
  3. 最后,如何展示数据

Image may be NSFW.
Clik here to view.
图 2

图 2.流程的关键步骤。

图 2 显示了 3 个步骤。 我们将重点讨论最后一步:利用数据可视化展示数据。

创建数据可视化流程需要提出(或回答)的问题

概括案例

  • 需要回答哪些问题?
  • 这是一个长期的问题吗? 还是需要现在采取处理?
  • 这是一个信息、激励或销售案例?
  • 数据案例的流程是什么?
  • 需要多少张幻灯片?
  • 每张幻灯片上包含什么信息?

了解问题和 “so what” 测试

  • 利益相关者为什么问这个问题?
  • 他们将怎样看待我的建议?
  • 他们将采取哪些措施?
  • 数据案例的目标是什么?

难点在于了解问题,只有了解问题,才能使用数据可视化展示准确、有意义的回答。

数据

  • 回答问题需要使用哪些数据?
  • 数据来源在哪里?
  • 回答之前的问题需要主数据(即通过调查收集,以及编写 Python* 脚本)还是次级数据(如开放政府数据)?
  • 收集数据需要哪些工具与技术?
  • 需要使用 BeautifulSoup* 获取数据吗? 需要发放一百万份调查问卷,以获取数据吗?
  • 如何存储数据? 会达到数十亿行吗?
  • 有必要担心如何设置 NOSQ(如 MongoDB*)吗? 可以将数据全部保存为平面文件(如 CSV)吗?
  • 数据有多脏?
  • 我能访问的清晰 Excel* 格式的政府数据吗? 还是需要编写 Python 脚本,以清理数据,如重复数据删除、标准化和处理缺失值
  • 从数据中能得到多少特性? 需要繁重的特性工程才能回答这个问题?

算法

现在,我们拥有大量数据。 我们了解数据格式、结构和特性。

  • 哪些算法能回答问题?
  • 这是一个监督式机器学习(我们为引擎提供真实的标签并使用模型进行预测)问题吗?
  • 这是一个非监督(如集群)问题吗?
  • 该算法会不会因为速度太慢,无法解决这个问题?
  • 需要支持近乎实时的视觉效果吗? 
  • 真的需要算法吗? 可以借助可用数据解决我的问题吗?

视觉编码

  • 哪些标记(如线条或圆形)和通道(如颜色、大小或倾斜)最适合展现案例?
  • 我应该使用哪些颜色?
  • 观众对特定标记或通道敏感吗?
  • 他们是技术热衷者吗?
  • 数据视觉效果应该有何种程度的交互性?
  • 是全交互式吗?
  • 观众将如何使用我的视觉效果? 他们将缩小或放大视觉效果吗?
  • 他们使用智能手机查看图表吗?
  • 我将使用哪些工具开发视觉效果?
  • Tableau 能提供理想的展示效果吗?我需要使用 D3.js 创建视觉效果吗?

案例简介和分析

  • 3 张幻灯片合理吗?
  • 流程可行吗?
  • 问题答复了吗?
  • “电子邮件测试” – 如果我将该视觉效果以电子邮件的形式发送给英格兰人,他会理解(无需解释电子邮件中的每个视觉元素)吗

执行案例

  • 他们将根据案例采取措施吗?
  • 他们会采用我的视觉效果吗?
  • 我能说服他们(假设这是一个激励案例)采纳吗?
  • 他们的问题是否得到解答?

避免缺陷(处理反馈)

您的数据有可能不正确。 如果这一情况真的发生了,您需要返回绘图板,从头开始收集新数据。

反馈显示数据案例无法执行(如流程或可视化效果不佳),这是可能出现的另一种情况。

为了减少这些情况的产生,我们提供了排除数据案例故障时的提问框架。

您不了解

  • 他们为什么要求该效果?
  • 背后的原因是什么?
  • 在团队中引进领域专家是一个简单有效的方法。 如果您正创建医疗数据案例可视化,最好聘请医生担任团队导师。
  • 以小组和一对一的形式采访目标用户。
  • 明确记录整个团队的询问过程。

视觉编码不正确

  • 我们是否过度使用通道?
  • 我们了解使用多少颜色吗?
  • 是否使用了太多动画? 3D?
  • 视觉元素是否太复杂?
  • 怎样进行简化?

算法速度过慢

  • 我们是否使用了正确的算法?
  • 这是一个阶段性问题,
  • 还是一个生产基础设施问题?
  • 或者存在其他问题?
    • 运行测试以查看哪个组件速度较慢。
    • 基于数据集等测量时间。

执行

  • 为什么没人使用特性、产品或视觉效果?
  • 怎样创建 talkback? 在何处单击?
  • 我们能否使用 Amazon Mobile Analytics* 等工具了解每个组件?
  • 他们是否单击以“深入分析”数据?
  • 他们是否尝试下载?
  • 哪部分视觉数据案例未被查看?

返回案例研究

现在,我们再次回顾问题陈述。

WeTrainYou 是一个总部位于伦敦的虚构的培训公司,计划在加利福尼亚州成立一家本地培训机构。 它正在寻找一座能提供充足 Salesforce* 开发岗位的城市。 他们的目标是培训工程师以及完成全职和兼职工作。 WeTrainYou 聘请您来确定创办企业的地址。 您需要回答以下问题:加州哪座城市拥有最多的 Salesforce 开发人员岗位?

问题陈述

  • 首席执行官需要决定在加利福尼亚州设立培训机构的地址(城市)。
  • 这是一个优先执行的任务,他们需要快速制定决策。

我们需要哪些数据以及数据源自何处?

  • 招聘网站 Dice.com 将提供原始数据。
  • 我们将使用 BeautifulSoup Python 脚本获取数据。
  • 为了简化流程,我们仅获取“标题”和“位置”。
  • 数据中要有城市信息
  • 和地理编码信息。
  • 为了展示地图,我们还需要经度和纬度。 所幸,Tableau 拥有内置的地理编码。

示例代码

以下是 Python 脚本。

## (C) DataTiles.ai
## (C) DataTiles.io
## This is Proof of concept script, please do not use in production
## Sudhir Wadhwa, Jyoti Wadhwa, January 2016
import bs4 as bs
import csv
import requests
holder = dict()
myurl = 'tps://www.dice.com/jobs?q=Salesforce+Developer&l=CA'
try:
# For Python 3.0 and later
from urllib.request import urlopen
except ImportError:
# Fall back to Python 2's urllib2
from urllib2 import urlopen
sourcehtml = urlopen("https://www.dice.com/jobs?q=Salesforce+Developer&l=CA")
soup = bs.BeautifulSoup(sourcehtml,"lxml")
with open('TableauJobsLocations.csv', 'w') as csvfile:
fieldnames = ['Title','Location']
jobwriter = csv.DictWriter(csvfile, fieldnames=fieldnames,dialect="excel",lineterminator='\n')
jobwriter.writeheader()
counter = 0
for a in soup.find_all('a', {"class": "dice-btn-link"}, href=True):
url = a['href']
if  url.find('jobs/detail') > 0:
response=requests.get(url)
soup=bs.BeautifulSoup(response.text)
jobDesc = soup.find("div", { "id" : "jobdescSec" }).get_text().encode('ascii','ignore').upper()
holder['Title'] = soup.find("h1", { "class" : "jobTitle" }).get_text().encode('ascii','ignore').strip()
holder['Location'] = soup.find("li", { "class" : "location" }).get_text().encode('ascii','ignore').strip()
jobwriter.writerow(holder)
holder.clear

示例输出

以下是存储于 TableauJobsLocations.csv 的输出

sudhirwadhwa ~/Desktop/tbd/SCU $ cat TableauJobsLocations.csv
Title,Location
Sr. Salesforce Developer,"San Marcos, CA"
Salesforce Developer,"Los Angeles, CA"
Senior Salesforce Developer,"San Francisco, CA"
Salesforce Developer - FTE,"San Francisco, CA"
Salesforce Developer - Burbank - 125k+ DOE,"Burbank, CA"
Salesforce Developer,"San Francisco, CA"
Senior Salesforce Developer,"Los Angeles, CA"
Senior Salesforce Developers,"San Diego, CA"
Junior Salesforce developer,"Aromas (monterey County), CA"
Sr. Salesforce Developer,"Santa Clara, CA"
Mid-Level Salesforce Developer,"El Segundo, CA"
Lead Salesforce Developer,"San Bruno, CA"
Lead Salesforce Developer,"San Bruno, CA"
Salesforce Developer,"San Diego, CA"
Salesforce Dev/Admin,"Los Angeles, CA"
Salesforce Developer,"Burbank, CA"
Salesforce developer/Admin,"Oakland, CA"
Sr. Salesforce Developer,"San Marcos, CA"
Salesforce Developer,"San Francisco, CA"
Salesforce Developer,"Vista, CA"
Salesforce Developer,"San Ramon, CA"
SalesForce Developer,"Burbank, CA"
Senior Salesforce Developer,"San Francisco, CA"
Salesforce Developer,"San Ramon, CA"
SalesForce Developer,"Burbank, CA"
Salesforce Developer,"Burbank, CA"
Salesforce Developer,"San Rafael, CA"
Salesforce Developer,"San Francisco, CA"
Salesforce Developer,"San Diego, CA"
Senior Salesforce Developer,"Milpitas, CA"
Sr. Salesforce Developer,"San Marcos, CA"
Salesforce Developer,"Los Angeles, CA"
Senior Salesforce Developer,"San Francisco, CA"
Salesforce Developer - FTE,"San Francisco, CA"
Salesforce Developer - Burbank - 125k+ DOE,"Burbank, CA"
Salesforce Developer,"San Francisco, CA"
Senior Salesforce Developer,"Los Angeles, CA"
Senior Salesforce Developers,"San Diego, CA"
Junior Salesforce developer,"Aromas (monterey County), CA"
Sr. Salesforce Developer,"Santa Clara, CA"
Mid-Level Salesforce Developer,"El Segundo, CA"
Lead Salesforce Developer,"San Bruno, CA"
Lead Salesforce Developer,"San Bruno, CA"
Salesforce Developer,"San Diego, CA"
Salesforce Dev/Admin,"Los Angeles, CA"
Salesforce Developer,"Burbank, CA"
Salesforce developer/Admin,"Oakland, CA"
Sr. Salesforce Developer,"San Marcos, CA"
Salesforce Developer,"San Francisco, CA"
Salesforce Developer,"Vista, CA"
Salesforce Developer,"San Ramon, CA"
SalesForce Developer,"Burbank, CA"
Senior Salesforce Developer,"San Francisco, CA"
Salesforce Developer,"San Ramon, CA"
SalesForce Developer,"Burbank, CA"
Salesforce Developer,"Burbank, CA"
Salesforce Developer,"San Rafael, CA"
Salesforce Developer,"San Francisco, CA"
Salesforce Developer,"San Diego, CA"
Senior Salesforce Developer,"Milpitas, CA"
sudhirwadhwa ~/Desktop/tbd/SCU $

图 3.示例输出

处理 Tableau* 中的输出

接下来,在 Tableau 中输入数据,将地址划分为州和城市两列。 数据来源的快照和图 4 相似。

Image may be NSFW.
Clik here to view.
图 4

图 4.使用地理编码划分 Tableau* 中的数据来源。

创建指示板

接下来创建两个工作簿并在指示板中使用这两个工作簿(见图 5)。

Image may be NSFW.
Clik here to view.
图 4

图 5.最终显示最佳城市为旧金山(基于数据集)。

结论

通过数据可视化高效展示内容不仅能释放隐藏在数 TB 复杂数据中的巨大潜力,还能帮助观众理解数据,从而将其转化为可用数据。

例如,借助数据可视化,您可以:

  • 为管理人员提供有意义的答案。
  • 确保数据科学家和数据工程师不会迷失于海量数据。
  • 助力中层管理人员发掘可行洞察
  • 支持各个级别的数据驱动型决策制定。
  • 甚至更多。

Playerunknown's Battleground*(绝地求生)背后的公司之内幕

原文由 Intel Game Dev 发表于 VentureBeat*:深入了解《Playerunknown’s Battlegrounds》背后的制作公司。请访问 VentureBeat 的英特尔页面,了解更多游戏开发新闻和相关主题。

Image may be NSFW.
Clik here to view.
Promotion image of Player Unknown

Playerunknown’s Battlegrounds 成功吸引了玩家的关注,正迅速发展为(如果还不是)一种潮流。而且随着游戏内容的不断演进,众多玩家对该游戏的兴趣只增不减。如果你没玩,你的朋友可能正在玩。

我们在韩国离首尔不远的地方(通过翻译)采访了 Bluehole 副总裁兼执行制作人 Chang Han Kim,了解了公司的背景、发展经历以及未来发展方向。

首先,您能否介绍一下创立 Bluehole 的初衷,您希望借助公司为游戏行业带来哪些最重要的游戏创意?

当时所有工作室都在开发免费移动游戏,我所考虑的是如何完成一个项目。开发免费移动游戏已成为全球发展趋势,同时也席卷了韩国。

我和团队花了 16 年时间开发 MMORPG,我们希望挖掘 PC 市场的新机遇。我更热衷于开发 PC 游戏,因为我一直从事 PC 游戏开发,而且我也希望继续沿着这条道路走下去,尽管移动游戏更受欢迎。

Image may be NSFW.
Clik here to view.
Color photo of Chang Han Kim

上图:Bluehole 副总裁兼执行制作人 Chang Han Kim

在了解了 Bluehole 和独立工作室的其他团队的工作后,我发现他们使用 Google Play、Apple App Store 等云服务器和数字分发平台向全球的玩家提供移动游戏。这对我来说是一记警钟,因为我一直关注韩国受众,但我相信 PC 游戏能吸引更多受众。

当 DayZ 面世时,我知道我想制作一款基于会话的生存游戏,也称为“Battle Royale”。长时间以来我一直希望制作一款生存游戏,但始终没有机会,主要是因为韩国的玩家不太喜欢这一类型的游戏。

当时,制作游戏意味着我必须确保该游戏在韩国市场取得成功,然后才能向其他地区发布。

研究全球市场后,我认为现在是我实现梦想的好时机。我做了一些研究,发现一名称作PLAYERUNKNOWN的改装玩家,他从个人的层面对游戏进行改装,所以我联系到他,决定合作启动这个项目。

你那个 30 秒的 Playerunknown’s Battleground 广告是什么?

PLAYERUNKNOWN’S BATTLEGROUNDS是一款独立的 Battle Royale 游戏。DayzRust H1Z1等生存游戏都采用 Battle Royale 模式,但它们仅仅只是模式。“基础游戏”通常制定不同的目标,游戏最后幸存者模式都基于该目标而构建。

我认为 PUBG 是第一款独立的 Battle Royale 游戏,因为它从一开始就是这样设计的。Brendan Greene 创建过第一种 Battle Royale 游戏模式,拥有多年的求生游戏开发经验。在创建基础游戏时,我们充分运用了他在这方面的丰富经验。

关卡设计、抢劫、枪战、战斗......PUBG 中的所有核心组件都专为独立 Battle Royale 游戏所设计和优化。

Image may be NSFW.
Clik here to view.
Player Unknown

上图:PUBG 的惊悚游戏风格让你感觉时时刻刻身处危险之中。

PUBG 工作室当时的规模多大?有多少名员工,程序人员/美术师/UI/支持等如何分类?

为了确保游戏版本的高质量,我们从世界各地招募优秀人才。目前我们拥有 15 名程序人员、25 名美术师、5 名 UI 和游戏设计师,以及 5 名 QA 测试人员。负责社区管理、市场推广和业务开发的工作人员有大约 20 名。

公司成立之初,有没有制定关于公司未来 5 年或 10 年的发展愿景?

有的。公司成立之初,我们的愿景是 PUBG “可能”成为下一个 eSport,但这不是目标。我告诉团队,我们要尽全力一天天地接近这一愿景。直到现在还是这样,我们一直在努力接近这一愿景。PUBG 绝对有可能成为下一个 eSport,但我没有十足的把握来预测。我们正在努力,一步一个台阶向前发展。

Image may be NSFW.
Clik here to view.
Color photo of Brendan Green

上图:Brendan Greene(又名 Player Unknown)从改装玩家变成 PC 游戏巨星。

Bluehole 总共有多少名员工?

Bluehole 公司拥有 500 名员工,不同的团队负责不同的项目,其中负责 PUBG 开发的员工有 70 名。

有没有从其他项目中获得一些对 Battleground 设计有帮助的启发?

我从事网络游戏开发已超过 16 年。在韩国,网络游戏的开发和服务结构都进行了深入而全面的优化,可支持灵活开发。尽管这些年一直从事网络游戏开发,但不断地重复开发周期,使我在游戏改进方面积累了丰富的经验。我通过经验制定了 PUBG 开发路线图,重点收集北美和欧洲的核心 Battle Royale 玩家的反馈。因此,我们的团队才能不断加快开发速度。

在韩国开发这款游戏时,有没有发现当地受众和全球受众在兴趣方面存在差异?

是的,我发现存在差异。从开发的早期阶段开始,我们一直与 Twitch 和 YouTube* 内容创建者保持密切合作。我们主要从他们那里获取切实可行的反馈,并采取相应的行动。我们还帮他们创建更加有趣的内容。

西方的内容创建者想要极具现实感的枪战场景......他们喜欢真实感十足的细节。韩国的内容创建者喜欢组织有趣的事件,因此专注于在游戏中创建有趣的时刻。我认为这是由文化差异所造成的。

不同地区之间存在着大大小小的差异。现实感是游戏的基础。我们在这种基础之上添加各项特性,帮助内容创建者创造多样性,向观众展示更符合他们喜好的 PUBG。这就是我们的目标。

Image may be NSFW.
Clik here to view.
Player Unknown

上图:PUBG 已迅速成为一种潮流,全世界的玩家都喜欢其中紧张的战斗场景。

在公司成立之初,有没有特别想实现的终极目标 — 一款终结游戏?

我们的目标是在一年之内发布抢先体验版游戏。我之前成立了 Ginno Games* 开发 PC 版 MMORPG 游戏。后来 Ginno Games 被开发和发布 TERA* 的 Bluehole 公司收购。收购完成后,我开始和团队开发 PUBG。

韩国的工作室在开发网络游戏方面经验非常丰富。网络游戏和单机游戏或封装游戏有很大的不同。有的人认为它们是服务,有的人认为它们既是产品也是服务。网络游戏不同于封装游戏,必须随时间不断演进,而且服务必须始终跟进,即使游戏在不断变化。因此,更大的目标是创建“游戏即服务平台”。

我知道这一目标实现起来不太容易。我们需要克服新的挑战,所以整个团队要不断学习和成长。我认为遇到挑战时允许失败,以此为后续发展铺平道路,但时间不能拖得过长,必须快速进行。制定发布抢先体验版游戏的目标意味着我已经准备好快速失败然后从中汲取经验。

只有失败才是成功之母。必须遇到新的挑战,才会导致失败。最初我们的团队只有 20 名成员,所有人都认为我们的目标不可能实现。直到最后发布抢先体验版,我们的团队,包括 QA 在内,也只有 36 名成员。别人说我们太疯狂,不可能实现目标。但我们成功了。

Image may be NSFW.
Clik here to view.
Player Unknown

上图:在 Battle Royale 战场,它是一个孤独的存在。 图片来源:Bluehole

你的团队现在最喜欢玩哪款游戏?

如果想从游戏中获得快乐,他们只玩 PUBG。有时我们会使用自定义游戏特性玩僵尸模式,但大部分时间开发人员都玩 DUO 或 SQUAD 模式。有的开发人员甚至在 Twitch 上观看游戏流。

你们如何与譬如 Steam* Early Access 或韩国第一方游戏机的流程进行合作?这种开发流程顺畅吗?你希望这种流程如何进行?

我认为目前的开发和服务环境全球化程度非常高,合作或支持方面不会有任何问题。不存在任何技术问题,与合作伙伴合作也不是问题。

我们是一家韩国公司,为创建适合西方玩家的内容是最大的挑战。必须了解亚洲受众和西方受众之间的文化差异。因此我们从一开始就与 Brendan Greene 保持合作,并尽量与北美和欧洲的核心玩家保持沟通。

必须保持沟通和透明,才能了解核心玩家的需求。在为期一年的开发过程中,我们在周末进行了 10 次游戏测试,并在每次测试完成后收集大量反馈。我们与内容创建者交流,倾听他们的反馈,并尽一切可能倾听来自社区的声音。

Image may be NSFW.
Clik here to view.
Player Unknown

上图:开发团队只玩 PUBG 游戏。

从现在到 2027 年,你认为游戏播放和游戏开发方面最大的挑战是什么?

我不确定 10 年之后会是什么样子,会有怎样的变化,但我希望我们能够适应目前的种种变化。几年前,许多 PC 游戏或单机游戏开发人员都已转为开发移动游戏。移动游戏市场得到了空前发展,而且还在不断发展壮大。其中的主要原因是现在移动设备更加普及,已经成我们生活的一部分。人们越来越容易获得移动设备。

但是,相比于容易获得移动设备,人们更容易看到他人玩游戏。越来越多的人更加方便、容易观看内容创建者在移动设备上玩游戏。

这种新内容的影响力正在不断加强,未来将会产生更大的影响力。我们自己每天都能感受到它所带来的影响。它还将彻底改变游戏开发的格局。


Twisted Pixel 邀请好莱坞一线明星走进虚拟现实

原文由 Intel Game Dev 发表于 VentureBeat*:Twisted Pixel 邀请好莱坞一线明星走进虚拟现实。请访问 VentureBeat 的英特尔页面,了解更多游戏开发新闻和相关主题。

Image may be NSFW.
Clik here to view.
Promo image for game Wilson&#039;s heart

对某些人来讲,面向新兴的虚拟世界发布游戏会带来风险:最终成为采纳新技术的开拓者,抑或是这个无人涉足领域的失败者?对于 Twisted Pixel Games 及其首席创意总监 Josh Bear,这并不是早期技术采纳,这家公司开发的《Gunslinger》为面向 Xbox 360 的决定性 Kinect 提供早期支持。

“将游戏技术作为工作室的重点并不是我们的目的,”Bear 表示,“但是我们接触了 Project Natal(Kinect 的初始代号),发现微软非常热衷于此,于是,我们开始制作《Gunslinger》。”

这家工作室成立了 10 多年,制作了若干款游戏,《Wilson’s Heart》是他们梦寐以求的愿望,现已发布虚拟现实版本。“我们创建了一个第一人称叙述形式的早期原型,称其为“手持游戏”,玩家通过手柄控制游戏。玩家使用双手捡起包括枪在内的物品,类似于第一人称射击游戏……但是当 Oculus 工作人员通过触摸控制器向我们展示那项技术时,我们一致认为‘这才是游戏的正确打开方式’。”Bear 解释道。

然而,改变游戏的核心技术绝非易事。最初,《Wilson’s Heart》是一款具有第一人称 PC 游戏,现在需要调整它的功能,以满足全新的游戏要求。“制作虚拟现实版本意味着我们基本上需要从头开始。”Bear 表示,“我们甚至重新评估了黑白色的图形审美:是否在虚拟现实中略显怪异?是否合适,是否让玩家感到不真实?”

“我们需要不断调试控制器,以确保手感良好。它们是游戏的重要方面,我们必须确保它们的手感、运行和外观都非常炫酷。”他补充道。

Image may be NSFW.
Clik here to view.
 game Wilson's Heart

上图:游戏融合了心理恐惧和谜题,没有太多突然出现的恐怖时刻。

实践、思考和对新虚拟现实模式的了解将帮助我们不断克服挑战。游戏体验的基本要素已受影响:多长时间算长?多短时间算短?目前,没有人会创建一个 100 小时的虚拟现实游戏,总体体验的时长是 Bear 团队必须克服的挑战之一。

“有人玩 6 个小时,有人玩 8 个小时,据我们所知,还有人玩 10 或 12 个小时。但是,无论您多么沉迷于游戏,总想中途摘下头盔,我们需要认识到一点。”Bear 表示。

您是否感到眩晕?

在目前的技术发展阶段,影响虚拟现实体验的主要问题无疑是晕动症。从 PC 转变为虚拟现实的过程中,移动是必须处理的设计更改。“我们不希望玩家产生眩晕感,我们希望玩家尽可能长时间投入游戏中。如果您在游戏中,屏幕变成黑色,您仍可以听到 Wilson 的呼吸声、脚步声或其他声效,您追寻这些声音前行。”Bear 表示,“在虚拟现实中,我们需要从不同角度考虑所有问题。”

游戏的早期版本允许玩家随处走动,前往任何地方,事实上,这曾是游戏玩家呼声最高的特性之一,如今引起了许多问题。

“我们希望有人能想办法实现这一点,于是我们开始尝试远距传动系统。”结果如何?“我们彻底解决了晕动症问题。”Bear 表示。

Bear 补充道,“Oculus 高度关注这个问题,他们做得非常好。但是很难执行,因为某些人特别喜欢远距传动,他们到处走动,但是会拔出电线,破坏系统。总之,这是一个很大的挑战。”

游戏背景设置在二战结束后的 40 年代,游戏营造的心理恐惧源于 Bear 对环球影业怪兽电影的喜爱。“我最喜欢《狼人》《Abbott and Costello Meet Frankenstein》、Boris Karloff……另外还有《阴阳魔界》。我们想向这些电影致敬。”

在这些电影中,主要演员将角色演活了,成为了电影的标志性人物。顶级的全明星阵容为《Wilson’s Heart》配音,使游戏更加出彩。

Image may be NSFW.
Clik here to view.
Game Wilson heart

上图:彼得•威勒、迈克尔•B•乔丹、罗莎里奥•道森、阿尔弗雷德•莫里纳和柯特伍德•史密斯组成了强大的阵容。

好莱坞大牌明星

“我特别希望彼得•威勒为 Wilson 配音……特别喜欢《机械战警》— 谁不喜欢呢 — 但是他在《裸体午餐》《天生爱神》等电影中的表现也很出色。因此,我们飞往新墨西哥州,向他展示了一段游戏演示,他非常和蔼,很欣赏这个概念和艺术形式,当即表示愿意加入。”Bear 表示。

对于其他角色,他看了看角色要求,确定了理想的演员。“我们最初选定的演员全部同意加入。”他表示,包括迈克尔•B•乔丹、阿尔弗雷德•莫里纳、罗莎里奥•道森和保罗•雷宾斯。

除了大牌明星彼得•威勒的加盟外,柯特伍德•史密斯也为游戏倾情献声,令所有《机械战警》粉丝兴奋不已。“尽管他们不在同一个房间内,但是,能同时邀请到两人非常难得。”《机械战警》铁杆粉丝 Bear 表示,“柯特伍德甚至情不自禁地说出《机械战警》的台词,我在 VO 室里都压抑不住内心的激动之情!我们在游戏中采用了一句台词。”

与这些视频游戏顶级天才的合作效果如何?“他们的表现非常出色,”Bear 表示,“他们能即兴修改我们的台词……与这些卓越的人才合作,工作轻松多了。”

您对他们的印象怎样?

“他们是我见过的最好的人!”Bear 表示。

游戏获得媒体和社区的一致好评,Bear 也看清了当今虚拟现实浪潮的本质。“为了保证竞争的公平,您需要装备,需要强大的 PC 来运行游戏,还需要控制器。我认为游戏将吸引更多玩家,因此,将产生长尾效应。”他表示。

对于 Twisted Pixel 的 30 多名开发人员,虚拟现实不是他们的全部追求。“虽然我们喜爱虚拟现实,但是对 PC 和游戏机的热情不减。我们关注理念和最佳平台,而不是把游戏生硬地转化为虚拟现实。”

无论未来规划如何,Bear 已经掌握了这个行业的本质。“我们能看到 3 到 5 年内的前景,”他表示,“但是如您所知,形势也许会一落千丈!”

虚拟现实内容开发人员指南

获得关于开发和设计虚拟现实 (VR) 应用的通用指南,了解如何实现最佳性能。本指南基于多个虚拟现实工作负载的性能特征,定义了常见瓶颈和问题。想办法解决受黑白色束缚的纹理格式选择问题,融合着色器通道,以及如何使用后期抗锯齿技术改进虚拟现实应用工作负载的性能。

目标

  • 明确整体设计要点和预算建议,针对使用第七代智能英特尔® 酷睿™ i7 处理器和英特尔® 高清显卡 615 (GT2) 创建虚拟现实内容的开发人员。
  • 提供指南和注意事项,以实现第七代智能英特尔® 酷睿™ i7 处理器的最佳图形性能。
  • 提供关于最佳媒体(尤其是 3D 媒体)的建议。
  • 获得设计虚拟现实应用的技巧,尤其针对移动设备提供持久动力。
  • 寻找工具,以帮助开发人员确定虚拟现实就绪型硬件上存在的计算机图形问题。

开发人员建议的设计要点

针对独立软件开发商的设计要点和预算通用指南

  • 三角形/帧 - 特定帧内 20 万 - 300 万个可见三角形。*使用视图体的强制遮挡、背面和闭塞减少发送到 GPU 的三角形数量。
  • 绘制/帧 - 500 - 1000*。减少绘制调用的数量,以改进性能和功耗。借助着色器批量处理绘制,通过 3D 工作负载从前到后绘制(参阅 3D 指南)。
  • 目标刷新率 - 至少每秒 60 帧 (fps),90 fps 可实现最佳体验。
  • 分辨率 - 可按需将头盔式显示器 (HMD) 的分辨率缩小到 60 fps,但是不能低于 HMD 分辨率的 80%。*也可以考虑动态调整渲染目标分辨率,以达到帧速率的要求。*
  • 内存 - 90 fps 需要每帧 180 MB ‒ 200 MB(DDR3,1600 MHz)。*

*数据为最初建议,可能会变化。

发挥通用硬件最佳性能的注意事项

纹理格式和过滤模式

  • 纹理格式和过滤模式可能对带宽产生重要影响。
  • 一般为多数过滤模式(双线性等)推荐 32 位和 64 位图像格式。
  • 和 32 位案例相比,使用标准红绿蓝和高动态范围 (sRGB/HDR) 格式过滤三线性和体积表面的速度较慢。

未压缩纹理格式

未压缩格式—sRGB 和 HDR —消耗更多带宽。如果应用消耗过多带宽,请使用线性格式。

HDR 格式

建议使用 R10G10B10A2(而非 R16G16B16A16 )和浮点格式。 

过滤模式

各向异性过滤等过滤模式可能显著影响性能,尤其是采用未压缩格式和 HDR 格式的模式。

各向异性 [CC6] 过滤可维持性能与质量的平衡。基于我们的性能和质量研究,通常推荐二级各向异性。MIP 贴图纹理和各向异性级别增加了过滤和硬件管线的开销。如果您选择各向异性过滤,建议您使用 bc1‒5 格式。

抗锯齿

暂时稳定的抗锯齿对卓越的虚拟现实体验至关重要。多点采样抗锯齿 (MSAA) 占用大量带宽和渲染预算。后期处理时暂时稳定的抗锯齿算法(如 TSCMAA)可提供毫不逊色的功能,成本降低了一半,可作为备选方案。

低延迟抢占

新一代硬件支持对象级抢占,通常转化为抢占三角形边界。及时抢占基元对高效调度编译器非常重要。为此,耗时 1 毫秒以上的绘制调用通常会有 64‒128 个三角形。一般而言,全屏后期处理应使用的网格应至少包含 64 个三角形,而不是 1 个或 2 个三角形。

应用调度

1.建议:无需额外添加。

Image may be NSFW.
Clik here to view.
screenshot of frame rendering values

在特定帧的理想情况下,应用有充足的时间完成垂直同步之间的任务,并且早于 late state request (LSR) 数据包的提交时间。在这种情况下,应用最好能够同步垂直同步,以便在最新 HMD 位置数据上执行渲染。这有助于最大程度缓解晕动症。

2.建议:在编译器开始工作时进行同步,而非垂直同步,提早开始。

Image may be NSFW.
Clik here to view.
screenshot of frame rendering values

当帧渲染时间不在间隔内时,回收所有可用的 GPU 时间,用于在 LSR 产生之前渲染帧。如果无法与间隔重叠,编译器可以将下一个可用渲染目标保留在交换链中,阻止应用渲染下一帧。将导致完成某个帧的当前工作负载之前,整幅帧被跳过,应用的 fps 也随之下降。应用应与编译器同步,这样,当前或 LSR 工作负载被提交后,将立即提交新渲染任务。通常借助编译器 API 提供的等待行为来实现。

Image may be NSFW.
Clik here to view.
vector image

3.建议:异步演示。

最坏的情况是帧渲染时间超过垂直渲染,应用应尽快提交渲染任务,使 GPU 满负荷运行,以支持编译器使用最新的帧数据,这个情况何时发生与 LSR 有关。为了实现这一目标,不要等到任何垂直同步或编译器事件发生后再继续渲染,如有可能,创建应用,以便将演示和渲染线程与剩余的状态更新分离。

例如,在 Holographic API 上,将 DoNotWaitForFrameToFinish传输至 PresentUsingCurrentPrediction,或在 DirectX* 中,将 SyncInterval=0传输至 Present。

4.建议:异步演示。

使用 GPUView 等 GPU 分析工具查看您遇到的渲染性能问题,然后按照上文的介绍做出必要的调整。

其他设计注意事项

半浮点对比浮点:在没有出现精度问题的情况下,计算密集型工作负载可以借助半浮点提高吞吐率。混合半分辨率和完全分辨率将导致性能下降,应尽量避免。

工具

以下工具帮助您确认虚拟现实工作负载问题。

GPU View:具体解释发现的调度和掉帧问题。

英特尔® 图形性能分析器:详细分析虚拟现实工作负载和预期模式。例如,面向左眼和右眼的两组相同的调用。

其他资源

总结

虚拟现实工作负载面临的最大性能挑战源于带宽限制。纹理格式、融合着色器通道以及使用后期抗锯齿技术有助于减轻带宽压力。

贡献者

本文提供的开发人员指南由 VPG Arch 团队创建。

Digital Happiness 计划打造 VR 版 DreadEye

原文由 Intel Game Dev 发表于 VentureBeat*:Digital Happiness 计划打造 VR 版 DreadEye。请访问 VentureBeat 的英特尔页面,了解更多游戏开发新闻和相关主题。

Image may be NSFW.
Clik here to view.

印度尼西亚西爪哇岛万隆市。说实话,我必须要借助谷歌地图,才能找到首都雅加达以南的位置。公平地讲,你可能认为它不是一个能够推动游戏概念和技术的游戏开发工作室,但这却体现了游戏行业的全球性,而且大家一点也不会觉得惊讶。

2013 年,总部位于此的游戏开发工作室 Digital Happiness 发布了一款惊悚游戏《DreadOut》,现在该公司计划借《DreadEye》打造虚拟现实版惊悚游戏。

最初的游戏讲述了 Linda 和一群孩子在一所闹鬼的高中遭遇各种鬼魂和幽灵的故事。武器装备?手机摄像头。情况对孩子十分不利。试想,如果现在戴上融合了这些惊悚游戏概念的 VR 头盔,去探索黑暗恐怖的房间,那气氛将是多么紧张。

Digital Happiness 首席执行官兼创始人 Rachmad Imron 介绍了在印度尼西亚开发游戏所面临的一些挑战,以及他对行业未来的希望。

工作室是怎样成立并发展壮大的?

2013 年我与合作伙伴成立 Digital Happiness 。之前我们在一家小型动画工作室工作,主要从事客户服务项目,但由于合作伙伴和我都非常喜欢视频游戏,而且真正热爱制作视频游戏,所以我们决定转而开发视频游戏业务。

公司成立之初只有 4 名员工,现在我们的团队成员已增加到 18 人。

Image may be NSFW.
Clik here to view.

上图:首席执行官兼创始人 Rachmad Imron 在位于印度尼西亚万隆的办公室。

团队最初的志向和梦想是什么?

当时由于经验有限,根本不可能与那些全球工作室竞争,所以我们最初的梦想就是为游戏增添我们当地的多样化特色,以增加全球游戏的价值。希望它成为我们的特色和与众不同之处。

印度尼西亚的游戏行业目前状况如何?有多少家工作室?

印尼人口居世界第四位,因此一直以来都是全球游戏行业的目标市场。据印尼游戏协会 (AGI) 介绍,尽管印尼目前有超过一百家本土游戏开发商,但 97% 都是购买外国产品。

而且有趣的是,PlayStation SDK(软件开发套件)和 Xbox One SDK 不能发货到我们国家,所以如果印尼游戏开发商希望将游戏移植到这些平台,就需要与外国发行商打交道。难度非常大。

印尼的大学开设游戏设计课程,以及游戏编程、3D 艺术等课程吗?

是的。过去 3-5 年,印尼一些大学在课程中增加了游戏开发学习大纲。大部分知名大学都支持这些学习大纲。

在《DreadOut》开发过程中,众筹 (Indiegogo) 发挥了怎样的关键作用?

政府最近成立了印度尼西亚创意经济产业局 (BEKRAF),开始通过资助计划为当地游戏开发商提供大力支持。这在 2013 年几乎是不可能的事情。因此,众筹是支持游戏开发进展的唯一选择。那时,我们还是第一批通过 Steam 绿灯计划的游戏之一。

成为第一批通过 Steam 绿灯计划的游戏相当具有挑战性,而且众筹计划成功与否是批准通过该计划的主要考虑因素之一(即使他们没明说这是其中的一个要求!)。

众筹计划也有它自己的好处。它向大众宣传了我们的视频游戏。那时我们还只是来自无名小国的无名开发商,没有任何制作梦想游戏的经验。

随着我们成为第一家通过众筹获得投资的印尼视频游戏开发商,更多的本地开发商问我们是如何做到的,并且跟随着我们的脚步成功融资。那是一次意想不到的体验。

Image may be NSFW.
Clik here to view.

上图:最初发布的《DreadOut》为变幻莫测的视频游戏开发领域提供了许多经验。

工作室发布第一款游戏,从中学到了哪些经验?

开始我们认为自己对视频游戏开发无所不知,但我们错了!《DreadOut》发布之前启示我们什么都不懂。这就是我们学到的最重要的一点,经过了一番艰难才了解到这点!

DreadOut 开发过程中有哪些灵感?

DreadOut 实际上是我们向恐怖大作《寂静岭》和《零》致敬。这两款游戏时我们主要的灵感来源,因为我们喜欢,并且也从这些游戏中得到了很大的启示。而且我们喜欢日本恐怖片(《贞子》和《咒怨》系列)以及我们国家 80 年代根据本土神话鬼怪传说改编的恐怖电影。

在开发和发行《DreadOut》的过程中,学到了哪些是将来不应该做的?

不要超出范围,不要超出预算,也不要低估自己的能力。

说到 VR,你们如何学习这项技术,如何为这种新平台编程?

我们学习基于 PC 和基于移动设备的硬件。关于软件,持续的社区支持和论坛为我们学习如何快速在 VR 中开发游戏提供了很大的帮助。由于 VR 主要是三维空间,而且我们之前的游戏也是 3D 游戏,因此能够非常顺利地从传统 PC 游戏编程和设计过渡至 VR 游戏。

基本上来说,VR 是我们的新游乐场,有很多方面让我们感到兴奋。尽管我们过去有制作《DreadOut》的经验,但在 VR 中开发游戏就像进入了一个新的领域。而且这就是乐趣所在!

Image may be NSFW.
Clik here to view.

上图:部分角色,比如之前游戏中挥舞剪刀的老板,将从 DreadEye VR 中消失。

对 DreadEye VR 来说,游戏中将会有何变化?

VR 就是关于体验。但由于我们必须为 DreadEye VR 更换引擎,因此必须摒弃之前的游戏机制、3D 模型和动画。为了与 VR 保持一致,我们尝试将《DreadOut》中的恐怖体验融入完全不同的 VR 体验之中。

它基本上是一款全新的游戏,但和之前的游戏一样,依然热衷于表现亚洲的恐怖主题。

所以即使是不同类型的游戏,我们的玩家仍然可以在游戏中体验到相同的(如果不是更多)恐怖气氛。

开发 VR 游戏是不是改变了你们讲述游戏情节或表现角色的方式?

是的,肯定有所改变。不论愿不愿意,叙述故事和展示角色的方式都需要改变。由于 VR 中的沉浸程度相当高,玩家可以直接跳到虚拟世界之中,所以和传统的第三人称或第一人称游戏有很大的不同。因此我们需要换一种方式来叙述故事。如果我们希望 VR 游戏为玩家带来流畅的体验,就必须做出改变。

Image may be NSFW.
Clik here to view.

上图:《寂静岭》和《零》游戏中独具特色的点头动作都非常明显。

你如何看待 VR 游戏面临许多挑战?

实际上是乐趣与挫败感并存!我们开始一直试验 Oculus DK1,直到最近获得了 HTC Vive,那真是一段艰难的经历。但许多问题在现在看来都没有那么困难了,比如动晕症。现在的 VR 就绪型 PC 硬件功能非常强大,完全可以为我们带来流畅的体验。从个人角度来说,我认为 VR 体验几乎非常完美,但最大的挑战是如何找到合适的游戏机制。

另外一个大问题是市场。VR 市场规模不如其他传统视频游戏。

VR 开发商需要通过潜在 VR 受众盈利,而且是的,有时会令我们所有人担忧。但我们相信,VR 仍然处在发展阶段。如果 AAA Development(比如《FallOut VR》),或者甚至是斯皮尔伯格的电影《玩家一号》登陆影院,能够进一步推动普通市场向 VR 市场的发展。

去年参加 Steam Dev Days 期间,Valve 声称每天会新增 1,000 名 VR 用户。我们依然乐观地认为,VR 处于正确的发展轨道之上,即使我们同样认为我们必须广泛地学习,才能进入目标市场。

Digital Happiness 团队成员为了开心会玩哪些游戏?

很明显(在我写这个采访之际),大多数团队成员经常玩 DOTA 2 — 特别是在周末 — 也偶尔在游戏机上玩 Bloodborne 和 Souls 系列。

你对 Digital Happiness 未来五年的发展有何愿景?

希望我们团队的成员继续享受游戏开发的乐趣,而且能够进入本国的大部分潜在市场。

一个身负艰巨使命的人

原文由 Intel Game Dev 发表于 VentureBeat*:一个身负艰巨使命的人。请访问 VentureBeat 的英特尔页面,了解更多游戏开发新闻和相关主题。

Image may be NSFW.
Clik here to view.
Screenshot of logo/banner of Space Jammers

“我喜欢别人对我发火,这说明他们在乎。”

这句大胆且自信的话正是出自 Sorob Raissi,他这样描述自己:Spread Shot Studios 的创始人、CEO、美术师、开发人员、设计师兼业务员。为何如此描述自己?因为他独自运营一间工作室,凭借第一款游戏《Space Jammers》在游戏行业立足。坦率来讲,Raissi 完全可以这样标榜自己,因为一连串职责表明,他是自己独自运营 Spread Shot Studios。

你如果关注我们的 Developer Spotlight 系列和 Studio Canvas 的介绍,一定听说过类似的故事,但 Raissi 的从业经验和传奇故事却是所有人都希望复制的。

他最初的工作是一名 3D 艺术家,从事训练模拟,也就是军事模拟。以《America’s Army》为例,它不是商业版本,而是国土安全部委托的训练软件。

这项工作就是—Raissi 没有命名 — 游戏设计和开发。他说:“我的上一份工作是负责制作道具和关卡、动作捕捉和动画整理,并且开始设计游戏内场景。”这些项目融合了典型的第一人称射击游戏机制和对话式游戏,经常被军事人员用在战斗场景中训练士兵以及与当地代表的外交场合中。

“这款一款半《反恐精英》半《质量效应》游戏。它采用半战斗半对话树机制。我负责军人与当地人交谈时的对话分层和场景切割。类似侦探故事,因为他们必须弄清楚谁是坏人。这在本质上就是游戏设计,” Raissi 补充说到。

帮助制作完地图后,譬如模拟洛杉矶市中心万豪国际酒店的地图,以便洛杉矶警察局、消防局和反恐部队应对假设针对该酒店的恐怖袭击,合同终止,因为这经常是和联邦机构的预算安排相对应的。

为了在游戏行业开创一番事业,Raissi 做出了两个大胆的决定。第一个是开始学习游戏编程以增强自己的 3D 艺术技能,另外一个把家从奥兰多搬到旧金山,以从那里日益兴旺的开发社区学习一切有用的经验。据 Raissi 描述:“在佛罗里达我一个编程人员都不认识,所以无法学习他人的经验。我也无法上网或使用任何资源。因此只能参考其他游戏,运用极其有限的编程知识尝试复制游戏。”

Image may be NSFW.
Clik here to view.
Screenshot of gameplay integration with Twitch

上图:集成 Twitch 功能后,Raissi 可以支持观众与游戏互动。

图片来源:Space Jammers

尽管这个垂直独立计划意味着 Raissi 必须独立完成游戏开发工作室所有部门的工作,但他依然为 Spread Shot Studios 的游戏制定了明确的愿景。他说:“公司的宗旨说明就是从亲密的朋友开始进行互动式社交活动。类似于沙发合作游戏和多人游戏,但更多的依赖你认识的人和圈内的人,然后逐步扩大朋友圈。”

这位才华横溢的年轻 CEO 补充说:“我一直与室友住在一起,比起玩在线《使命召唤》(一群 13 岁的孩子骂我,但我根本不认识他们),我更珍惜和室友住在一起的时光。不是不能在网上和陌生人交朋友,而是和朋友圈内的人一起才是最开心的。”

这种态度一直激励着我制作尽管意识到存在技术弱点,但依然保有坚定决心的游戏。“我曾在高中某一节课时使用过 Gamemaker。老师让我们制作一款游戏,后来我就再没碰过那款游戏,直到一天看到《Flappy Bird》游戏。我最好朋友的女朋友是小学老师,她的学生经常向她说起《Flappy Bird》,所以她就问我‘有没有听说过《Flappy Bird》’。我问她《Flappy Bird》是什么样的游戏。这款游戏非常简单,孩子们很喜欢,不断尝试超过别人的分数。游戏机制很简单,我看到它将所有孩子都聚集在一起。”

后来我用一些道具制作了自己版本的《Flappy Bird》,只是为了学习如何编程和了解发布游戏的生态系统。

有了这一起点之后,我搬到旧金山,开始全心全意制作《Space Jammers》,这款动作游戏包罗万象,玩法简单,包含古怪的角色、疯狂的武器和体现 Raissi 幽默特质的场景。“《Space Jammers》的灵感主要来源于《火线迈阿密》和《废土之王》等游戏,我希望从一开始就是多人游戏,而不是通过 mod 添加。我希望从一开始就展现出游戏的合作性质。”

Image may be NSFW.
Clik here to view.
The fast-paced game is colorful and full of quirky characters

上图:色彩华丽、角色古怪的快节奏游戏。

当然,Raissi 非常乐于接受仍然需要学习的东西,因此所要求的多人在线等特性可能暂时不太可行。不过他通过参加譬如 Playcasting 的集会组织来与开发人员合作,并加入编程人员培训基地,在他人的帮助下将 Twitch 功能集成到游戏中。

这听起来就像是一个速成班,但 Raissi 接受本计划在四个月内完成的游戏项目向后拖延如此之久。尽管他承认自己并不希望整个职业生涯单打独斗,但他没有停下一个人制作游戏的脚步。尽管有 3D 艺术创作的经验,但他很难在大型发行公司谋求一份美术方面的工作,因为他没有任何具体可证明的游戏开发经验,因为军事模拟的工作是无法展示的。

但他的志向和抱负始终没有改变,因为集成 Twitch 和 Discord 说明了他合作开发游戏的愿望,比如使用 Twitch 命令将救援箱放在游戏中以便玩家看到。但 Raissi 没有生在数百名开发人员都可以通过 YouTube 提升技能的互联网时代。

Raissi 评价这一视频平台说:“上面只有一堆并无多达作用的视频,没有多少在线资源帮助提升技能。父母以前也无法联网,我是在上高中后才能拨号上网。因此上完大学后就没再学习。我尝试过通过书本学习,但总是连第一章都看不完!”

防止特性蠕变和与 Steam、Humble Bundle 等合作伙伴接洽也为这个一人运营的工作室施加了很大的时间压力。他坦然地说:“我做不了那些年轻小伙子能做的事情 — 我不是说成为在线多玩家和使用蛮力。而且我喜欢问问题。如果我对某件事情不太了解,我一点也不介意。英特尔拥有出色的设备而且一直着眼于提高游戏性能,但作为一款 2D 游戏,没有什么可以搞砸的,对吧?”

谈及 Steam 针对独立公司改变商业模式(他对此保持谨慎态度)以及可能改变游戏效果的新技术时,他说:“项目开始后发生了很多事情。”对于热情十足的 Raissi 来说这只是个开始,“这款游戏是我进入游戏行业的垫脚石”,不论挣钱与否,这都是一次充满各种奇遇的创业之旅。

谁会对此生气呢?

解析京东大数据下高效图像特征提取方案

本文主要分享英特尔和京东在基于Spark*和BigDL*的深度学习技术在搭建大规模图片特征提取框架上的实战经验。

背景

图像特征提取被广泛地应用于相似图片检索,去重等。在使用BigDL1框架(下文即将提到)之前,我们尝试过在多机多GPU卡、GPU集群上分别开发并部署特征抽取应用。但以上框架均存在比较明显的缺点:

  • 在GPU集群中,以GPU卡为单位的资源分配策略非常复杂,资源分配容易出问题,如剩余显存不够而导致OOM和应用崩溃。
  • 在单机情况下,相对集群方式,需要开发者手动做数据分片、负载和容错。
  • GPU模式的应用以Caffe*为例有很多依赖,包括CUDA*等等,增加了部署和维护的难度,如碰到不同操作系统版本和GCC版本有问题时,都需要重新编译打包。

以上问题使得基于GPU的前向程序从架构上面临诸多技术应用挑战。

再来看看场景本身。因为很多图片的背景复杂,主体物体占比通常较小,所以为了减少背景对特征提取准确性的干扰,需要将主体从图片中分离出来。自然地,图片特征提取的框架分为两步,先用目标检测算法检测出目标,然后用特征提取算法提取目标特征。在这里,我们采用SSD*2 (Single shot multibox detector) 进行目标检测,并用DeepBit*3网络进行特征提取。

京东内部有海量的(数亿张以上)商品图片存在于主流的分布式的开源数据库里。因此如何高效地在大规模分布式环境下进行数据检索和处理,是图片特征提取流水线一个很关键的问题。现有的基于GPU的方案在解决上述场景的需求中面临着另外一些挑战:

  • 数据下载耗费很长的时间,基于GPU的方案不能很好地对其进行优化。
  • 针对分布式的开源数据库中的图片数据,GPU方案的前期数据处理过程很复杂,没有一个成熟的软件框架用于资源管理,分布式数据处理和容错性管理等。
  • 因为GPU软件和硬件框架的限制,扩展GPU方案去处理大规模图片有很大的挑战性。

BigDL* 集成方案

在生产环境中,利用现有的软件和硬件设施,将大幅提高生产效率(如减少新产品的研发时间),同时降低成本。基于在这个案例中,数据存储在大数据集群中主流的分布式开源数据库上,如果深度学习应用能利用已有的大数据集群(如Hadoop*或Spark集群)进行计算,便可非常容易地解决上述的挑战。

Intel开源的BigDL1项目, 是在Spark上的一个分布式深度学习框架,提供了全面的深度学习算法支持。BigDL借助Spark平台的分布式扩展性,可以方便地扩展到上百或上千个节点。同时BigDL利用了Intel® MKL 数学计算库以及并行计算等技术,在Intel® Xeon® 服务器上可以达到很高的性能(计算能力可取得媲美主流GPU的性能)。

在我们的场景中,BigDL为支持各种模型(检测,分类)进行定制开发;模型从原来只适用于特定 环境移植到了支持通用模型(Caffe, Torch*, TensorFlow*)BigDL大数据环境 ;整个pipeline全流程获得了优化提速。

通过BigDL在spark环境进行特征提取的流水线如图片 1所示 :

  1. 使用Spark从分布式开源数据库中读入上亿张原始图片,构建成RDD
  2. 使用Spark预处理图片,包括调整大小,减去均值,将数据组成Batch
  3. 使用BigDL加载SSD模型,通过Spark对图片进行大规模、分布式的目标检测,得到一系列的检测坐标和对应的分数
  4. 保留分数最高的检测结果作为主题目标,并根据检测坐标对原始图片进行裁剪得到目标图片
  5. 对目标图片RDD进行预处理,包括调整大小,组成Batch
  6. 使用BigDL加载DeepBit模型,通过Spark对检测到的目标图片进行分布式特征提取,得到对应的特征
  7. 将检测结果(提取的目标特征RDD)存储在HDFS上

Image may be NSFW.
Clik here to view.

图片 1:基于BigDL的图像特征提取流水线

整个数据分析流水线,包括数据读取,数据分区,预处理,预测和结果的存储,都能很方便地通过BigDL在Spark中实现。在现有的大数据集群(Hadoop/Spark)上,用户不需要修改任何集群配置,即可使用BigDL运行深度学习应用。并且,BigDL利用Spark平台的高扩展性,可以很容易地扩展到大量的节点和任务上,因此极大地加快数据分析流程。

除了分布式深度学习的支持,BigDL也提供了很多易用的工具,如图片预处理库,模型加载工具(包括加载第三方深度学习框架的模型)等,更方便用户搭建整个流水线。

图片预处理

BigDL提供了基于OpenCV*5的图像预处理库4, 支持各种常见的图像转换和图像增强的功能,用户可以很容易地使用这些基本功能搭建图像预处理的流水线。此外,用户也可以调用该库所提供的OpenCV操作自定义图像转换的功能。

val preProcessor =
   BytesToMat() ->
   Resize(300, 300) ->
   MatToFloats(meanRGB = Some(123, 117, 104)) ->
   RoiImageToBatch(10)

val transformed = preProcessor(dataRdd)

这个样例的预处理流水线将一个原始RDD通过一系列的转换,转成一个Batch的RDD。其中,ByteToMat把Byte图片转换成OpenCV的Mat存储格式,Resize将图片的调整为300x300的大小,MatToFloats将Mat里的像素存成Float数组的格式,并减去对应通道的均值。最后,RoiImageToBatch把数据组成Batch,作为模型的输入,用于预测或训练。

加载模型

用户可以方便地使用BigDL加载预训练好的模型,在Spark程序中直接使用。给定BigDL模型文件,即可调用Module.load得到模型。

val model = Module.load[Float](bigdlModelPath)

另外,BigDL也支持第三方深度学习框架模型的导入,如Caffe,Torch,TensorFlow。

Image may be NSFW.
Clik here to view.

用户可以很方便地加载已经训练好的模型,用于数据预测,特征提取,模型微调等。以Caffe为例,Caffe的模型由两个文件组成,模型prototxt定义文件和模型参数文件。如下所示,用户可以很容易地将预训练好的Caffe模型加载到Spark和BigDL程序中。

val model = Module.loadCaffeModel(caffeDefPath, caffeModelPath)

性能

我们对基于Caffe的GPU集群解决方案和基于BigDL的Xeon集群解决方案进行了性能基准测试,测试均运行在京东的内部集群环境里。

测试标准

端到端的图片处理和分析流水线,包括:

  1. 从分布式的开源数据库中读取图片(从图片源下载图片到内存)
  2. 输入到目标检测模型和特征提取模型进行特征抽取
  3. 将结果(图片路径和特征)保存到文件系统

注:下载因素成为端到端总体吞吐率的重要影响因素,在这个案例里面,这部分耗时占处理总耗时(下载+检测+特征)约一半。GPU服务器对下载这部分的处理是无法利用GPU加速的。

测试环境

  • GPU: NVIDIA Tesla K40,20张卡并发执行
  • CPU: Intel® Xeon® CPU E5-2650 v4 @ 2.20GHz,共1200个逻辑核 (每台服务器有24个物理核,启用英特尔®超线程技术,配置成YARN的50个逻辑核)

测试结果

图片 2显示了Caffe*在20个K40并发处理图片的吞吐量约为540图片/秒,而BigDL在1200个逻辑核的YARN(Xeon)集群上对应的吞吐量约为2070图片/秒。BigDL在Xeon集群上吞吐量上约是GPU集群的3.83倍,极大地缩短了大规模图片的处理时间。

测试结果表明,BigDL在大规模图片特征提取应用中提供了更好的支持。BigDL的高扩展性,高性能和易用性,帮助京东更轻松地应对海量,爆炸式增长的图片规模。基于这样的测试结果,京东正在将基于GPU集群的Caffe图片特征提取实现,升级为基于Xeon集群的BigDL方案部署到Spark集群生产环境中。

Image may be NSFW.
Clik here to view.

图片 2:比较 K40和Xeon在图片特征提取流水线的吞吐量

结论

BigDL的高扩展性,高性能和易用性,帮助京东6更容易地使用深度学习技术处理海量图片。京东会继续将BigDL应用到更广泛的深度学习应用中,如分布式模型训练等。

引用

  1. BigDL, https://github.com/intel-analytics/BigDL
  2. Liu, Wei, et al., SSD: Single Shot MultiBox Detector, European conference on computer vision. Springer, Cham, 2016.
  3. Lin, Kevin, et al., Learning compact binary descriptors with unsupervised deep neural networks, Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, 2016.
  4. Vision: Image Augmentation, https://github.com/intel-analytics/analytics-zoo/tree/master/transform/vision
  5. Open Source Computer Vision Library, http://opencv.org/
  6. Same article (Chinese) published by JD.com
Viewing all 583 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>