​Adlik 云原生介绍

Adlik是一个深度学习模型优化框架,包括模型优化、编译和推理引擎。它支持多种模型格式编译为OpenVINO、TensorFlow等格式,并提供OpenVINO、TensorRT等推理引擎。Adlik云原生镜像简化了模型编译和推理的环境配置,提高了易用性和普适性,允许用户通过JSON文件和环境变量进行模型编译,支持TensorRT、TensorFlow等运行时。

一、云原生背景介绍

Pivotal作为云原生(Cloud Native)应用架构中先驱者和探路者,于2015年提出了云原生应用。同一年Google主导成立了云原生计算基金会(CNCF),起初CNCF对云原生的定义包含三个方面:应用容器化、面向微服务架构、应用支持容器的编排调度。

随着科技的发展,CNCF基金会对云原生进行了重新定义:云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。云原生所具备的特点如图1.1.1所示:

图1.1.1 云原生特性

云原生应用是一个相互关联但又不独立的组件(service、task、worker)的集合,这些组件与配置结合在一起并在适当的运行时实例化后,共同完成统一的功能目的。下图1.1.2是 OAM(Open Application Model) 定义的云原生应用模型示意图,为了便于理解,图中相同颜色的部分为同一类别的对象定义。其中基本定义如下:

● Workload(工作负载):应用程序的工作负载类型,由平台提供。

● Component(组件):定义了一个 Workload 的实例,并以基础设施中立的术语声明其运维特性。

● Trait(特征):用于将运维特性分配给组件实例。

● ApplicationScope(应用作用域):用于将组件分组成具有共同特性的松散耦合的应用。

● ApplicationConfiguration(应用配置):描述 Component 的部署、Trait 和 ApplicationScope。

图1.1.2云原生应用模型示意图

二、 Adlik云原生

2.1 Adlik

2.1.1 Adlik介绍

Adlik是深度学习模型的端到端优化框架。主要由三部分构成,包括:模型优化,模型编译和推理引擎三部分,架构图如下图1.2.1所示。其中Adlik模型优化器,专注于特定硬件并在其上运行以达到加速的目的。稀疏修剪由于依赖于特殊算法和硬件来实现加速,所以使用场景受到限制。Adlik剪枝集中在通道修剪和过滤器修剪上,可以真正减少参数和触发器的数量。在量化方面,Adlik专注于8 - bit量化,该量化在特定硬件上更容易加速,并且不影响模型的准确率。

图2.1.1 Adlik架构图

模型编译器旨在把不同的模型格式(H5, Checkpoint, ONNX, FrozenGraph, Saved Model)编译为OpenVINO, TensorFlow, TensorRT, TensorFlow Lite格式,满足用户对不同模型的编译需求,在编译的过程中用户可以选择是否对模型进行量化,目前支持模型量化的有TensorRT模型和Tensorflow Lite模型。

推理引擎提供了OpenVINO, TensorFlow-cpu, TensorFlow-gpu,TensorRT, TensorFlow Lite五种格式的推理运行时,满足用户多方推理需求,用户可以根据自己的环境选择合适的编译方式和推理方式。在进行推理时用户可以选择单模型推理,多模型推理,多运行时推理等方式,Adlik提供的模型优化,模型编译和引擎推理均可以部署在云侧和边缘侧。

2.1.2 Adlik操作指南

如果你想在云端或本地使用Adlik,建议最好使用docker镜像在容器搭建,这样不但宿主机和Adlik都环境整洁,也不影响功能的使用,比较便捷。Adlik的安装指南如下图所示:

启动ubuntu18.04容器:

docker run -it ubuntu:bionic bash

安装git:

apt install git -y 

克隆Adlik代码并进入Adlik代码文件:

git clone https://github.com/ZTE/Adlik.git

cd Adlik

配置bazel源:

apt-get install --no-install-recommends -y wget && \
    wget 'https://storage.googleapis.com/bazel-apt/doc/apt-key.pub.gpg' -O /etc/apt/trusted.gpg.d/bazel.asc
