すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:KServeでFluidを使用してモデルのデータプルを高速化する

最終更新日:Mar 06, 2025

技術の発展に伴い、AIアプリケーションのモデルで使用されるファイルのサイズはますます大きくなります。 ただし、これらの大きなファイルがObject storage Service (OSS) やApsara File Storage NAS (NAS) などのストレージサービスから取得されると、長いレイテンシとコールドスタートの問題が発生する可能性があります。 Fluidを使用すると、モデルのファイルプルを高速化し、推論サービス、特にKServeを使用してデプロイされた推論サービスのパフォーマンスを最適化できます。 このトピックでは、KServeでFluidを使用してモデルを高速化する方法について説明します。 この例では、NVIDIA V100 GPUを使用するQwen-7B-Chat-Int8モデルが使用されています。

前提条件

  • ContainerOSオペレーティングシステムを実行していないContainer Service for Kubernetes (ACK) Proクラスターが作成されます。 ACK ProクラスターはKubernetes 1.22以降を実行し、少なくとも3つのノードを含みます。 各ノードには、少なくとも3 GBの空きメモリが必要です。 詳細については、「ACK Proクラスターの作成」をご参照ください。

  • クラウドネイティブAIスイートがインストールされ、ack-fluidコンポーネントがデプロイされます。 詳細については、「クラウドネイティブ AI スイートをデプロイする」をご参照ください。

  • バージョン0.9.15以降のArenaクライアントがインストールされています。 詳細については、「Arenaクライアントの設定」をご参照ください。

  • ack-kserveコンポーネントがインストールされています。 詳細については、「ack-kserveのインストール」をご参照ください。

  • OSSが有効化されています。 詳細については、「OSSの有効化」をご参照ください。

ステップ1: モデルデータを準備し、モデルデータをOSSバケットにアップロードする

  1. モデルをダウンロードします。 この例では、Qwen-7B-Chat-Int8モデルが使用される。

    1. 次のコマンドを実行してGitをインストールします。

      sudo yum install git
    2. 次のコマンドを実行して、LFS (Large File Support) プラグインをインストールします。

      sudo yum install git-lfs
    3. 次のコマンドを実行して、Qwen-7B-Chat-Int8リポジトリをModelScopeコミュニティからローカルホストに複製します。

      GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat-Int8.git
    4. 次のコマンドを実行して、Qwen-7B-Chat-Int8リポジトリが格納されているディレクトリに移動します。

      cd Qwen-7B-Chat-Int8
    5. 次のコマンドを実行して、Qwen-7B-Chat-Int8リポジトリが格納されているディレクトリからLFSで管理されている大きなファイルをダウンロードします。

      git lfs pull
  2. ダウンロードしたQwen-7B-Chat-Int8ファイルをOSSバケットにアップロードします。

    1. OSSコンソールにログインし、作成したOSSバケットの名前を表示および記録します。

      OSSバケットの作成方法の詳細については、「バケットの作成」をご参照ください。

    2. ossutilをインストールして構成します。 詳細については、「ossutil のインストール」をご参照ください。

    3. 次のコマンドを実行して、OSSバケットにQwen-7B-Chat-Int8という名前のディレクトリを作成します。

      ossutil mkdir oss://<your-bucket-name>/Qwen-7B-Chat-Int8
    4. 次のコマンドを実行して、モデルファイルをOSSバケットにアップロードします。

      ossutil cp -r ./Qwen-7B-Chat-Int8 oss://<Your-Bucket-Name>/Qwen-7B-Chat-Int8

ステップ2: データセットとJindoRuntimeの作成

