PAI-Blade敏捷版提供了C++ SDK帮助您部署优化后的模型推理。本文以TensorFlow模型为例,介绍PAI-Blade敏捷版SDK的使用方法。

前提条件

  • 已使用PAI-Blade敏捷版对TensorFlow模型进行了优化,详情请参见优化TensorFlow模型
  • 已安装SDK并获取鉴权Token,详情请参见安装PAI-Blade敏捷版。因为本文使用GCC 4.8,所以需要使用pre-cxx11 ABI的SDK。本文选用3.7.0版本的RPM包。
    说明 经过PAI-Blade敏捷版优化的模型,必须依赖对应的SDK才能正常运行。

准备环境

本文以CentOS 7为例,介绍如何使用PAI-Blade敏捷版SDK部署TensorFlow模型推理。

  1. 准备服务器。
    本文使用如下配置的ECS实例:
    • 实例规格:ecs.gn6i-c4g1.xlarge,T4 GPU
    • 操作系统:CentOS 7.9 64位
    • 设备:CUDA 10.0
    • 显卡驱动:Driver 440.64.00
    • GPU计算加速包:CUDNN 7.6.5
  2. 安装GCC。
    本文使用CentOS默认的GCC 4.8,安装命令如下。
    yum install -y gcc-c++
  3. 安装Python 3。
    # 更新 pip 版本。
    python3 -m pip install --upgrade pip
    
    # 安装virtualenv,在虚拟环境中安装TensorFlow。
    pip3 install virtualenv==16.0
    python3 -m virtualenv venv
    
    # 重要!激活virtuanenv。
    source venv/bin/activate
  4. 安装TensorFlow,并下载相关库文件。
    使用TensorFlow进行推理通常需要libtensorflow_framework.so和libtensorflow_cc.so两个动态链接库。实际生产中,必须构建TensorFlow Wheel包(包含libtensorflow_framework.so),并且与libtensorflow_cc.so使用的配置、环境及编译器版本一致。为演示方便,本文使用社区TensorFlow和已经预编译的库文件(请勿直接用于生产环境)。
    # 安装TensorFlow。
    pip3 install tensorflow-gpu==1.15.0
    
    # 下载libtensorflow_cc.so。
    wget http://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/demo/sdk/tensorflow/libtensorflow_cc.so

部署模型推理

通过PAI-Blade敏捷版SDK加载并部署优化后的模型推理,您无需修改原代码逻辑,只需要在编译时链接上PAI-Blade敏捷版SDK中的库文件。

  1. 准备模型。
    本文使用已经优化好的示例模型进行演示,通过如下命令即可下载该模型。您也可以使用自己的优化模型,关于如何使用PAI-Blade敏捷版优化模型,详情请参见优化TensorFlow模型
    wget http://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/demo/asr_frozen.pb
  2. 下载并查看推理代码。
    通过PAI-Blade敏捷版优化后的模型,其执行过程与常规TensorFlow模型相同,无需编写额外代码或配置额外信息。您可以使用如下命令下载本文使用的推理代码。
    wget http://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/demo/sdk/tensorflow/tf_sdk_demo.cc
    查看已下载的tf_sdk_demo.cc文件,其内容均为TensorFlow推理的通用逻辑,并没有PAI-Blade敏捷版的相关代码。
  3. 编译代码。
    您只需要额外链接SDK下/usr/local/lib子目录下的SO文件libblade_ops.so,即可正常运行PAI-Blade优化后的模型。编译命令如下所示。
    # 获取TensorFlow的编译flag。
    TF_COMPILE_FLAGS=$(python3 -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_compile_flags()))')
    
    # 获取TensorFlow的链接flag。
    TF_LD_FLAGS=$(python3 -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_link_flags()))')
    
    # libtensorflow_cc.so在当前目录。
    TF_CC_PATH='.'
    
    g++ -std=c++11 tf_sdk_demo.cc \\
        ${TF_COMPILE_FLAGS} \\
        ${TF_LD_FLAGS} \\
        -L ${TF_CC_PATH} \\
        -L /usr/local/lib \\
        -ltensorflow_cc \\
        -lblade_ops \\
        -ltao_ops \\
        -o demo_cpp_sdk.bin
    您可以根据实际情况修改如下参数:
    • tf_sdk_demo.cc:推理代码的文件名。
    • /usr/local/lib:SDK的安装路径,通常无需修改。
    • demo_cpp_sdk.bin:编译生成的可执行程序名。
    说明 相比常规TensorFlow Serving的编译,此处需要额外链接两个PAI-Blade敏捷版提供的包含优化OP的SO文件,即libblade_ops.so和libtao_ops.so。
  4. 本地执行模型推理。
    您可以参考如下命令,使用编译好的可执行程序(demo_cpp_sdk.bin)加载并执行PAI-Blade敏捷版优化好的示例模型(asr_frozen.pb)。
    # 必填,请联系PAI团队获取。
    export BLADE_REGION=<region>
    # 必填,请联系PAI团队获取。
    export BLADE_TOKEN=<token>
    TF_LD_FLAGS=$(python3 -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_link_flags()))')
    TF_FRAMEWORK_PATH=`echo $TF_LD_FLAGS | awk '{print $1}' | sed "s/-L//g"`
    LD_LIBRARY_PATH=${TF_FRAMEWORK_PATH}:${TF_CC_PATH}:/usr/local/lib:${LD_LIBRARY_PATH} ./demo_cpp_sdk.bin asr_frozen.pb
    您需要根据实际情况替换以下参数:
    • <region>:PAI-Blade敏捷版支持的地域,需要加入PAI-Blade用户群获取该信息,用户群的二维码详情请参见获取Token
    • <token>:鉴权Token,需要加入PAI-Blade用户群获取该信息,用户群的二维码详情请参见获取Token
    • /usr/local/lib:SDK的安装目录,通常无需修改。
    • demo_cpp_sdk.bin:上一步中编译好的可执行程序。
    • asr_frozen.pb:PAI-Blade敏捷版优化好的TensorFlow模型。本文使用步骤1中下载的示例模型。
    系统回显如下类似结果,表示模型已经顺利地开始执行了。
    ...
    2020-11-20 16:41:41.263192: I demo_cpp_sdk.cpp:96] --- Execution uses: 41.995 ms
    2020-11-20 16:41:41.305550: I demo_cpp_sdk.cpp:96] --- Execution uses: 42.334 ms
    2020-11-20 16:41:41.347772: I demo_cpp_sdk.cpp:96] --- Execution uses: 42.195 ms
    2020-11-20 16:41:41.390894: I demo_cpp_sdk.cpp:96] --- Execution uses: 43.09 ms
    2020-11-20 16:41:41.434968: I demo_cpp_sdk.cpp:96] --- Execution uses: 44.047 ms
    ...