云上深度学习实践(二)-云上MXNet实践

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 目录 云上深度学习实践(一)-GPU云服务器TensorFlow单机多卡训练性能实践 云上深度学习实践(二)-云上MXNet实践 1     MXNet 简介   1.1   MXNet特点         MXNet是一个全功能,灵活可编程和高扩展性的深度学习框架。所

目录

云上深度学习实践(一)-GPU云服务器TensorFlow单机多卡训练性能实践

云上深度学习实践(二)-云上MXNet实践

1     MXNet 简介  

1.1   MXNet特点

        MXNet是一个全功能,灵活可编程和高扩展性的深度学习框架。所谓深度学习,顾名思义,就是使用深度神经网络进行的机器学习。神经网络本质上是一门语言,我们通过它可以描述实际的应用问题。比如,使用卷积神经网络(CNN)可以表达空间相关性的问题,使用循环神经网络(RNN)可以表达时间连续性方面的问题。MXNet支持深度学习模型中的最先进技术,当然也包括卷积神经网络(CNN),循环神经网络(RNN)中比较有代表性的长期短期记忆网络(LSTM)。根据问题的复杂性和信息如何从输入到输出一步一步提取,我们通过将不同大小的不同层按照一定的原则连接起来,最终形成完整的深层的神经网络。

        MXNet有三个特点,便携(Portable),高效(Efficient),扩展性(Scalable)。

        首先看第一个特点,便携(Portable)指方便携带,轻便以及可移植。MXNet支持丰富的编程语言,如常用的C++,python,Matlab,Julia,JavaScript,Go等等。同时支持各种各样不同的操作系统版本,MXNet可以实现跨平台的移植,支持的平台包括Linux,Windows,IOS和Android等等。

        第二点,高效(Efficient)指的是MXNet对于资源利用的效率。而资源利用效率中很重要的一点是内存,因为在实际的运算当中,内存通常是一个非常重要的瓶颈,尤其对于GPU,嵌入式设备而言,内存显得更为宝贵。神经网络通常需要大量的临时空间,例如每层的输入,输出变量,每个变量需要独立的内存空间,这会带来高额度的内存开销。如何优化内存开销,对于深度学习框架而言是非常重要的事情。MXNet在这方面做了特别的优化,有数据表明,在运行多达1000层的深层神经网络任务时,MXNet只需要消耗4GB的内存。我们使用Caffe与MXNet做过相同任务的比较之后也验证了MXNet内存消耗小的这项特点。

        第三点,扩展性(Scalable)在深度学习当中一个非常重要的性能指标。更高效的扩展可以让训练新模型的速度得到显著提高,或者在相同的时间内,大幅度提高模型复杂性。扩展性指两方面,首先是单机扩展性,另一个是多机扩展性。MXNet在单机扩展性和多机扩展性方面都有非常优秀的表现。所以扩展性(Scalable)是MXNet最大的一项优势,也是最突出的特点。

 

1.2   MXNet编程模式

        对于一个优秀的深度学习系统,或者一个优秀的科学计算系统,最重要的是如何设计编程接口,它们都采用一个特定领域的语言,并将其嵌入到主语言当中。比如numpy将矩阵运算嵌入到python当中。嵌入一般分为两种,其中一种嵌入较浅,每种语言按照原来的意思去执行,叫命令式编程,比如numpy和Torch都属于浅深入,命令式编程。另一种则是使用更深的嵌入方式,提供了一整套针对具体应用的迷你语言,通常称为声明式编程。用户只需要声明做什么,具体执行交给系统去完成。这类编程模式包括Caffe,Theano和TensorFlow等。

        这两种方式各有利弊:

        目前现有的系统大部分都采用上图所示两种编程模式的一种,两种编程模式也各有优缺点。所以MXNet尝试将两种模式无缝的结合起来。在命令式编程上MXNet提供张量运算,而声明式编程中MXNet支持符号表达式。用户可以自由的混合它们来快速实现自己的想法。例如我们可以用声明式编程来描述神经网络,并利用系统提供的自动求导来训练模型。另一方面,模型的迭代训练和更新模型法则中可能涉及大量的控制逻辑,因此我们可以用命令式编程来实现。同时我们用它来进行方便地调式和与主语言交互数据。

