简介: JindoFS提供了一个计算侧的分布式缓存零碎,能够无效利用计算集群上的本地存储资源(磁盘或者内存)缓存OSS上的热数据,从而缩小对OSS上数据的重复拉取,耗费网络带宽。

背景介绍

近些年,机器学习畛域疾速倒退,广泛应用于各行各业。对于机器学习畛域的从业人员来说,充斥了大量的时机和挑战。Tensorflow、PyTorch等深度学习框架的呈现,使开发者可能轻松地构建和部署机器学习利用。随着近些年云计算技术的一直成熟,越来越多的人承受将他们的开发、生产服务搬到云上平台,因为云环境在计算成本、规模扩大上比传统平台有显著的劣势。云上平台为了达到弹性、节约老本,通常采纳计算存储拆散的解决方案。应用对象存储构建数据湖,能够降低成本、存储海量数据。在机器学习这个场景下,尤其适宜将训练数据存储在数据湖上。

将训练数据存储在数据湖上具备以下劣势:

1.不须要将数据提前同步到训练节点。传统形式,咱们须要将数据提前导入到计算节点的本地磁盘。而如果将数据存储在对象存储上,咱们能够间接读取数据进行训练,缩小筹备工作。

2.能够存储更大的训练数据,不再受限于计算节点本地磁盘大小。对于深度学习,领有更多的数据,往往能获得更好的训练成果。

3.计算资源能够弹性扩缩容,节约老本。机器学习通常应用应用更多核数的CPU或高端GPU,较为低廉,对象存储的老本就绝对较低。将训练数据存储在数据湖上,能够与计算资源解耦。计算资源能够按需付费,随时开释,达到节省成本的目标。

然而,这种形式同时存在着一些问题和挑战:

1.远端拉取数据的提早和带宽无奈随着计算资源线性扩大。硬件计算能力在一直倒退,利用GPU进行计算能够获得更快的训练速度。应用云上弹性计算ECS、容器服务能够疾速调度起大规模的计算资源。拜访对象存储须要走网络,得益于网络技术的倒退,咱们拜访对象存储有一个高速网络,即便如此,对象存储的网络延时和带宽无奈随着集群规模线性扩大,可能会成为瓶颈,限度了训练速度。在计算存储拆散架构下,如何高效地拜访到这些数据,成为了一个微小的挑战。

2.须要更加便捷的通用的数据拜访形式。深度学习框架如TensorFlow对于GCS、HDFS反对较为敌对,而对于诸多第三方对象存储的反对上较为滞后。而POSIX接口是一种更天然敌对的形式,应用相似于本地磁盘一样的形式拜访数据,大大简化了开发者对存储系统的适配工作。

为了解决数据湖上机器学习训练惯例计划存在的上述问题,JindoFS 针对这种场景提供了缓存减速优化计划。

基于JindoFS缓存减速的训练架构计划

JindoFS提供了一个计算侧的分布式缓存零碎,能够无效利用计算集群上的本地存储资源(磁盘或者内存)缓存OSS上的热数据,从而缩小对OSS上数据的重复拉取,耗费网络带宽。

内存缓存

对于深度学习,咱们能够抉择计算能力更强的GPU机型,来获取更快的训练速度。此时须要高速的内存吞吐,能力让GPU充沛跑满。此时咱们能够应用JindoFS基于内存搭建分布式高速缓存。当整个集群的所有内存加起来足以撑持整个数据集时(除去工作自身所需内存量),咱们就能够利用内存缓存以及本地高速网络,来提供高的数据吞吐,放慢计算速度。

磁盘缓存

对于一些机器学习场景,训练数据的规模超过了内存所能承载的大小,以及训练所需的CPU/GPU能力要求没有那么高,而要求数据拜访有较高的吞吐。此时计算的瓶颈会受限于网络带宽压力。因而咱们能够搭建应用本地SSD作为缓存介质的JindoFS分布式缓存服务,利用本地存储资源缓存热数据,来达到进步训练速度的成果。

FUSE接口

