【数据湖加速篇】 —— 如何利用缓存加速服务来提升数据湖上机器学习训练速度
簡介:?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的部署方式。我們需要修改以下配置項:
通過這些配置項,我們創建了一個名為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 143m2.在宿主機上訪問/mnt/jfs/目錄,即等同于訪問JindoFS的文件
ls /mnt/jfs/test/ 15885689452274647042-0 17820745254765068290-0 entrypoint.sh3.安裝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的緩存加速服務,只需要讀取一遍數據,大部分的熱數據將緩存到本地內存或磁盤,深度學習的訓練速度可以得到顯著提高。對于大部分訓練,我們還可以使用預加載的方式先將數據加載到緩存中,來加快下一次訓練的速度。
?
?
原文鏈接
 本文為阿里云原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的【数据湖加速篇】 —— 如何利用缓存加速服务来提升数据湖上机器学习训练速度的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 可观测告警运维系统调研——SLS告警与多
- 下一篇: 揭秘!信息检索技术高端玩法
