使用Triton部署chatglm2-6b模型

京東雲開發者發表於2023-09-27

一、技術介紹

NVIDIA Triton Inference Server是一個針對CPU和GPU進行最佳化的雲端和推理的解決方案。

支援的模型型別包括TensorRT、TensorFlow、PyTorch(meta-llama/Llama-2-7b)、Python(chatglm)、ONNX Runtime和OpenVino。

NVIDIA Triton Server是一個高效能的推斷伺服器,具有以下特點:

1. 高效能:Triton Server為使用GPU進行推斷的工作負載提供了高效能和低延遲。它能夠在高吞吐量和低延遲的情況下同時服務多個模型。

2. 記憶體管理:大模型通常需要大量的視訊記憶體來進行推斷。Triton Server具有靈活的記憶體管理機制,可以有效地管理和分配視訊記憶體,確保大模型的推斷可以高效地進行。

3. 可擴充套件性:Triton Server透過並行處理和非同步推斷支援高度併發的推斷請求。它可以根據負載的需要自動擴充套件和收縮。

4. 多模型支援:Triton Server能夠同時部署和管理多個模型。這允許您共享伺服器資源並以一致的方式部署和管理不同的模型。

5. 靈活性:Triton Server支援多種模型格式和推斷框架,包括TensorFlow、PyTorch、ONNX等。您可以使用您喜歡的模型和工具進行模型開發和訓練,並將其輕鬆部署到Triton Server上。

6. 高階特性:Triton Server提供了許多高階特性,例如模型版本管理、請求併發控制、動態批處理大小最佳化、請求時間跟蹤等。這些特性增強了模型的部署和管理能力。

二、實踐

Serve a Model in 3 (N) Easy Steps 官方文件

https://github.com/triton-inference-server/server

Serve a Model in n Easy Steps

Step 1: 拉取triton-server程式碼

git clone -b r23.08 https://github.com/triton-inference-server/server.git #

Step 2: 使用tritonserver:22.12-py3映象構建triton-server容器

docker run --gpus all --shm-size=1g --ulimit memlock=-1 -p 8000:8000 -p 8001:8001 -p 8002:8002 --ulimit stack=67108864 -ti nvcr.io/nvidia/tritonserver:22.12-py3

-p埠對映要注意, 後期要改很麻煩.

tritonserver版本和python_backend後端版本一定要對應.

比如都用22.12

Step 3: 下載python推理後端 python_backend

文件: https:/ https://github.com/triton-inference-server/python_backend

下載python後端程式碼:

git clone https://github.com/triton-inference-server/python_backend -b r22.12

容器內操作:如果中途退出容器,使用命令 docker exec -it 容器名 /bin/bash 進入容器

如下載不下來可以複製到容器內:docker cp python_backend busy_galileo:/opt

Step 4: 建立模型目錄

cd python_backend

1)建立模型目錄: mkdir -p models/chatglm2-6b/1/

2)宿主機複製chatglm2到容器內模型目錄: docker cp chatglm2-6b 容器名:/容器內路徑/models/chatglm2-6b

3)建立模型配置檔案 : vi models/chatglm2-6b/config.pbtxt 包含各種引數,input,output引數,模型路徑等.

name: "chatglm2-6b"
backend: "python"
max_batch_size: 1

input [
  {
    name: "QUERY"
    data_type: TYPE_STRING
    dims: [ -1 ]
  },
  {
    name: "max_new_tokens"
    data_type: TYPE_UINT32
    dims: [ -1 ]
  },
  {
    name: "top_k"
    data_type: TYPE_UINT32
    dims: [ 1 ]
    optional: true
  },
  {
    name: "top_p"
    data_type: TYPE_FP32
    dims: [ 1 ]
    optional: true
  },
  {
    name: "temperature"
    data_type: TYPE_FP32
    dims: [ 1 ]
    optional: true
  },
  {
    name: "length_penalty"
    data_type: TYPE_FP32
    dims: [ 1 ]
    optional: true
  },
  {
    name: "repetition_penalty"
    data_type: TYPE_FP32
    dims: [ 1 ]
    optional: true
  },
  {
    name: "bos_token_id"
    data_type: TYPE_UINT32
    dims: [ 1 ]
    optional: true
  },
  {
    name: "eos_token_id"
    data_type: TYPE_UINT32
    dims: [ 1 ]
    optional: true
  },
  {
    name: "do_sample"
    data_type: TYPE_BOOL
    dims: [ 1 ]
    optional: true
  },
  {
    name: "num_beams"
    data_type: TYPE_UINT32
    dims: [ 1 ]
    optional: true
  }
]
output [
  {
    name: "OUTPUT"
    data_type: TYPE_STRING
    dims: [ -1, -1 ]
  }
]

instance_group [
  {
    kind: KIND_GPU
  }
]

parameters {
  key: "model_path"
  value: {
    string_value: "/opt/tritonserver/python_backend/models/chatglm2-6b"
  }
}

建立model.py 自定義Python程式碼實現的模型推理邏輯 vi models/chatglm2-6b/1/model.py

模型的輸入,輸出和引數可以在這裡使用python指令碼進行加工處理

    import triton_python_backend_utils as pb_utils


