在Alluxio-FUSE上运行Tensorflow

Slack Docker Pulls GitHub edit source

本指南介绍如何在Alluxio POSIX API上运行Tensorflow

概述

Tensorflow使开发人员可以快速轻松地开始使用深度学习。 深度学习部分介绍了深度学习的数据挑战 以及Alluxio如何帮助解决这些挑战。 本教程针对在Alluxio POSIX API之上运行Tensorflow提供一些动手实例和技巧。

先决条件

  • 安装或刷新Java为Java 8 Update 60或更高版本(8u60 +),64位。
  • Alluxio已设置并好并正常运行。
  • 已安装Tensorflow。本指南使用Tensorflow v1.15

设置Alluxio POSIX API

在本节中,我们将按照 POSIX API部分中的介绍来设置Alluxio POSIX API 和允许Tensorflow应用程序通过Alluxio POSIX API来访问数据。

运行以下命令在Linux上安装FUSE

$ yum install fuse fuse-devel

在MacOS上下载osxfuse dmg文件,然后按照安装说明进行操作。

在Alluxio根目录下建立一个文件夹

$ ./bin/alluxio fs mkdir /training-data

创建一个文件夹/mnt/fuse,改变文件夹的所有者为当前用户($(WHOAMI )), 并改变其权限允许读取和写入

$ sudo mkdir -p /mnt/fuse
$ sudo chown $(whoami) /mnt/fuse
$ chmod 755 /mnt/fuse

运行Alluxio-FUSE shell来挂载Alluxio文件夹training-data 到刚刚创建本地空文件夹:

$ ./integration/fuse/bin/alluxio-fuse mount /mnt/fuse /training-data

以上CLI命令产生了一个后台用户空间Java进程(AlluxioFuse),该进程将在指定挂载点/mnt/alluxio把在/training-data中指定的Alluxio路径挂载到本地文件系统。 请参阅POSIX API文档, 以获取有关如何安装Alluxio-FUSE以及设置fuse相关选项的详细信息。

检查FUSE进程的状态

$ ./integration/fuse/bin/alluxio-fuse stat

挂载的/mnt/fuse文件夹已经准备好可以为深度学习框架所用,深度学习框架可以视Alluxio存储为本地文件夹。 下一部分中Tensorflow将使用此文件夹进行训练。

示例:图像识别

准备训练数据

如果训练数据已经在远程数据存储中,则可以将其挂载为Alluxio/training-data目录下的一个文件夹。 这些数据对于在本地/mnt/fuse/上运行的应用程序是可见的。

假设ImageNet数据存储在S3存储桶s3://alluxio-tensorflow-imagenet/。 运行以下命令将该S3存储桶挂载到Alluxio路径/training-data/imagenet:

$ ./bin/alluxio fs mount /training-data/imagenet/ s3://alluxio-tensorflow-imagenet/ \
  --option s3a.accessKeyID=<ACCESS_KEY_ID> --option s3a.secretKey=<SECRET_KEY>

注意,此命令可以接受选项来传递存储桶的S3凭证。 一旦把这些凭证与挂载点关联起来,将来的访问将不再需要这些凭证。

如果数据不在远程数据存储中,则可以将其复制到Alluxio命名空间:

$ wget http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz
$ ./bin/alluxio fs mkdir /training-data/imagenet 
$ ./bin/alluxio fs copyFromLocal inception-2015-12-05.tgz /training-data/imagenet 

假设ImageNet数据存储在一个S3桶s3://alluxio-tensorflow-imagenet/, 以下三个命令将在两个挂载进程运行之后显示完全相同的数据:

aws s3 ls s3://alluxio-tensorflow-imagenet/
# 2019-02-07 03:51:15          0 
# 2019-02-07 03:56:09   88931400 inception-2015-12-05.tgz
bin/alluxio fs ls /training-data/imagenet/
# -rwx---rwx ec2-user       ec2-user              88931400       PERSISTED 02-07-2019 03:56:09:000   0% /training-data/imagenet/inception-2015-12-05.tgz
ls -l /mnt/fuse/imagenet/
# total 0
# -rwx---rwx 0 ec2-user ec2-user 88931400 Feb  7 03:56 inception-2015-12-05.tgz