JindoFS蕴含了FUSE客户端,提供了简便的、相熟的数据拜访形式。通过FUSE程序将JindoFS集群实例映射到本地文件系统,就能够像拜访本地磁盘文件一样,享受到JindoFS带来的减速成果。

实战:搭建Kubernetes + JindoFS + Tensorflow训练集群

1、创立kubernetes集群

咱们返回阿里云-容器服务,创立一个Kubernetes集群。

2、装置JindoFS服务

2.1 返回容器服务->利用目录,进入“JindoFS”装置配置页面。

2.2 配置参数

残缺的配置模板能够参考容器服务-利用目录-jindofs装置阐明。
配置OSS Bucket和AK,参考文档应用JFS Scheme的部署形式。咱们须要批改以下配置项:

jfs.namespaces: testjfs.namespaces.test.mode :  cachejfs.namespaces.test.oss.uri :  oss:_//xxx-sh-test.oss-cn-shanghai-internal.aliyuncs.com/xxx/k8s_c1_jfs.namespaces.test.oss.access.key :  xxjfs.namespaces.test.oss.access.secret :  xx

通过这些配置项,咱们创立了一个名为test的命名空间,指向了chengli-sh-test这个OSS bucket的xxx/k8s_c1目录。后续咱们通过JindoFS操作test命名空间的时候,就等同于操作该OSS目录。

2.3 装置服务

1.验证装置胜利

# kubectl get podsNAME                               READY   STATUS      RESTARTS   AGEjindofs-fuse-267vq                 1/1     Running     0          143mjindofs-fuse-8qwdv                 1/1     Running     0          143mjindofs-fuse-v6q7r                 1/1     Running     0          143mjindofs-master-0                   1/1     Running     0          143mjindofs-worker-mncqd               1/1     Running     0          143mjindofs-worker-pk7j4               1/1     Running     0          143mjindofs-worker-r2k99               1/1     Running     0          143m

2.在宿主机上拜访/mnt/jfs/目录,即等同于拜访JindoFS的文件

ls /mnt/jfs/test/15885689452274647042-0  17820745254765068290-0  entrypoint.sh

3.装置kubeflow(arena)

**Kubeflow 是开源的基于Kubernetes云原生AI平台,用于开发、编排、部署和运行可扩大的便携式机器学习工作负载。Kubeflow反对两种TensorFlow框架分布式训练,别离是参数服务器模式和AllReduce模式。基于阿里云容器服务团队开发的Arena,用户能够提交这两种类型的分布式训练框架。
咱们参照github repo上的应用文档进行装置。
**

4. 启动TF作业

arena submit mpi --name job-jindofs --gpus=8  --workers=4  --working-dir=/perseus-demo/tensorflow-demo/  --data-dir /mnt/jfs/test:/data/imagenet  -e DATA_DIR=/data/imagenet -e num_batch=1000  -e datasets_num_private_threads=8   --image=registry.cn-hangzhou.aliyuncs.com/tensorflow-samples/perseus-benchmark-dawnbench-v2:centos7-cuda10.0-1.2.2-1.14-py36  ./launch-example.sh 4 8

本文中,咱们提交了一个ResNet-50模型作业,应用的是大小144GB的ImageNet数据集。数据以TFRecord格局存储,每个TFRecord大小约130MB。模型作业和ImageNet数据集都能够在网上轻松找到。这些参数中,/mnt/jfs/是通过JindoFS FUSE挂载到宿主机的一个目录,test是一个namespace,对应一个oss bucket。咱们应用--data-dir将这个目录映射到容器内的/data/imagenet目录,这样作业就能够读取到OSS的数据了,对于读取过的数据,会主动缓存到JindoFS集群本地。

总结

通过JindoFS的缓存减速服务,只须要读取一遍数据,大部分的热数据将缓存到本地内存或磁盘,深度学习的训练速度能够失去显著进步。对于大部分训练,咱们还能够应用预加载的形式先将数据加载到缓存中,来放慢下一次训练的速度。

原文链接
本文为阿里云原创内容,未经容许不得转载。