基于KServe使用Fluid實現(xiàn)模型加速
隨著技術(shù)的發(fā)展,AI應(yīng)用的模型數(shù)據(jù)越來越大,但是通過存儲服務(wù)(如OSS、NAS等)拉取這些大文件時可能會出現(xiàn)長時間的延遲和冷啟動問題。您可以利用Fluid顯著提升模型加載速度,從而優(yōu)化推理服務(wù)的性能,特別是對于基于KServe的推理服務(wù)而言。本文以Qwen-7B-Chat-Int8模型、GPU類型為V100卡為例,演示如何在KServe中使用Fluid實現(xiàn)模型加速。
前提條件
已創(chuàng)建一個非ContainerOS操作系統(tǒng)的ACK Pro版集群,且集群版本為1.22及以上,同時集群中至少有3個節(jié)點,每個節(jié)點的剩余內(nèi)存需大于3GB。具體操作,請參見創(chuàng)建ACK Pro版集群。
已安裝云原生AI套件并部署ack-fluid組件。具體操作,請參見安裝云原生AI套件。
已安裝Arena客戶端,且版本不低于0.9.15。具體操作,請參見配置Arena客戶端。
已安裝ack-kserve。具體操作,請參見安裝ack-kserve?。
已開通阿里云對象存儲(OSS)服務(wù)。具體操作,請參見開通OSS服務(wù)。
步驟一:準備模型數(shù)據(jù)并上傳OSS Bucket
下載模型。本文以Qwen-7B-Chat-Int8模型為例。
執(zhí)行以下命令,安裝Git。
sudo yum install git
執(zhí)行以下命令,安裝Git LFS(Large File Support)插件。
sudo yum install git-lfs
執(zhí)行以下命令,將ModelScope上的Qwen-7B-Chat-Int8倉庫克隆到本地。
GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat-Int8.git
執(zhí)行以下命令,進入Qwen-7B-Chat-Int8倉庫目錄。
cd Qwen-7B-Chat-Int8
執(zhí)行以下命令,在Qwen-7B-Chat-Int8目錄下,下載LFS管理的大文件。
git lfs pull
將下載的Qwen-7B-Chat-Int8文件上傳至OSS。
登錄OSS控制臺,查看并記錄已創(chuàng)建的Bucket名稱。
如何創(chuàng)建Bucket,請參見創(chuàng)建存儲空間。
安裝和配置ossutil。具體操作,請參見安裝ossutil。
執(zhí)行以下命令,在OSS創(chuàng)建名為Qwen-7B-Chat-Int8的目錄。
ossutil mkdir oss://<Your-Bucket-Name>/Qwen-7B-Chat-Int8
執(zhí)行以下命令,上傳模型文件至OSS。
ossutil cp -r ./Qwen-7B-Chat-Int8 oss://<Your-Bucket-Name>/Qwen-7B-Chat-Int8
步驟二:創(chuàng)建Dataset和JindoRuntime
Dataset可以高效地組織和處理數(shù)據(jù),而集成JindoRuntime可以通過數(shù)據(jù)緩存策略進一步加速數(shù)據(jù)訪問,兩者結(jié)合可以大幅提升數(shù)據(jù)處理和模型服務(wù)的性能。
執(zhí)行以下命令,創(chuàng)建用于存儲OSS的訪問憑證的Secret。
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
和fs.oss.accessKeySecret
是用來訪問OSS的AccessKey ID(AK)和AccessKey Secret(SK)。關(guān)于如何獲取AK和SK,請參見獲取AccessKey。預(yù)期輸出:
secret/oss-secret created
創(chuàng)建并拷貝以下內(nèi)容到resource.yaml文件中,用于創(chuàng)建一個Dataset和一個JindoRuntime。關(guān)于Dataset及JindoRuntime的詳細配置信息,請參見JindoFS加速OSS文件訪問。
Dataset用于描述遠端存儲數(shù)據(jù)集和UFS的信息。
JindoRuntime用于啟動一個JindoFS的集群來提供緩存服務(wù)。
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: qwen-7b-chat-int8 spec: mounts: - mountPoint: oss://<oss_bucket>/Qwen-7b-chat-Int8 # 請?zhí)鎿Q為實際的模型存儲地址。 options: fs.oss.endpoint: <oss_endpoint> # 請?zhí)鎿Q為實際的OSS endpoint地址。 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 # 需要與Dataset名稱保持一致。 spec: replicas: 3 tieredstore: levels: - mediumtype: MEM # 使用內(nèi)存緩存數(shù)據(jù)。 volumeType: emptyDir path: /dev/shm quota: 3Gi # 單個分布式緩存Worker副本所能提供的緩存容量。 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"
執(zhí)行以下命令,創(chuàng)建JindoRuntime和Dataset。
kubectl apply -f resource.yaml
預(yù)期輸出:
dataset.data.fluid.io/qwen-7b-chat-int8 created jindoruntime.data.fluid.io/qwen-7b-chat-int8 created
步驟三:部署vLLM推理服務(wù)
執(zhí)行以下命令,部署一個基于KServe的模型服務(wù)。
如下所示,利用vLLM推理框架和KServe部署了一個服務(wù)于qwen-7b-chat-Int8語言模型的服務(wù)。
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"
預(yù)期輸出:
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
預(yù)期輸出表明推理服務(wù)已部署成功。
步驟四:查看數(shù)據(jù)加速效果
執(zhí)行以下命令,查看Dataset信息。
kubectl get dataset qwen-7b-chat-int8
預(yù)期輸出:
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
執(zhí)行以下命令,查看應(yīng)用就緒的時間。
# 從所有Pod列表中篩選出名字中包含qwen-fluid的Pod,并提取出Pod的名稱賦值給變量POD_NAME。 POD_NAME=$(kubectl get po |grep qwen-fluid|awk -F " " '{print $1}') # 查看應(yīng)用程序服務(wù)器準備就緒所花費的時間 kubectl logs $POD_NAME |grep -i "server ready takes"
預(yù)期輸出:
server ready takes 25.875763 s
輸出結(jié)果顯示使用Fluid數(shù)據(jù)加速后應(yīng)用就緒時間僅為25.875763s。具體加速效果與您的應(yīng)用、數(shù)據(jù)集大小以及環(huán)境配置有關(guān),本數(shù)據(jù)僅供參考。
如需了解JindoRuntime加速效果的詳細信息,請參見JindoFS加速OSS文件訪問。
相關(guān)文檔
如需了解數(shù)據(jù)加速Fluid的更多信息,請參見數(shù)據(jù)加速Fluid概述。