运行图像识别测试

下载图像识别脚本 ,然后使用包含训练数据的本地文件夹运行脚本。

$ curl -o classify_image.py -L https://raw.githubusercontent.com/tensorflow/models/v1.11/tutorials/image/imagenet/classify_image.py
$ python classify_image.py --model_dir /mnt/fuse/imagenet/

这将使用/mnt/fuse/imagenet/inception-2015-12-05.tgz中的输入数据来识别图像,并将一些中间数据写入/mnt/fuse/imagenet 如果都成功运行,你将在命令提示符下看到:

giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.89107)
indri, indris, Indri indri, Indri brevicaudatus (score = 0.00779)
lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00296)
custard apple (score = 0.00147)
earthstar (score = 0.00117)

示例:Tensorflow基准

假设数据位于S3路径s3://alluxio-tensorflow-imagenet/,将S3存储桶中的ImageNet数据挂载到路径/training-data/imagenet

$ ./bin/alluxio fs mount /training-data/imagenet/ \
  s3://alluxio-tensorflow-imagenet/ \
  --option s3a.accessKeyID=<ACCESS_KEY_ID> \
  --option s3a.secretKey=<SECRET_KEY>

要使用Alluxio POSIX API通过Alluxio访问S3中的训练数据, 可以将路径/mnt/fuse/imagenet传递给基准脚本的参数data_dir tf_cnn_benchmarsk.py

提示

使用数据位置参数编写Tensorflow应用程序

在HDFS,S3和其他底层存储之上运行Tensorflow可能需要不同的配置,进而 使管理和集成Tensorflow应用和不同底层存储很难。 通过Alluxio POSIX API,用户只需要将底层存储挂载到Aluxio一次和将包含培训数据底层存储父文件夹挂载到本地文件系统。 初始挂载后,就可通过Alluxio fuse挂载点立即访问数据,并可 在Tensorflow应用程序中透明地访问该数据。 如果Tensorflow应用程序已设置了数据位置参数,则只需要将fuse挂载点内的数据位置传递 点给Tensorflow应用程序,而无需对其进行修改。 这大大简化了应用程序开发,避免了使用不同的集成设置和 为每个底层存储做凭证配置。

共置Tensorflow和Alluxio worker

通过共置Tensorflow应用程序和Alluxio worker,Alluxio在本地缓存远程数据以供将来访问, 从而提供很好的数据局部性。 如果没有Alluxio,缓慢的远程存储可能会导致I/O瓶颈,并导致GPU资源利用不足。 在同时写入或读取大文件时,在Alluxio worker节点上运行,Alluxio POSIX API可以提供明显更好的性能。 通过Alluxio POSIX API并设置具有内存空间的worker节点来承载所有培训数据可以使 性能提高近2倍。

配置Alluxio写入类型和读取类型

许多Tensorflow应用程序在其工作流程期间会生成许多小的临时中间文件。 这些临时中间文件仅在短时间内有用,不需要持久存储在底层存储中。 如果我们直接将Tensorflow与远程存储链接,则所有文件(无论类型-数据文件,临时中间文件, 结果等)都将写入并持久保存到远程存储中。 借助Alluxio-Tensorflow应用程序和远程存储之间的缓存层,用户可以减少不必要的远程 持久性存储操作并缩短写入/读取时间。

alluxio.user.file.writetype.default设置为MUST_CACHE后,可以写入Alluxio worker存储顶层(通常是内存层) 。 将alluxio.user.file.readtype.default设置为CACHE_PROMOTE后,可以将读取的数据缓存在Alluxio中以供将来访问。 通过从内存写入和读取将加速我们的Tensorflow工作流程。 如果远程存储是像S3这样的云存储,则优势将更加明显。