0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Apache Spark和NVIDIA GPU加速深度学习

星星科技指导员 来源:NVIDIA 作者:NVIDIA 2022-04-27 09:54 次阅读

随着人们对深度学习( deep learning , DL )兴趣的日益浓厚,越来越多的用户在生产环境中使用 DL 。由于 DL 需要强大的计算能力,开发人员正在利用 gpu 来完成他们的训练和推理工作。

pYYBAGJoomiALHkfAACMGzsbajs051.png

最近,为了更好地统一 Spark 上的 DL 和数据处理,作为 Apache Spark 的一项重大举措的一部分, GPU 成为 Apache Spark 3.0 中的一种可调度资源。 Spark 将这些资源请求传递给底层集群管理器。因为这允许您大规模地运行分布式推理,所以它可以帮助加速大数据管道以利用 DL 应用程序。

在 Apache Spark 3. 0 之前,使用 gpu 是很困难的。您必须手动将 GPU 设备分配给 Spark 作业,并对每个执行器或任务的所有配置进行硬编码,以便在一台机器上使用不同的 GPU 。因为 apachehadoop3 。 1yarn 集群管理器允许不同机器之间的 GPU 协调, Apache Spark 现在可以与它一起工作,帮助将设备安排传递给不同的任务。提交带有 GPU 资源配置发现脚本的应用程序后, Spark 将处理任务之间如何共享 GPU 的分配和协调。

在本教程中,我们将演示如何创建 GPU 机器集群,并使用 Apache Spark 和 Amazon EMR 上的 深层 Java 库( DJL ) 来利用 Scala 中的大规模图像分类。 DJL 现在提供了一个基于 GPU 的深入学习 Java 包,该包被设计成可以在 Spark 中顺利工作。

如果您对 Scala 和 Java 感兴趣,或者正在寻找将 Java 中的 DL 集成到大数据管道中的解决方案, DJL 提供了一个可行的解决方案。由于 Python 是 DL 最常用的语言,而 Java 是企业开发人员和数据工程师最流行的语言, DJL 的目标是深入学习, Java 开发人员可以使用熟悉的概念和直观的 API 访问的开源工具。 DJL 是建立在现代深度学习框架( TensorFlow 、 PyTorch 、 Apache MXNet 等)之上的。您可以轻松地使用 DJL 来训练您的模型,或者从各种引擎部署您喜爱的模型,而无需进行任何额外的转换。

设置 Spark 应用程序

首先,导入 Spark 依赖项。 Spark SQL 和 ML 库用于存储和处理映像, Spark 依赖项仅在编译时使用,并且由于在运行时提供,因此在打包时被排除在外。当所有东西都打包好后,。 jar 任务将它们排除在外。

