机器学习(ML)和深度学习(DL)涉及计算和数据密集型任务。 为了最大程度地提高模型精度,我们想训练更大的数据集,评估各种算法,并为每种算法尝试不同的参数(超参数调整)。

随着数据集和模型复杂性的增长,等待工作完成所需的时间也会增加,从而导致效率低下。 结果,我们运行的迭代次数和测试次数减少了,或者最终处理了较小的数据集。

NVIDIA GPU是加速我们的数据科学工作的绝佳工具。 在深度学习工作负载方面,它们是显而易见的选择,并且比CPU提供更好的ROI。 借助RAPIDS等新开发技术,NVIDIA可以有效地应对数据分析和机器学习工作负载(例如XGBoost)(请参阅我之前的文章:Extreme Performance中的Python Pandas)。 例如,一项读取Json数据,汇总其指标并写回压缩(Parquet)文件的分析任务在GPU上运行1.4秒,而在CPU上运行43.4秒(快30倍!)。

挑战:共享GPU

CPU具有长期受支持的技术,例如虚拟化(管理程序),虚拟内存和IO管理。 我们可以在同一CPU上运行许多不同的工作负载,虚拟机和容器,同时确保最大程度的隔离。 我们可以使用多种集群技术来跨多个CPU和系统扩展计算,并使用调度程序将计算动态分配给任务。

另一方面,必须将GPU分配给特定的VM或容器。 这导致效率低下。 当GPU密集型任务完成时,GPU将保持空闲状态。 例如,如果我们将笔记本服务器与GPU关联,则每当任务未运行时(例如,在编写或调试代码时或午餐时),我们就会浪费GPU资源。 这是一个问题,尤其是当配备GPU的服务器更昂贵时。

存在一些将单个GPU划分为较小的虚拟GPU的解决方案,但这不能解决问题,因为我们得到的(大部分是空闲的)片段太小或内存太少而无法执行我们的任务,并且考虑到很难 在同一GPU上的任务之间隔离内存,我们可能会遇到许多潜在的故障。

解决方案:动态GPU分配和横向扩展

用户正在寻找的解决方案是可以利用多个GPU来完成一项任务(这样可以更快地完成),并仅在任务期间分配GPU。 通过将容器与业务流程,集群和共享数据层结合起来,可以实现这一点。

假设我们在Jupyter笔记本或IDE中编写了一些代码(例如PyCharm)。 我们可以在本地执行它,但是当我们需要扩展时,我们打开一个旋钮,它在分布式集群上的运行速度将提高10-100倍。 那不是很好吗? 我们可以实现这样的梦想吗? 是的,我们可以,我将在本文中进一步向您展示一个演示。

为此,我们需要能够在运行时将代码和库打包并克隆到多个动态调度的容器中。 我们需要所有这些容器共享相同的数据并实现任务分配/并行机制,如下图所示。

> Dynamic GPU/CPU Allocation (image by author)

MLRun建立在Kubernetes和KubeFlow之上,它使用Kubernetes API创建和管理资源。 它利用KubeFlow自定义资源(CRD)来无缝运行水平扩展工作负载(例如Nuclio函数,Spark,Dask,Horovod…),KubeFlow SDK来将任务附加到诸如存储卷和密钥之类的资源,以及KubeFlow管道来创建多步执行 图(DAG)。

MLRun服务控制器跟踪通过MLRun执行的每个本地或远程任务,所有输入,输出,日志和工件都存储在版本数据库中,并且可以使用简单的UI,SDK或REST API调用进行浏览,即 内置的作业和工件管理。 MLRun函数可以链接形成一个管道,它们支持超参数和AutoML任务,Git集成,项目打包,但是这些是不同文章的主题,请在此处内容。

> GPU-as-a-Service Stack (image by author)

示例:使用Keras和TensorFlow进行分布式图像分类

在我们的示例中,我们有一个基于著名的Cats and Dogs TensorFlow用例的4步流水线:

· 数据提取功能-从AWS S3加载图像档案

· 数据标记功能-将图像标记为狗或猫

· 分布式训练功能-将TensorFlow / Keras与Horovod一起使用来训练我们的模型

· 部署交互式模型服务功能

我们的代码可以在本地运行(请参阅笔记本的第1和第2步),要在具有GPU的集群上运行分布式培训,我们只需将函数定义为MPIJob类型(一种使用MPI和Horovod分布TensorFlow逻辑的函数), 我们指定一个代码链接,一个容器映像(或者MLRun可以为我们构建映像),所需的容器数量,GPU数量(每个容器),并将其附加到文件挂载(我们应用iguazio低延迟) v3io结构安装,但其他K8s共享文件卷驱动程序或对象存储解决方案也可以正常运行)。

