NVIDIA TensorRT Inference Server on Kubernetes

时间:2022-07-22
本文章向大家介绍NVIDIA TensorRT Inference Server on Kubernetes,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1 Overview

NVIDIA TensorRT Inference Server 是 NVIDIA 推出的,经过优化的,可以在 NVIDIA GPUs 使用的推理引擎,TensorRT 有下面几个特点。

  1. 支持多种框架模型,包括 TensorFlow GraphDef,TensorFlow SavedModel,ONNX,PyTorch 和 Cadde2 NetDef 等模型格式
  2. 支持多个模型的并发请求
  3. 支持 Batching 批量请求
  4. 模型仓库支持本地文件系统,或者 Google Cloud Storage 以及 S3

更多内容可以参考 TensorRT 官方文档。本文通过 Kubernetes 来部署一个 Example 的 TensorRT 服务。

2 Prerequisite

下面是通过 nvidia-docker 运行起来的 TensorRT 容器,这里关注几个关键参数。进程通过 trtserver 命令启动,--model-repository 指定模型仓库的地址。

$ nvidia-docker run --rm --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 -p8000:8000 -p8001:8001 -p8002:8002 -v/path/to/model/repository:/models <tensorrtserver image name> trtserver --model-repository=/models

3 部署

下面只给出了 Pod 的 Spec 部分,需要特别留意的主要是 commandenvvolumemount 几个字段。

```yaml
spec:
  containers:
  - args:
    - --model-repository
    - /ojbk/model_repository/
    command:
    - /opt/tensorrtserver/bin/trtserver
    env:
    - name: PATH
      value: /opt/tensorrtserver/bin:/usr/local/nvidia/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: LD_LIBRARY_PATH
      value: /opt/tensorrtserver/lib:/usr/local/nvidia/lib:/usr/local/nvidia/lib64
    - name: LIBRARY_PATH
      value: '/usr/local/cuda/lib64/stubs:'
    image: hub.oa.com/dbyin/tensorrtserver:19.10-py3
    imagePullPolicy: Always
    name: new-container-1
    resources:
      limits:
        alpha.kubernetes.io/nvidia-gpu: "1"
        cpu: "1"
        memory: 4Gi
      requests:
        alpha.kubernetes.io/nvidia-gpu: "1"
        cpu: "1"
        memory: 4Gi
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /ojbk
      name: ojbk
    - mountPath: /usr/local/nvidia
      name: nvidia-driver
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-4dkll
      readOnly: true
  dnsPolicy: ClusterFirst
  nodeName: 100.119.242.53
  nodeSelector:
    alpha.kubernetes.io/nvidia-gpu-driver: 418.87.01
    alpha.kubernetes.io/nvidia-gpu-name: P40
    tencent.cr/resource-provider: tenc
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  volumes:
  - emptyDir: {}
    name: ojbk
  - hostPath:
      path: /var/lib/nvidia-docker/volumes/nvidia_driver/latest
      type: ""
    name: nvidia-driver
  - name: default-token-4dkll
    secret:
      defaultMode: 420
      secretName: default-token-4dkll

4 验证

进入容器后,请求运行 curl localhost:8000/api/status。可以看到返回一些模型的状态和推理服务版本的一些信息。

为了验证,从 NVIDIA 的镜像仓库找一个安装好客户端的镜像 tensorrtserver:19.10-py3-clientsdk,并且在客户端容器中请求 TensorRT 的推理服务。

验证的过程,可以通过部署一个 Jobflow 通用计算任务,然后进入容器,对目标推理服务进行预测请求。

进入容器,通过下面的命令来进行推理。

  1. image_client 客户端
  2. -u 默认是 localhost:8000
  3. -m 指定模型
image_client -u 6.19.120.17:8000 -m resnet50_netdef -s INCEPTION images/mug.jpg

5 Reference

  1. NVIDIA TensorRT QuickStart
  2. NVIDIA 镜像仓库