日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

源码编译优化

發(fā)布時間:2023/11/28 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 源码编译优化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

源碼編譯優(yōu)化
深度學(xué)習(xí)的發(fā)展十分迅速,對科研或工程人員來說,可能會遇到一些需要自己開發(fā)op的場景,可以在python層面編寫op,但如果對性能有嚴(yán)格要求的話,必須在C++層面開發(fā)op,對于這種情況,需要用戶源碼編譯飛槳paddle,使之生效。 此外對于絕大多數(shù)使用C++將模型部署上線的工程人員來說,可以直接通過飛槳paddle官網(wǎng)下載已編譯好的預(yù)測庫,快捷開啟飛槳paddle使用之旅。飛槳paddle官網(wǎng)提供了多個不同環(huán)境下編譯好的預(yù)測庫。如果用戶環(huán)境與官網(wǎng)提供環(huán)境不一致(如cuda 、cudnn、tensorrt版本不一致等),或?qū)︼w槳paddle源代碼有修改需求,或希望進行定制化構(gòu)建,可查閱本文檔自行源碼編譯得到預(yù)測庫。
編譯原理
目標(biāo)產(chǎn)物
飛槳paddle框架的源碼編譯包括源代碼的編譯和鏈接,最終生成的目標(biāo)產(chǎn)物包括:
? 含有 C++ 接口的頭文件及其二進制庫:用于C++環(huán)境,將文件放到指定路徑即可開啟飛槳paddle使用之旅。
? Python Wheel 形式的安裝包:用于Python環(huán)境,此安裝包需要參考飛槳paddle安裝教程進行安裝操作。也就是說,前面講的pip安裝屬于在線安裝,這里屬于本地安裝。
基礎(chǔ)概念
飛槳paddle主要由C++語言編寫,通過pybind工具提供了Python端的接口,飛槳paddle的源碼編譯主要包括編譯和鏈接兩步。
? 編譯過程由編譯器完成,編譯器以編譯單元(后綴名為 .cc 或 .cpp 的文本文件)為單位,將 C++ 語言 ASCII 源代碼翻譯為二進制形式的目標(biāo)文件。一個工程通常由若干源碼文件組織得到,所以編譯完成后,將生成一組目標(biāo)文件。
? 鏈接過程使分離編譯成為可能,由鏈接器完成。鏈接器按一定規(guī)則將分離的目標(biāo)文件組合成一個能映射到內(nèi)存的二進制程序文件,并解析引用。由于這個二進制文件通常包含源碼中指定可被外部用戶復(fù)用的函數(shù)接口,所以也被稱作函數(shù)庫。根據(jù)鏈接規(guī)則不同,鏈接可分為靜態(tài)和動態(tài)鏈接。靜態(tài)鏈接對目標(biāo)文件進行歸檔;動態(tài)鏈接使用地址無關(guān)技術(shù),將鏈接放到程序加載時進行。配合包含聲明體的頭文件(后綴名為 .h 或 .hpp),用戶可以復(fù)用程序庫中的代碼開發(fā)應(yīng)用。靜態(tài)鏈接構(gòu)建的應(yīng)用程序可獨立運行,而動態(tài)鏈接程序在加載運行時需到指定路徑下搜尋其依賴的二進制庫。
編譯方式
飛槳paddle框架的設(shè)計原則之一是滿足不同平臺的可用性。然而,不同操作系統(tǒng)慣用的編譯和鏈接器是不一樣的,使用命令也不一致。比如,Linux 一般使用 GNU 編譯器套件(GCC),Windows 則使用 Microsoft Visual C++(MSVC)。為了統(tǒng)一編譯腳本,飛槳paddle使用了支持跨平臺構(gòu)建的 CMake,可以輸出上述編譯器所需的各種 Makefile 或者 Project 文件。
為方便編譯,框架對常用的CMake命令進行了封裝,如仿照 Bazel工具封裝了 cc_binary 和 cc_library ,分別用于可執(zhí)行文件和庫文件的產(chǎn)出等,對CMake感興趣的,可在 cmake/generic.cmake 中查看具體的實現(xiàn)邏輯。Paddle的CMake中集成了生成python wheel包的邏輯,對如何生成wheel包感興趣的,可參考相關(guān)文檔。
編譯步驟
飛槳paddle分為 CPU 版本和 GPU 版本。如果計算機沒有 Nvidia GPU,選擇 CPU 版本構(gòu)建安裝。如果計算機含有 Nvidia GPU且預(yù)裝有 CUDA / CuDNN,也可選擇 GPU 版本構(gòu)建安裝。本節(jié)簡述飛槳paddle在常用環(huán)境下的源碼編譯方式,歡迎訪問飛槳paddle官網(wǎng)獲取更詳細(xì)內(nèi)容。請閱讀本節(jié)內(nèi)容。
推薦配置及依賴項
1、穩(wěn)定的互聯(lián)網(wǎng)連接,主頻 1 GHz 以上的多核處理器,9 GB 以上磁盤空間。
2、Python 版本 2.7 或 3.5 以上,pip 版本 9.0 及以上;CMake v3.5 及以上;Git 版本 2.17 及以上。將可執(zhí)行文件放入系統(tǒng)環(huán)境變量中以方便運行。
3、GPU 版本額外需要 Nvidia CUDA 9 / 10,CuDNN v7 及以上版本。根據(jù)需要還可能依賴 NCCL 和 TensorRT。
基于Ubuntu 18.04

  1. 環(huán)境準(zhǔn)備
    除了本節(jié)開頭提到的依賴,在 Ubuntu 上進行飛槳paddle的源碼編譯,還需要準(zhǔn)備 GCC8 編譯器等工具,可使用下列命令安裝:
    sudo apt-get install gcc g++ make cmake git vim unrar python3 python3-dev python3-pip swig wget patchelf libopencv-dev
    pip3 install numpy protobuf wheel setuptools
    若需啟用 cuda 加速,需準(zhǔn)備 cuda、cudnn、nccl。上述工具的安裝請參考 nvidia 官網(wǎng),以 cuda10.1,cudnn7.6 為例配置 cuda 環(huán)境。