mprun = trainer.run(name='train', params=params, artifact_path='/User/mlrun/data', inputs=inputs, watch=True)

请注意,在此示例中,我们不需要移动代码或数据,事实上,我们在笔记本和工作容器中使用了相同的低延迟共享文件系统挂载,这意味着我们可以在Jupyter中修改代码并重新运行 我们的工作(所有工作容器将看到新的Py文件更改),所有工作结果将在Jupyter文件浏览器或MLRun UI中立即查看。

除了以交互方式查看作业进度(watch = True)之外,运行对象(mprun)还会保存运行中的所有信息,包括指向输出工件,日志,状态等的指针。我们可以使用MLRun基于Web的UI来跟踪我们的 工作进度,比较实验结果或访问版本控制的工件。

我们使用" .save()"将功能对象序列化并版本化到数据库中,稍后我们可以在其他笔记本或CI / CD管道中检索此功能对象(无需在笔记本和团队之间复制代码和配置)。

如果我们想将生成的模型部署为交互式无服务器功能,我们所需要做的就是将"模型"和" category_map"输出提供给"服务"函数并将其部署到我们的测试集群中。

MLRun编排了自动缩放的Nuclio函数,这些函数是超快速的并且可以是有状态的(支持GPU附件,共享文件挂载,状态缓存,流式传输等),这些函数将自动缩放以适应工作量,并且在请求时缩放为零 几分钟不会到达(消耗零资源)。 在此示例中,我们使用" nuclio-serving"功能(托管标准KFServing模型类的Nuclio功能),如下所示,只需一个命令(部署)即可使其作为实时无服务器功能运行。

现在我们有了一个运行中的推断功能,我们可以使用简单的HTTP请求(在负载中甚至包含url或什至是二进制图像)来测试端点。

使用KubeFlow管道进行端到端工作流

既然我们已经手动测试了流水线的每个步骤,我们可能希望使流程自动化并可能按给定的时间表运行,或者被事件触发(例如Git推送)。 下一步是定义KubeFlow管道图(DAG),该图将这4个步骤链接到一个序列中并运行该图。

可以使用简单方法(.as_step())将MLRun函数转换为KubeFlow管道步骤,并指定如何将步骤输出馈送到其他步骤输入,请在此处查看完整的笔记本示例,以下代码演示了图DSL。

MLRun项目可以具有多个工作流程,并且可以使用单个命令启动它们,也可以通过各种事件(例如Git push或HTTP REST调用)来触发。

一旦我们运行了管道,我们就可以使用KubeFlow跟踪其进度,MLRun将自动在KubeFlow UI中注册指标,输入,输出和工件,而无需编写任何额外的代码行(我想您应该首先尝试不使用MLRun来欣赏它,it )。

> KubeFlow Output (image by author)

有关更基本的项目示例,您可以查看MLRun Iris XGBoost项目,其他示例可以在MLRun演示存储库中找到,您可以查看MLRun自述文件和示例以获取教程和简单示例。

摘要

本文演示了如何有效地使用计算资源来大规模地运行数据科学工作,但更重要的是,我演示了如何简化和自动化数据科学开发,从而实现更高的生产率和更快的上市时间。 如果您还有其他问题,请在KubeFlow Slack上给我打电话。

亚龙

