淘姐妹

淘姐妹

塔罗斯法则星星关卡 塔罗斯的法则全关卡攻略

手机 0

淘宝搜:【天降红包222】领超级红包,京东搜:【天降红包222】
淘宝互助,淘宝双11微信互助群关注公众号 【淘姐妹】

塔罗斯法则星星位置,塔罗斯法则星星关卡,塔罗斯法则星星有什么用,塔罗斯法则星星关钟表

2525年人类在丰饶星与星盟开战,致远星是地球的门户,是UNSC司令部,2552年沦陷,地球已岌岌可危。2160-2200:早期冲突这一时期的人类历史充斥着太阳系中各大和派别之间的一系列血腥冲突。具有重大历史意义的冲突包括:木卫战役(Jo【【微信】】)、雨林争霸(The Rain Forest Wars)和一系列的火星遭遇战。随着地球上人口过剩和政局动荡的愈演愈烈,许多新的运动兴起了。这一时期最值得注意的异端运动是“科思洛维克”("Koslovics")和 “福里登”("Frieden")运动。“科思洛维克”是指新共产主义者的强权领袖福拉德米亚・科思洛夫(【【微信】】)的拥护者,他们致力于回到共产主义的光荣岁月,要消灭公司和资本家的流毒,特别是要肃清近地轨道和地外殖民地。“福里登”运动是法西斯主义的复兴,该运动起源于反“科思洛维克”情绪,扎根木星殖民地为据点(很大程度上受到了统一德意志企业的支持,这些企业常常成为科思洛维克“工人起义”的对象)。“福里登”的字面意思是“和平”――这就是说,他们相信只有消灭了“人类的暴君”(oppressors on Terra Firma),才可能达成和平。9.2 2160 三月-六月:木卫战役开始木星分裂主义者袭击了位于木卫一爱莪(Io)的联合国殖民地总署(United Nations Colonial Advisors),导致了地球军与木星“福里登”部队之间展开了长达三个月的激战。虽然这并非我们太阳系中的第一起武装冲突,但此役成了最为血腥的战斗之一,也被普遍认为是引发接下来的摩擦和军国主义大潮的导火索。木卫战役也升级了地球各国间的紧张关系――许多国家在太阳系中都建立了殖民地,开始为各自在地外的利益而开战。殖民地战争的持续,使得地球上的紧张关系一触即发,引发了地球本土的数起武装冲突。9.3 2162:雨林争霸武装冲突横扫南美大陆,科思洛维克、福里登和联合国军之间因为不同的意识形态而开战。而这又加剧了地外冲突。9.4 2163 十二月:在火星的战斗地球三股主要派别将雨林争霸中燃起的战火烧到了火星上。一系列在火星Argyre Planitia附近对科思洛维克军的闪电战,是第一次非地军队的部署。战斗取得了决定性胜利。作为结果,后来的军事指导战略,惯用大编制的地面部队突袭配合舰船登陆行动。9.5 2164:星际大战联合国军开始形成大规模集结的格局,终于迎来了第一次真正的星际大战。继火星的军队部署告捷后,大规模的征兵行动和宣传策略极大地鼓舞了UNSC (United Nations Space Command,联合国太空司令部)军队的士气。联合国军挫败了地球上的科思洛维克和福里登军队,接着开始系统地专注于驱逐其在太阳系内其他行星上建立起来的残存。在这些局部战争后,福里登和科思洛维克军队被庞大、统一而强大的联合国军悉数剿灭。9.6 2170:膨胀2160年代的战乱促使人们建立了统一的地球。现在,胜利者必须处理不太引人注目却同样严重的威胁:人口过剩和无仗可打的庞大军队。战后的岁月里,大量人口急剧膨胀;雨林争霸遗留的资源破坏和饥荒更是雪上加霜,世界经济岌岌可危。9.7 2291:超越光速一支由研究人员、物理学家和数学家组成的团队正在秘密研发“肖恩・藤川”超光速引擎(Shaw-Fujikawa Translight Engine,SFTE),一种驱动太空船穿越辽远星际的特殊手段。这种新型引擎允许飞船钻入“跃迁空间”("the Slipstream"或"Slipspace",又称为“迁跃断层空间”)。“断层”一个变通的物理法则下的空间,允许超光速旅行而避免相对论的副作用。超光速旅行并不是瞬间完成的;“短程”的跳跃一般要花两个月,而“长程”的跳跃则能持续六个月甚至更久。SFTE能生成一个共振场,当与迁跃空间的物理特性结合时,就能大大缩短跨越星际的时间;然而,科学家们也注意到在迁跃空间内部会有暂时的涌流这一奇怪的“变数”。尽管人类科学家都无法确定为何星际旅行所需的时间不是一个常量,但有理论指出在迁跃空间内部存在“漩涡”或“涌动” ――正是这造成了星际旅行所需的时间会有百分之五到十的出入。这一暂时的不一致性使军事战术家和战略家颇为恼火――这会妨碍许多协同作战的进行。9.8 2310:初潮地球向公众公布了一系列殖民船中的第一艘――应征者相当踊跃。地球上的状况因为人口过剩而不断恶化,搭乘飞船去外星殖民自然成了诱人的选择。每艘殖民船都配备了军队人员和护卫舰,这样有助于更好地利用现有的庞大舰队。在异端武装瓦解后,军队正消耗着庞大的军费和物资。因为超光速旅行在此阶段还十分新鲜而又昂贵,殖民地居民和军队人员都要通过生理和心理的严格测试。原则上,只有最优秀的公民和士兵才能获准去“邻近”的世界殖民。这就是近地殖民地(Inner Colonies)的诞生。9.10 2362:远征号远征号(【【微信】】)于2362年1月1日发射。作为浩浩荡荡的殖民舰队的领头舰船,远征号满载着部队和地貌改造装置,殖民的矛头直指新世界。人类超越太阳系的边界向外扩展的初潮由此拉开帷幕。9.11 2390:近地殖民地到了2390年,近地殖民地的殖民化运动正如火如荼。总计有210个人类占据的世界在进行不同程度的地貌改造,而在人类掌控的太空里,人口负担得到了巨大的缓解。9.12 2490:远地殖民地的诞生扩张仍在马不停蹄地进行,到2490年已经有800多个人类世界遍布银河系猎户座星臂了(这些世界形形色色,既有高度开化的星际要塞,也有偏僻的小定居点)。随着向外扩张的继续,近地殖民地成了和经济重镇,虽然他们极其仰赖远地殖民地提供的原材料。在这一时期,致远星(planet Reach,围绕波江座第五恒星(Epsilon Eridani)运转,正当地球的咽喉要道)成为了UNSC的主要舰船制造厂和训练营地。致远星是战舰和殖民船的主要制造地,也是训练秘密特工和特种部队的所在地。9.13 2525:星盟战争开始2525年4月20日,与远地殖民地丰饶星(Harvest)的联络中断了。在试图重新建立联络的努力失败后,殖民军总参谋部 (the Colonial Military Administration,CMA)派遣了一艘侦查舰,金羊毛号(【【微信】】)前去调查。可是金羊毛号一到达丰饶星系,与飞船的联络也突然中断了。CMA火速派遣了一支三艘战舰组成的战列舰队前往丰饶星。只有战列舰队领航的旗舰大力神号(【【微信】】)返回了致远星,战痕累累,伤亡惨重。战舰的指挥官报告说,出现了一艘配备了强大武器的外星战舰,已经践踏了丰饶星,血洗了殖民地(很可能也已摧毁了金羊毛号)。战列编队很快遭遇了外星战舰,并被紧密跟踪。在两艘战舰被击毁后,大力神号迅速跳出了星系,但因为受损严重,几周之后大力神号才回到了致远星。地球军立即提升了警报级别,开始积极准备收复丰饶星的作战计划。当年12月,由普雷斯顿・科尔(Preston Cole)中将率领的地球军舰队浩浩荡荡地出发了,如此快地派出如此庞大的远征军,在人类历史上实数罕见。9.14 2525:丰饶星战役科尔率领的舰队誓报殖民星沦陷之仇,在与外星战舰的遭遇战中告捷――尽管胜利的代价是损失了科尔军三分之二的有生力量。扭转战局的,只是科尔在最后几分钟,战术上的灵光乍现罢了。军队回师地球之后,晋升为上将的科尔才获悉:许多外围殖民地已经沦陷,无人生还。科尔开始排兵布阵,准备对入侵者展开截击。地面战和舰船战相当惨烈,战火绵延到了整个远地殖民地。在一次地面遭遇中,人类部队俘虏了一个外星入侵者。在负伤过重死亡之前,人类得知这些外星人自称为“星盟” (the Covenant)。远地殖民地大屠杀在接下来的几年中,科尔部遭到了重创,他个人出色的领导力和战略才华也无济于事。这完全是一场实力悬殊的较量,星盟在舰船战中的胜率甚至接近四比一。到了2535年11月,事实上所有的远地殖民地都已经惨遭星盟屠戮。“科尔协议”(Cole Protocol)作为军事命令确立了如下原则:所有的地球舰船必须确保星盟军不会发现地球。当地球舰船被迫撤退时,必须远离环地航线,甚至不做计算就进行超时空跳跃也在所不惜。如果存在被星盟俘虏的危险,连“盲跳”都不可行时,船长必须下令船只自毁。此外,强大的舰船人工智能(AI)核心数据也切不可落入敌军之手。所以,科尔条款的部分内容也指出:在紧急状态下,必须转移或销毁舰船人工智能。9.15 2536-2552:近地殖民地之围星盟的铁蹄已经踏入近地殖民地。多年来的战事渐成定局:人类只是以极其高昂的代价赢得局部战斗的胜利,尤其是在地面行动中。而在太空对战中,人类的失利猝不及防,殖民地就这样接二连三地沦陷了。9.16 2552:致远星的沦陷星盟军终于到达了致远星――这个离地球最近的重大军事要塞覆灭了。秋之柱号(【【微信】】)巡洋舰,载着最后一个斯巴达 (SPARTAN)战士士官长逃出生天,幸免于难。所谓“斯巴达战士”指的是超级特种兵的一种精英作战单位,装备了令人望而生畏的雷神锤装甲。他们是人造的终极兵种。现在,仅存一个斯巴达战士能与敌对决了。秋之柱号的舰长雅各布・凯斯(Jacob Keyes)为了遵守“科尔条款”下令进行目的地未知的长程跳跃,希冀着能让星盟追兵始终远离地球。引擎熄火后,秋之柱号发现自己落入了一个辽远未知的星系。星系中也有一支星盟舰队,他们附近有一个行星般大小的环状结构――“光晕”。9.17 2552-2553:地球战役解决了“光晕”的问题之后,秋之柱号一小部分幸存者和致远星上的部分幸存者合流,经过一系列艰辛的征战回到了地球。然而,此时星盟舰队也大举入侵。人类不得不为自己最后一个故乡而战。 由于星盟内精英和鬼面兽的对抗导致了星盟的分裂,以神风烈士提尔・外达密和星盟舰队指挥官瓦图米为首的精英起义舰队于2552年底和以真相先知、鬼面兽首领塔塔罗斯为首的先知鬼面兽舰队作战。而此时先知已经在地球上找到了通往“方舟”的传送门,精英与人类组成同盟,向神秘的“方舟”进发。9.18 2553:方舟战役,战争结束士官长等人在方舟阻止了真相先知毁灭世界的阴谋,同时为了对付另一个威胁,他们摧毁了方舟。然而回到地球后,大家翘首期盼的士官长却没能够回来。大家怀着悲痛的心情悼念战争中牺牲的战士,而在纪念碑的一角不知是谁刻上了士官长的编号“117”三个数字

