技術の発展に伴い、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バケットにアップロードする
モデルをダウンロードします。 この例では、Qwen-7B-Chat-Int8モデルが使用される。
次のコマンドを実行してGitをインストールします。
sudo yum install git次のコマンドを実行して、LFS (Large File Support) プラグインをインストールします。
sudo yum install git-lfs次のコマンドを実行して、Qwen-7B-Chat-Int8リポジトリをModelScopeコミュニティからローカルホストに複製します。
GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat-Int8.git次のコマンドを実行して、Qwen-7B-Chat-Int8リポジトリが格納されているディレクトリに移動します。
cd Qwen-7B-Chat-Int8次のコマンドを実行して、Qwen-7B-Chat-Int8リポジトリが格納されているディレクトリからLFSで管理されている大きなファイルをダウンロードします。
git lfs pull
ダウンロードしたQwen-7B-Chat-Int8ファイルをOSSバケットにアップロードします。
OSSコンソールにログインし、作成したOSSバケットの名前を表示および記録します。
OSSバケットの作成方法の詳細については、「バケットの作成」をご参照ください。
ossutilをインストールして構成します。 詳細については、「ossutil のインストール」をご参照ください。
次のコマンドを実行して、OSSバケットにQwen-7B-Chat-Int8という名前のディレクトリを作成します。
ossutil mkdir oss://<your-bucket-name>/Qwen-7B-Chat-Int8次のコマンドを実行して、モデルファイルをOSSバケットにアップロードします。
ossutil cp -r ./Qwen-7B-Chat-Int8 oss://<Your-Bucket-Name>/Qwen-7B-Chat-Int8
ステップ2: データセットとJindoRuntimeの作成
データセットを使用して、データを効率的に整理および処理できます。 JindoRuntimeは、データキャッシュポリシーに基づいてデータアクセスをさらに高速化できます。 データセットとJindoRuntimeを一緒に使用して、データ処理とモデルのパフォーマンスを大幅に向上させることができます。
次のコマンドを実行して、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 createdresource.yamlという名前のファイルを作成し、次の内容をファイルにコピーしてデータセットとJindoRuntimeを作成します。 データセットとJindoRuntimeを設定する方法の詳細については、「JindoFSを使用したOSSへのアクセスの高速化」をご参照ください。
データセットは、リモートストレージ内のデータセットおよび基になるファイルシステム (UFS) に関する情報を指定するために使用されます。
JindoRuntimeは、データキャッシュ用のJindoFSクラスターを開始するために使用されます。
次のコマンドを実行して、データセットと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モデルを推論サービスとしてデプロイする
次のコマンドを実行して、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: データプル加速の結果を確認する
次のコマンドを実行して、データセットに関する情報を表示します。
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次のコマンドを実行して、アプリケーションサーバーの準備が整うまでの時間を確認します。
# 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の概要」をご参照ください。