JindoFS缓存加速数据湖上的机器学习训练

本文涉及的产品
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: JindoFS提供了一个计算侧的分布式缓存系统,可以有效利用计算集群上的本地存储资源(磁盘或者内存)缓存OSS上的热数据,从而减少对OSS上数据的反复拉取,消耗网络带宽。

背景介绍

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

将训练数据存储在数据湖上具有以下优势:

1.不需要将数据提前同步到训练节点。传统方式,我们需要将数据提前导入到计算节点的本地磁盘。而如果将数据存储在对象存储上,我们可以直接读取数据进行训练,减少准备工作。

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

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

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

1.远端拉取数据的延迟和带宽无法随着计算资源线性扩展。硬件计算能力在不断发展,利用GPU进行计算可以取得更快的训练速度。使用云上弹性计算ECS、容器服务可以快速调度起大规模的计算资源。访问对象存储需要走网络,得益于网络技术的发展,我们访问对象存储有一个高速网络,即便如此,对象存储的网络延时和带宽无法随着集群规模线性扩展,可能会成为瓶颈,限制了训练速度。在计算存储分离架构下,如何高效地访问到这些数据,成为了一个巨大的挑战。

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

为了解决数据湖上机器学习训练常规方案存在的上述问题,JindoFS 针对这种场景提供了缓存加速优化方案。

基于JindoFS缓存加速的训练架构方案

JindoFS提供了一个计算侧的分布式缓存系统,可以有效利用计算集群上的本地存储资源(磁盘或者内存)缓存OSS上的热数据,从而减少对OSS上数据的反复拉取,消耗网络带宽。

6.png

内存缓存

对于深度学习,我们可以选择计算能力更强的GPU机型,来获取更快的训练速度。此时需要高速的内存吞吐,才能让GPU充分跑满。此时我们可以使用JindoFS基于内存搭建分布式高速缓存。当整个集群的所有内存加起来足以支撑整个数据集时(除去任务本身所需内存量),我们就可以利用内存缓存以及本地高速网络,来提供高的数据吞吐,加快计算速度。

磁盘缓存

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

FUSE接口

JindoFS包含了FUSE客户端,提供了简便的、熟悉的数据访问方式。通过FUSE程序将JindoFS集群实例映射到本地文件系统,就可以像访问本地磁盘文件一样,享受到JindoFS带来的加速效果。

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

1、创建kubernetes集群

我们前往阿里云-容器服务,创建一个Kubernetes集群。

7.png

2、安装JindoFS服务

2.1 前往容器服务->应用目录,进入“JindoFS”安装配置页面。

8.png

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 安装服务

8.png

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的缓存加速服务,只需要读取一遍数据,大部分的热数据将缓存到本地内存或磁盘,深度学习的训练速度可以得到显著提高。对于大部分训练,我们还可以使用预加载的方式先将数据加载到缓存中,来加快下一次训练的速度。


