日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

使用TensorRT-LLM部署Qwen2模型推理服務(wù)

本文以Qwen2-1.5B-Instruct模型、GPU類型為A10卡為例,演示如何在ACK中使用Triton推理服務(wù) + TensorRT-LLM部署通義千問模型推理服務(wù)。模型部署過程中使用Fluid Dataflow完成模型準備工作,并使用Fluid提升模型加載速度。

背景信息

Qwen2-1.5B-Instruct

Qwen2-1.5B-Instruct是基于Transformer的大語言模型,在超大規(guī)模的預訓練數(shù)據(jù)上進行訓練得到的15億參數(shù)規(guī)模的模型。預訓練數(shù)據(jù)類型多樣,覆蓋廣泛,包括大量網(wǎng)絡(luò)文本、專業(yè)書籍、代碼等。

更多模型信息,請參見Qwen2 Github代碼庫

Triton(Triton Inference Server)

Triton Inference Server是NVIDIA開源的推理服務(wù)框架,可以幫助您快速搭建AI推理應(yīng)用。Triton支持多種不同的機器學習框架作為它的運行時后端,包括TensorRT、TensorFlow、PyTorch、ONNX、vLLM等。Triton面向?qū)崟r推理、批量推理以及音視頻流式推理場景進行了許多優(yōu)化,以在推理時獲得更好的性能。

更多關(guān)于Triton推理服務(wù)框架的信息,請參見Triton Inference Server GitHub代碼庫

TensorRT-LLM

TensorRT-LLM 是NVIDIA開源的LLM(Large Language Model)模型優(yōu)化引擎,用于定義LLM模型并將模型構(gòu)建為TensorRT引擎,以提升服務(wù)在NVIDIA GPU上的推理效率。TensorRT-LLM還可以與Triton框架結(jié)合,作為Triton推理框架的一種后端TensorRT-LLM Backend。TensorRT-LLM構(gòu)建的模型可以在單個或多個GPU上運行,支持Tensor Parallelism及Pipeline Parallelism。

更多關(guān)于TensorRT-LLM的信息,請參見TensorRT-LLM Github代碼庫

前提條件

步驟一:創(chuàng)建Dataset和JindoRuntime

