全部產品
Search
文件中心

Alibaba Cloud Service Mesh:ASM結合KServe與Fluid實現資料加速訪問的AI Serving

更新時間:Jun 30, 2024

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叢集:

  • ASM執行個體已開啟通過資料面叢集KubeAPI訪問Istio資源能力。具體操作,請參見通過資料面叢集KubeAPI訪問Istio資源

  • 已為叢集添加入口網關。本文使用ASM入口網關作為叢集網關,ASM入口網關名稱為預設的ingressgateway,開放80和443連接埠。具體操作,請參見建立入口網關

  • 已在ACK或ACK Serverless叢集中部署Knative Serving組件,並開啟Knative on ASM功能。更多資訊,請參見使用Knative on ASM部署Serverless應用

    展開查看如何部署Knative Serving組件

    • 關於如何在ACK叢集安裝Knative,請參見部署Knative

    • 關於如何在ACK Serverless叢集安裝Knative,請參見開啟Knative

    說明

    如果您選擇Kourier為服務網關一鍵部署Knative,即在ACK控制台的叢集列表頁面單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Knative一鍵部署Knative組件時,選擇Kourier組件作為服務網關,請在組件成功安裝後,單擊組件管理頁簽,在add-on 組件地區的列表卸載Kourier組件。

    展開查看如何開啟Knative on ASM

    1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

    2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇生態整合中心 > Knative on ASM

    3. Knative on ASM頁面,單擊啟用Knative on ASM

  • 已開通阿里雲Object Storage Service服務和儲存空間(Bucket)。具體操作,請參見開通OSS服務控制台建立儲存空間

步驟一:開啟KServe on ASM功能

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇生態整合中心 > KServe on ASM

  3. KServe on ASM頁面,按需開啟或關閉在叢集中自動安裝CertManager組件開關,然後單擊開啟KServe on ASM

    cert-manager是一個認證生命週期管理系統,支援認證的申請、部署等功能。KServe on ASM功能依賴CertManager組件的部署與使用。安裝KServe時,會自動安裝CertManager組件。

    • 如果您未在叢集中安裝CertManager,請開啟在叢集中自動安裝CertManager組件開關。

    • 如果您已經在資料面叢集中安裝CertManager,請關閉在叢集中自動安裝CertManager組件開關。