既然能跑甜甜圈了,说明显卡本身没有问题。如果有问题,那么高负载下根本不能运行20分钟。另外,N760 HAWK这款显卡最高功耗是200W,因为频率能到1250MHZ。必须要确保你的电源12V输出起码有25A,因为CPU也需要12V供电。

游戏排行:《英雄联盟》、《守望先锋》、《魔兽世界》。

1、《英雄联盟》

《英雄联盟》(简称LOL)是由美国拳头游戏(Riot Games)开发、中国大陆地区腾讯游戏代理运营的英雄对战MOBA竞技网游。2011年9月22日,英雄联盟国服正式公测,在那个混沌的年代里,几乎没什么人看好这款来自于北美的游戏,和其他MOBA游戏完全不同的“卡通风”。时光荏苒,一晃八年时间过去了,英雄联盟在无数人的惊叹声中成为了电子竞技的代言人,而英雄联盟的玩家数量也出现了许多次的“井喷”。

2、《守望先锋》

《守望先锋》作为一款将重点放在上手度和乐趣方面的第一人称射击游戏,是暴雪标志性的“易于上手、难于精通”的完美体现。玩家将在游戏中控制各自的英雄及其不同的能力,在6v6的团队竞赛中,在未来地球各个不同地点相互角逐,这些场景包括被全息影像照亮的伦敦街头和高科技埃及金字塔下阴暗的集市等等。每个场景都独具特色,从拥挤的街道再到空旷的屋顶,每一位英雄的能力都可以在这里发挥出最大的潜力。