更多数据湖技术相关的文章请点击:[阿里云重磅发布云原生数据湖体系
](https://developer.aliyun.com/article/772298?spm=a2c6h.12873581.0.dArticle772298.28042b0fFZNGve&groupCode=datalakeformation)


更多数据湖相关信息交流请加入阿里巴巴数据湖技术钉钉群
数据湖钉群.JPG

相关实践学习
基于EMR Serverless StarRocks一键玩转世界杯
基于StarRocks构建极速统一OLAP平台
快速掌握阿里云 E-MapReduce
E-MapReduce 是构建于阿里云 ECS 弹性虚拟机之上,利用开源大数据生态系统,包括 Hadoop、Spark、HBase,为用户提供集群、作业、数据等管理的一站式大数据处理分析服务。 本课程主要介绍阿里云 E-MapReduce 的使用方法。
相关文章
|
11天前
|
机器学习/深度学习 数据采集 数据处理
谷歌提出视觉记忆方法,让大模型训练数据更灵活
谷歌研究人员提出了一种名为“视觉记忆”的方法,结合了深度神经网络的表示能力和数据库的灵活性。该方法将图像分类任务分为图像相似性和搜索两部分,支持灵活添加和删除数据、可解释的决策机制以及大规模数据处理能力。实验结果显示,该方法在多个数据集上取得了优异的性能,如在ImageNet上实现88.5%的top-1准确率。尽管有依赖预训练模型等限制,但视觉记忆为深度学习提供了新的思路。
20 2
|
19天前
|
机器学习/深度学习 数据采集 人工智能
浅谈机器学习,聊聊训练过程,就酱!
本故事讲的是关于机器学习的基本概念和训练过程。通过这个故事,你将对机器学习有一个直观的了解。随后,当你翻阅关于机器学习的书籍时,也许会有不同的感受。如果你有感觉到任督二脉被打通了,那我真是太高兴了。如果没有,我再努努力 ヘ(・_|
35 0
浅谈机器学习,聊聊训练过程,就酱!
|
1月前
|
机器学习/深度学习 存储 人工智能
揭秘机器学习背后的神秘力量:如何高效收集数据,让AI更懂你?
【10月更文挑战第12天】在数据驱动的时代,机器学习广泛应用,从智能推荐到自动驾驶。本文以电商平台个性化推荐系统为例,探讨数据收集方法,包括明确数据需求、选择数据来源、编写代码自动化收集、数据清洗与预处理及特征工程,最终完成数据的训练集和测试集划分,为模型训练奠定基础。
44 3
|
1月前
|
机器学习/深度学习 算法 Python
“探秘机器学习的幕后英雄:梯度下降——如何在数据的海洋中寻找那枚失落的钥匙?”
【10月更文挑战第11天】梯度下降是机器学习和深度学习中的核心优化算法,用于最小化损失函数,找到最优参数。通过计算损失函数的梯度,算法沿着负梯度方向更新参数,逐步逼近最小值。常见的变种包括批量梯度下降、随机梯度下降和小批量梯度下降,各有优缺点。示例代码展示了如何用Python和NumPy实现简单的线性回归模型训练。掌握梯度下降有助于深入理解模型优化机制。
30 2
|
1月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
2月前
|
存储 人工智能 并行计算
Pai-Megatron-Patch:围绕Megatron-Core打造大模型训练加速生态
Pai-Megatron-Patch(https://github.com/alibaba/Pai-Megatron-Patch)是阿里云人工智能平台PAI研发的围绕Nvidia MegatronLM的大模型开发配套工具,旨在帮助开发者快速上手大模型,完成大模型(LLM)相关的高效分布式训练,有监督指令微调,下游任务评估等大模型开发链路。最近一年来,我们持续打磨Pai-Megatron-Patch的性能和扩展功能,围绕Megatron-Core(以下简称MCore)进一步打造大模型训练加速技术生态,推出更多的的训练加速、显存优化特性。
|
2月前
|
机器学习/深度学习 数据采集 监控
探索机器学习:从数据到决策
【9月更文挑战第18天】在这篇文章中,我们将一起踏上一段激动人心的旅程,穿越机器学习的世界。我们将探讨如何通过收集和处理数据,利用算法的力量来预测未来的趋势,并做出更加明智的决策。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和思考方式。
|
1月前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
34 0
|
2月前
|
机器学习/深度学习 数据采集 算法
利用未标记数据的半监督学习在模型训练中的效果评估
本文将介绍三种适用于不同类型数据和任务的半监督学习方法。我们还将在一个实际数据集上评估这些方法的性能,并与仅使用标记数据的基准进行比较。
212 8
|
2月前
|
机器学习/深度学习 Python
训练集、测试集与验证集:机器学习模型评估的基石
在机器学习中,数据集通常被划分为训练集、验证集和测试集,以评估模型性能并调整参数。训练集用于拟合模型,验证集用于调整超参数和防止过拟合,测试集则用于评估最终模型性能。本文详细介绍了这三个集合的作用,并通过代码示例展示了如何进行数据集的划分。合理的划分有助于提升模型的泛化能力。