1.3   MXNet架构

        下图是MXNet架构图,从上到下是分别为各种主从语言的嵌入,编程接口(矩阵运算NDArray,符号表达式Symbolic Expression,分布式通讯KVStore),还有两种编程模式的统一系统实现,其中包括依赖引擎,还有用于数据通信的通信接口,以及CPU,GPU等各硬件的支持,还有对Android,IOS等多种操作系统跨平台支持。在三种主要编程接口(矩阵运算NDArray,符号表达式Symbolic Expression,分布式通讯KVStore)中,重点介绍KVStore。

        KVStore是MXNet提供的一个分布式的key-value存储,用来进行数据交换。KVStore的本质上的实现是基于参数服务器。

        1)通过引擎来管理数据一致性,这使得参数服务器的实现变得相当简单,同时使得KVStore的运算可以无缝的与其他部分结合在一起。

        2)使用一个两层的通讯结构,原理如下图所示。第一层的服务器管理单机内部的多个设备之间的通讯。第二层服务器则管理机器之间通过网络的通讯。第一层的服务器在与第二层通讯前可能合并设备之间的数据来降低网络带宽消费。同时考虑到机器内和外通讯带宽和延时的不同性,可以对其使用不同的一致性模型。例如第一层用强的一致性模型,而第二层则使用弱的一致性模型来减少同步开销。在第3节会介绍KVStore对于实际通讯性能的影响。

2     阿里云上部署和运行MXNet

2.1   阿里云提供的弹性GPU服务

        深度学习的发展依赖于三个重要的要素。第一,算法的大幅改进;第二个是大数据的提供;第三个是算力的大幅提升。其中GPU的性能大幅度提升是对算力的巨大贡献。阿里云提供的弹性GPU计算计算服务,提供了丰富的GPU实例、软件(镜像市场)和服务(如容器服务)来给客户。

        1)GPU实例支持M40、P4、P100、V100多种GPU,和丰富的CPU、内存配置,覆盖深度学习训练和推理场景。

        2)镜像市场提供了预装NVIDIA GPU 驱动和CUDA 库的镜像,以及预装开源深度学习框架(包括MXNet)的镜像。同时还支持在购买页选择GPU驱动和CUDA库在实例启动时实现自动安装:参考创建GPU计算型实例

        3)提供容器服务一键部署、运行深度学习任务,提供ROS资源编排服务创建需要的GPU实例资源等等。

        阿里云的容器服务可以提供分布式的运算模型,并且可以利用阿里云丰富的存储资源,如使用高效云盘或者SSD云盘,OSS对象存储,可以使用NAS文件存储来存储用户训练数据。

        阿里云可以基于容器,实现弹性GPU服务一键式部署,包括支持GPU资源调度,挂载共享存储,负载均衡,弹性伸缩,CPU、GPU监控以及丰富的日志管理。

        基于容器的工作方式相对于很多传统的方式有非常多巨大便利。我们需要搭建深度学习环境,对数据做准备,对模型进行开发,然后对开发的模型进行训练和预测。而传统的部署过程全部都需要手动完成,这是极其复杂的过程。利用容器的一键式部署可以极大缩短部署时间。

2.2   使用容器服务部署MXNet

        下面是使用容器服务部署MXNet的过程。首先可以在阿里云控制台上找到容器服务解决方案,如下图所示。在当中选择机器学习,可以看到支持模型开发,模型训练及模型预测。选择创建数据卷,可以选择OSS,NAS云盘等多种不同的存储设备,之后将训练数据放到存储设备上;可以选择模型开发,并且创建一个GPU集群,选择需要的训练框架,GPU数据,数据来源。数据来源可以是主机目录,或者是之前创建的数据源。之后便可以部署MXNet框架任务,部署过程是非常方便的。

        在容器服务解决方案中选择机器学习:

        创建数据源:

        创建模型开发应用:

2.3   基于Docker使用NVIDIA GPU CLOUD部署

        我们还可以使用开源Docker部署NGC(NVIDIA GPU CLOUD)容器镜像。

        NVIDIA GPU CLOUD实际上是一个开放的深度学习的容器镜像的仓库。我们可以通过安装最新的Docker,以及安装nvidia-docker的插件:https://github.com/NVIDIA/nvidia-docker,之后注册NGC,pull最新的MXNet容器镜像。在MXNet容器镜像当中,NVIDIA装了最新的CUDA Driver,最新的深度学习加速库cuDNN,以及多GPU加速库NCCL等。所以我们可以使用已经优化好的整套软件来部署到系统之上。

        另外,阿里云还是中国首家官方支持NGC服务的云厂商,阿里云通过云市场的方式为客户提供了NVIDIA官方的NGC容器镜像服务、在GPU云主机上全面支持Nivida GPU Cloud(NGC)生态系统。详见:在gn5实例上部署NGC环境

