KServe(旧称 KFServing)は、クラウドネイティブ環境向けの AI モデルサービスおよび推論エンジンです。自動スケーリング、スケールツーゼロ、カナリアデプロイメントをサポートしています。 サービスメッシュ(ASM)は、コンテナサービス Kubernetes 版(ACK)クラスターまたはサーバーレス Kubernetes(ASK)クラスターのいずれかにデプロイされた Knative Serving コンポーネントの機能を統合します。 さらに、ASM は ASM 上の KServe 機能を提供し、数回クリックするだけで KServe と ASM を統合して AI サービングを実現できます。 Fluid は、ビッグデータアプリケーションや AI アプリケーションなどのクラウドネイティブシナリオにおけるデータ集約型アプリケーション向けの、オープンソースの Kubernetes ネイティブ分散データセットオーケストレーターおよびアクセラレーターです。 Fluid を ASM 上の KServe 機能と直接統合して、モデルの読み込みを高速化できます。 このトピックでは、Fluid と ASM 上の KServe 機能を統合して、データアクセスを高速化する AI サービングを実装する方法について説明します。
前提条件
バージョン 1.17 以降の ASM インスタンスが作成され、Kubernetes クラスターが ASM インスタンスに追加されています。 詳細については、「ASM インスタンスの作成」および「ASM インスタンスへのクラスターの追加」をご参照ください。
説明ASM インスタンスの更新方法の詳細については、「ASM インスタンスの更新」をご参照ください。
Kubernetes クラスターの場合:
ACK クラスターを使用する場合、クラスターのバージョンは 1.22 以降である必要があります。 詳細については、「ACK マネージドクラスターの作成」または「ACK クラスターの更新」をご参照ください。 AI サービングにグラフィック処理装置(GPU)を使用する場合は、ACK クラスターに ecs.gn6i-c16g1.4xlarge などの GPU アクセラレーションノードが含まれていることを確認してください。
ASK クラスターを使用する場合、クラスターのバージョンは 1.18 以降である必要があり、CoreDNS コンポーネントがクラスターにインストールされている必要があります。 詳細については、「ACK Serverless クラスターの作成」および「システムコンポーネントの管理」をご参照ください。
データプレーン上のクラスターの Kubernetes API を使用して Istio リソースにアクセスする機能が、ASM インスタンスで有効になっています。 詳細については、「データプレーン上のクラスターの Kubernetes API を使用して Istio リソースにアクセスする」をご参照ください。
クラスターのイングレスゲートウェイが作成されています。 この例では、クラスターの ASM イングレスゲートウェイが作成されます。 ASM イングレスゲートウェイはデフォルト名 ingressgateway を使用し、ポート 80 と 443 が公開されます。 詳細については、「イングレスゲートウェイの作成」をご参照ください。
Knative Serving コンポーネントが ACK または ASK クラスターにデプロイされ、ASM 上の Knative 機能が有効になっています。 詳細については、「ASM 上の Knative を使用してサーバーレスアプリケーションをデプロイする」をご参照ください。
オブジェクトストレージサービス(OSS)がアクティブ化され、バケットが作成されています。 詳細については、「OSS のアクティブ化」および「バケットの作成」をご参照ください。
手順 1:ASM 上の KServe 機能を有効にする
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。
ASM 上の KServeクラスターに Certmanager コンポーネントを自動的にインストールするASM で KServe を有効にする ページで、 スイッチをオンまたはオフにして、 をクリックします。
cert-manager は、証明書の発行とデプロイに使用できる証明書ライフサイクル管理システムです。 ASM 上の KServe 機能のデプロイと使用は、CertManager コンポーネントに依存します。 KServe をインストールすると、CertManager コンポーネントが自動的にインストールされます。
クラスターに CertManager をインストールしていない場合は、[クラスターに Certmanager コンポーネントを自動的にインストールする] をオンにします。
データプレーン上のクラスターに CertManager をインストール済みの場合は、[クラスターに Certmanager コンポーネントを自動的にインストールする] をオフにします。
手順 2:ack-fluid コンポーネントをインストールし、AI モデルのキャッシュと高速化を有効にする
バージョン 0.9.10 以降の ack-fluid コンポーネントをクラスターにデプロイします。
データプレーン上のクラスターが ACK クラスターの場合は、クラウドネイティブ AI スイートをインストールし、ack-fluid コンポーネントをクラスターにデプロイします。
説明オープンソースの Fluid をインストールしている場合は、ack-fluid コンポーネントをインストールする前にアンインストールする必要があります。
クラウドネイティブ AI スイートをインストールしていない場合は、スイートをインストールするときに [fluid アクセラレーション] を有効にします。 詳細については、「クラウドネイティブ AI スイートのデプロイ」をご参照ください。
クラウドネイティブ AI スイートをすでにインストールしている場合は、ACK コンソール にログインし、目的のクラスターをクリックして、 を選択し、[ack-fluid] コンポーネントをデプロイします。
データプレーン上のクラスターが ASK クラスターの場合は、ack-fluid コンポーネントをクラスターにデプロイします。 詳細については、「ジョブの高速化」トピックの「Fluid のコントロールプレーンコンポーネントのデプロイ」セクションをご参照ください。
AI モデルを準備し、OSS バケットにアップロードします。
AI SavedModel を準備します。
このトピックでは、PyTorch ベースのオープンソースの Transformer 大規模言語モデル(LLM)である BLOOM モデルを使用します。 モデルデータの詳細については、Hugging Face をご参照ください。
ダウンロードしたモデルデータファイルを OSS バケットにアップロードし、モデルデータファイルの格納場所を記録します。
格納場所の形式は、
oss://{bucket}/{path}
です。 たとえば、fluid-demo という名前のバケットを作成し、すべてのモデルデータファイルをバケットのmodels/bloom
ディレクトリにアップロードする場合、モデルデータファイルの格納場所はoss://fluid-demo/models/bloom
です。説明OSS が提供する ossutil ツールを使用してデータをアップロードできます。 詳細については、「ossutil のインストール」をご参照ください。
Fluid キャッシュと AI サービングをデプロイするための名前空間を作成し、OSS アクセス権限を設定します。
kubectl を使用して、データプレーン上のクラスターに接続します。 詳細については、「kubectl を使用して ACK クラスターに接続する」をご参照ください。
次のコマンドを実行して、Fluid キャッシュと KServe ベースの AI サービングをデプロイするための
kserve-fluid-demo
という名前の名前空間を作成します。kubectl create ns kserve-fluid-demo
oss-secret.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
fs.oss.accessKeyId
は、OSS にアクセスできるアカウントの AccessKey ID で、fs.oss.accessKeySecret
はアカウントの AccessKey シークレットです。apiVersion: v1 kind: Secret metadata: name: access-key stringData: fs.oss.accessKeyId: xxx # OSS にアクセスできる Alibaba Cloud アカウントの AccessKey ID に置き換えます。 fs.oss.accessKeySecret: xxx # Alibaba Cloud アカウントの AccessKey シークレットに置き換えます。
次のコマンドを実行して、OSS AccessKey ペアを適用します。
kubectl apply -f oss-secret.yaml -n kserve-fluid-demo
Fluid でアクセスする AI モデルデータを宣言します。
Dataset カスタムリソース(CR)と JindoRuntime CR を送信する必要があります。 Dataset CR は、外部ストレージシステム内のデータの URL を記述します。 JindoRuntime CR は、キャッシュシステムとその具体的な構成を記述します。
oss-jindo.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
Dataset CR では、
oss://{bucket}/{path}
を 手順 2.b で記録したモデルデータファイルの格納場所に置き換え、{endpoint}
を OSS へのアクセスに使用できるエンドポイントに置き換えます。 さまざまなリージョンで OSS にアクセスするために使用できるエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。次のコマンドを実行して、Dataset CR と JindoRuntime CR をデプロイします。
kubectl create -f oss-jindo.yaml -n kserve-fluid-demo
次のコマンドを実行して、Dataset CR と JindoRuntime CR のデプロイを確認します。
kubectl get jindoruntime,dataset -n kserve-fluid-demo
予期される出力:
NAME MASTER PHASE WORKER PHASE FUSE PHASE AGE jindoruntime.data.fluid.io/oss-data Ready Ready Ready 3m NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE dataset.data.fluid.io/oss-data 3.14GiB 0.00B 100.00GiB 0.0% Bound 3m
出力は、Dataset CR の
PHASE
がBound
で、JindoRuntime CR のFUSE PHASE
がReady
であることを示しています。 これは、Dataset CR と JindoRuntime CR がデプロイされていることを示しています。
Fluid でデータをプリフェッチして、データアクセス性能を向上させます。
oss-dataload.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: data.fluid.io/v1alpha1 kind: DataLoad metadata: name: oss-dataload spec: dataset: name: oss-data namespace: kserve-fluid-demo target: - path: /bloom-560m replicas: 2
次のコマンドを実行して、Dataload をデプロイし、データをプリフェッチします。
kubectl create -f oss-dataload.yaml -n kserve-fluid-demo
次のコマンドを実行して、データプリフェッチの進捗状況をクエリします。
kubectl get dataload -n kserve-fluid-demo
予期される出力:
NAME DATASET PHASE AGE DURATION oss-dataload oss-data Complete 1m 45s
出力は、データプリフェッチに約
45 秒
かかることを示しています。 データがプリフェッチされるまで待つ必要があります。
手順 3:AI モデルに基づいて推論サービスをデプロイする
クラスターに基づいて oss-fluid-isvc.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
ACK クラスター
apiVersion: "serving.kserve.io/v1beta1" kind: "InferenceService" metadata: name: "fluid-bloom" spec: predictor: timeout: 600 minReplicas: 0 containers: - name: kserve-container image: registry.cn-hangzhou.aliyuncs.com/acs/kserve-fluid:bloom-gpu resources: limits: cpu: "12" memory: 48Gi nvidia.com/gpu: 1 # GPU を使用する場合は、必要な GPU の数に設定します。そうでない場合は、値を設定する必要はありません。 requests: cpu: "12" memory: 48Gi env: - name: STORAGE_URI value: "pvc://oss-data/bloom-560m" - name: MODEL_NAME value: "bloom" # GPU を使用する場合は、このパラメーターを True に設定します。そうでない場合は、このパラメーターを False に設定します。 - name: GPU_ENABLED value: "True"
ASK クラスター
apiVersion: "serving.kserve.io/v1beta1" kind: "InferenceService" metadata: name: "fluid-bloom" labels: alibabacloud.com/fluid-sidecar-target: "eci" annotations: k8s.aliyun.com/eci-use-specs : "ecs.gn6i-c16g1.4xlarge" # 使用する Elastic Compute Service(ECS)インスタンスの仕様に置き換えます。 knative.aliyun.com/reserve-instance-eci-use-specs: "ecs.gn6i-c16g1.4xlarge" # 使用する ECS インスタンスの仕様に置き換えます。 spec: predictor: timeout: 600 minReplicas: 0 containers: - name: kserve-container image: registry.cn-hangzhou.aliyuncs.com/acs/kserve-fluid:bloom-gpu resources: limits: cpu: "12" memory: 48Gi requests: cpu: "12" memory: 48Gi env: - name: STORAGE_URI value: "pvc://oss-data/bloom-560m" - name: MODEL_NAME value: "bloom" # GPU を使用する場合は、このパラメーターを True に設定します。そうでない場合は、このパラメーターを False に設定します。 - name: GPU_ENABLED value: "True"
説明このトピックでは、LLM を使用します。 したがって、12 コアと 48 GiB のリソースが適用されます。 クラスターの負荷に基づいて、
InferenceService
のresources
フィールドを変更します。この例では、
image
フィールドはregistry.cn-hangzhou.aliyuncs.com/acs/kserve-fluid:bloom-gpu
サンプルイメージに設定されています。 このイメージは、モデルと推論サービスを読み込むためのインターフェースを提供します。 このサンプルイメージのコードは、KServe オープンソースコミュニティで表示し、イメージをカスタマイズできます。 詳細については、Docker をご参照ください。
次のコマンドを実行して、AI モデルに基づいて推論サービスをデプロイします。
kubectl create -f oss-fluid-isvc.yaml -n kserve-fluid-demo
次のコマンドを実行して、AI モデルに基づいて推論サービスのデプロイを確認します。
kubectl get inferenceservice -n kserve-fluid-demo
予期される出力:
NAME URL READY PREV LATEST PREVROLLEDOUTREVISION LATESTREADYREVISION AGE fluid-bloom http://fluid-bloom.kserve-fluid-demo.example.com True 100 fluid-bloom-predictor-00001 2d
出力では、
READY
フィールドはTrue
です。これは、AI モデルに基づく推論サービスがデプロイされていることを示しています。
手順 4:AI モデルに基づく推論サービスにアクセスする
ASM イングレスゲートウェイのアドレスを取得します。
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。
サービスアドレスイングレスゲートウェイ の セクションで、ASM ゲートウェイのサービスアドレスを表示して取得します。
次のコマンドを実行して、サンプル AI モデルに基づく推論サービス fluid-bloom にアクセスし、ASM ゲートウェイのサービスアドレスを サブステップ 1 で取得したアドレスに置き換えます。
curl -v -H "Content-Type: application/json" -H "Host: fluid-bloom.kserve-fluid-demo.example.com" "http://{ASM ゲートウェイのサービスアドレス}:80/v1/models/bloom:predict" -d '{"prompt": "It was a dark and stormy night", "result_length": 50}'
予期される出力:
* Trying xxx.xx.xx.xx :80... * Connected to xxx.xx.xx.xx (xxx.xx.xx.xx ) port 80 (#0) > POST /v1/models/bloom:predict HTTP/1.1 > Host: fluid-bloom-predictor.kserve-fluid-demo.example.com > User-Agent: curl/7.84.0 > Accept: */* > Content-Type: application/json > Content-Length: 65 > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < content-length: 227 < content-type: application/json < date: Thu, 20 Apr 2023 09:49:00 GMT < server: istio-envoy < x-envoy-upstream-service-time: 1142 < { "result": "It was a dark and stormy night, and the wind was blowing in the\ndirection of the west. The wind was blowing in the direction of the\nwest, and the wind was blowing in the direction of the west. The\nwind was" } * Connection # 0 to host xxx.xx.xx.xx left intact
出力は、AI モデルに基づく推論サービスがサンプル入力を更新し、推論結果が返されることを示しています。