如何在后台部署深度学习模型

如何在后台部署深度学习模型,第1张

搭建深度学习后台服务器

我们的Keras深度学习REST API将能够批量处理图像,扩展到多台机器(包括多台web服务器和Redis实例),并在负载均衡器之后进行循环调度。

为此,我们将使用:

KerasRedis(内存数据结构存储)

Flask (Python的微web框架)

消息队列和消息代理编程范例

本篇文章的整体思路如下:

我们将首先简要讨论Redis数据存储,以及如何使用它促进消息队列和消息代理。然后,我们将通过安装所需的Python包来配置Python开发环境,以构建我们的Keras深度学习REST API。一旦配置了开发环境,就可以使用Flask web框架实现实际的Keras深度学习REST API。在实现之后,我们将启动Redis和Flask服务器,然后使用cURL和Python向我们的深度学习API端点提交推理请求。最后,我们将以对构建自己的深度学习REST API时应该牢记的注意事项的简短讨论结束。

第一部分:简要介绍Redis如何作为REST API消息代理/消息队列

1:Redis可以用作我们深度学习REST API的消息代理/消息队列

Redis是内存中的数据存储。它不同于简单的键/值存储(比如memcached),因为它可以存储实际的数据结构。今天我们将使用Redis作为消息代理/消息队列。这包括:

在我们的机器上运行Redis

将数据(图像)按照队列的方式用Redis存储,并依次由我们的REST API处理

为新批输入图像循环访问Redis

对图像进行分类并将结果返回给客户端