cuda

sh cuda_10.1.168_418.67_linux.run
export PATH=/usr/local/cuda-10.1/binKaTeX parse error: Expected '}', got 'EOF' at end of input: {PATH:+:{PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/KaTeX parse error: Expected '}', got 'EOF' at end of input: …LIBRARY_PATH:+:{LD_LIBRARY_PATH}}

cudnn

tar -xzvf cudnn-10.1-linux-x64-v7.6.4.38.tgz
sudo cp -a cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp -a cuda/lib64/libcudnn* /usr/local/cuda/lib64/

nccl

install nccl local deb 參考https://docs.nvidia.com/deeplearning/sdk/nccl-install-guide/index.html

sudo dpkg -i nccl-repo-ubuntu1804-2.5.6-ga-cuda10.1_1-1_amd64.deb

根據(jù)安裝提示,還需要執(zhí)行sudo apt-key add /var/nccl-repo-2.5.6-ga-cuda10.1/7fa2af80.pub

sudo apt update
sudo apt install libnccl2 libnccl-dev

sudo ldconfig
編譯飛槳paddle過程中可能會打開很多文件,Ubuntu 18.04 默認(rèn)設(shè)置最多同時打開的文件數(shù)是1024(參見 ulimit -a),需要更改這個設(shè)定值。
在 /etc/security/limits.conf 文件中添加兩行。

  • hard noopen 102400
  • soft noopen 102400
    重啟計算機,重啟后執(zhí)行以下指令,請將${user}切換成當(dāng)前用戶名。
    su ${user}
    ulimit -n 102400
  1. 編譯命令
    使用 Git 將飛槳paddle代碼克隆到本地,并進入目錄,切換到穩(wěn)定版本(git tag顯示的標(biāo)簽名,如v2.0.0)。
    飛槳paddle使用 develop 分支進行最新特性的開發(fā),使用 release 分支發(fā)布穩(wěn)定版本。在 GitHub 的 Releases 選項卡中,可以看到飛槳paddle版本的發(fā)布記錄。
    git clone https://github.com/PaddlePaddle/Paddle.git
    cd Paddle
    git checkout v2.0.0
    下面以 GPU 版本為例說明編譯命令。其它環(huán)境可以參考“CMake編譯選項表”修改對應(yīng)的cmake選項。比如,若編譯 CPU 版本,將 WITH_GPU 設(shè)置為 OFF。如果要使用TensorRT加速功能,將WITH_TENSORRT設(shè)置為ON,并通過TENSORRT_ROOT指定TensorRT安裝路徑。

創(chuàng)建并進入 build 目錄

mkdir build_cuda && cd build_cuda

執(zhí)行cmake指令

cmake -DPY_VERSION=3
-DWITH_TESTING=OFF
-DWITH_MKL=ON
-DWITH_GPU=ON
-DWITH_TENSORRT=ON
-DTENSORRT_ROOT=/home/work/nvidia/TensorRT-7.1.3.4
-DON_INFER=ON
-DCMAKE_BUILD_TYPE=RelWithDebInfo

使用make編譯

make -j4

編譯成功后可在dist目錄找到生成的.whl包

pip3 install python/dist/paddlepaddle-2.0.0-cp36-cp36m-linux_x86_64.whl

預(yù)測庫編譯

make inference_lib_dist -j4
CMake 編譯選項表
以下介紹的編譯方法都是通用步驟,根據(jù)環(huán)境對應(yīng)修改cmake選項即可。

基于Windows 10

  1. 環(huán)境準(zhǔn)備
    除了本節(jié)開頭提到的依賴,在 Windows 10 上編譯飛槳paddle,還需要準(zhǔn)備 Visual Studio 2015 Update3 以上版本。本節(jié)以 Visual Studio 企業(yè)版 2019(C++ 桌面開發(fā),含 MSVC 14.24)、Python 3.8 為例介紹編譯過程。
    在命令提示符輸入下列命令,安裝必需的 Python 組件。
    pip3 install numpy protobuf wheel
  2. 編譯命令
    使用 Git 將飛槳paddle代碼克隆到本地,并進入目錄,切換到穩(wěn)定版本(git tag顯示的標(biāo)簽名,如v2.0.0)。
    飛槳paddle使用 develop 分支進行最新特性的開發(fā),使用 release 分支發(fā)布穩(wěn)定版本。在 GitHub 的 Releases 選項卡中,可以看到 Paddle 版本的發(fā)布記錄。
    git clone https://github.com/PaddlePaddle/Paddle.git
    cd Paddle
    git checkout v2.0.0
    創(chuàng)建一個構(gòu)建目錄,并在其中執(zhí)行 CMake,生成解決方案文件 Solution File,以編譯 CPU 版本為例說明編譯命令,其它環(huán)境可以參考“CMake編譯選項表”修改對應(yīng)的cmake選項。
    mkdir build
    cd build
    cmake … -G “Visual Studio 16 2019” -A x64 -DWITH_GPU=OFF -DWITH_TESTING=OFF -DCMAKE_BUILD_TYPE=Release -DPY_VERSION=3

使用 Visual Studio 打開解決方案文件,在窗口頂端的構(gòu)建配置菜單中選擇 Release x64,單擊生成解決方案,等待構(gòu)建完畢即可。
CMake 編譯選項表

結(jié)果驗證

  1. Python Wheel 安裝包
    編譯完畢后,會在 python/dist 目錄下生成一個文件名類似 paddlepaddle-2.0.0-cp36-cp36m-linux_x86_64.whl 的 Python Wheel 安裝包,安裝測試的命令為:
    pip3 install python/dist/paddlepaddle-2.0.0-cp36-cp36m-linux_x86_64.whl
    安裝完成后,可以使用 python3 進入python解釋器,輸入以下指令,出現(xiàn)PaddlePaddle is installed successfully!,說明安裝成功。
    import paddle
    paddle.utils.run_check()
  2. C++ 預(yù)測庫及頭文件
    預(yù)測庫編譯后,所有產(chǎn)出均位于build目錄下的paddle_inference_install_dir目錄內(nèi),目錄結(jié)構(gòu)如下。version.txt 中記錄了該預(yù)測庫的版本信息,包括Git Commit ID、使用OpenBlas或MKL數(shù)學(xué)庫、CUDA/CUDNN版本號。
    paddle_inference_install_dir
    ├── CMakeCache.txt
    ├── paddle
    │ ├── include
    │ │ ├── crypto
    │ │ ├── internal
    │ │ ├── paddle_analysis_config.h
    │ │ ├── paddle_api.h
    │ │ ├── paddle_infer_declare.h
    │ │ ├── paddle_inference_api.h
    │ │ ├── paddle_mkldnn_quantizer_config.h
    │ │ └── paddle_pass_builder.h
    │ └── lib
    │ ├── libpaddle_fluid.a
    │ └── libpaddle_fluid.so
    ├── third_party
    │ ├── cudaerror
    │ │ └── data
    │ ├── install
    │ │ ├── cryptopp
    │ │ ├── gflags
    │ │ ├── glog
    │ │ ├── openblas
    │ │ ├── protobuf
    │ │ └── xxhash
    │ └── threadpool
    │ └── ThreadPool.h
    └── version.txt
    Include目錄下包括了使用飛槳paddle預(yù)測庫需要的頭文件,lib目錄下包括了生成的靜態(tài)庫和動態(tài)庫,third_party目錄下包括了預(yù)測庫依賴的其它庫文件。
    可以編寫應(yīng)用代碼,與預(yù)測庫聯(lián)合編譯并測試結(jié)果。請參“單機服務(wù)器部署中的“ 基于C++ API的推理部署”一節(jié)。

總結(jié)

以上是生活随笔為你收集整理的源码编译优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。