一、云原生背景介绍
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包:
配置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
安装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}
配置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
配置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
安装OpenVINO
apt-get install --no-install-recommends -y \
intel-openvino-model-optimizer-"$OPENVINO_VERSION"
编译model compiler wheel包
cd model_compiler/
python3 -m pip install -u pip setuptools wheel
python3 setup.py bdist_wheel
安装compiler wheel包
apt-get install --no-install-recommends -y protobuf-compiler
python3 -m pip install dist/*.whl
编译测试模型
训练模型
cd Adlik/examples/keras_model/
python3 train_model.py
编译模型
python3 compile_model.py`
{'status':'success', 'path':'/Adlik/examples/keras_model/model_repos/mnist_1.zip'}
编译OpenVINO引擎:
配置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
安装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"编译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
配置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引擎:
安装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
编译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引擎:
安装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
编译引擎
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
推理结果:

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

355

被折叠的 条评论
为什么被折叠?