2.4   一个简单MXNet单机训练任务的运行例子

        我们选择一个单机图像分类模型的训练作为示例

        1)选择CNN网络Inception-v3,选择Imagenet数据集

        2)Github下载最新的MXNet源码,并且在Example中找到图像分类

        3)执行命令,运行train_imagenet.py(这是一个性能benchmark):python train_imagenet.py --benchmark1 --gpus 0 --network inception-v3 --batch-size 64 --image-shape 3,299,299 --num -epochs 1 --kv-store local

        运行效果如下图中所示,我们可以发现运行之后屏幕会实时打印出当前运行的性能及精度,性能单位:每秒处理的图像张数。

 

3     阿里云上的MXNet性能实践

3.1   阿里云GPU服务器MXNet性能数据

        首先来看单GPU性能数据,选择Inception-V3网络,用MXNet在ImageNet数据集上做图像分类模型训练的Benchmark性能测试。从下图中的测试数据来看,我们发现搭载V100的GN6实例因为使用TensorCore混合精度,性能接近搭载P100的GN5实例的3倍。可以看到由于NVIDIA每年在GPU硬件上的性能巨大的提升,使得在GPU上运行深度学习的速度大幅度提升。

        之后看单机多GPU性能数据,使用GN5(P100)8卡实例,同样测试了MXNet的图像分类模型训练的单机扩展性。从下图中发现AlexNet,GoogleNet,Inception-V3和ResNet152等四种经典的卷积神经网络测试当中,单机多卡接近线性加速。这证明了MXNet在单机的扩展性上的确非常优秀。

3.2   KVStore策略对性能的影响

        在第1节有提到KVStore是MXNet数据通讯的模块。KVStore策略对最终性能有巨大影响。深度学习过程有两部分组成,前向和后向。前向指的是通过正向运算取得结果,然后利用损失函数,计算结果与基准结果的偏差,再对偏差进行反向求导,计算偏差减小的最大梯度方向,在最大梯度方向减少偏差从而更新新的权值,再利用新的权值运算新的结果。不断反复迭代运算,最终结果会无限逼近最终想要达到的基准结果。那么在迭代运算的过程当中,会涉及到两个主要数据流向。并行计算当中,会有很多的设备。以GPU为例,就是有很多GPU worker,每个workers计算完自己的梯度之后要汇集到一起合成完整梯度,所以会有梯度聚合的梯度流向。第二个数据流向,计算完梯度后,在梯度反向对网络权值进行更新,之后更新后的权值会更新到每个GPU worker上。

        KVStore的不同参数主要是两个不同数据流向的选择,目前的KVStore可以支持local和device两种参数,在1.0版本之后,新增了nccl参数。

        1)local:所有的梯度都拷贝到CPU内存完成聚合,同时在CPU内存上完成权值的更新并拷贝回每个GPUworker。这种方式主要在于CPU与GPU,主要的性能负载在于CPU拷贝的负载。

        2)device:梯度聚合和权值更新都在GPU上完成。GPU之间的如果支持Peer to Peer通信(PCIe or NVLink),将避免CPU拷贝的负载,可以大大减轻CPU的负担,仅受限于通信带宽。PCIe 与NVLink通信带宽不同,NVLink具备告诉的Peer to Peer通信带宽

        3)nccl:1.0版本后新增,类似于device,利用NVIDIA的NCCL通信库,相比device,会有潜在的性能提升(尤其是针对NVLink有特别优化),但是NCCL本身会消耗GPU资源,所以往往GPU数量较多时效果明显,目前MXNet对NCCL的支持还属于实验版本,在PCIe上的效果并不好。从下图数据来看,对于Inception-V3网络来说,使用local参数性能最优,使用device较差,nccl最差。当然因为nccl对于NVLink有特别优化,后续阿里云上会推出最新NVLink版本的V100的实例。可以期待在新的设备之上,会有更优的表现。

3.3   分布式通信性能

        前面提到的都是单机通信,主要取决于通信基础设施,比如PCle和NVLink带宽。在多机通信中性能主要瓶颈在于网络通信。普通的我们使用的以太网因为通信延迟的原因,会大大影响多机扩展性。从下图中可以看到,InfiniBand(IB)网络和RoCE网络因为支持RDMA,大大降低了通信延迟,相比之下,20G的以太网格延迟会大大提升。为了改善延迟,阿里云超级计算机集群使用InfiniBand或者RoCE网络,支持GPUDirect RDMA,可以大大降低延迟,增加多机扩展性。

        当然,对于现有的普通以太网络,也可以通过别的方法优化通信带宽的减少,比方说梯度压缩。通过梯度压缩,能够在减少通信带宽消耗的同时,保证收敛速度和精度不会有明显下降。MXNet官方提供了梯度压缩算法,按照官方数据,最佳的时候可以达到两倍的训练速度提升,同时收敛速度和精度的下降不会超过百分之一。

