KServe(旧称 KFServing)は、クラウドネイティブ環境向けの AI モデルサービスおよび推論エンジンであり、自動スケーリング、スケールトゥーゼロ、カナリアデプロイをサポートします。Service Mesh (ASM) は、ACK または ACK Serverless クラスターにデプロイされた Knative Serving 機能を統合し、ワンクリックで KServe を統合できる「KServe on ASM」機能を提供します。Fluid は、ビッグデータや AI などのクラウドネイティブシナリオにおけるデータ集約型アプリケーション向けのオープンソース Kubernetes ネイティブ分散データセットオーケストレータおよびアクセラレータです。Fluid を「KServe on ASM」機能と直接統合することで、モデルロードを高速化できます。
このトピックでは、「KServe on ASM」と Fluid を統合し、Object Storage Service (OSS) をバックエンドとする AI 推論サービスをデプロイする手順を説明します。
仕組み
この統合では、以下の 3 つのコンポーネントが連携します。
Fluid は、OSS バケットからモデルファイルをクラスターノードのローカル SSD ストレージにキャッシュします。JindoRuntime カスタムリソース (CR) が分散キャッシュを管理し、DataLoad CR が推論 Pod の起動前にデータをプリフェッチします。
KServe on ASM は、永続ボリューム要求 (PVC) を介してキャッシュ済みデータを参照する InferenceService CR をデプロイします。推論コンテナは、OSS からダウンロードする代わりに、Fluid が管理するマウントポイントからモデルをロードします。
Service Mesh (ASM) は、イングレスゲートウェイ経由でトラフィックを KServe 推論サービスにルーティングします。Knative Serving が自動スケーリングおよびスケールトゥーゼロを処理します。
リクエストが到着し、Knative がゼロから Pod をスケーリングする際、モデルはすでにローカルにキャッシュされています。そのため、Pod はリモートからのダウンロードなしに起動し、予測を提供できます。
前提条件
作業を開始する前に、以下の要件を満たしていることを確認してください。
バージョン 1.17 以降の ASM インスタンスがあり、Kubernetes クラスターが追加されていること。詳細については、「ASM インスタンスの作成」および「ASM インスタンスへのクラスターの追加」をご参照ください。
以下のいずれかの Kubernetes クラスターが ASM インスタンスに追加されていること。
バージョン 1.22 以降の Container Service for Kubernetes (ACK) クラスター。GPU を使用した推論を行う場合は、
ecs.gn6i-c16g1.4xlargeなどの GPU アクセラレータ搭載ノードを含む必要があります。詳細については、「ACK マネージドクラスターの作成」または「ACK クラスターの更新」をご参照ください。バージョン 1.18 以降の ACK Serverless クラスターで、CoreDNS コンポーネントがインストール済みであること。詳細については、「ACK Serverless クラスターの作成」および「システムコンポーネントの管理」をご参照ください。
ASM インスタンスで、Istio リソースへの Kubernetes API アクセスが有効になっていること。詳細については、「データプレーンのクラスターの Kubernetes API を使用した Istio リソースへのアクセス」をご参照ください。
ingressgatewayという名前の ASM イングレスゲートウェイがあり、ポート 80 および 443 が公開されていること。詳細については、「イングレスゲートウェイの作成」をご参照ください。クラスターに Knative Serving コンポーネントがデプロイされており、「Knative on ASM」機能が有効になっていること。詳細については、「Knative on ASM を使用したサーバーレスアプリケーションのデプロイ」をご参照ください。
アクティブな OSS サブスクリプションがあり、少なくとも 1 つのバケットが作成済みであること。詳細については、「OSS の有効化」および「バケットの作成」をご参照ください。
既存の ASM インスタンスを更新する場合は、「ASM インスタンスの更新」をご参照ください。
ステップ 1:KServe on ASM の有効化
ASM コンソールにログインします。左側のナビゲーションウィンドウで、Service Mesh > メッシュ管理 を選択します。
メッシュ管理 ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、エコシステム > KServe on ASM を選択します。
KServe on ASM ページで、CertManager オプションを設定し、KServe on ASM の有効化 をクリックします。KServe は証明書のライフサイクル管理のために cert-manager に依存しています。CertManager コンポーネントは、KServe とともに自動的にインストールされます。
クラスターに CertManager がインストールされていない場合は、クラスターに CertManager コンポーネントを自動インストールする をオンにします。
クラスターに CertManager がすでにインストールされている場合は、クラスターに CertManager コンポーネントを自動インストールする をオフにします。
ステップ 2:Fluid のインストールとモデルキャッシュの設定
ack-fluid コンポーネントのインストール
データプレーンクラスターに ack-fluid コンポーネント(バージョン 0.9.10 以降)をデプロイします。
ACK クラスターの場合、クラウドネイティブ AI スイートをインストールし、ack-fluid コンポーネントをデプロイします。
クラウドネイティブ AI スイートがインストールされていない場合は、インストール時に Fluid アクセラレーション を有効にしてください。詳細については、「クラウドネイティブ AI スイートのデプロイ」をご参照ください。
クラウドネイティブ AI スイートがすでにインストールされている場合は、Container Service for Kubernetes コンソールにログインし、クラスターをクリックして、アプリケーション > クラウドネイティブ AI スイート を選択し、ack-fluid コンポーネントをデプロイします。
ack-fluid コンポーネントをインストールする前に、オープンソース版 Fluid をアンインストールしてください。両者は共存できません。
ACK Serverless クラスターの場合、「ジョブの高速化」トピックの「Fluid のコントロールプレーンコンポーネントのデプロイ」セクションをご参照ください。
AI モデルの OSS へのアップロード
このチュートリアルでは、PyTorch ベースのオープンソーストランスフォーマー LLM である BLOOM-560m モデルを使用します。
Hugging Face からモデルファイルをダウンロードします。
ファイルをご利用の OSS バケットにアップロードし、ストレージパスを記録します。
パスの形式は
oss://<bucket>/<path>です。たとえば、バケットがfluid-demoで、ファイルがmodels/bloomディレクトリにある場合、ストレージパスはoss://fluid-demo/models/bloomになります。
ファイルのアップロードには ossutil を使用してください。詳細については、「ossutil のインストール」をご参照ください。
名前空間の作成と OSS アクセスの設定
kubectl を使用してデータプレーンクラスターに接続します。詳細については、「kubectl を使用した ACK クラスターへの接続」をご参照ください。
Fluid キャッシュおよび推論ワークロード用の名前空間を作成します。
kubectl create ns kserve-fluid-demo以下の内容で
oss-secret.yamlという名前のファイルを作成します。以下のプレースホルダーを実際の値に置き換えてください。
プレースホルダー 説明 例 <your-access-key-id>OSS アクセス権を持つ Alibaba Cloud アカウントの AccessKey ID LTAI5tXxx <your-access-key-secret>アカウントの AccessKey Secret xXxXxXx apiVersion: v1 kind: Secret metadata: name: access-key stringData: fs.oss.accessKeyId: <your-access-key-id> # OSS アクセス権を持つアカウントの AccessKey ID fs.oss.accessKeySecret: <your-access-key-secret> # アカウントの AccessKey Secretシークレットを適用します。
kubectl apply -f oss-secret.yaml -n kserve-fluid-demo
Fluid でのモデルデータの宣言
Dataset CR および JindoRuntime CR を送信して、モデルデータを宣言します。Dataset はリモートストレージの場所を記述し、JindoRuntime はキャッシュシステムとその具体的な構成を設定します。
以下の内容で
oss-jindo.yamlという名前のファイルを作成します。以下のプレースホルダーを実際の値に置き換えてください。利用可能なエンドポイントの一覧については、「リージョンとエンドポイント」をご参照ください。
プレースホルダー 説明 例 <bucket>/<path>モデルファイルの OSS ストレージパス fluid-demo/models/bloom<endpoint>バケットが存在するリージョンの OSS エンドポイント oss-cn-hangzhou-internal.aliyuncs.com以下の表は、JindoRuntime 構成パラメーターの説明です。
パラメーター 値 説明 replicas2 キャッシュワーカーレプリカ数 mediumtypeSSD ローカルキャッシュのストレージメディア quota50Gi ワーカーノードごとの最大キャッシュ容量 high/low0.95 / 0.7 キャッシュエビクションのウォーターマーク(high でエビクションがトリガーされ、low がターゲット値) cleanPolicyOnDemand Fuse サイドカーのクリーンアップポリシー Dataset および JindoRuntime をデプロイします。
kubectl create -f oss-jindo.yaml -n kserve-fluid-demoデプロイメントを確認します。
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 3mDataset の
PHASEがBound、JindoRuntime のFUSE PHASEがReadyと表示されれば、正常にデプロイされています。
モデルデータのプリフェッチ
プリフェッチにより、推論 Pod の起動前にモデルファイルがローカルキャッシュにロードされるため、Pod 起動時のリモートダウンロード遅延がなくなります。
以下の内容で
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: 2DataLoad をデプロイします。
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次のステップに進む前に、
PHASEがCompleteになるまで待ちます。
ステップ 3:推論サービスのデプロイ
ご利用のクラスタータイプに応じた InferenceService 構成で
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" - name: GPU_ENABLED value: "True" # GPU を使用しない場合は "False" に設定してください。ACK Serverless クラスター
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" # 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" - name: GPU_ENABLED value: "True" # GPU を使用しない場合は "False" に設定してください。以下の表は、InferenceService パラメーターの説明です。
パラメーター 値 説明 imageregistry.cn-hangzhou.aliyuncs.com/acs/kserve-fluid:bloom-gpuモデルロードおよび推論インターフェイスを備えたサンプルイメージ。カスタマイズする場合は、「KServe Fluid Docker サンプル STORAGE_URIpvc://oss-data/bloom-560mFluid 管理キャッシュを指す PVC ベースのストレージ URI MODEL_NAMEbloom予測 API エンドポイントで使用されるモデル名 GPU_ENABLEDTrueGPU を使用しない場合は Falseに設定します。resources12 CPU、48 GiB メモリ BLOOM-560m モデル用のリソース割り当て。モデルサイズおよびクラスター容量に応じて調整してください。 推論サービスをデプロイします。
kubectl create -f oss-fluid-isvc.yaml -n kserve-fluid-demoデプロイメントを確認します。
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 2dREADYがTrueと表示されれば、推論サービスが正常に動作しています。
ステップ 4:予測リクエストの送信
ASM イングレスゲートウェイのアドレスを取得します。
ASM コンソールにログインします。左側のナビゲーションウィンドウで、Service Mesh > メッシュ管理 を選択します。
メッシュ管理 ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、ASM ゲートウェイ > イングレスゲートウェイ を選択します。
ingressgateway の サービスアドレス セクションで、サービスアドレスをコピーします。
テストリクエストを送信します。以下のコマンド中の
<gateway-address>を、前のステップで取得したアドレスに置き換えてください。curl -v \ -H "Content-Type: application/json" \ -H "Host: fluid-bloom.kserve-fluid-demo.example.com" \ "http://<gateway-address>: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 > Content-Type: application/json > < HTTP/1.1 200 OK < content-type: application/json < server: istio-envoy < { "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" }200 OK応答とともに生成されたテキストが返されれば、推論サービスが正常に動作しています。
クリーンアップ
このチュートリアルで作成したすべてのリソースを削除するには、以下のコマンドを順番に実行します。
kubectl delete inferenceservice fluid-bloom -n kserve-fluid-demo
kubectl delete dataload oss-dataload -n kserve-fluid-demo
kubectl delete dataset oss-data -n kserve-fluid-demo
kubectl delete jindoruntime oss-data -n kserve-fluid-demo
kubectl delete secret access-key -n kserve-fluid-demo
kubectl delete ns kserve-fluid-demo