全部產品
Search
文件中心

Platform For AI:使用SDK部署TensorFlow模型推理

更新時間:Jul 13, 2024

PAI-Blade提供了C++ SDK協助您部署最佳化後的模型推理。本文以TensorFlow模型為例,介紹PAI-Blade的SDK的使用方法。

前提條件

  • 已使用PAI-Blade對TensorFlow模型進行了最佳化,詳情請參見最佳化TensorFlow模型

  • 已安裝SDK並擷取鑒權Token,詳情請參見安裝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
    
    # 重要!啟用virtualenv。
    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檔案libtf_blade.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 \
        -ltf_blade \
        -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檔案,即libtf_blade.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
    ...