简介: 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: test
jfs.namespaces.test.mode : cache
jfs.namespaces.test.oss.uri : oss:_//xxx-sh-test.oss-cn-shanghai-internal.aliyuncs.com/xxx/k8s_c1_
jfs.namespaces.test.oss.access.key : xx
jfs.namespaces.test.oss.access.secret : xx
通过这些配置项,咱们创立了一个名为 test 的命名空间,指向了 chengli-sh-test 这个 OSS bucket 的 xxx/k8s_c1 目录。后续咱们通过 JindoFS 操作 test 命名空间的时候,就等同于操作该 OSS 目录。
2.3 装置服务
1. 验证装置胜利
# kubectl get pods
NAME READY STATUS RESTARTS AGE
jindofs-fuse-267vq 1/1 Running 0 143m
jindofs-fuse-8qwdv 1/1 Running 0 143m
jindofs-fuse-v6q7r 1/1 Running 0 143m
jindofs-master-0 1/1 Running 0 143m
jindofs-worker-mncqd 1/1 Running 0 143m
jindofs-worker-pk7j4 1/1 Running 0 143m
jindofs-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 的缓存减速服务,只须要读取一遍数据,大部分的热数据将缓存到本地内存或磁盘,深度学习的训练速度能够失去显著进步。对于大部分训练,咱们还能够应用预加载的形式先将数据加载到缓存中,来放慢下一次训练的速度。
原文链接
本文为阿里云原创内容,未经容许不得转载。