KServe(原KFServing)是雲原生環境的一個AI模型服務和推理引擎,支援自動縮放、零縮放、金絲雀部署等能力。阿里雲服務網格ASM在整合Container ServiceKnative Serving能力的基礎上,支援一鍵整合KServe實現AI Serving的KServe on ASM能力。Fluid是一個開源的Kubernetes原生的分布式資料集編排和加速引擎,主要服務於雲原生情境下的資料密集型應用,例如巨量資料應用、AI應用等。ASM的KServe on ASM功能可以直接與Fluid整合,加速模型的載入過程。本文介紹如何在ASM結合KServe與Fluid實現資料加速訪問的AI Serving。
前提條件
已添加Kubernetes叢集到ASM執行個體。具體操作,請參見建立ASM執行個體和添加叢集到ASM執行個體。
說明ASM執行個體版本需為1.17及以上。關於升級執行個體的具體操作,請參見升級ASM執行個體。
Kubernetes叢集:
ACK叢集版本需為1.22及以上。具體操作,請參見建立Kubernetes託管版叢集或升級ACK叢集。如果您使用GPU運行AI服務,請確保ACK叢集中包含GPU類型的節點,例如ecs.gn6i-c16g1.4xlarge。
ACK Serverless叢集版本需為1.18及以上,且已安裝CoreDNS組件。具體操作,請參見建立ASK叢集和管理組件。
ASM執行個體已開啟通過資料面叢集KubeAPI訪問Istio資源能力。具體操作,請參見通過資料面叢集KubeAPI訪問Istio資源。
已為叢集添加入口網關。本文使用ASM入口網關作為叢集網關,ASM入口網關名稱為預設的ingressgateway,開放80和443連接埠。具體操作,請參見建立入口網關。
已在ACK或ACK Serverless叢集中部署Knative Serving組件,並開啟Knative on ASM功能。更多資訊,請參見使用Knative on ASM部署Serverless應用。
已開通阿里雲Object Storage Service服務和儲存空間(Bucket)。具體操作,請參見開通OSS服務和控制台建立儲存空間。
步驟一:開啟KServe on ASM功能
登入ASM控制台,在左側導覽列,選擇 。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇 。
在KServe on ASM頁面,按需開啟或關閉在叢集中自動安裝CertManager組件開關,然後單擊開啟KServe on ASM。
cert-manager是一個認證生命週期管理系統,支援認證的申請、部署等功能。KServe on ASM功能依賴CertManager組件的部署與使用。安裝KServe時,會自動安裝CertManager組件。
如果您未在叢集中安裝CertManager,請開啟在叢集中自動安裝CertManager組件開關。
如果您已經在資料面叢集中安裝CertManager,請關閉在叢集中自動安裝CertManager組件開關。
步驟二:安裝Fluid並開啟AI模型緩衝加速
在叢集中部署ack-fluid組件,且組件版本為0.9.10及以上。
如果您的資料面叢集為ACK叢集,請在叢集中安裝雲原生AI套件並部署ack-fluid組件。
說明若您已安裝開源Fluid,請卸載後再部署ack-fluid組件。
未安裝雲原生AI套件:安裝時開啟Fluid資料加速。具體操作,請參見安裝雲原生AI套件。
已安裝雲原生AI套件:登入Container Service管理主控台,在 頁面部署ack-fluid。
如果您的資料面叢集為ACK Serverless叢集,請在叢集中部署ack-fluid組件。具體操作,請參見加速Job應用資料訪問的部署Fluid控制面組件。
準備AI模型並上傳至OSS Bucket。
準備已訓練好的AI模型儲存資料。
本文以基於PyTorch的開源Transformer大語言模型bloom為例。關於模型資料詳情,請參見Hugging Face。
將下載的模型資料檔案上傳至OSS Bucket,並記錄模型資料檔案的儲存位置。
模型資料檔案的儲存位置格式為
oss://{bucket}/{path}
。例如,如果您建立了名為fluid-demo的Bucket,並在Bucket中的models/bloom
目錄中上傳了所有的模型資料檔案,則模型資料檔案的儲存位置為oss://fluid-demo/models/bloom
。說明您可以通過OSS提供的用戶端工具ossutil上傳資料。具體操作,請參見安裝ossutil。
建立用於部署Fluid緩衝和AI服務的命名空間,並配置OSS存取權限。
使用kubectl串連到資料面叢集。具體操作,請參見通過kubectl串連Kubernetes叢集。
執行以下命令,建立用於部署Fluid緩衝和KServe AI服務的命名空間
kserve-fluid-demo
。kubectl create ns kserve-fluid-demo
使用以下內容,建立oss-secret.yaml檔案。
fs.oss.accessKeyId
和fs.oss.accessKeySecret
分別代表可以訪問OSS的accessKeyId和accessKeySecret。apiVersion: v1 kind: Secret metadata: name: access-key stringData: fs.oss.accessKeyId: xxx # 請替換為可以訪問OSS的阿里雲accessKeyId。 fs.oss.accessKeySecret: xxx # 請替換為可以訪問OSS的阿里雲accessKeySecret。
執行以下命令,部署Secret,配置OSS存取金鑰。
kubectl apply -f oss-secret.yaml -n kserve-fluid-demo
在Fluid中聲明待訪問的AI模型資料。
您需要提交一個Dataset CR和一個JindoRuntime CR。Dataset CR描述資料在外部儲存系統中的URL位置,JindoRuntime CR描述緩衝系統及其具體配置。
使用以下內容,建立oss-jindo.yaml檔案。
請將Dataset CR中的
oss://{bucket}/{path}
替換為上文步驟2.b中記錄的模型資料檔案的儲存位置,{endpoint}
替換為OSS的訪問網域名稱。關於如何擷取不同地區OSS的訪問網域名稱,請參見訪問網域名稱和資料中心。執行以下命令,部署Dataset和JindoRuntime CR。
kubectl create -f oss-jindo.yaml -n kserve-fluid-demo
執行以下命令,查看Dataset和JindoRuntime的部署情況。
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 3m
由預期輸出得到,Dataset的
PHASE
為Bound
,JindoRuntime的FUSE PHASE
為Ready
,表明Dataset和JindoRuntime部署成功。
在Fluid中進行資料預熱,提升資料訪問效能。
使用以下內容,建立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: 2
執行以下命令,部署Dataload以預熱資料。
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
由預期輸出得到,資料預熱耗時約
45s
。您需要等待一段時間,資料預熱才會完成。
步驟三:部署AI模型推理服務
按需選擇以下內容,建立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" # 如果使用GPU則設定成True,否則設定為False。 - name: GPU_ENABLED value: "True"
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" # 如果使用GPU則設定成True,否則設定為False。 - name: GPU_ENABLED value: "True"
說明本樣本配置為大語言模型,因此申請了12核 48 Gi的較大資源。請您根據自身叢集負載對
InferenceService
中的resources
欄位進行修改。本樣本的
image
欄位使用了registry.cn-hangzhou.aliyuncs.com/acs/kserve-fluid:bloom-gpu
樣本鏡像。該鏡像提供載入模型及推理服務的介面。您可以在KServe開源社區中查看此樣本鏡像的代碼,並進行鏡像自訂。詳細資料,請參見Docker。
執行以下命令,部署InferenceService AI模型推理服務。
kubectl create -f oss-fluid-isvc.yaml -n kserve-fluid-demo
執行以下命令,查看AI模型推理服務的部署狀態。
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 2d
由預期輸出得到,
READY
欄位為True
,表明AI模型推理服務已經部署成功。
步驟四:訪問AI模型推理服務
擷取ASM入口網關地址。
登入ASM控制台,在左側導覽列,選擇 。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇 。
在ingressgateway網關的服務地址地區,查看並擷取ASM網關服務地址。
執行以下命令,訪問樣本AI模型推理服務bloom,將ASM網關服務地址替換為步驟1擷取的ASM入口網關地址。
curl -v -H "Content-Type: application/json" -H "Host: fluid-bloom.kserve-fluid-demo.example.com" "http://{ASM網關服務地址}: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 > User-Agent: curl/7.84.0 > Accept: */* > Content-Type: application/json > Content-Length: 65 > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < content-length: 227 < content-type: application/json < date: Thu, 20 Apr 2023 09:49:00 GMT < server: istio-envoy < x-envoy-upstream-service-time: 1142 < { "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" } * Connection # 0 to host xxx.xx.xx.xx left intact
由預期輸出得到,AI模型推理服務已成功對樣本輸入進行續寫並返回推理結果。