configurations {
    exclusion
}
dependencies {
    implementation "org.apache.spark:spark-sql_2.12:3.0.1"
    implementation "org.apache.spark:spark-mllib_2.12:3.0.1"
    implementation "org.apache.hadoop:hadoop-hdfs:2.7.4"

    exclusion "org.apache.spark:spark-sql_2.12:3.0.1"
    exclusion "org.apache.spark:spark-mllib_2.12:3.0.1"
    exclusion "org.apache.hadoop:hadoop-hdfs:2.7.4"}
}
jar {
    from {
        (configurations.runtimeClasspath - configurations.exclusion).collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
}

接下来,导入与 DJL 相关的依赖项。您使用 DJL 和 PyTorch 包。它们提供了 DJL 的核心特性,并加载了一个 DL 引擎来运行以进行推断。此外,您还可以使用 pytorch-native-cu101 在具有 CUDA 10 。 1 的 GPU 上运行。

    implementation platform("ai.djl:bom:0.8.0")
    implementation "ai.djl:api"
    runtimeOnly "ai.djl.pytorch:pytorch-model-zoo"
    runtimeOnly "ai.djl.pytorch:pytorch-native-cu101::linux-x86_64"

加载模型

要在 DJL 中加载模型,请提供承载模型的 URL ( file ://, hdfs ://, s3 ://, https ://)。从该 URL 下载并导入模型。 DJL 还提供了一个强大的动物园模型。 zoo 模型允许您管理预先训练的模型,并在一行中加载它们。内置的动物园模型目前支持 70 多个预先训练和准备使用的模型,这些模型来自 GluonCV 、 HuggingFace 、 TorchHub 和 Keras 。

def loadModel(device : Device): ZooModel[Row, Classifications] = {
    val modelUrl = "https://alpha-djl-demos.s3.amazonaws.com/model/djl-blockrunner/pytorch_resnet18.zip?model_name=traced_resnet18"
    val criteria = Criteria.builder
      .setTypes(classOf[Row], classOf[Classifications])
      .optModelUrls(modelUrl)
      .optTranslator(new MyTranslator())
      .optProgress(new ProgressBar)
      .optDevice(device)
      .build()
     ModelZoo.loadModel(criteria)
}

这里的输入类型是 Spark SQL 中的 Row 。输出类型是分类结果。 MyTranslator 函数执行预处理和后处理工作。加载的模型是来自 torchvision 的预训练 PyTorch ResNet18 模型。

主要逻辑

在下面的代码示例中, downloadImages 函数下载演示图像并将其存储在 Hadoop 文件系统( hdfs )。接下来, spark.read.format(“image”) 函数使用 Spark 图像数据源 将图像文件从 HDFS 加载到 Spark DataFrame 中。在此步骤之后, mapPartition 获取 GPU 信息。如代码示例所示, TaskContext.resources()(“gpu”) 函数存储为此分区分配的 GPU 。这可确保单个设备上的所有 GPU 都得到正确使用。将模型加载到指定的 GPU 后, predictor.predict(row) 返回 Spark DataFrame 分区中图像(行)的分类。

def main(args: Array[String]) {

    // download images
    val imagePath = downloadImages(new Path("hdfs:///images"))

    // Spark configuration
    val spark = SparkSession.builder()
      .appName("Image Classification")
      .config(new SparkConf())
      .getOrCreate()
    val df = spark.read.format("image").option("dropInvalid", true).load(imagePath)
    val result = df.select(col("image.*")).mapPartitions(partition => {
      val context = TaskContext.get()
      val gpu = context.resources()("gpu").addresses(0)
      val model = loadModel(Device.gpu(gpu.toInt))
      val predictor = model.newPredictor()
      partition.map(row => {
        predictor.predict(row).toString
      })
    })(Encoders.STRING)
    println(result.collect().mkString("
"))
}

把它包起来

运行 。/gradlew jar 将所有内容捆绑到一个 jar 中,并在 Spark 集群中运行。

使用多个 GPU 设置 Spark 群集

由于 Amazon emr6 。 2 。 0 的发布, Spark 3 。 0 在所有 GPU 实例中都可用。

要设置 Spark 群集,请使用 AWS CLI 创建一个包含三个实例的 GPU 群集。要成功运行该命令,必须将 myKey 更改为 EC2 密钥名称。如果预先配置了 --region 选项,也可以将其删除。

aws emr create-cluster \
    --name "Spark cluster" \
    --release-label emr-6.2.0 \
    --region us-east-1 \
    --ebs-root-volume-size 50 \
    --applications Name=Hadoop Name=Spark \
    --ec2-attributes KeyName=myKey \
    --instance-type g3s.xlarge \
    --instance-count 3 \
    --use-default-roles \
    --configurations https://raw.githubusercontent.com/aws-samples/djl-demo/master/aws/emr-distributed-inference/image-classification-gpu/configurations.json 

您可以从 AWS 中提供的各种 GPU 实例中进行选择。此示例使用 g3s.xlarge 实例类型进行测试目的群集设置的总运行时间约为 10 – 15 分钟。

执行 Spark 作业

您可以在 EMR 控制台上或从命令行运行此驻车作业。

下面的命令告诉 Spark 运行一个 Yarn 集群,并设置一个脚本来查找不同设备上的 gpu 。每个任务的 GPU 数量设置为 0 。 5 ,这意味着两个任务共享一个 GPU 。您可能还需要相应地设置 CPU 编号,以确保它们匹配。例如,如果您有一个 8 核 CPU ,并且将 spark.task.cpus 设置为 2 ,这意味着四个任务可以在一台机器上并行运行。要获得最佳性能,请将 spark.task.resource.gpu.amount 设置为 0 。 25 。这允许四个任务共享同一个 GPU 。这有助于最大限度地提高性能,因为 GPU 和 CPU 中的所有核心都已使用。如果没有平衡的设置,一些内核处于空闲状态,这会浪费资源。

spark-submit \
    --master yarn \
    --conf spark.executor.resource.gpu.discoveryScript=/usr/lib/spark/scripts/gpu/getGpusResources.sh \
    --conf spark.worker.resource.gpu.discoveryScript=/usr/lib/spark/scripts/gpu/getGpusResources.sh \
    --conf spark.task.resource.gpu.amount="0.5" \
    --conf spark.task.cpus=2 \
    --conf spark.executor.resource.gpu.amount=1 \
    --conf spark.worker.resource.gpu.amount=1 \
    --class com.examples.ImageClassificationExample \
    build/libs/image-classification-gpu-1.0-SNAPSHOT.jar

这个脚本大约需要 4-6 分钟才能完成,您将得到一个打印输出的推断结果作为输出。

摘要

在本教程中,您从头开始构建包,并将工作提交到 GPU 集群以执行推理任务。尝试对自己的应用程序使用相同的设置。

关于作者

Qing Lan 是 AWS 深度学习工具包团队的 SDE 。他是 DJL 的合著者之一 (djl 。 ai 公司 ) 以及 apachemxnet 的 PPMC 成员。 2017 年毕业于哥伦比亚大学,获计算机工程硕士学位, 2017 年暑期实习。他专注于分布式深度学习训练和推理领域。

Kong Zhao 是 NVIDIA 的主要解决方案架构师。他提供技术思想领导和架构指导。他为 NVIDIA 和 AWS 客户进行 PoC ,通过在云中开发、优化和部署 GPU 加速解决方案来满足他们的 AI 和 HPC 需求。他关注的核心领域是 GPU 相关的云架构、 HPC 、机器学习和分析。此前, Kong 曾担任 AWS 的高级解决方案架构师、云交换的 atEquinix 架构师以及 Cisco 的产品经理。

Carol McDonald 是一位产品营销经理,专注于 Spark 和数据科学。 Carol 在很多方面都有经验,包括技术营销、软件架构和开发、培训、技术宣传和开发人员外展。 Carol 编写行业架构、最佳实践、模式、原型、教程、演示、博客文章、白皮书和电子书。她走遍世界各地,做演讲和动手实验;在银行、医疗保险和电信行业开发了复杂的、关键任务的应用程序。卡罗尔拥有田纳西大学计算机科学硕士学位和范德比尔特大学地质学学士学位。卡罗尔精通英语、法语和德语。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2978

    浏览量

    105290
  • API
    API
    +关注

    关注

    2

    文章

    1522

    浏览量

    62506
  • python
    +关注

    关注

    56

    文章

    4811

    浏览量

    85103
收藏 人收藏

    评论

    相关推荐

    《CST Studio Suite 2024 GPU加速计算指南》

    的各个方面,包括硬件支持、操作系统支持、许可证、GPU计算的启用、NVIDIA和AMD GPU的详细信息以及相关的使用指南和故障排除等内容。 1. 硬件支持 - NVIDIA
    发表于 12-16 14:25

    深度学习工作负载中GPU与LPU的主要差异

    ,一个新的竞争力量——LPU(Language Processing Unit,语言处理单元)已悄然登场,LPU专注于解决自然语言处理(NLP)任务中的顺序性问题,是构建AI应用不可或缺的一环。 本文旨在探讨深度学习工作负载中GPU
    的头像 发表于 12-09 11:01 2411次阅读
    <b class='flag-5'>深度</b><b class='flag-5'>学习</b>工作负载中<b class='flag-5'>GPU</b>与LPU的主要差异

    GPU深度学习中的应用 GPUs在图形设计中的作用

    随着人工智能技术的飞速发展,深度学习作为其核心部分,已经成为推动技术进步的重要力量。GPU(图形处理单元)在深度学习中扮演着至关重要的角色,
    的头像 发表于 11-19 10:55 794次阅读

    NPU在深度学习中的应用

    设计的硬件加速器,它在深度学习中的应用日益广泛。 1. NPU的基本概念 NPU是一种专门针对深度学习算法优化的处理器,它与传统的CPU和
    的头像 发表于 11-14 15:17 1005次阅读

    PyTorch GPU 加速训练模型方法

    深度学习领域,GPU加速训练模型已经成为提高训练效率和缩短训练时间的重要手段。PyTorch作为一个流行的深度
    的头像 发表于 11-05 17:43 702次阅读

    GPU深度学习应用案例

    GPU深度学习中的应用广泛且重要,以下是一些GPU深度学习应用案例: 一、图像识别 图像识别是
    的头像 发表于 10-27 11:13 541次阅读

    GPU加速计算平台是什么

    GPU加速计算平台,简而言之,是利用图形处理器(GPU)的强大并行计算能力来加速科学计算、数据分析、机器学习等复杂计算任务的软硬件结合系统。
    的头像 发表于 10-25 09:23 311次阅读

    FPGA加速深度学习模型的案例

    FPGA(现场可编程门阵列)加速深度学习模型是当前硬件加速领域的一个热门研究方向。以下是一些FPGA加速
    的头像 发表于 10-25 09:22 419次阅读

    深度学习GPU加速效果如何

    图形处理器(GPU)凭借其强大的并行计算能力,成为加速深度学习任务的理想选择。
    的头像 发表于 10-17 10:07 286次阅读

    Spark基于DPU的Native引擎算子卸载方案

    1.背景介绍 Apache Spark(以下简称Spark)是一个开源的分布式计算框架,由UC Berkeley AMP Lab开发,可用于批处理、交互式查询(Spark SQL)、实
    的头像 发表于 06-28 17:12 776次阅读
    <b class='flag-5'>Spark</b>基于DPU的Native引擎算子卸载方案

    新手小白怎么学GPU云服务器跑深度学习?

    新手小白想用GPU云服务器跑深度学习应该怎么做? 用个人主机通常pytorch可以跑但是LexNet,AlexNet可能就直接就跑不动,如何实现更经济便捷的实现GPU云服务器
    发表于 06-11 17:09

    Spark基于DPU Snappy压缩算法的异构加速方案

    一、总体介绍 1.1 背景介绍 Apache Spark是专为大规模数据计算而设计的快速通用的计算引擎,是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些不同之处使
    的头像 发表于 03-26 17:06 888次阅读
    <b class='flag-5'>Spark</b>基于DPU Snappy压缩算法的异构<b class='flag-5'>加速</b>方案

    RDMA技术在Apache Spark中的应用

    背景介绍 在当今数据驱动的时代,Apache Spark已经成为了处理大规模数据集的首选框架。作为一个开源的分布式计算系统,Spark因其高效的大数据处理能力而在各行各业中广受欢迎。无论是金融服务
    的头像 发表于 03-25 18:13 1621次阅读
    RDMA技术在<b class='flag-5'>Apache</b> <b class='flag-5'>Spark</b>中的应用

    基于DPU和HADOS-RACE加速Spark 3.x

    背景简介 Apache Spark(下文简称Spark)是一种开源集群计算引擎,支持批/流计算、SQL分析、机器学习、图计算等计算范式,以其强大的容错能力、可扩展性、函数式API、多语
    的头像 发表于 03-25 18:12 1440次阅读
    基于DPU和HADOS-RACE<b class='flag-5'>加速</b><b class='flag-5'>Spark</b> 3.x

    FPGA在深度学习应用中或将取代GPU

    现场可编程门阵列 (FPGA) 解决了 GPU 在运行深度学习模型时面临的许多问题 在过去的十年里,人工智能的再一次兴起使显卡行业受益匪浅。英伟达 (Nvidia) 和 AMD 等公
    发表于 03-21 15:19