echo 'deb https://storage.googleapis.com/bazel-apt stable jdk1.8' >> /etc/apt/sources.list

安装基础依赖包:

apt-get update && \
    apt-get install --no-install-recommends -y \
        automake \
        libpython2.7-stdlib \
        bazel \
        libpython3-dev \
        libtool \
        make \
        patch \
        python-minimal \
        python3-distutils \
        python3-numpy \
        python3-pip

bazel编译client端:

env PYTHON_BIN_PATH=/usr/bin/python3 \
    bazel build //adlik_serving/clients/python:build_pip_package -c opt

编译pip包:

mkdir /tmp/pip-packages && bazel-bin/adlik_serving/clients/python/build_pip_package /tmp/pip-packages

安装client端wheel包:

pip3 install /tmp/pip-packages/adlik_serving_api-0.0.0-py2.py3-none-any.whl 

安装model_compiler包:

  1. 配置cuda源

wget "https://developer.download.nvidia.com/compute/cuda/repos/$ID$(echo $VERSION_ID | tr -d .)/x86_64/7fa2af80.pub" -O /etc/apt/trusted.gpg.d/cuda.asc
. /etc/os-release && \
    echo "deb https://developer.download.nvidia.com/compute/cuda/repos/$ID$(echo $VERSION_ID | tr -d .)/x86_64 /\n\
deb https://developer.download.nvidia.com/compute/machine-learning/repos/$ID$(echo $VERSION_ID | tr -d .)/x86_64 /" >> /etc/apt/sources.list
  1. 安装TensorRT CUDA依赖

export TENSORRT_VERSION=7.1.3

export CUDA_VERSION=10.2
apt-get update && \
apt-get install --no-install-recommends -y cuda-nvrtc-10-2
apt-get install --no-install-recommends -y \
  libcudnn8=*+cuda${CUDA_VERSION} \
  libcudnn8-dev=*+cuda${CUDA_VERSION}
apt-get update && \
apt-get install --no-install-recommends -y \
    libnvinfer7=${TENSORRT_VERSION}-1+cuda${CUDA_VERSION} \
    libnvinfer-dev=${TENSORRT_VERSION}-1+cuda${CUDA_VERSION} \
    libnvinfer-plugin7=${TENSORRT_VERSION}-1+cuda${CUDA_VERSION} \
    libnvparsers7=${TENSORRT_VERSION}-1+cuda${CUDA_VERSION} \
    libnvonnxparsers7=${TENSORRT_VERSION}-1+cuda${CUDA_VERSION} \
    libnvonnxparsers-dev=${TENSORRT_VERSION}-1+cuda${CUDA_VERSION} \
    python3-libnvinfer=${TENSORRT_VERSION}-1+cuda${CUDA_VERSION}
  1. 配置TensorRT环境变量

export LD_LIBRARY_PATH=/usr/local/cuda-$CUDA_VERSION/targets/x86_64-linux/lib
export LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:$LD_LIBRARY_PATH
  1. 配置OpenVINO源

wget 'https://apt.repos.intel.com/openvino/2021/GPG-PUB-KEY-INTEL-OPENVINO-2021' -O /etc/apt/trusted.gpg.d/openvino.asc
echo 'deb https://apt.repos.intel.com/openvino/2021 all main' >> /etc/apt/sources.list
  1. 安装OpenVINO

apt-get install --no-install-recommends -y \
    intel-openvino-model-optimizer-"$OPENVINO_VERSION"
  1. 编译model compiler wheel包

cd model_compiler/

python3 -m pip install -u pip setuptools wheel

python3 setup.py bdist_wheel
  1. 安装compiler wheel包

apt-get install --no-install-recommends -y protobuf-compiler