步驟二:安裝Fluid並開啟AI模型緩衝加速

  1. 在叢集中部署ack-fluid組件,且組件版本為0.9.10及以上。

    • 如果您的資料面叢集為ACK叢集,請在叢集中安裝雲原生AI套件並部署ack-fluid組件。

      說明

      若您已安裝開源Fluid,請卸載後再部署ack-fluid組件。

    • 如果您的資料面叢集為ACK Serverless叢集,請在叢集中部署ack-fluid組件。具體操作,請參見加速Job應用資料訪問部署Fluid控制面組件

  2. 準備AI模型並上傳至OSS Bucket。

    1. 準備已訓練好的AI模型儲存資料。

      本文以基於PyTorch的開源Transformer大語言模型bloom為例。關於模型資料詳情,請參見Hugging Face

    2. 將下載的模型資料檔案上傳至OSS Bucket,並記錄模型資料檔案的儲存位置。

      模型資料檔案的儲存位置格式為oss://{bucket}/{path}。例如,如果您建立了名為fluid-demo的Bucket,並在Bucket中的models/bloom目錄中上傳了所有的模型資料檔案,則模型資料檔案的儲存位置為oss://fluid-demo/models/bloom

      說明

      您可以通過OSS提供的用戶端工具ossutil上傳資料。具體操作,請參見安裝ossutil

  3. 建立用於部署Fluid緩衝和AI服務的命名空間,並配置OSS存取權限。

    1. 使用kubectl串連到資料面叢集。具體操作,請參見通過kubectl串連Kubernetes叢集

    2. 執行以下命令,建立用於部署Fluid緩衝和KServe AI服務的命名空間kserve-fluid-demo

      kubectl create ns kserve-fluid-demo
    3. 使用以下內容,建立oss-secret.yaml檔案。

      fs.oss.accessKeyIdfs.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。
    4. 執行以下命令,部署Secret,配置OSS存取金鑰。

      kubectl apply -f oss-secret.yaml -n kserve-fluid-demo
  4. 在Fluid中聲明待訪問的AI模型資料。

    您需要提交一個Dataset CR和一個JindoRuntime CR。Dataset CR描述資料在外部儲存系統中的URL位置,JindoRuntime CR描述緩衝系統及其具體配置。

    1. 使用以下內容,建立oss-jindo.yaml檔案。

      請將Dataset CR中的oss://{bucket}/{path}替換為上文步驟2.b中記錄的模型資料檔案的儲存位置,{endpoint}替換為OSS的訪問網域名稱。關於如何擷取不同地區OSS的訪問網域名稱,請參見訪問網域名稱和資料中心

      展開查看oss-jindo.yaml

      apiVersion: data.fluid.io/v1alpha1
      kind: Dataset
      metadata:
        name: oss-data
      spec:
        mounts:
        - mountPoint: "oss://{bucket}/{path}" # 請替換為模型資料檔案的儲存位置。
          name: bloom-560m
          path: /bloom-560m
          options:
            fs.oss.endpoint: "{endpoint}"  # 請替換為實際的OSS endpoint地址。
          encryptOptions:
            - name: fs.oss.accessKeyId
              valueFrom:
                secretKeyRef:
                  name: access-key
                  key: fs.oss.accessKeyId
            - name: fs.oss.accessKeySecret
              valueFrom:
                secretKeyRef:
                  name: access-key
                  key: fs.oss.accessKeySecret
        accessModes:
          - ReadOnlyMany
      ---
      apiVersion: data.fluid.io/v1alpha1
      kind: JindoRuntime
      metadata:
        name: oss-data
      spec:
        replicas: 2
        tieredstore:
          levels:
            - mediumtype: SSD
              volumeType: emptyDir
              path: /mnt/ssd0/cache
              quota: 50Gi
              high: "0.95"
              low: "0.7"
        fuse:
          properties:
            fs.jindofsx.data.cache.enable: "true"
          args:
            - -okernel_cache
            - -oro
            - -oattr_timeout=7200
            - -oentry_timeout=7200
            - -ometrics_port=9089
          cleanPolicy: OnDemand
      
    2. 執行以下命令,部署Dataset和JindoRuntime CR。

      kubectl create -f oss-jindo.yaml -n kserve-fluid-demo
    3. 執行以下命令,查看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的PHASEBound,JindoRuntime的FUSE PHASEReady,表明Dataset和JindoRuntime部署成功。

  5. 在Fluid中進行資料預熱,提升資料訪問效能。

    1. 使用以下內容,建立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
    2. 執行以下命令,部署Dataload以預熱資料。

      kubectl create -f oss-dataload.yaml -n kserve-fluid-demo
    3. 執行以下命令,查看資料預熱的進度。

      kubectl get dataload -n kserve-fluid-demo

      預期輸出:

      NAME           DATASET    PHASE      AGE     DURATION
      oss-dataload   oss-data   Complete   1m      45s

      由預期輸出得到,資料預熱耗時約45s。您需要等待一段時間,資料預熱才會完成。

步驟三:部署AI模型推理服務

  1. 按需選擇以下內容,建立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

  2. 執行以下命令,部署InferenceService AI模型推理服務。

    kubectl create -f oss-fluid-isvc.yaml -n kserve-fluid-demo
  3. 執行以下命令,查看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模型推理服務

  1. 擷取ASM入口網關地址。

    1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

    2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇ASM網關 > 入口網關

    3. ingressgateway網關的服務地址地區,查看並擷取ASM網關服務地址。

  2. 執行以下命令,訪問樣本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模型推理服務已成功對樣本輸入進行續寫並返回推理結果。

相關文檔