Dataset可以高效地組織和處理數(shù)據(jù),而集成JindoRuntime可以通過數(shù)據(jù)緩存策略進一步加速數(shù)據(jù)訪問,兩者結(jié)合可以大幅提升數(shù)據(jù)處理和模型服務(wù)的性能。

  1. 執(zhí)行以下命令,創(chuàng)建用于存儲OSS的訪問憑證的Secret。

    kubectl apply -f-<<EOF                                            
    apiVersion: v1
    kind: Secret
    metadata:
      name: fluid-oss-secret
    stringData:
      fs.oss.accessKeyId: <YourAccessKey ID>
      fs.oss.accessKeySecret: <YourAccessKey Secret>
    EOF

    其中,fs.oss.accessKeyIdfs.oss.accessKeySecret是用來訪問OSS的AccessKey ID(AK)和AccessKey Secret(SK)。關(guān)于如何獲取AK和SK,請參見獲取AccessKey

    預期輸出:

    secret/fluid-oss-secret created
  2. 創(chuàng)建并拷貝以下內(nèi)容到dataset.yaml文件中,用于創(chuàng)建一個Dataset和一個JindoRuntime來提供緩存服務(wù)。關(guān)于Dataset及JindoRuntime的詳細配置信息,請參見JindoFS加速OSS文件訪問

    # 創(chuàng)建一個Dataset,描述遠端存儲數(shù)據(jù)集和UFS的信息。
    apiVersion: data.fluid.io/v1alpha1
    kind: Dataset
    metadata:
      name: qwen2-oss
    spec:
      mounts:
      - mountPoint: oss://<oss_bucket>/qwen2-1.5b # 請?zhí)鎿Q為實際的模型存儲地址。
        name: qwen2
        path: /
        options:
          fs.oss.endpoint: <oss_endpoint> # 請?zhí)鎿Q為實際的OSS endpoint地址。
        encryptOptions:
          - name: fs.oss.accessKeyId
            valueFrom:
              secretKeyRef:
                name: fluid-oss-secret
                key: fs.oss.accessKeyId
          - name: fs.oss.accessKeySecret
            valueFrom:
              secretKeyRef:
                name: fluid-oss-secret
                key: fs.oss.accessKeySecret
      accessModes:
        - ReadWriteMany
    # 創(chuàng)建一個JindoRuntime,啟動一個JindoFS的集群來提供緩存服務(wù)。
    ---
    apiVersion: data.fluid.io/v1alpha1
    kind: JindoRuntime
    metadata:
      name: qwen2-oss
    spec:
      replicas: 2
      tieredstore:
        levels:
          - mediumtype: MEM
            volumeType: emptyDir
            path: /dev/shm
            quota: 20Gi
            high: "0.95"
            low: "0.7"
      fuse:
        properties:
          fs.oss.read.buffer.size: "8388608" # 8M
          fs.oss.download.thread.concurrency: "200"
          fs.oss.read.readahead.max.buffer.count: "200"
          fs.oss.read.sequence.ambiguity.range: "2147483647"
        args:
          - -oauto_cache
          - -oattr_timeout=1
          - -oentry_timeout=1
          - -onegative_timeout=1
  3. 執(zhí)行以下命令,創(chuàng)建JindoRuntime和Dataset。

    kubectl apply -f dataset.yaml

    預期輸出:

    dataset.data.fluid.io/qwen2-oss created
    jindoruntime.data.fluid.io/qwen2-oss created

    輸出結(jié)果表明Dataset資源和JindoRuntime資源已被成功創(chuàng)建。

  4. 執(zhí)行以下命令,查看Dataset的部署情況。

    kubectl get dataset qwen2-oss

    預期輸出:

    NAME        UFS TOTAL SIZE   CACHED   CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    qwen2-oss   0.00B            0.00B    20.00GiB         0.0%                Bound   57s

步驟二:創(chuàng)建Dataflow

