サーバーレスシナリオでは、Fluid が JindoRuntime を使用して Object Storage Service (OSS) へのアクセスを最適化します。Fluid はキャッシュモードとキャッシュなしモードの両方をサポートしています。本トピックでは、キャッシュなしモードを用いた Argo ジョブ向けデータアクセスの高速化方法について説明します。
前提条件
-
Argo または ack-workflow コンポーネントがインストール済みである必要があります。詳細については、「Argo」または「Argo Workflows」をご参照ください。
-
ACK 仮想ノードがデプロイ済みである必要があります。詳細については、「ECI への Pod のスケジュール設定」をご参照ください。
Container Service for Kubernetes (ACK) Pro マネージドクラスター(non-containerOS)が作成済みであり、クラスターの Kubernetes バージョンが 1.18 以降である必要があります。詳細については、「ACK Pro マネージドクラスターの作成」をご参照ください。
重要ack-fluid コンポーネントは、現在 ContainerOS 上ではサポートされていません。
-
クラウドネイティブ AI スイートがインストール済みであり、ack-fluid コンポーネントがデプロイ済みである必要があります。
重要オープンソース版 Fluid が既にインストールされている場合は、ack-fluid コンポーネントをデプロイする前にアンインストールしてください。
-
クラウドネイティブ AI スイートが未インストールの場合:データキャッシュ高速化を有効にするために、Fluid データアクセラレーション をデプロイします。詳細については、「クラウドネイティブ AI スイートのインストール」をご参照ください。
-
クラウドネイティブ AI スイートがインストールされている場合:[ack-fluid] を [クラウドネイティブ AI コンポーネントセット] ページの Container Service 管理コンソール にデプロイします。
-
-
kubectl を使用して Kubernetes クラスターに接続済みである必要があります。詳細については、「kubectl を使用したクラスターへの接続」をご参照ください。
-
Alibaba Cloud Object Storage Service (OSS) が有効化済みであり、バケットが作成済みである必要があります。詳細については、「OSS の有効化」および「コンソールでのバケットの作成」をご参照ください。
制限事項
本機能は ACK のエラスティックスケジューリング機能と相互排他です。ACK のエラスティックスケジューリング機能の詳細については、「優先度に基づくリソーススケジューリングの設定」をご参照ください。
手順 1:テストデータセットを OSS バケットにアップロード
サイズ 2 GB のテストデータセットを作成します。本例では、テスト データセットを使用します。
作成済みの OSS バケットにテストデータセットをアップロードします。
OSS が提供する ossutil ツールを使用してデータをアップロードできます。詳細については、「ossutil のインストール」をご参照ください。
手順 2:Dataset および JindoRuntime の作成
ACK クラスターおよび OSS バケットの準備が完了したら、Dataset および JindoRuntime をデプロイします。このデプロイには数分程度かかります。
以下の内容に基づいて、secret.yaml という名前のファイルを作成します。
このファイルには、OSS バケットへのアクセスに使用される
fs.oss.accessKeyIdおよびfs.oss.accessKeySecretが含まれます。apiVersion: v1 kind: Secret metadata: name: access-key stringData: fs.oss.accessKeyId: **** fs.oss.accessKeySecret: ****以下のコマンドを実行して Secret をデプロイします:
kubectl create -f secret.yaml以下の内容に基づいて、resource.yaml という名前のファイルを作成します。
この YAML ファイルには、以下の情報が格納されます:
Dataset:リモートデータストアに格納された Dataset および UNIX ファイルシステム(UFS)の情報を指定します。JindoRuntime:クラスター内でのデータキャッシュに JindoFS を有効化します。
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: serverless-data spec: mounts: - mountPoint: oss://large-model-sh/ name: demo path: / options: fs.oss.endpoint: oss-cn-shanghai.aliyuncs.com encryptOptions: - name: fs.oss.accessKeyId valueFrom: secretKeyRef: name: access-key key: fs.oss.accessKeyId - name: fs.oss.accessKeySecret valueFrom: secretKeyRef: name: access-key key: fs.oss.accessKeySecret accessModes: - ReadWriteMany --- apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: serverless-data spec: master: disabled: true worker: disabled: true上記コードブロックで指定されたパラメーターの一部について、以下の表に説明を示します。
パラメーター
説明
mountPointUFS ファイルシステムをマウントするパス。パスの形式は
oss://<oss_bucket>/<bucket_dir>です。パス内にエンドポイント情報を含めないでください。
<bucket_dir>は、バケットに直接アクセス可能な場合に省略可能です。fs.oss.endpointOSS バケットのパブリックエンドポイントまたはプライベートエンドポイント。
データセキュリティを強化するために、バケットのプライベートエンドポイントを指定できます。ただし、プライベートエンドポイントを指定する場合は、ACK クラスターが OSS が有効化されているリージョンにデプロイされていることを確認してください。たとえば、OSS バケットが中国 (杭州) リージョンに作成されている場合、そのパブリックエンドポイントは
oss-cn-hangzhou.aliyuncs.com、プライベートエンドポイントはoss-cn-hangzhou-internal.aliyuncs.comとなります。fs.oss.accessKeyIdバケットへのアクセスに使用する AccessKey ID。
fs.oss.accessKeySecretバケットへのアクセスに使用する AccessKey Secret。
accessModesアクセスモード。有効な値は
ReadWriteOnce、ReadOnlyMany、ReadWriteMany、およびReadWriteOncePodです。デフォルト値はReadOnlyManyです。disabledmaster ノードおよび worker ノードの両方でこのパラメーターを
trueに設定すると、キャッシュなしモードが使用されます。以下のコマンドを実行して Dataset および JindoRuntime をデプロイします:
kubectl create -f resource.yaml以下のコマンドを実行して、Dataset が正しくデプロイされたかを確認します:
kubectl get dataset serverless-data期待される出力:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE serverless-data Bound 1d出力の
BoundがPHASE列に表示される場合、Dataset が正常にデプロイされたことを示します。以下のコマンドを実行して、JindoRuntime が正しくデプロイされたかを確認します:
kubectl get jindo serverless-data期待される出力:
NAME MASTER PHASE WORKER PHASE FUSE PHASE AGE serverless-data Ready 3m41s出力の
ReadyがFUSE列に表示される場合、JindoRuntime が正常にデプロイされたことを示します。
手順 3:OSS へのアクセスを行う Argo ジョブの作成
JindoFS 加速サービスを利用するには、アプリケーションコンテナを作成するか、機械学習ジョブを送信します。本トピックでは、OSS にアクセスする Argo ジョブを例として使用します。
-
以下の内容で workflow.yaml という名前のファイルを作成します。
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: serverless-workflow- spec: entrypoint: serverless-workflow-example volumes: - name: datadir persistentVolumeClaim: claimName: serverless-data templates: - name: serverless-workflow-example steps: - - name: copy template: copy-files - - name: check template: check-files - name: copy-files metadata: labels: alibabacloud.com/fluid-sidecar-target: eci alibabacloud.com/eci: "true" annotations: k8s.aliyun.com/eci-use-specs: ecs.g7.4xlarge container: image: debian:buster command: [bash, -c] args: ["time cp -r /data/ /tmp"] volumeMounts: - name: datadir mountPath: /data - name: check-files metadata: labels: alibabacloud.com/fluid-sidecar-target: eci alibabacloud.com/eci: "true" annotations: k8s.aliyun.com/eci-use-specs: ecs.g7.4xlarge container: image: debian:buster command: [bash, -c] args: ["du -sh /data; md5sum /data/*"] volumeMounts: - name: datadir mountPath: /data -
以下のコマンドを実行してワークフローを作成します。
kubectl create -f workflow.yaml -
以下のコマンドを実行して起動ログを表示します。
kubectl logs serverless-workflow-85sbr-4093682611期待される出力:
real 0m24.966s user 0m0.009s sys 0m0.677s出力から、ファイルコピー時間(
real)が0m24.966sであることがわかります。このコピー時間はネットワーク遅延および帯域幅に依存します。データアクセスをさらに高速化するには、「キャッシュモードを用いた Argo ジョブ向けデータアクセスの高速化」をご参照ください。 -
Fluid によって読み込まれたファイルがローカルファイルと一致しているかを確認します。
-
以下のコマンドを実行して、Fluid によって読み込まれたファイルの MD5 検証値を表示します。
kubectl logs serverless-workflow-85sbr-1882013783期待される出力:
1.2G /data 871734851bf7d8d2d1193dc5f1f692e6 /data/wwm_uncased_L-24_H-1024_A-16.zip -
以下のコマンドを実行して、ローカルファイルの MD5 検証値を表示します。
md5sum ./wwm_uncased_L-24_H-1024_A-16.zip期待される出力:
871734851bf7d8d2d1193dc5f1f692e6 ./wwm_uncased_L-24_H-1024_A-16.zip出力から、MD5 検証値が同一であることが確認できます。これは、Fluid によって読み込まれたファイルがローカルファイルと一致していることを示します。
-
手順 4:環境のクリーンアップ
データアクセス機能を今後使用しない場合は、速やかに環境をクリーンアップしてください。そのためには、以下の手順を実行します:
-
以下のコマンドを実行してアプリケーションコンテナを削除します。
kubectl delete workflow serverless-workflow-85sbr -
以下のコマンドを実行して Dataset を削除します。
kubectl delete dataset serverless-data