文章中对Redis官网有一个超链接(>

第二部分:安装和配置Redis

官网做法,linux系统的安装:

自己的安装方法:

conda install redis

开启方式相同:

resdis-server

结果:

测试和原文的命令一致。


第三部分:配置Python开发环境以构建Keras REST API

文章中说需要创建新的虚拟环境来防止影响系统级别的python项目(但是我没有创建),但是还是需要安装rest api所需要依赖的包。以下为所需要的包。


第四部分:实现可扩展的Keras REST API

首先是Keras Redis Flask REST API数据流程图

让我们开始构建我们的服务器脚本。为了方便起见,我在一个文件中实现了服务器,但是它可以按照您认为合适的方式模块化。为了获得最好的结果和避免复制/粘贴错误,我建议您使用本文的“下载”部分来获取相关的脚本和图像。

为了简单起见,我们将在ImageNet数据集上使用ResNet预训练。我将指出在哪里可以用你自己的模型交换ResNet。flask模块包含flask库(用于构建web API)。redis模块将使我们能够与redis数据存储接口。从这里开始,让我们初始化将在run_keras_serverpy中使用的常量


我们将向服务器传递float32图像,尺寸为224 x 224,包含3个通道。我们的服务器可以处理一个BATCH_SIZE = 32。如果您的生产系统上有GPU(s),那么您需要调优BATCH_SIZE以获得最佳性能。我发现将SERVER_SLEEP和CLIENT_SLEEP设置为025秒(服务器和客户端在再次轮询Redis之前分别暂停的时间)在大多数系统上都可以很好地工作。如果您正在构建一个生产系统,那么一定要调整这些常量。

让我们启动我们的Flask app和Redis服务器:


在这里你可以看到启动Flask是多么容易。在运行这个服务器脚本之前,我假设Redis服务器正在运行(之前的redis-server)。我们的Python脚本连接到本地主机6379端口(Redis的默认主机和端口值)上的Redis存储。不要忘记将全局Keras模型初始化为None。接下来我们来处理图像的序列化:


Redis将充当服务器上的临时数据存储。图像将通过诸如cURL、Python脚本甚至是移动应用程序等各种方法进入服务器,而且,图像只能每隔一段时间(几个小时或几天)或者以很高的速率(每秒几次)进入服务器。我们需要把图像放在某个地方,因为它们在被处理前排队。我们的Redis存储将作为临时存储。

为了将图像存储在Redis中,需要对它们进行序列化。由于图像只是数字数组,我们可以使用base64编码来序列化图像。使用base64编码还有一个额外的好处,即允许我们使用JSON存储图像的附加属性。

base64_encode_image函数处理序列化。类似地,在通过模型传递图像之前,我们需要反序列化图像。这由base64_decode_image函数处理。

预处理


我已经定义了一个prepare_image函数,它使用Keras中的ResNet50实现对输入图像进行预处理,以便进行分类。在使用您自己的模型时,我建议修改此函数,以执行所需的预处理、缩放或规范化。

从那里我们将定义我们的分类方法


classify_process函数将在它自己的线程中启动,我们将在下面的__main__中看到这一点。该函数将从Redis服务器轮询图像批次,对图像进行分类,并将结果返回给客户端。

在model = ResNet50(weights="imagenet")这一行中,我将这个 *** 作与终端打印消息连接起来——根据Keras模型的大小,加载是即时的,或者需要几秒钟。

加载模型只在启动这个线程时发生一次——如果每次我们想要处理一个映像时都必须加载模型,那么速度会非常慢,而且由于内存耗尽可能导致服务器崩溃。

加载模型后,这个线程将不断轮询新的图像,然后将它们分类(注意这部分代码应该时尚一部分的继续)


在这里,我们首先使用Redis数据库的lrange函数从队列(第79行)中获取最多的BATCH_SIZE图像。

从那里我们初始化imageIDs和批处理(第80和81行),并开始在第84行开始循环队列。

在循环中,我们首先解码对象并将其反序列化为一个NumPy数组image(第86-88行)。

接下来,在第90-96行中,我们将向批处理添加图像(或者如果批处理当前为None,我们将该批处理设置为当前图像)。

我们还将图像的id附加到imageIDs(第99行)。

让我们完成循环和函数

在这个代码块中,我们检查批处理中是否有图像(第102行)。如果我们有一批图像,我们通过模型(第105行)对整个批进行预测。从那里,我们循环一个图像和相应的预测结果(110-122行)。这些行向输出列表追加标签和概率,然后使用imageID将输出存储在Redis数据库中(第116-122行)。

我们使用第125行上的ltrim从队列中删除了刚刚分类的图像集。最后,我们将睡眠设置为SERVER_SLEEP时间并等待下一批图像进行分类。下面我们来处理/predict我们的REST API端点


稍后您将看到,当我们发布到REST API时,我们将使用/predict端点。当然,我们的服务器可能有多个端点。我们使用@app。路由修饰符以第130行所示的格式在函数上方定义端点,以便Flask知道调用什么函数。我们可以很容易地得到另一个使用AlexNet而不是ResNet的端点,我们可以用类似的方式定义具有关联函数的端点。你懂的,但就我们今天的目的而言,我们只有一个端点叫做/predict。

我们在第131行定义的predict方法将处理对服务器的POST请求。这个函数的目标是构建JSON数据,并将其发送回客户机。如果POST数据包含图像(第137和138行),我们将图像转换为PIL/Pillow格式,并对其进行预处理(第141-143行)。

在开发这个脚本时,我花了大量时间调试我的序列化和反序列化函数,结果发现我需要第147行将数组转换为C-contiguous排序(您可以在这里了解更多)。老实说,这是一个相当大的麻烦事,但我希望它能帮助你站起来,快速跑。

如果您想知道在第99行中提到的id,那么实际上是使用uuid(通用唯一标识符)在第151行生成的。我们使用UUID来防止hash/key冲突。

接下来,我们将图像的id和base64编码附加到d字典中。使用rpush(第153行)将这个JSON数据推送到Redis db非常简单。

让我们轮询服务器以返回预测

我们将持续循环,直到模型服务器返回输出预测。我们开始一个无限循环,试图得到157-159条预测线。从这里,如果输出包含预测,我们将对结果进行反序列化,并将结果添加到将返回给客户机的数据中。我们还从db中删除了结果(因为我们已经从数据库中提取了结果,不再需要将它们存储在数据库中),并跳出了循环(第163-172行)。

否则,我们没有任何预测,我们需要睡觉,继续投票(第176行)。如果我们到达第179行,我们已经成功地得到了我们的预测。在本例中,我们向客户机数据添加True的成功值(第179行)。注意:对于这个示例脚本,我没有在上面的循环中添加超时逻辑,这在理想情况下会为数据添加一个False的成功值。我将由您来处理和实现。最后我们称烧瓶。jsonify对数据,并将其返回给客户端(第182行)。这就完成了我们的预测函数。

为了演示我们的Keras REST API,我们需要一个__main__函数来实际启动服务器

第186-196行定义了__main__函数,它将启动classify_process线程(第190-192行)并运行Flask应用程序(第196行)。

第五部分:启动可伸缩的Keras REST API

要测试我们的Keras深度学习REST API,请确保使用本文的“下载”部分下载源代码示例图像。从这里,让我们启动Redis服务器,如果它还没有运行:

redis-server

然后,在另一个终端中,让我们启动REST API Flask服务器:

python run_keras_serverpy

另外,我建议在向服务器提交请求之前,等待您的模型完全加载到内存中。现在我们可以继续使用cURL和Python测试服务器。

第七部分:使用cURL访问Keras REST API

使用cURL来测试我们的Keras REST API服务器。这是我的家庭小猎犬Jemma。根据我们的ResNet模型,她被归类为一只拥有946%自信的小猎犬。

curl -X POST -F image=@jemmapng ''

你会在你的终端收到JSON格式的预测:

{"predictions": [{"label": "beagle","probability": 09461546540260315},{"label": "bluetick","probability": 0031958919018507004},{"label": "redbone","probability": 0006617196369916201},{"label": "Walker_hound","probability": 00033879687543958426},{"label": "Greater_Swiss_Mountain_dog","probability": 00025766862090677023}],"success": true}

第六部分:使用Python向Keras REST API提交请求

如您所见,使用cURL验证非常简单。现在,让我们构建一个Python脚本,该脚本将发布图像并以编程方式解析返回的JSON。

让我们回顾一下simple_requestpy

# import the necessary packagesimport requests# initialize the Keras REST API endpoint URL along with the input# image pathKERAS_REST_API_URL = ""

我们在这个脚本中使用Python请求来处理向服务器提交数据。我们的服务器运行在本地主机上,可以通过端口5000访问端点/predict,这是KERAS_REST_API_URL变量(第6行)指定的。

我们还定义了IMAGE_PATH(第7行)。png与我们的脚本在同一个目录中。如果您想测试其他图像,请确保指定到您的输入图像的完整路径。

让我们加载图像并发送到服务器:

# load the input image and construct the payload for the requestimage = open(IMAGE_PATH, "rb")read()payload = {"image": image}# submit the requestr = requestspost(KERAS_REST_API_URL, files=payload)json()# ensure the request was sucessfulif r["success"]: # loop over the predictions and display them for (i, result) in enumerate(r["predictions"]): print("{} {}: {:4f}"format(i + 1, result["label"], result["probability"]))# otherwise, the request failedelse: print("Request failed")

我们在第10行以二进制模式读取图像并将其放入有效负载字典。负载通过请求发送到服务器。在第14行发布。如果我们得到一个成功消息,我们可以循环预测并将它们打印到终端。我使这个脚本很简单,但是如果你想变得更有趣,你也可以使用OpenCV在图像上绘制最高的预测文本。

第七部分:运行简单的请求脚本

编写脚本很容易。打开终端并执行以下命令(当然,前提是我们的Flask服务器和Redis服务器都在运行)。

python simple_requestpy

使用Python以编程方式使用我们的Keras深度学习REST API的结果

第八部分:扩展深度学习REST API时的注意事项

如果您预期在深度学习REST API上有较长一段时间的高负载,那么您可能需要考虑一种负载平衡算法,例如循环调度,以帮助在多个GPU机器和Redis服务器之间平均分配请求。

记住,Redis是内存中的数据存储,所以我们只能在队列中存储可用内存中的尽可能多的图像。

使用float32数据类型的单个224 x 224 x 3图像将消耗602112字节的内存。

TrendForce于“2022年集邦拓墣 科技 产业大预测”研讨会中,针对2022年 科技 产业发展做出预测如下:

一、电信商着眼6G技术

5G具有超快传输速率和低时延特性,使智慧城市、虚拟实境、扩增实境之沉浸式协作体验、自动驾驶车应用成为可能。2022年将有更多透过沙箱建置,开发人员于其中创建新体验案例,且可用于“智慧医疗、工厂自动化、扩增实境”等,如5G具备实时性连线功能,可使得装配保持稳定连线状态,其中5G低延迟更助于“触觉应用程序”较灵敏,可有效改善模拟触觉方式,应用则扩及至机器人手术、远端医疗、视讯 游戏 等。另一方面,随着5G、低轨道卫星持续朝向商业化发展,卫星可与5G并存且补足5G基地台于艰困环境不易布建的痛点。

电信营运商在面临数字化转型压力下,如何结合5G和以网络为中心的商业模式为发展关键。展望2022年电信营运商着眼6G技术,将有更多国家政府、大厂投入,包括美国、中国、欧盟、韩国与日本等,透过公私单位合作研究6G标准。6G强调多元化XR装置整合,包括VR、AR、MR、8K和更多影像,使用全像投影(Holography)交流将变得更真实,远端工作、控制、医学、教育得以推广,覆盖范围甚至扩展到天空、海洋和太空等地。

二、2022年晶圆代工12吋产能年增约14%

由5G领头带动的半导体需求自2019下半年逐渐发酵,加上日益紧张的地缘政治因素,延伸至2020年新冠疫情,除了加速全球数位元转型需求,疫情更驱动了恐慌性备货,为半导体供需带来结构性的改变,造成晶圆代工产能严重供不应求情况延烧将近两年仍未停歇。有鉴于此,各大晶圆代工厂先后在2021年宣布扩产或新建晶圆厂,以满足来自消费性电子产品如智能型手机、电视、笔电、 游戏 主机等需求,亦或是中长期 科技 发展所带动的如服务器、云端、物联网、电动车/自动驾驶、5G基地台等各项需求。TrendForce预估,2022年全球晶圆代工8吋年均产能将新增约6%,12吋将年增约14%;其中,12吋新增产能逾半为现今最为短缺的成熟制程(1Xnm及以上),预期现阶段极其紧张的芯片缺货潮可因此稍获喘息。

三、2022年智能型手机产量可望回升

预期新冠肺炎疫情影响趋缓的前提下,2022年智能型手机可望恢复至2019年的水平,预估全年将有139亿支的生产表现,同比增长约35%。规格创新方面,摺叠机的市占比重持续提升,但由于缺乏杀手级应用推升其市占,成长速度缓慢;其余规格则着重既有功能最佳化,创新幅度不高。5G议题上,受惠中国政府积极推动5G商转,并带动2021年全球市占快速爬升至37%,如今该市场覆盖率已达八成,其驱动力也随之放缓,尔后将伴随全球5G基地台覆盖率稳定向上提升,预估2022年5G手机渗透率将有机会达47%。整体而言,2022年智能型手机市场发展的观察重点仍以疫情变化为主,另一方面,明年晶圆代工的产能供给仍相当紧缺,对于零组件的资源取得,以及手机的造价成本也是一大观察重点。

四、2022年物联网三大主战场

乘着5G与半导体的产业热潮,2022年物联网近200亿台的连接设备将续以人工智能为基础,并取关键性(Critical)与永续性(Sustainability)为贯穿来年物联网产业的两大发展支柱,进而带出三个技术主战场,包括诉求环境永续、脱碳生产的绿色物联网,着眼无远弗届、万物相连的太空物联网,以及聚焦数据演算、镜射现实的元宇宙物联网。各技术可望成为产业大厂跨域布局的滩头堡,以及物联网产品服务的设计主轴。延伸此基础至终端应用面,2022年物联网将以更为稳定、实时、节能且预测之效益,赋能多元垂直领域;而市场主流的物联网应用中,预期将以智慧城市的环境监控与防疫管理、智慧家庭的居家安全与沉浸 娱乐 、智慧制造的虚实整合与数位模拟,以及智慧医疗的远程服务与精准医学为四大核心领域,协助企业于后疫情时代转型再进化。

五、2022年服务器出货量将成长4~5%

近年因5G商转与智慧终端装置的普及,使得大部分应用服务皆藉由云、端、网来进行统合,尤其需倚赖庞大数据进行运算与训练的应用服务;伴随着虚拟化平台及云储存技术发展,促使服务器需求与日俱增。因此,TrendForce预估,2021年及2022年服务器出货均可达4~5%成长。2021年服务器供应链仍持续受疫情影响,提前备货需求明显,促使各级零组件采购动能较疫情发生之初更为强劲,此状况不仅反映于今年上旬server DRAM的采购订单上,也加速DRAM 价格演进周期的循环。除此之外,由于疫情带动工作模式与生活型态的改变,包括远距办公与教学、云端应用服务(SaaS)需求扩张、企业在基础架构的支出上选择更为d性的模式(IaaS、PaaS)等云端题材仍持续发酵,也推升整体服务器需求扩张。其中,今年多数企业对于基础架构的采购行为逐渐从以往高投入门槛的资本支出,移转为更为灵活d性的营运费用,故除既有服务器采购订单外,也加速转移至云端(Cloud Digital Transformation),因此直至今年第三季前,以Dell、HPE为首的企业服务器供应商为满足相关需求,也开始调整生产计划与出货安排。

六、电动车迈入高速发展期

全球在脱碳声浪不断升高下,各国持续以法规和政策影响该国车辆电动化的速度,并且试图将电动车产业链本土化,积极争取企业设厂。整个产业正为市场主流转为电动车而做准备,随着车款与销量持续上升,车厂面临多项转型所需的策略规划,加上芯片缺货风波未平、疫情干扰供应链稳定性,使得“确保供应、d性管理”极为重要,2022年将持续就半导体、电池与闭回路生态链三大关键领域进行布局。而在自动驾驶方面,伴随着芯片运算力、传感器性能双双提高,以及5G覆盖率增加和法规放行下,Level 3~Level 4的自动驾驶将在商用车与乘用车上落实,自驾商用车扩大商用服务、乘用车则搭载自动驾驶技术的功能,其中ODD (operation design domain)的设计为重要的自驾商用条件,“有条件的自动驾驶功能”成为产业与 社会 共识。

七、大尺寸面板供需比开始趋于宽松

疫情爆发下所带起的面板热潮逐渐消退,2021年下半年起,面板产业进入了新的转折。零组件供给上已不再是全面性的缺货,只有特定关键零组件仍有缺货风险。但需求面上,伴随着需求退烧,过去一年超额备货,以及物流不顺而衍生的后遗症正逐一浮现,市场势必需要一段不短的时间消化。然而,在韩厂延后退出TFT-LCD市场的时间,同时数家面板厂再次启动新一轮的扩产计划,这都让市场供需正逐渐往宽松方向发展,2021年大尺寸面板供需比为54%,预期2022年供需比将达73%,可以想见面板价格将在会一段时间内呈现疲软态势,能否再创反d契机,则将考验着众家面板厂在稼动率、产品组合,以及获利水平之间如何调节。

手机市场中,AMOLED面板技术逐渐成熟,逐步扩大市场规模,渗透率预计将从2021年的42%提升至2022年的47%,也进一步压缩LTPS LCD在手机市场的发展,趋使面板厂积极将LTPS LCD产能转往中尺寸应用。但AMOLED面板的产出仍有可能受制于目前供给仍偏紧俏的OLED DDI,让2022年AMOLED面板与LTPS LCD面板在手机市场的消长仍有些许悬念。

八、品牌掀起Micro & Mini LED显示器产业升级新纪元

2022年将是Mini LED与Micro LED在新型显示器上逐渐商品化增量的一年,品牌已摆脱以往处于观望的方式,转而以务实的方式,将Micro LED与Mini LED规划在自身品牌的新产品里面,以率先布局,优先抢占Micro 与Mini LED的供应链中技术与供货量的主导权,同时在价格上能有高度的制价能力。就如苹果与三星在2021年,即分别推出Mini LED背光应用在平板与电视的光源上,也都各自优先掌握Mini LED背光打件的关键技术,采用具有高度技术含量的COB (Chip On Board)方案,作为Mini LED背光,使得Mini LED在背光排列的间距更小,Mini LED在背板上的分布密度将大幅提升,并搭配更细密的驱动方式,实现高背光分区,以符合百万等级的高对比效果,拉开与传统LED的对比效果的差距,直接对标OLED的高对比效果,提升了产品亮点,也促进了产业升级的机会。不仅如此,三星除了在新型显示器上除了采用Mini LED作为背光源之外,也跨足LED芯片更小的Micro LED,应用在自发光的大型显示器上,将创造下一波新型显示器产业升级的风潮。

九、增强现实、虚拟现实装置合计出货将达1,202万台

随着元宇宙等议题发酵再次带动增强现实、虚拟现实的热度,再加上疫情促使数位转型也拉升AR、VR在远端互动应用的普及度,将促使更多厂商和产品跨入该领域,预估增强现实、虚拟现实装置的合计出货量将会在2022年达到1,202万台。在追求更为真实的第二个虚拟世界之下,除了增强现实/虚拟现实头戴装置本身硬件规格的发展外,亦会延伸至手部肢体的追踪感测、控制器或穿戴装置上的触觉反馈、甚至是耳机上的声学功能。而除了商业应用外,独立虚拟现实装置搭配更多相机模块在内的传感器设计,将会成为消费市场更常见的选择,若再搭配更为成熟的5G网络环境,虚拟社群及多人互动等应用会是2022年厂商投入的关键。

2022年,全球数据中心建设热潮或将进一步升级,据头部厂商工业富联预测,在元宇宙概念持续走热以及云网端融合需求增加、端边云协作型态普及等助推下,整个服务器产业都将在2022年持续成长。据市场人士预测,该公司云计算相关产品在2022年第一季的出货量将取得双位数成长。

近年来,工业富联的数据中心业务持续畅旺,在该公司日前举行的年度会议上,CEO郑弘孟曾表示,截至2021年底,工业富联企业服务器全球市占率超过35%,云服务商服务器占超过30%,两项均处于世界领先的地位。

元宇宙概念的持续火热被视为推动数据中心需求剧增的重要原因,然而在工业富联首席技术官暨云企业解决方案事业群总经理周泰裕看来,除了元宇宙之外,云网端融合需求增加、边缘运算应用成形、端边云协作型态的普及、自动驾驶等新应用崛起,都不仅会维持,更提高了今后一段时间内,市场/客户对数据中心、服务器等产品的需求。

根据Synergy Research Group日前公布的数据分析,全球超大型数据中心目前已经超过700座,近4年来数量成长一倍;同时据统计,2021年全球前七大的云端服务供应商(CSP)的资本支出,平均年增173%。而根据DIGITIMES Research调查,2021年全球服务器出货年成长约45%。随着云端需求续强,再加上新处理器的问世,2022年全球服务器出货量可望再成长68%。

周泰裕表示,不论是远程化还是无人化应用,在疫后都将会是市场主流趋势,这些对大数据及人工智慧有相当需求的应用,将同时推升对高效运算及数据中心的需求,“此外,由于通过边缘数据中心能更贴近使用者与数据产生源,提供低延迟、在地运算与即时反馈等服务,这种由云端应用市场而衍生的边缘运算架构的相关需求及市场在近两年也陆续浮现。”

周泰裕认为,由于集中式的云服务,无法满足使用者对低延迟的需求,进而促使端、边、云的数据撷取、传输、运算的新架构逐渐成形。

“就像是自动驾驶等新应用的崛起,”周泰裕表示,大量业者投入自动驾驶技术的发展,从先进驾驶辅助系统(ADAS)层面,逐步往完全无人的自动驾驶方向发展,但除了载具本身的平台发展外,更需要的是载具(端)、路侧(边)及后台(云)三方之间无逢接轨的协作模式,才能完美的达到无人驾驶的境界,而这其中就包含了各类数据中心的协同应用。

同样的,元宇宙这个包含了云 游戏 、沉浸式虚拟工作与社交平台、NFT区块链交易平台并与现实紧密连结的虚拟世界,也同样可以视为是另一种会带动对大量各类数据中心需求的端边云协作生态系统下的新应用。

周泰裕强调,无论是端边云的基础建设架构,还是元宇宙、自动驾驶等领域,工业富联在技术发展及产品导入速度上,都与全球主要客户间有着密切的合作。不仅能随着市场趋势、客户需求而稳定成长,更能借由集团平台化的发展方针,从市场上寻求更多可能的机会。

本文源自挖贝网


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13440204.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-06
下一篇 2023-08-06

发表评论

登录后才能评论

评论列表(0条)

保存