データセットを使用して、データを効率的に整理および処理できます。 JindoRuntimeは、データキャッシュポリシーに基づいてデータアクセスをさらに高速化できます。 データセットとJindoRuntimeを一緒に使用して、データ処理とモデルのパフォーマンスを大幅に向上させることができます。

  1. 次のコマンドを実行して、OSSバケットへのアクセスに使用されるAccessKeyペアを保存するシークレットを作成します。

    kubectl apply -f-<<EOF                                            
    apiVersion: v1
    kind: Secret
    metadata:
      name: oss-secret
    stringData:
      fs.oss.accessKeyId: <YourAccessKey ID>
      fs.oss.accessKeySecret: <YourAccessKey Secret>
    EOF

    上記のコードでは、fs.oss.accessKeyIdパラメーターはAccessKey IDを指定し、fs.oss.accessKeySecretパラメーターはAccessKey secretを指定します。 AccessKeyペアを取得する方法の詳細については、「AccessKeyペアの取得」をご参照ください。

    期待される出力:

    secret/oss-secret created
  2. resource.yamlという名前のファイルを作成し、次の内容をファイルにコピーしてデータセットとJindoRuntimeを作成します。 データセットとJindoRuntimeを設定する方法の詳細については、「JindoFSを使用したOSSへのアクセスの高速化」をご参照ください。

    • データセットは、リモートストレージ内のデータセットおよび基になるファイルシステム (UFS) に関する情報を指定するために使用されます。

    • JindoRuntimeは、データキャッシュ用のJindoFSクラスターを開始するために使用されます。

    resource.yamlファイルのコンテンツの表示

    apiVersion: data.fluid.io/v1alpha1
    kind: Dataset
    metadata:
      name: qwen-7b-chat-int8
    spec:
      mounts:
        - mountPoint: oss://<oss_bucket>/Qwen-7b-chat-Int8 # Replace the value with the actual storage address of the model. 
          options:
            fs.oss.endpoint: <oss_endpoint> # Replace the value with the actual endpoint of the OSS bucket. 
          name: models
          path: "/"
          encryptOptions:
            - name: fs.oss.accessKeyId
              valueFrom:
                secretKeyRef:
                  name: oss-secret
                  key: fs.oss.accessKeyId
            - name: fs.oss.accessKeySecret
              valueFrom:
                secretKeyRef:
                  name: oss-secret
                  key: fs.oss.accessKeySecret
    ---
    apiVersion: data.fluid.io/v1alpha1
    kind: JindoRuntime
    metadata:
      name: qwen-7b-chat-int8 # The name must be the same as that of the dataset. 
    spec:
      replicas: 3
      tieredstore:
        levels:
          - mediumtype: MEM # Use memory to cache data. 
            volumeType: emptyDir
            path: /dev/shm
            quota: 3Gi # The cache capacity that a worker replica can provide. 
            high: "0.95"
            low: "0.7"
      fuse:
        resources:
          requests:
            memory: 2Gi
        properties:
          fs.oss.download.thread.concurrency: "200"
          fs.oss.read.buffer.size: "8388608"
          fs.oss.read.readahead.max.buffer.count: "200"
          fs.oss.read.sequence.ambiguity.range: "2147483647"
  3. 次のコマンドを実行して、データセットとJindoRuntimeを作成します。

    kubectl apply -f resource.yaml

    期待される出力:

    dataset.data.fluid.io/qwen-7b-chat-int8 created
    jindoruntime.data.fluid.io/qwen-7b-chat-int8 created

手順3: vLLMモデルを推論サービスとしてデプロイする

  1. 次のコマンドを実行して、KServeベースの推論サービスをデプロイします。

    次のサンプルコードでは、Vetorized Large Language model (vLLM) とKServeを使用して、Qwen-7B-Chat-Int8モデルを推論サービスとしてデプロイします。

    arena serve kserve \
        --name=qwen-fluid \
        --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \
        --gpus=1 \
        --cpu=4 \
        --memory=12Gi \
        --data="qwen-7b-chat-int8:/mnt/models/Qwen-7B-Chat-Int8" \
        "python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen-7B-Chat-Int8 --gpu-memory-utilization 0.95 --quantization gptq --max-model-len=6144"

    期待される出力:

    inferenceservice.serving.kserve.io/qwen-fluid created
    INFO[0002] The Job qwen-fluid has been submitted successfully 
    INFO[0002] You can run `arena serve get qwen-fluid --type kserve -n default` to check the job status 

    を確認できます。

    期待される出力は、推論サービスがデプロイされていることを示します。

ステップ4: データプル加速の結果を確認する

  1. 次のコマンドを実行して、データセットに関する情報を表示します。

    kubectl get dataset qwen-7b-chat-int8

    期待される出力:

    NAME                UFS TOTAL SIZE   CACHED     CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    qwen-7b-chat-int8   17.01GiB         10.46MiB   18.00GiB         0.1%                Bound   23h

  2. 次のコマンドを実行して、アプリケーションサーバーの準備が整うまでの時間を確認します。

    # Filter pods whose names contain qwen-fluid from all pods, extract the pod names, and assign the extracted pod names to the POD_NAME variable. 
    POD_NAME=$(kubectl get po |grep qwen-fluid|awk -F " " '{print $1}')
    Check the amount of time that is consumed until the application server is ready.
    kubectl logs $POD_NAME |grep -i "server ready takes"

    期待される出力:

    server ready takes 25.875763 s

    出力は、Fluidを使用してデータプルを高速化した後、アプリケーションサーバーの準備が整うまで25.875763秒が消費されることを示しています。 アクセラレーションの効果は、アプリケーション、データセットサイズ、環境設定によって異なります。 このトピックで提供されるデータは参照用です。

    JindoRuntimeに基づくアクセラレーション効果の詳細については、「JindoFSを使用してOSSへのアクセスを加速する」トピックの手順3: データアクセラレーションをテストするアプリケーションの作成セクションを参照してください。

関連ドキュメント

Fluidの詳細については、「Fluidの概要」をご参照ください。