(本文翻译自yaron haviv的文章《GPU-as-a-Service on KubeFlow: Fast, Scalable and Efficient ML》,参考:https://towardsdatascience.com/gpu-as-a-service-on-kubeflow-fast-scalable-and-efficient-ml-c5783b95d192)

系统gpu 调试_KubeFlow上的GPU即服务:快速,可扩展且高效的ML相关推荐

  1. 在Linux系统(服务器)使用阿里云盘服务快速上传下载文件

    使用集群服务器的时候,尤其是当服务器有多个节点时有些复杂,连接集群我们一般用xshell,传输文件我们一般使用Xftp,一般对于单个节点服务器来说是方便的,使用Xftp还可以可视化本地和服务器端的文件 ...

  2. 服务器开启防火墙后无法登录系统,客户端连不上,服务器防火墙服务启动不了...

    关闭软件时,如果自动备份后,备份完成了,他就会提示这个. 关闭软件时,如果自动备份后,备份完成了,他就会提示这个. 备份好账套数据之后,卸载软件 点击电脑左下角"开始"-" ...

  3. java毕业设计小区生活服务平台的设计与实现Mybatis+系统+数据库+调试部署

    java毕业设计小区生活服务平台的设计与实现Mybatis+系统+数据库+调试部署 java毕业设计小区生活服务平台的设计与实现Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S ...

  4. java毕业设计独龙族民族特色服务网站Mybatis+系统+数据库+调试部署

    java毕业设计独龙族民族特色服务网站Mybatis+系统+数据库+调试部署 java毕业设计独龙族民族特色服务网站Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开发语 ...

  5. java毕业设计宠物用品商城服务系统Mybatis+系统+数据库+调试部署

    java毕业设计宠物用品商城服务系统Mybatis+系统+数据库+调试部署 java毕业设计宠物用品商城服务系统Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开发语言: ...

  6. 【调试】——idea远程调试服务器上的代码

    前提 有些时候难免会出现一些线上问题,可能就需要远程调试服务器上的代码,依次快速定位错误代码,进行改正.小编最近通过idea进行了远程代码调试,特此记录一下,希望可以帮需要的朋友. 步骤 1.保证本机 ...

  7. Mint系统使用介绍,Mint系统安装,在Mint系统上搭建GPU环境,在Mint系统上安装Pycharm、Anaconda等软件,在Mint系统上安装cuda和cudnn

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 原创文章,转载告知,盗版必究 Mint系统使用介绍,Mint系统安装,在Mint系统上搭建GPU环境,在Mint系统上安装Pycharm.Anacon ...

  8. activeperl安装不成功_手把手教你:Windows系统上安装GPU深度学习环境

    前言 在入手学习深度学习的过程当中,有好几个朋友都咨询过我如何安装深度学习环境,之前写过一篇在Ubuntu环境下安装深度学习环境,但是有部分朋友在Windows电脑上安装深度学习环境遇到过许多的问题, ...

  9. android 系统gpu 调试_基于Android系统的GPU动态调频方案 | Imagination中文技术社区

    针对移动终端上GPU的高功耗问题,提出一种基于Android系统的GPU动态调频方案.方案根据各种应用对GPU的性能需求,引入了GPU的频率一性能模型,包括选择工作频率和测量相对性能的方法.动态调频算 ...

最新文章

  1. 美国两政府网站被挂马 以性丑闻女星为诱饵
  2. OpenGL vs D3D
  3. 无法连接本地计算机,xp系统电脑本地连接连不上如何解决
  4. 关于nginx为站点绑定域名以及绑定多个域名
  5. java -锁(公平、非公平锁、可重入锁【递归锁】、自旋锁)
  6. full outer join 与full join的区别_sleep、yield、join都是干啥的? sleep与wait有啥区别?中篇[十五]...
  7. 森林结点数,边数与树个数的关系
  8. python3 zip()函数笔记
  9. 拓端tecdat|R语言对股票风险“溃疡指数”( Ulcer Index)曲面图可视化
  10. VisualTreeHelper不仅仅只是用来查看可视化树结构的
  11. Auslogics Registry Cleaner v9.2.0.0 注册表清理优化工具
  12. oracle导出建表语句sql语句,关于导出oracle多个表的建表语句DLL,生成.sql语句。...
  13. 将论文奇数页与偶数页页眉添加不同的下划线
  14. 为啥yum源repolist为0?自己经常出错和常用的解决办法
  15. Windows 7 通用 CDC 串口驱动程序
  16. 逆向教程-U3D游戏逆向分析(伊甸逆向分析)
  17. 浅谈设计模式(一)策略模式
  18. 什么是CMOS与BIOS?又有什么区别?
  19. 中国省市区县行政编码sql脚本
  20. android 应用未验证,解决微信分享显示“未验证应用”问题。

热门文章

  1. mouseleave mouseout时候悬浮框不应该消失的时候消失了 css 解决办法
  2. 半夜闲的真是蛋疼。。。决定写个小博文
  3. RadonDB - 部署教程
  4. Java异常处理: 缺包 ClassNotFound javax/xml/bind/JAXBException
  5. 容器编排技术 -- Kubernetes 在 Namespace 中配置默认的CPU请求与限额
  6. 分布式事务 - 如何解决分布式事务问题?
  7. 3、MapReduce详解与源码分析
  8. SynchronizationContext(同步上下文)综述
  9. js 数字序号 转 字母序号
  10. C#LeetCode刷题-字典树