如何使用 GPU 进行图像处理

概览

为了演示使用 GPU 在 PySpark 中运行分布式作业的能力,本示例使用NumbaPro和 CUDA 平台进行图像分析。本示例对灰度图像执行二维 FFT 卷积,并比较基于 CPU 和基于 GPU 的计算的执行时间。

这是给谁的?

本指南适用于希望使用 YARN 资源管理器运行 Python 代码的 Spark 集群用户。本指南将向您展示如何将第三方 Python 库与 Spark 集成。

开始之前

对于此示例,您需要使用 YARN 资源管理器运行 Spark。您可以使用Cloudera CDHHortonworks HDP等企业 Hadoop 发行版安装 Spark 和 YARN 。

您还需要有效的Amazon Web Services (AWS) 凭证才能下载示例数据。

对于此示例,我们建议使用支持 GPU 的 AWS 实例类型 g2.2xlarge和 AMI ami-12fd8178(us-east-1 区域),其中预装了 CUDA 7.0 和 NVIDIA 驱动程序。示例配置文件(将放置在 中 ~/.acluster/profiles.d/gpu_profile.yaml)如下所示:

name: gpu_profile
node_id: ami-12fd8178  # Ubuntu 14.04, Cuda 7.0, us-east-1 region
node_type: g2.2xlarge
num_nodes: 4
provider: aws_east
user: ubuntu

要执行此示例,请下载: 或 .spark-numbapro.py example scriptspark-numbapro.ipynb example notebook

如果你想使用 Jupyter Notebook 插件,可以使用以下命令安装在集群上:spark-numbapro.ipynb example notebook

acluster install notebook

安装 Jupyter Notebook 插件后,您可以使用以下命令在浏览器中查看 Jupyter Notebook:

acluster open notebook

安装依赖项

如果您有安装软件包的权限,则acluster可以使用以下命令在所有节点上安装所需的软件包。

acluster conda install scipy matplotlib numbapro PIL

加载数据到 HDFS

首先,我们将示例文本数据加载到 HDFS 数据存储中。以下脚本将示例图像数据(大约 1.1 GB)从公共 Amazon S3 存储桶传输到集群上的 HDFS 数据存储。

将 下载到您的集群并在和变量中插入您的 Amazon AWS 凭证。cluster-download-data.py scriptAWS_KEYAWS_SECRET

import subprocess

AWS_KEY = 'YOUR_AWS_KEY'
AWS_SECRET = 'YOUR_AWS_SECRET'

s3_path = 's3n://{0}:{1}@blaze-data/dogs-cats-img/images'.format(AWS_KEY, AWS_SECRET)
cmd = ['hadoop', 'distcp', s3_path, 'hdfs:///tmp/dogs-cats']
subprocess.call(cmd)

注意:由于内存限制,该命令可能会导致 HDFS 在较小的实例大小上失败。hadoop distcp

cluster-download-data.py在集群上运行脚本。

python cluster-download-data.py

几分钟后,图像数据将位于集群上的 HDFS 数据存储中,并准备好进行分析。

运行作业

spark-numbapro.py使用spark-submit在 Spark 集群上运行脚本 。输出显示了基于 CPU 与基于 GPU 的计算的图像处理执行时间。

54.164.123.31: Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
15/11/09 02:33:21 INFO SparkContext: Running Spark version 1.5.1

[...]

15/11/09 02:33:45 INFO TaskSetManager: Finished task 6.0 in stage 1.0 (TID 13)
in 106 ms on ip-172-31-9-24.ec2.internal (7/7)
15/11/09 02:33:45 INFO YarnScheduler: Removed TaskSet 1.0, whose tasks have
all completed, from pool
15/11/09 02:33:45 INFO DAGScheduler: ResultStage 1
(collect at /tmp/anaconda-cluster/spark-numbapro.py:106) finished in 4.844 s
15/11/09 02:33:45 INFO DAGScheduler: Job 1 finished:
collect at /tmp/anaconda-cluster/spark-numbapro.py:106, took 4.854970 s

10 images
CPU: 6.91735601425
GPU: 4.88133311272

[...]

15/11/09 02:34:27 INFO TaskSetManager: Finished task 255.0 in stage 3.0 (TID 525)
 in 139 ms on ip-172-31-9-24.ec2.internal (256/256)
15/11/09 02:34:27 INFO YarnScheduler: Removed TaskSet 3.0, whose tasks have
all completed, from pool
15/11/09 02:34:27 INFO DAGScheduler: ResultStage 3
(collect at /tmp/anaconda-cluster/spark-numbapro.py:126) finished in 19.340 s
15/11/09 02:34:27 INFO DAGScheduler: Job 3 finished:
collect at /tmp/anaconda-cluster/spark-numbapro.py:126, took 19.400670 s

500 images
CPU: 22.1282501221
GPU: 19.8209779263

故障排除

如果出现问题,请查阅常见问题/已知问题页面。

更多信息

有关更多信息,请参阅SparkPySpark文档页面。

有关 NumbaPro 的更多信息,请参阅NumbaPro 文档