3、《魔兽世界》

《魔兽世界》(World of Warcraft)是由著名游戏公司暴雪娱乐所制作的第一款网络游戏,属于大型多人在线角色扮演游戏。游戏以该公司出品的即时战略游戏《魔兽争霸》的剧情为历史背景,依托魔兽争霸的历史事件和英雄人物,魔兽世界有着完整的历史背景时间线。玩家在魔兽世界中冒险、完成任务、新的历险、探索未知的世界、征服怪物等。

以上这几个游戏都是非常受玩家欢迎的游戏。

I also teach out at the community college in Henderson

圆不了,因为这部电影大胆的完全摒弃了原来附加在蜘蛛侠上的悲情过往,转而成为了一个小蜘蛛侠希望得到钢铁侠认可,是一个行侠仗义,充满朝气的青春故事,没有了蜘蛛侠,电影就没有了灵魂。

上古卷轴5,刺客信条:奥德赛,GTA5,鬼泣5,主要看你喜欢什么类型的游戏。


基于web端和C++的两种深度学习模型部署方式

基于web是什么,基于web的设计与并实现,基于webgl,基于web的app
  • 深度学习Author:louwillMachine Learning Lab 本文对深度学习两种模型部署方式进行总结和梳理。一种是基于web服务端的模型部署,一种是基...

    深度学习

    Author:louwill

    Machine Learning Lab

    ? ? ?

    ? ? ? 本文对深度学习两种模型部署方式进行总结和梳理。一种是基于web服务端的模型部署,一种是基于C++软件集成的方式进行部署。

    ? ? ? 基于web服务端的模型部署,主要是通过REST API的形式来提供接口方便调用。而基于C++的深度学习模型部署,主要是通过深度学习框架的C++前端版本,将模型集成到软件服务中。

    ? ? ? 本文分别对上述两种模型部署方式进行流程梳理,并分别举例进行说明。

    1. 基于web端的模型部署

    1.1 web服务与技术框架

    ? ? ?下面以ResNet50预训练模型为例,旨在展示一个轻量级的深度学习模型部署,写一个较为简单的图像分类的REST API。主要技术框架为Keras+Flask+Redis。其中Keras作为模型框架、Flask作为后端Web框架、Redis则是方便以键值形式存储图像的数据库。各主要package版本:

    先简单说一下Web服务,一个Web应用的本质无非就是客户端发送一个HTTP请求,然后服务器收到请求后生成一个HTML文档作为响应返回给客户端的过程。在部署深度学习模型时,大多时候我们不需要搞一个前端页面出来,一般是以REST API的形式提供给开发调用。那么什么是API呢?很简单,如果一个URL返回的不是HTML,而是机器能直接解析的数据,这样的一个URL就可以看作是一个API。

    先开启Redis服务:

    1.2 服务配置

    定义一些配置参数:

    ? ? ?指定输入图像大小、类型、batch_size大小以及Redis图像队列名称。

    然后创建Flask对象实例,建立Redis数据库连接:

    因为图像数据作为numpy数组不能直接存储到Redis中,所以图像存入到数据库之前需要将其序列化编码,从数据库取出时再将其反序列化解码即可。分别定义编码和解码函数:

    另外待预测图像还需要进行简单的预处理,定义预处理函数如下:

    1.3 预测接口定义

    准备工作完毕之后,接下来就是主要的两大部分:模型预测部分和app后端响应部分。先定义模型预测函数如下:

    然后定义app服务:

    Flask使用Python装饰器在内部自动将请求的URL和目标函数关联了起来,这样方便我们快速搭建一个Web服务。

    1.4 接口测试

    服务搭建好了之后我们可以用一张图片来测试一下效果:

    模型端的返回:

    预测结果返回:

    最后我们可以给搭建好的服务进行一个压力测试,看看服务的并发等性能如何,定义一个压测文件stress_test.py 如下:

    测试效果如下:

    2. 基于C++的模型部署

    2.1 引言

    PyTorch作为一款端到端的深度学习框架,在1.0版本之后已具备较好的生产环境部署条件。除了在web端撰写REST API进行部署之外(参考),软件端的部署也有广泛需求。尤其是最近发布的1.5版本,提供了更为稳定的C++前端API。

    工业界与学术界最大的区别在于工业界的模型需要落地部署,学界更多的是关心模型的精度要求,而不太在意模型的部署性能。一般来说,我们用深度学习框架训练出一个模型之后,使用Python就足以实现一个简单的推理演示了。但在生产环境下,Python的可移植性和速度性能远不如C++。所以对于深度学习算法工程师而言,Python通常用来做idea的快速实现以及模型训练,而用C++作为模型的生产工具。目前PyTorch能够完美的将二者结合在一起。实现PyTorch模型部署的核心技术组件就是TorchScript和libtorch。

    所以基于PyTorch的深度学习算法工程化流程大体如下图所示:

    2.2 TorchScript

    TorchScript可以视为PyTorch模型的一种中间表示,TorchScript表示的PyTorch模型可以直接在C++中进行读取。PyTorch在1.0版本之后都可以使用TorchScript的方式来构建序列化的模型。TorchScript提供了Tracing和Script两种应用方式。

    Tracing应用示例如下:

    在这段代码中,我们先是定义了一个简单模型并创建模型实例,然后给定输入示例,Tracing方法最关键的一步在于使用torch.jit.trace方法对模型进行TorchScript转化。我们可以获得转化后的traced_model对象获得其计算图属性和代码属性。计算图属性:

    代码属性:

    这样我们就可以将整个模型都保存到硬盘上了,并且经过这种方式保存下来的模型可以加载到其他其他语言环境中。

    TorchScript的另一种实现方式是Script的方式,可以算是对Tracing方式的一种补充。当模型代码中含有if或者for-loop等控制流程序时,使用Tracing方式是无效的,这时候可以采用Script方式来进行实现TorchScript。实现方法跟Tracing差异不大,关键在于把jit.tracing换成jit.script方法,示例如下。

    除了Tracing和Script之外,我们也可以混合使用这两种方式,这里不做详述。总之,TorchScript为我们提供了一种表示形式,可以对代码进行编译器优化以提供更有效的执行。

    2.3 libtorch

    在Python环境下对训练好的模型进行转换之后,我们需要C++环境下的PyTorch来读取模型并进行编译部署。这种C++环境下的PyTorch就是libtorch。因为libtorch通常用来作为PyTorch模型的C++接口,libtorch也称之为PyTorch的C++前端。

    我们可以直接从PyTorch官网下载已经编译好的libtorch安装包,当然也可以下载源码自行进行编译。这里需要注意的是,安装的libtorch版本要与Python环境下的PyTorch版本一致。

    安装好libtorch后可简单测试下是否正常。比如我们用TorchScript转换一个预训练模型,示例如下:

    输出为:

    然后切换到C++环境,编写CmakeLists文件如下:

    继续编写test.cpp代码如下:

    编译test.cpp并执行,输出如下。对比Python环境下的的运行结果,可以发现基本是一致的,这也说明当前环境下libtorch安装没有问题。

    2.4 完整部署流程

    通过前面对TorchScript和libtorch的描述,其实我们已经基本将PyTorch的C++部署已经基本讲到了,这里我们再来完整的理一下整个流程。基于C++的PyTorch模型部署流程如下。

    第一步:

    通过torch.jit.trace方法将PyTorch模型转换为TorchScript,示例如下:

    第二步:

    将TorchScript序列化为.pt模型文件。

    第三步:

    在C++中导入序列化之后的TorchScript模型,为此我们需要分别编写包含调用程序的cpp文件、配置和编译用的CMakeLists.txt文件。CMakeLists.txt文件示例内容如下:

    包含模型调用程序的example-app.cpp示例编码如下:

    两个文件编写完成之后便可对其执行编译:

    第四步:

    给example-app.cpp添加模型推理代码并执行:

    以上便是C++中部署PyTorch模型的全过程,相关教程可参考PyTorch官方:

    【【网址】】/tutorials/

    总结

    ? ? ?模型部署对于算法工程师而言非常重要,关系到你的工作能否产生实际价值。相应的也需要大家具备足够的工程能力,比如MySQL、Redis、C++、前端和后端的一些知识和开发技术,需要各位算法工程师都能够基本了解和能够使用。

    ?

    收起?

    展开全文?

    ?python?java?深度学习?人工智能?tensorflow

  • 2020-05-06 11:38:46

    如果说前几年深度学习主题追求的是越来越深的模型及越来越准的方法,那么最近两年关注的点是模型的轻量化及部署,这是一个比较大而且比较复杂的话题。即训练好的模型怎样部署在实际的项目中,也就是我们常说的train...

    转载自【【网址】】/supersayajin/p/11445401.html

    如果说前几年深度学习主题追求的是越来越深的模型及越来越准的方法,那么最近两年关注的点是模型的轻量化及部署,这是一个比较大而且比较复杂的话题。即训练好的模型怎样部署在实际的项目中,也就是我们常说的train和inference(或者forward,test,deploy)主要关注以下几点:

    (1) 场景和平台选择,是移动端还是服务器端的,CPU还是GPU的,速度和准确率要求等等。有的时候像TensorFlow、PyTorch、MXNet等框架不太适合直接拿来部署,即使用这些框架部署也要结合硬件平台手动做一些配置上的加速,比如【【微信】】可以用MKL或者SSE、AVX等SIMD指令集加速等等。

    (2) 移动端有很多大厂的forward框架比如主流的NCNN,上半年阿里开源的MNN,以及比较低调的armNN等等,目前看NCNN用的最多,MNN很有潜力,移动端的GPU支持貌似不是很好,N【【微信】】的话主流还是他们自家的TensorRT加速。训练好的模型部署到移动端需要做模型转换,要注意有些框架只支持几个大厂的格式,比如TensorFlow,PyTorch、Caffe、onnx等,话说这里的onnx貌似发展的并不怎么样,感觉caffe本身反而是最时候做中间转换的桥梁,哈哈。。比如MXNet->Caffe->MNN;另外诸多框架的op也尚未完全统一,很多需要自己自定义op实现,还有的方法是做截断,也就是拿支持的那部分网络的op做转换,先计算得到这部分的结果,后接自己实现的剩余部分。

    (3) 用TVM做编译优化,这个看起来比较有意思,很可能是深度学习部署优化的方向之一,针对不同框架、不同语言的前端(目前使用relay)生成中间层IR,然后针对不同的硬件平台做针对性的优化工作。优化的内容包括内存分配、算子融合、GEMM优化等等。之前试过mobilefacenet的TVM版本,差不多能加速30%左右,14ms->9.5ms还是非常给力的,但是目前看默认的优化选项并不是最优的,比如我也试过mxnet gluoncv中的模型还不如不用TVM来得快,更多的时候需要用tvm中【【微信】】方法搜索一个最优的配置,这个过程比较耗时,一个模型可能需要几个小时来实验。

    (4) 手动写forward方法,如果做到完全脱离第三方库,需要自己手写forward方法,基本思路还是im2col+GEMM等等,做好内存分配,数据对齐重排,使用指定架构的寄存器提高访存效率、提高cache命中率等等,模型压缩和优化的坑太深,这里不多说了。。。。

    收起?

    展开全文?
  • 2020-08-22 00:33:43

    深度学习Author:louwillMachine Learning Lab 本文对深度学习两种模型部署方式进行总结和梳理。一种是基于web服务端的模型部署,一种是基...

    深度学习

    Author:louwill

    Machine Learning Lab

    ? ? ?

    ? ? ? 本文对深度学习两种模型部署方式进行总结和梳理。一种是基于web服务端的模型部署,一种是基于C++软件集成的方式进行部署。

    ? ? ? 基于web服务端的模型部署,主要是通过REST API的形式来提供接口方便调用。而基于C++的深度学习模型部署,主要是通过深度学习框架的C++前端版本,将模型集成到软件服务中。

    ? ? ? 本文分别对上述两种模型部署方式进行流程梳理,并分别举例进行说明。

    1. 基于web端的模型部署

    1.1 web服务与技术框架

    ? ? ?下面以ResNet50预训练模型为例,旨在展示一个轻量级的深度学习模型部署,写一个较为简单的图像分类的REST API。主要技术框架为Keras+Flask+Redis。其中Keras作为模型框架、Flask作为后端Web框架、Redis则是方便以键值形式存储图像的数据库。各主要package版本:

    先简单说一下Web服务,一个Web应用的本质无非就是客户端发送一个HTTP请求,然后服务器收到请求后生成一个HTML文档作为响应返回给客户端的过程。在部署深度学习模型时,大多时候我们不需要搞一个前端页面出来,一般是以REST API的形式提供给开发调用。那么什么是API呢?很简单,如果一个URL返回的不是HTML,而是机器能直接解析的数据,这样的一个URL就可以看作是一个API。

    先开启Redis服务:

    1.2 服务配置

    定义一些配置参数:

    ? ? ?指定输入图像大小、类型、batch_size大小以及Redis图像队列名称。

    然后创建Flask对象实例,建立Redis数据库连接:

    因为图像数据作为numpy数组不能直接存储到Redis中,所以图像存入到数据库之前需要将其序列化编码,从数据库取出时再将其反序列化解码即可。分别定义编码和解码函数:

    另外待预测图像还需要进行简单的预处理,定义预处理函数如下:

    1.3 预测接口定义

    准备工作完毕之后,接下来就是主要的两大部分:模型预测部分和app后端响应部分。先定义模型预测函数如下:

    然后定义app服务:

    Flask使用Python装饰器在内部自动将请求的URL和目标函数关联了起来,这样方便我们快速搭建一个Web服务。

    1.4 接口测试

    服务搭建好了之后我们可以用一张图片来测试一下效果:

    模型端的返回:

    预测结果返回:

    最后我们可以给搭建好的服务进行一个压力测试,看看服务的并发等性能如何,定义一个压测文件stress_test.py 如下:

    测试效果如下:

    2. 基于C++的模型部署

    2.1 引言

    PyTorch作为一款端到端的深度学习框架,在1.0版本之后已具备较好的生产环境部署条件。除了在web端撰写REST API进行部署之外(参考),软件端的部署也有广泛需求。尤其是最近发布的1.5版本,提供了更为稳定的C++前端API。

    工业界与学术界最大的区别在于工业界的模型需要落地部署,学界更多的是关心模型的精度要求,而不太在意模型的部署性能。一般来说,我们用深度学习框架训练出一个模型之后,使用Python就足以实现一个简单的推理演示了。但在生产环境下,Python的可移植性和速度性能远不如C++。所以对于深度学习算法工程师而言,Python通常用来做idea的快速实现以及模型训练,而用C++作为模型的生产工具。目前PyTorch能够完美的将二者结合在一起。实现PyTorch模型部署的核心技术组件就是TorchScript和libtorch。

    所以基于PyTorch的深度学习算法工程化流程大体如下图所示:

    2.2 TorchScript

    TorchScript可以视为PyTorch模型的一种中间表示,TorchScript表示的PyTorch模型可以直接在C++中进行读取。PyTorch在1.0版本之后都可以使用TorchScript的方式来构建序列化的模型。TorchScript提供了Tracing和Script两种应用方式。

    Tracing应用示例如下:

    在这段代码中,我们先是定义了一个简单模型并创建模型实例,然后给定输入示例,Tracing方法最关键的一步在于使用torch.jit.trace方法对模型进行TorchScript转化。我们可以获得转化后的traced_model对象获得其计算图属性和代码属性。计算图属性:

    代码属性:

    这样我们就可以将整个模型都保存到硬盘上了,并且经过这种方式保存下来的模型可以加载到其他其他语言环境中。

    TorchScript的另一种实现方式是Script的方式,可以算是对Tracing方式的一种补充。当模型代码中含有if或者for-loop等控制流程序时,使用Tracing方式是无效的,这时候可以采用Script方式来进行实现TorchScript。实现方法跟Tracing差异不大,关键在于把jit.tracing换成jit.script方法,示例如下。

    除了Tracing和Script之外,我们也可以混合使用这两种方式,这里不做详述。总之,TorchScript为我们提供了一种表示形式,可以对代码进行编译器优化以提供更有效的执行。

    2.3 libtorch

    在Python环境下对训练好的模型进行转换之后,我们需要C++环境下的PyTorch来读取模型并进行编译部署。这种C++环境下的PyTorch就是libtorch。因为libtorch通常用来作为PyTorch模型的C++接口,libtorch也称之为PyTorch的C++前端。

    我们可以直接从PyTorch官网下载已经编译好的libtorch安装包,当然也可以下载源码自行进行编译。这里需要注意的是,安装的libtorch版本要与Python环境下的PyTorch版本一致。

    安装好libtorch后可简单测试下是否正常。比如我们用TorchScript转换一个预训练模型,示例如下:

    输出为:

    然后切换到C++环境,编写CmakeLists文件如下:

    继续编写test.cpp代码如下:

    编译test.cpp并执行,输出如下。对比Python环境下的的运行结果,可以发现基本是一致的,这也说明当前环境下libtorch安装没有问题。

    2.4 完整部署流程

    通过前面对TorchScript和libtorch的描述,其实我们已经基本将PyTorch的C++部署已经基本讲到了,这里我们再来完整的理一下整个流程。基于C++的PyTorch模型部署流程如下。

    第一步:

    通过torch.jit.trace方法将PyTorch模型转换为TorchScript,示例如下:

    第二步:

    将TorchScript序列化为.pt模型文件。

    第三步:

    在C++中导入序列化之后的TorchScript模型,为此我们需要分别编写包含调用程序的cpp文件、配置和编译用的CMakeLists.txt文件。CMakeLists.txt文件示例内容如下:

    包含模型调用程序的example-app.cpp示例编码如下:

    两个文件编写完成之后便可对其执行编译:

    第四步:

    给example-app.cpp添加模型推理代码并执行:

    以上便是C++中部署PyTorch模型的全过程,相关教程可参考PyTorch官方:

    【【网址】】/tutorials/

    总结

    ? ? ?模型部署对于算法工程师而言非常重要,关系到你的工作能否产生实际价值。相应的也需要大家具备足够的工程能力,比如MySQL、Redis、C++、前端和后端的一些知识和开发技术,需要各位算法工程师都能够基本了解和能够使用。

    收起?

    展开全文?

    ?人工智能?python?深度学习?java?大数据

  • 2019-04-27 14:51:17

    深度学习也成了机器学习领域内的热点,现在人工智能、大数据更是越来越贴近我们的日常生活,越来越多的人工智能应用开始在移植移动端上,那能够快速高效地在移动端部署深度学习模型就变成亟待解决的问题了。...

    自从 AlphaGo 出现以来,机器学习无疑是当今最火热的话题,而深度学习也成了机器学习领域内的热点,现在人工智能、大数据更是越来越贴近我们的日常生活,越来越多的人工智能应用开始在移植到移动端上,那能够快速高效地在移动端部署深度学习模型就变成亟待解决的问题了。

    现阶段 app 上使用的深度学习主要有两种模式:

    首先在移动端做初步预处理,然后把数据传到服务器进行预测后返回移动端。优点:部署相对简单,现成的框架(caffe,theano,mxnet,Torch) 做下封装就可以直接拿来用;使用服务器进行计算,性能强,能够处理比较大的模型缺点:必须使用网络,而且展示效果依赖网速,不适合实时性要求高的应用。

    根据硬件的性能选择模型,在服务器训练得到模型,在手机上进行预测的过程。优点:不需要使用网络,可以保护隐私缺点:计算的性能、耗时等取决于移动端的性能,有些模型只能使用CPU,精度可能会有影响,无法进行类似云端的大规模分布式训练;移动端部署相对较麻烦,需要针对移动端进行优化;大模型耗费大量的资源(计算、内存、存储、电)。

    下面主要介绍offline的部署方法。

    主要分两个阶段,第一个阶段是训练并得到模型,第二个阶段则是在得到模型后,在移动端进行部署。本文主要讲解的为第二阶段。

    在第一阶段训练模型中,已经有很成熟的开源框架和算法进行实现,但是为了能部署到移动端,还需要进行压缩加速。

    目前深度学习在各个领域轻松碾压传统算法,不过真正用到实际项目中却会有很大的问题:

    1. 计算量非常巨大;
    2. 模型占用很高内存;由于移动端系统资源有限,而深度学习模型可能会高达几百M,因此很难将深度学习应用到移动端系统中去。

    综合现有的深度模型压缩方法,它们主要分为四类:

    方法名称描述应用场景方法细节
    参数修剪和共享(parameter pruning and sharing)删除对准确率影响不大的参数卷积层和全连接层对不同设置具有鲁棒性,可以达到较好效果,支持从零训练和预训练
    低秩因子分解(low-rank factorization)使用矩阵对参数进行分解估计卷积层和全连接层标准化的途径,很容易实施,支持从零训练和预训练
    转移/紧凑卷积滤波器(transferred/compact con【【微信】】)设计特别的卷积核来保存参数只有卷积层算法依赖于应用程序,通常可以取得好的表现,只能从零开始训练
    知识蒸馏

    关于本站

    Copyright © 2023 欢迎来到我的小站 备案号:隋唐演义 | 名诗名词 |小学生100分 | 粤ICP备2020117555号 | 京公网安备44011302002786

    联系我们

    合作或咨询可通过如下方式:

    QQ:

    邮箱:

    关注我们

    淘姐妹