相关实践学习
通过workbench远程登录ECS,快速搭建Docker环境
本教程指导用户体验通过workbench远程登录ECS,完成搭建Docker环境的快速搭建,并使用Docker部署一个Nginx服务。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的迁移学习:从理论到实践
科技进步不断推动人工智能的发展,其中深度学习已成为最炙手可热的领域。然而,训练深度学习模型通常需要大量的数据和计算资源,这对于许多实际应用来说是一个显著的障碍。迁移学习作为一种有效的方法,通过利用已有模型在新任务上的再训练,大大减少了数据和计算资源的需求。本文将详细探讨迁移学习的理论基础、各种实现方法以及其在实际应用中的优势和挑战。
|
15天前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习的奥秘:从理论到实践
【5月更文挑战第31天】本文将深入探讨深度学习的理论基础和实践应用,揭示其在解决复杂问题中的强大能力。我们将从深度学习的基本概念开始,然后讨论其在不同领域的应用,最后分享一些实践经验和技巧。
|
8天前
|
机器学习/深度学习 API TensorFlow
Keras深度学习框架入门与实践
**Keras**是Python的高级神经网络API,支持TensorFlow、Theano和CNTK后端。因其用户友好、模块化和可扩展性受到深度学习开发者欢迎。本文概述了Keras的基础,包括**模型构建**(Sequential和Functional API)、**编译与训练**(选择优化器、损失函数和评估指标)以及**评估与预测**。还提供了一个**代码示例**,展示如何使用Keras构建和训练简单的卷积神经网络(CNN)进行MNIST手写数字分类。最后,强调Keras简化了复杂神经网络的构建和训练过程。【6月更文挑战第7天】
19 7
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习:从理论到实践
【6月更文挑战第4天】本文深入探讨了深度学习的理论基础和实践应用,包括其发展历程、主要模型、以及在图像识别、自然语言处理等领域的应用。文章不仅提供了对深度学习的全面理解,还通过实例展示了如何将理论知识转化为实际的技术解决方案。
|
15天前
|
机器学习/深度学习 自然语言处理 算法
探索深度学习:从理论到实践
【5月更文挑战第31天】本文旨在深入探讨深度学习的理论基础及其在实际应用中的实施方式。我们将首先介绍深度学习的基本概念,然后详细讨论其在不同领域的应用,最后分享一些实践经验和技巧。无论你是深度学习的新手还是有经验的研究者,这篇文章都将为你提供有价值的见解和指导。
|
16天前
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用构建高效云原生应用:云平台的选择与实践
【5月更文挑战第31天】 随着人工智能技术的飞速发展,深度学习已经成为推动计算机视觉进步的关键力量。特别是在图像识别领域,通过模仿人脑处理信息的方式,深度学习模型能够从大量数据中学习并识别复杂的图像模式。本文将探讨深度学习技术在自动驾驶系统中图像识别方面的应用,重点分析卷积神经网络(CNN)的结构与优化策略,以及如何通过这些技术提高自动驾驶车辆的环境感知能力。此外,文章还将讨论目前所面临的挑战和未来的研究方向。
|
17天前
|
机器学习/深度学习 运维 监控
构建高效自动化运维系统:策略与实践基于深度学习的图像识别在自动驾驶系统中的应用
【5月更文挑战第29天】 在当今的信息技术时代,企业的IT基础设施管理变得日益复杂。为了保持竞争力,组织必须确保其服务的稳定性和效率。本文将探讨如何通过实施自动化运维系统来优化IT管理流程,降低成本并提高服务质量。文中不仅介绍了自动化的核心原则和组件,还分享了实际案例研究和最佳实践,为读者提供了一套切实可行的自动化运维解决方案。
|
18天前
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用深入理解操作系统内存管理:原理与实践
【5月更文挑战第28天】 随着人工智能技术的飞速发展,图像识别作为其重要分支之一,在多个领域展现出了广泛的应用潜力。尤其是在自动驾驶系统中,基于深度学习的图像识别技术已成为实现车辆环境感知和决策的关键。本文将深入探讨深度学习算法在自动驾驶图像识别中的作用,分析其面临的挑战以及未来的发展趋势,并以此为基础,展望该技术对自动驾驶安全性和效率的影响。
|
18天前
|
机器学习/深度学习 算法 大数据
基于深度学习的图像识别技术:原理与实践
基于深度学习的图像识别技术:原理与实践
35 4
|
18天前
|
机器学习/深度学习 PyTorch 人机交互
探索深度学习在语音识别中的实践:基于循环神经网络的模型构建
探索深度学习在语音识别中的实践:基于循环神经网络的模型构建
29 0