要使用TensorRT-LLM加速模型推理,首先需要下載模型文件,然后進行模型文件格式轉(zhuǎn)換,構(gòu)建TensorRT Engine,修改配置文件等操作。本文通過使用Fluid Dataflow完成上述步驟。

  1. 創(chuàng)建并拷貝以下內(nèi)容到dataflow.yaml文件中,用于創(chuàng)建一個Dataflow,包含以下三個步驟:

    1. 從ModelScope下載Qwen2-1.5B-Instruct模型。

    2. 使用TensorRT-LLM工具完成模型格式轉(zhuǎn)換,構(gòu)建Engine。

    3. 使用Dataload更新Dataset數(shù)據(jù)。

    # 從ModelScope平臺下載Qwen2-1.5B-Instruct模型到指定的存儲路徑。
    apiVersion: data.fluid.io/v1alpha1
    kind: DataProcess
    metadata:
      name: step1-download-model
    spec:
      dataset:
        name: qwen2-oss
        namespace: default
        mountPath: /mnt/models/
      processor:
        script:
          image: ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/base
          imageTag: ubuntu22.04
          imagePullPolicy: IfNotPresent
          restartPolicy: OnFailure
          command:
          - bash
          source: |
            #!/bin/bash
            echo "download model..."
            if [ -d "${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct" ]; then
                echo "directory ${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct exists, skip download model"
            else
                apt update && apt install -y git git-lfs
                git clone https://www.modelscope.cn/qwen/Qwen2-1.5B-Instruct.git Qwen2-1.5B-Instruct
                mv Qwen2-1.5B-Instruct ${MODEL_MOUNT_PATH}
            fi
          env:
          - name: MODEL_MOUNT_PATH
            value: "/mnt/models"
    # 將下載的模型轉(zhuǎn)換為TensorRT-LLM所需的格式,并構(gòu)建推理引擎。
    ---
    apiVersion: data.fluid.io/v1alpha1
    kind: DataProcess
    metadata:
      name: step2-trtllm-convert
    spec:
      runAfter:
        kind: DataProcess
        name: step1-download-model
        namespace: default
      dataset:
        name: qwen2-oss
        namespace: default
        mountPath: /mnt/models/
      processor:
        script:
          image: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tritonserver-build
          imageTag: 24.07-trtllm-python-py3
          imagePullPolicy: IfNotPresent
          restartPolicy: OnFailure
          command:
          - bash
          source: |
            #!/bin/bash
            set -ex
    
            cd /tensorrtllm_backend/tensorrt_llm/examples/qwen
            if [ -d "${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct-ckpt" ]; then
                echo "directory ${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct-ckpt exists, skip convert checkpoint"
            else
                echo "covert checkpoint..."
                python3 convert_checkpoint.py --model_dir ${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct --output_dir /root/Qwen2-1.5B-Instruct-ckpt --dtype float16
    
                echo "Writing trtllm model ckpt to OSS Bucket..."
                mv /root/Qwen2-1.5B-Instruct-ckpt ${MODEL_MOUNT_PATH}
            fi
    
            sleep 2
            
            if [ -d "${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct-engine" ]; then
                echo "directory $OUTPUT_DIR/Qwen2-1.5B-Instruct-engine exists, skip build engine"
            else
                echo "build trtllm engine..."
                trtllm-build --checkpoint_dir ${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct-ckpt \
                --gemm_plugin float16 \
                --paged_kv_cache enable \
                --output_dir /root/Qwen2-1.5B-Instruct-engine
    
                echo "Writing trtllm engine to OSS Bucket..."
                mv /root/Qwen2-1.5B-Instruct-engine ${MODEL_MOUNT_PATH}
            fi
    
            if [ -d "${MODEL_MOUNT_PATH}/tensorrtllm_backend" ]; then
                echo "directory $OUTPUT_DIR/tensorrtllm_backend exists, skip config tensorrtllm_backend"
            else
                echo "config model..."
                cd /tensorrtllm_backend
                cp all_models/inflight_batcher_llm/ qwen2_ifb -r
                export QWEN2_MODEL=${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct
                export ENGINE_PATH=${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct-engine
    
                python3 tools/fill_template.py -i qwen2_ifb/preprocessing/config.pbtxt tokenizer_dir:${QWEN2_MODEL},triton_max_batch_size:8,preprocessing_instance_count:1
                python3 tools/fill_template.py -i qwen2_ifb/postprocessing/config.pbtxt tokenizer_dir:${QWEN2_MODEL},triton_max_batch_size:8,postprocessing_instance_count:1
                python3 tools/fill_template.py -i qwen2_ifb/tensorrt_llm_bls/config.pbtxt triton_max_batch_size:8,decoupled_mode:False,bls_instance_count:1,accumulate_tokens:False
                python3 tools/fill_template.py -i qwen2_ifb/ensemble/config.pbtxt triton_max_batch_size:8
                python3 tools/fill_template.py -i qwen2_ifb/tensorrt_llm/config.pbtxt triton_backend:tensorrtllm,triton_max_batch_size:8,decoupled_mode:False,max_beam_width:1,engine_dir:${ENGINE_PATH},max_tokens_in_paged_kv_cache:1280,max_attention_window_size:1280,kv_cache_free_gpu_mem_fraction:0.5,exclude_input_in_output:True,enable_kv_cache_reuse:False,batching_strategy:inflight_fused_batching,max_queue_delay_microseconds:0
    
                echo "Writing trtllm config to OSS Bucket..."
                mkdir -p ${MODEL_MOUNT_PATH}/tensorrtllm_backend
                mv /tensorrtllm_backend/qwen2_ifb ${MODEL_MOUNT_PATH}/tensorrtllm_backend
            fi
          env:
          - name: MODEL_MOUNT_PATH
            value: "/mnt/models"
          resources:
            requests:
              cpu: 2
              memory: 10Gi
              nvidia.com/gpu: 1
            limits:
              cpu: 12
              memory: 30Gi
              nvidia.com/gpu: 1
    # 加載轉(zhuǎn)換并優(yōu)化后的模型及配置到內(nèi)存中,以實現(xiàn)快速響應(yīng)的推理服務(wù)。
    ---
    apiVersion: data.fluid.io/v1alpha1
    kind: DataLoad
    metadata:
      name: step3-warmup-cahce
    spec:
      runAfter:
        kind: DataProcess
        name: step2-trtllm-convert
        namespace: default
      dataset:
        name: qwen2-oss
        namespace: default
      loadMetadata: true
      target:
      - path: /Qwen2-1.5B-Instruct-engine
      - path: /tensorrtllm_backend

    以上代碼的三個步驟共同構(gòu)成了一個完整的模型部署流程,從原始模型的下載、轉(zhuǎn)換、優(yōu)化到最終的緩存預加載,實現(xiàn)了自動化、可擴展的模型部署。

  2. 執(zhí)行以下命令,創(chuàng)建Dataflow。

    kubectl create -f dataflow.yaml

    預期輸出:

    dataprocess.data.fluid.io/step1-download-model created
    dataprocess.data.fluid.io/step2-trtllm-convert created
    dataload.data.fluid.io/step3-warmup-cahce created

    輸出結(jié)果表明已成功地根據(jù)dataflow.yaml文件中的定義創(chuàng)建了相應(yīng)的自定義資源對象。

  3. 執(zhí)行以下命令,查看Dataflow執(zhí)行情況,等待任務(wù)執(zhí)行完成。

    kubectl get dataprocess

    預期輸出:

    NAME                   DATASET     PHASE      AGE   DURATION
    step1-download-model   qwen2-oss   Complete   23m   3m2s
    step2-trtllm-convert   qwen2-oss   Complete   23m   19m58s

    輸出結(jié)果表明集群中與數(shù)據(jù)集qwen2-oss相關(guān)的兩個數(shù)據(jù)處理任務(wù)(下載模型和轉(zhuǎn)換模型至trtllm格式)都已經(jīng)成功完成。

步驟三:部署推理服務(wù)

  1. 執(zhí)行以下命令,通過Arena命令部署一個Custom類型的Serve服務(wù)。

    該服務(wù)名稱為qwen2-chat,version為v1,需要使用一個GPU,副本數(shù)為1,并且配置了就緒檢測。模型是一種特殊類型的數(shù)據(jù),因此采用--data參數(shù)將Fluid創(chuàng)建的模型PVC qwen2-oss掛載到了容器中的/mnt/models目錄下。

    arena serve custom \
    --name=qwen2-chat \
    --version=v1 \
    --gpus=1 \
    --replicas=1 \
    --restful-port=8000 \
    --readiness-probe-action="tcpSocket" \
    --readiness-probe-action-option="port: 8000" \
    --readiness-probe-option="initialDelaySeconds: 30" \
    --readiness-probe-option="periodSeconds: 30" \
    --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tritonserver:24.07-trtllm-python-py3 \
    --data=qwen2-oss:/mnt/models \
    "tritonserver --model-repository=/mnt/models/tensorrtllm_backend/qwen2_ifb --http-port=8000 --grpc-port=8001 --metrics-port=8002 --disable-auto-complete-config --backend-config=python,shm-region-prefix-name=prefix0_"

    參數(shù)說明如下:

    參數(shù)

    說明

    --name

    指定推理服務(wù)名稱。

    --version

    指定推理服務(wù)版本。

    --gpus

    指定單個推理服務(wù)副本需要使用的GPU卡數(shù)。

    --replicas

    指定推理服務(wù)副本數(shù)。

    --restful-port

    指定推理服務(wù)對外暴露的端口。

    --readiness-probe-action

    指定就緒探針連接類型,支持HttpGet、Exec、gRPC、TCPSocket。

    --readiness-probe-action-option

    指定就緒探針連接方式。

    --readiness-probe-option

    指定就緒探針配置。

    --data

    掛載共享存儲卷PVC到運行環(huán)境中。它由兩部分組成,通過英文冒號(:)分割。冒號左側(cè)是您已經(jīng)準備好的PVC名稱。您可以通過命令arena data list查看當前集群可用的PVC列表;冒號右側(cè)是您想將PVC掛載到運行環(huán)境中的路徑,也是您訓練代碼要讀取數(shù)據(jù)或模型的本地路徑。這樣通過掛載的方式,您的代碼就可以訪問PVC中的數(shù)據(jù)或模型。

    --image

    指定推理服務(wù)的鏡像地址。

    預期輸出:

    service/qwen2-chat-v1 created
    deployment.apps/qwen2-chat-v1-custom-serving created
    INFO[0003] The Job qwen2-chat has been submitted successfully
    INFO[0003] You can run `arena serve get qwen2-chat --type custom-serving -n default` to check the job status

    輸出結(jié)果表明推理服務(wù)已成功部署。

  2. 執(zhí)行下列命令,查看推理服務(wù)詳細信息,等待服務(wù)就緒。

    arena serve get qwen2-chat

    預期輸出:

    Name:       qwen2-chat
    Namespace:  default
    Type:       Custom
    Version:    v1
    Desired:    1
    Available:  1
    Age:        1m
    Address:    192.XX.XX.XX
    Port:       RESTFUL:8000
    GPU:        1
    
    Instances:
      NAME                                           STATUS   AGE  READY  RESTARTS  GPU  NODE
      ----                                           ------   ---  -----  --------  ---  ----
      qwen2-chat-v1-custom-serving-657869c698-hl665  Running  1m   1/1    0         1    ap-southeast-1.192.XX.XX.XX

    輸出結(jié)果表明該推理服務(wù)的一個Pod(qwen2-chat-v1-custom-serving-657869c698-hl665)正在穩(wěn)定運行,且已準備好提供服務(wù)。

步驟四:驗證推理服務(wù)

  1. 執(zhí)行以下命令,在推理服務(wù)與本地環(huán)境之間建立端口轉(zhuǎn)發(fā)。

    重要

    請注意kubectl port-forward建立的端口轉(zhuǎn)發(fā)不具備生產(chǎn)級別的可靠性、安全性和擴展性,因此僅適用于開發(fā)和調(diào)試目的,不適合在生產(chǎn)環(huán)境使用。更多關(guān)于Kubernetes集群內(nèi)生產(chǎn)可用的網(wǎng)絡(luò)方案的信息,請參見Ingress概述

    kubectl port-forward svc/qwen2-chat-v1 8000:8000

    預期輸出:

    Forwarding from 127.0.0.1:8000 -> 8000
    Forwarding from [::1]:8000 -> 8000
  2. 執(zhí)行以下命令,發(fā)送模型推理請求。

    curl -X POST localhost:8000/v2/models/ensemble/generate -d '{"text_input": "什么是機器學習?", "max_tokens": 20, "bad_words": "", "stop_words": "", "pad_id": 2, "end_id": 2}'

    預期輸出:

    {"context_logits":0.0,"cum_log_probs":0.0,"generation_logits":0.0,"model_name":"ensemble","model_version":"1","output_log_probs":[0.0,0.0,0.0,0.0],"sequence_end":false,"sequence_id":0,"sequence_start":false,"text_output":" 機器學習是一種人工智能技術(shù),它使計算機系統(tǒng)能夠從數(shù)據(jù)中學習,而無需明確的編程。"}

    輸出結(jié)果表明模型可以根據(jù)給定的輸入生成相應(yīng)的回復。

(可選)步驟五:清理環(huán)境

如果不再使用已部署的模型推理服務(wù),請執(zhí)行以下命令,刪除服務(wù)。

arena serve delete qwen2-chat