class TritonPythonModel:
    @staticmethod
    def auto_complete_config(auto_complete_model_config):
        """`auto_complete_config` is called only once when loading the model

    def initialize(self, args):
        """`initialize` is called only once when the model is being loaded.
        Implementing `initialize` function is optional. This function allows
        the model to initialize any state associated with this model.

        Parameters
        ----------
        args : dict
          Both keys and values are strings. The dictionary keys and values are:
          * model_config: A JSON string containing the model configuration
          * model_instance_kind: A string containing model instance kind
          * model_instance_device_id: A string containing model instance device
            ID
          * model_repository: Model repository path
          * model_version: Model version
          * model_name: Model name
        """
        print('Initialized...')

    def execute(self, requests):
        """`execute` must be implemented in every Python model. `execute`
        function receives a list of pb_utils.InferenceRequest as the only
        argument. This function is called when an inference is requested
        for this model.

        Parameters
        ----------
        requests : list
          A list of pb_utils.InferenceRequest

        Returns
        -------
        list
          A list of pb_utils.InferenceResponse. The length of this list must
          be the same as `requests`
        """

        responses = []

    def finalize(self):
        """`finalize` is called only once when the model is being unloaded.
        Implementing `finalize` function is optional. This function allows
        the model to perform any necessary clean ups before exit.
        """
        print('Cleaning up...')

Step 5: 安裝推理環境和各種軟體

cuda版本和顯示卡驅動必須對應,cuda toolkit與驅動版本

對應關係見官網: https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions

1) torch介紹和安裝:

torch科學計算框架,旨在為機器學習和其他科學計算任務提供高效的矩陣運算和自動微分功能。

提供了豐富的預訓練模型和演算法庫,使使用者能夠快速構建和訓練各種機器學習任務。

pip install ./torch-1.12.1+cu116-cp38-cp38-linux_x86_64.whl

2) 顯示卡驅動:

sh ./NVIDIA-Linux-x86_64-460.106.00.run

3) cudnn介紹和安裝:

CUDA Deep Neural Network library是由NVIDIA提供的GPU加速的深度神經網路(DNN)庫。它旨在最佳化和加速深度學習任務中的神經網路模型訓練和推理。

cuDNN提供了一組用於卷積神經網路(Convolutional Neural Networks, CNN)和迴圈神經網路(Recurrent Neural Networks, RNN)等常見深度學習任務的核心演算法和函式。這些演算法和函式針對GPU架構進行了高度最佳化,以提供最佳的效能和效率。

wget https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu1804/x86_64/libcudnn8_8.1.1.33-1+cuda11.2_amd64.deb

dpkg -i libcudnn8_8.1.1.33-1+cuda11.2_amd64.deb

4) cuda:

Compute Unified Device Architecture庫是由NVIDIA開發的用於GPU程式設計的平行計算平臺和API。

透過CUDA庫,可以在GPU上同步或非同步地進行模型推理,同時支援批處理和多張卡平行計算,以提升模型推理的速度和效率

wget https://developer.download.nvidia.com/compute/cuda/11.2.0/local_installers/cuda_11.2.0_460.27.04_linux.run

sudo sh cuda_11.2.0_460.27.04_linux.run

5) 各種軟體

nohup apt-get update

nohup apt-get install -y autoconf autogen clangd gdb git-lfs libb64-dev libz-dev locales-all mosh openssh-server python3-dev rapidjson-dev sudo tmux unzip zstd zip zsh

Step 6: 啟動triton-server

CUDA_VISIBLE_DEVICES=0 setsid tritonserver --model-repository=/opt/tritonserver/python_backend/models --backend-config=python,shm-region-prefix-name=prefix1_ --http-port 8000 --grpc-port 8001 --metrics-port 8002 --log-verbose 1 --log-file /opt/tritonserver/logs/triton_server_gpu0.log

啟動成功 http埠 8000 grpc埠8001 測量埠8002

三、測試

簡單的呼叫python程式碼 呼叫http介面

import requests
# 定義模型的輸入資料
data = {
    "inputs": [
        {

            "name": "QUERY",
            "shape": [1,1],
            "datatype": "BYTES",
            "data": ["川普是不是四川人"]
        },
        {

            "name": "max_new_tokens",
            "shape" : [1,1],
            "datatype": "UINT32",
            "data": [15000]
        },
    ]
}
headers = {
    'Content-Type': 'application/json',
}
# 傳送 POST 請求
response = requests.post('http://localhost:8000/v2/models/chatglm2-6b/infer', headers=headers, json=data)
result = response.json()
print(result)


響應:

{
	"model_name": "chatglm2-6b",
	"model_version": "1",
	"outputs": [
		{
			"data": [
				"\n\n 川普不是四川人,他出生於美國賓夕法尼亞州,是一個美國政治家、企業家和電視名人。"
			],
			"datatype": "BYTES",
			"name": "OUTPUT",
			"shape": []
		}
	]
}

四、技術方向

CI(Continuous Integration,持續整合)/CD(Continuous Delivery,持續交付/Continuous Deployment,持續部署)

未來可實現:

1.使用k8s自動操作容器部署--類似行雲

2.儲存一個大模型執行環境的完整docker映象, 只需下載模型檔案到對應目錄即可啟動提供服務..

3.單機部署多種開源模型, 提供不同模型的應答介面 , 可對比應答效果

4.建立dockerFile自動構建基礎容器

k8s文件

https://kubernetes.io/zh-cn/docs/tasks/tools/

在所有節點上安裝Docker和kubeadm,kubenet

部署Kubernetes Master

部署容器網路外掛kubectl

部署 Kubernetes Node,將節點加入Kubernetes叢集中

作者:京東科技 楊建

來源:京東雲開發者社群 轉載請註明來源

相關文章