python3 -m pip install dist/*.whl

编译测试模型

  1. 训练模型

cd Adlik/examples/keras_model/

python3 train_model.py
  1. 编译模型

python3 compile_model.py`

{'status':'success', 'path':'/Adlik/examples/keras_model/model_repos/mnist_1.zip'}

编译OpenVINO引擎:

  1. 配置OpenVINO源

wget 'https://apt.repos.intel.com/openvino/2021/GPG-PUB-KEY-INTEL-OPENVINO-2021' -O /etc/apt/trusted.gpg.d/openvino.asc
echo 'deb https://apt.repos.intel.com/openvino/2021 all main' >> /etc/apt/sources.list
  1. 安装OpenVINO

export OPENVINO_VERSION='2021.1.110'
. /etc/os-release && \
    apt-get update && \
    apt-get install --no-install-recommends -y "intel-openvino-ie-rt-core-$ID-$VERSION_CODENAME-$OPENVINO_VERSION"
  1. 编译OpenVINO serving二进制文件

export INTEL_CVSDK_DIR=/opt/intel/openvino_VERSION
export InferenceEngine_DIR=$INTEL_CVSDK_DIR/deployment_tools/inference_engine/share
env PYTHON_BIN_PATH=/usr/bin/python3 \
    bazel build //adlik_serving \
        --config=openvino \
        -c opt
  1. 配置OpenVINO环境变量

export LD_LIBRARY_PATH=/opt/intel/openvino_$OPENVINO_VERSION/deployment_tools/inference_engine/lib/intel64:/opt/intel/openvino_$OPENVINO_VERSION/deployment_tools/ngraph/lib:/opt/intel/openvino_$OPENVINO_VERSION/deployment_tools/inference_engine/external/tbb/lib

编译TensorFlow cpu 引擎:

env PYTHON_BIN_PATH=/usr/bin/python3 \
    bazel build //adlik_serving \
        --config=tensorflow-cpu \
        -c opt 

编译TensorFlow Lite 引擎:

env PYTHON_BIN_PATH=/usr/bin/python3 \
        bazel build --config=tensorflow-lite-cpu -c opt //adlik_serving

编译TensorFlow gpu引擎:

  1. 安装CUDA依赖包

apt-get update && \
    apt-get install --no-install-recommends -y \
        cuda-cufft-10-2 \
        cuda-cufft-dev-10-2 \
        cuda-cupti-dev-10-2 \
        cuda-curand-10-2 \
        cuda-curand-dev-10-2 \
        cuda-cusolver-10-2 \
        cuda-cusolver-dev-10-2 \
        cuda-cusparse-dev-10-2 \
        cuda-cusparse-10-2 \
        cuda-nvml-dev-10-2 \
        cuda-nvrtc-10-2 \
        libcublas-dev=10.2.* \
        'libcudnn7=*+cuda10.2' \
        'libcudnn7-dev=*+cuda10.2'
apt-mark hold libcudnn7 libcudnn7-dev 
  1. 编译TensorFlow gpu serving二进制文件

env PYTHON_BIN_PATH=/usr/bin/python3 \
        TF_CUDA_VERSION=10.2 \
        bazel build //adlik_serving \
         --config=tensorflow-gpu \
         -c opt \
         --incompatible_use_specific_tool_files=false

编译TensorRT引擎:

  1. 安装CUDA依赖包

apt-get update && \
apt-get install --no-install-recommends -y \
    cuda-cufft-10-2 \
    cuda-cufft-dev-10-2 \
    cuda-cupti-dev-10-2 \
    cuda-curand-10-2 \
    cuda-curand-dev-10-2 \
    cuda-cusolver-10-2 \
    cuda-cusolver-dev-10-2 \
    cuda-cusparse-dev-10-2 \
    cuda-cusparse-10-2 \
    cuda-nvml-dev-10-2 \
    cuda-nvrtc-10-2 \
    libcublas-dev=10.2.* \
    'libcudnn7=*+cuda10.2' \
    'libcudnn7-dev=*+cuda10.2' \
    'libnvinfer7=7.0.*+cuda10.2' \
    'libnvinfer-dev=7.0.*+cuda10.2' \
    'libnvinfer-plugin7=7.0.*+cuda10.2' \
    'libnvparsers7=7.0.*+cuda10.2' \
    'libnvonnxparsers7=7.0.*+cuda10.2' \
    'libnvonnxparsers-dev=7.0.*+cuda10.2'
apt-mark hold libcudnn7 libcudnn7-dev libnvinfer7 libnvinfer-dev libnvonnxparsers7 libnvonnxparsers-dev
  1. 编译引擎

env PYTHON_BIN_PATH=/usr/bin/python3 \
        TF_CUDA_VERSION=${CUDA_VERSION} \
        bazel build //adlik_serving \
         --config=tensorrt \
         -c opt \
         --action_env=LIBRARY_PATH=/usr/local/cuda-${CUDA_VERSION}/lib64/stubs \
         --incompatible_use_specific_tool_files=false 

使用编译好的模型测试引擎是否编译成功:

启动服务:

cd /Adlik/bazel-bin/adlik_serving

./adlik_serving --model_base_path=/Adlik/examples/keras_model/model_repos/ --grpc_port=8500 --htpp_port=8501

进入容器:

docker exec -it 容器名字 bash

进行推理:

python3 mnist_client.py data/0.png

推理结果:

2.2 Adlik云原生

2.2.1 Adlik云原生介绍

由于使用Adlik进行模型编译和推理时,不同的运行时需要不同的依赖环境;不同运行时的依赖包下载和环境构建过程较为复杂,耗时较长,用户使用时便捷性较差;用户构建运行时环境的学习成本较高,并且可能会出错;在部署kubernets的云环境中,用户需要自己研究并部署编译和推理任务。为了提高Adlik的易用性以及普适性,方便用户进行部署和使用。我们推出了Adlik云原生镜像,Adlik云原生镜像主要包括:模型编译镜像;OpenVINO运行时镜像,TensorFlow cpu运行时镜像,TensorFlow Lite运行时镜像,TensorFlow gpu运行时镜像和TensorRT运行时镜像。

编译镜像支持用户通过json文件和env环境变量两种办法进行模型的编译,在进行模型编译时用户需要提供提前训练好的模型文件。编译镜像支持的模型文件包括:H5, FrozenGraph, Checkpoint, ONNX, Saved Model,支持的编译运行时包括:TensorFlow,TensorFlow Lite,TensorRT,OpenVINO。用户在进行编译时source type, serving type, max batch size, export path, model name这五个字段时必须要给的,给定编译字段之后就可以进行模型编译了。

使用TensorRT serving镜像时需要注意的是TensorRT版本和CUDA版本需要与compiler镜像中的TensorRT版本和CUDA版本相匹配,否则做不了推理,造成这个问题的主要原因是TensorRT在编译时会绑定GPU,所以最好在同一台GPU上进行编译和推理,这样能确保不会出问题。同时需要注意的是环境中必须安装了GPU,并且cuda的驱动器版本大于400,目前提供的镜像不支持CUDA版本10.0以下,环境的内存配置不能低于10G,GPU的推理和环境所安装的GPU型号有很大的关系。

用户在使用serving镜像时需要给定编译好的对应格式的模型文件,推理时使用的HTTP PORT或者GRPC PORT,然后就可以进行推理了。

2.2.2 Adlik云原生操作指南

关于Adlik云原生镜像的操作指南使用的演示模型均为提前训练好的yolov3模型。

2.2.2.1 Adlik云原生纯镜像操作指南

使用yaml文件创建编译镜像的pod:

kubectl create -f compiler.yaml

pod创建成功:

查看创建好的pod:

kubectl get pod | grep compiler

查看编译好的模型文件:

使用yaml文件创建引擎服务pod:

kubectl create -f openvino-serving.yaml

查看创建好的pod:

kubectl get pod | grep openvino-serving

使用yaml文件创建service pod,把服务的端口暴露到集群外:

kubectl create -f openvino-svc.yaml

查看创建好的服务pod:

kubectl get pod | grep openvino-serving

进行推理:

python3 yolov3 client.py -b 1 dog.jpg

推理结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux基金会AI&Data基金会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值