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

Container Service for Kubernetes:vLLMモデルを推論サービスとしてデプロイする

最終更新日:Mar 04, 2025

Vectorized Large Language Model (vLLM) は、複数のモデル形式とバックエンドサービスの高速化をサポートする高性能のlarge language model (LLM) 推論ライブラリです。 vLLMは、LLMを推論サービスとしてデプロイするのに適しています。 このトピックでは、vLLMモデルを推論サービスとしてデプロイする方法について説明します。 この例では、NVIDIA V100 GPUを使用するQwen-7B-Chat-Int8モデルが使用されています。

説明

vLLMの詳細については、「vllm-project」をご参照ください。

前提条件

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

OSSバケットまたはApsara File Storage NAS (NAS) ファイルシステムを使用して、モデルデータを準備できます。 詳細については、「静的にプロビジョニングされたOSSボリュームのマウント」または「静的にプロビジョニングされたNASボリュームのマウント」をご参照ください。 この例では、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
  3. クラスターのllm-modelという名前の永続ボリューム (PV) と永続ボリューム要求 (PVC) を設定します。 詳細については、「静的にプロビジョニングされたOSSボリュームのマウント」をご参照ください。

    • 次の表に、PVの作成に使用される基本的なパラメーターを示します。

      パラメーター

      説明

      ストレージタイプ

      PVのタイプ。 この例では、OSSが選択されています。

      ボリューム名:

      PV の名前。 この例では、PVはllm-modelと名付けられています。

      アクセス証明書

      OSSバケットへのアクセスに使用されるAccessKeyペア。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。

      バケット ID:

      OSS バケットの名前。 作成したOSSバケットを選択します。

      OSSパス

      モデルが存在するパス。 例: /Qwen-7B-Chat-Int8

    • 次の表に、PVCの作成に使用される基本的なパラメーターを示します。

      パラメーター

      説明

      ボリュームタイプ

      PVCのタイプ。 この例では、OSSが選択されています。

      名前

      PVCの名前。 この例では、PVCはllm-modelと名付けられています。

      割り当てモード

      この例では、既存ボリューム が選択されています。

      既存ボリューム

      ボリュームの選択 をクリックします。 [PVの選択] ダイアログボックスで、使用するPVを見つけ、[操作] 列の [選択] をクリックします。

手順2: 推論サービスのデプロイ

  1. 次のコマンドを実行して、クラスターで使用可能なGPUリソースを照会します。

    arena top node

    推論サービスの実行に使用できるGPU高速化ノードの数が返されます。

  2. 次のコマンドを実行して、vllmという名前の推論サービスを開始します。

    arena serve kserve \
        --name=qwen \
        --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \
        --gpus=1 \
        --cpu=4 \
        --memory=12Gi \
        --data="llm-model:/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"

    下表に、各パラメーターを説明します。

    パラメーター

    必須

    説明

    -- name

    必須

    送信する推論サービスの名前。グローバルに一意です。

    -- イメージ

    必須

    推論サービスのイメージアドレス。

    -- gpus

    任意

    推論サービスによって使用されるGPUの数。 デフォルト値:0

    -- cpu

    任意

    推論サービスが使用するCPUコアの数。

    -メモリ

    任意

    推論サービスによって使用されるメモリのサイズ。

    -- データ

    任意

    推論サービスとしてデプロイされるモデルのアドレス。 この例では、モデルはllm-modelディレクトリに格納され、ポッドの /mnt/models /ディレクトリにマウントされます。

    期待される出力:

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

    を確認できます。

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

手順3: 推論サービスの検証

  1. 次のコマンドを実行して、KServeを使用してデプロイされた推論サービスのデプロイの進行状況を表示します。

    arena serve get qwen

    期待される出力:

    推論サービスのデプロイメントステータスの表示

    Name:       qwen
    Namespace:  default
    Type:       KServe
    Version:    1
    Desired:    1
    Available:  1
    Age:        2m
    Address:    http://qwen-default.example.com
    Port:       :80
    GPU:        1
    
    
    Instances:
      NAME                             STATUS   AGE  READY  RESTARTS  GPU  NODE
      ----                             ------   ---  -----  --------  ---  ----
      qwen-predictor-5485d6d8d5-kvj7g  Running  2m   1/1    0         1    cn-beijing.XX.XX.XX.XX

    上記の出力は、推論サービスがKServeを使用してデプロイされ、http://qwen-default.example.com からモデルにアクセスできることを示しています。

  2. 次のコマンドを実行して、NGINX IngressコントローラーのIPアドレスを取得し、そのIPアドレスを使用して推論サービスにアクセスします。

    # Obtain the IP address of the NGINX Ingress controller. 
    NGINX_INGRESS_IP=$(kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}')
    # Obtain the hostname of the inference service. 
    SERVICE_HOSTNAME=$(kubectl get inferenceservice qwen -o jsonpath='{.status.url}' | cut -d "/" -f 3)
    # Send a request to access the inference service. 
    curl -H "Host: $SERVICE_HOSTNAME" -H "Content-Type: application/json" http://$NGINX_INGRESS_IP:80/v1/chat/completions -d '{"model": "qwen", "messages": [{"role": "user", "content": "Perform a text."}], "max_tokens": 10, "temperature": 0.7, "top_p": 0.9, "seed": 10}

    期待される出力:

    期待出力の表示

    {"id":"cmpl-b7579597aa284f118718b22b83b726f8","object":"chat.completion","created":1715589652,"model":"qwen","choices":[{"index":0,"message":{"role":"assistant","content":"OK. What do you want to test? <|im_end|>"},"logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":10,"total_tokens":20,"completion_tokens":10}}% 

    上記の出力は、リクエストが推論サービスに正しく送信され、サービスが期待されるレスポンスをJSON形式で返すことを示しています。

ステップ4: (オプション) 推論サービスを削除する

重要

推論サービスを削除する前に、推論サービスとその関連リソースが不要になったことを確認してください。

次のコマンドを実行して、推論サービスを削除します。

arena serve delete qwen

関連ドキュメント