前言

這一章我們介紹如何安裝新版本的PaddlePaddle,這裏說的新版本主要是說Fluid版本。Fluid 是設計用來讓用戶像Pytorch和Tensorflow Eager Execution一樣執行程序。在這些系統中,不再有模型這個概念,應用也不再包含一個用於描述Operator圖或者一系列層的符號描述,而是像通用程序那樣描述訓練或者預測的過程。也就是說PaddlePaddle從Fluid版本開始使用動態圖機制,所以我們這個系列也是使用Fluid版本編寫的教程。

環境

  • 系統:64位Windows 10專業版,64位Ubuntu 16.04
  • Python環境:Python 3.5
  • 內存:8G

Windows下安裝

PaddlePaddle在1.2版本之後開始支持Windows,也就是說使用Windows的用戶不需要再安裝Docker容器,或者使用Windows的Liunx子系統,直接可以在Windows系統本身安裝PaddlePaddle。下面我們就介紹如何在Windows安裝PaddlePaddle,分爲兩個部分介紹,首先安裝Python 3.5環境,然後再使用命令安裝PaddlePaddle。

安裝Python

1、本系列使用的是Python 3.5,官方在Windows上支持Python2.7.15,Python3.5.x,Python3.6.x,Python3.7.x。讀者根據自己的實際情況安裝自己喜歡的版本。官網下載頁面:https://www.python.org/downloads/windows/ ,官網下載地址:https://www.python.org/ftp/python/3.5.4/python-3.5.4-amd64.exe

2、雙擊運行Python 3.5安裝包開始安裝,記住要選上添加環境變量,這很重要,之後使用命令都要依賴這個環境變量,要不每次都要進入到pip的目錄比較麻煩。然後點擊Install Now開始安裝。

3、安裝完成之後,測試安裝是否成功,打開Windows PowerShell或者cmd,筆者的系統是Windows 10,可以使用Windows PowerShell,如果讀者是其他系統,可以使用cmd。用命令python -V查看是否安裝成功。正常安裝之後可以顯示安裝Python的版本。

安裝PaddlePaddle

PaddlePaddle支持Windows之後,安裝起來非常簡單,只需要一條命令就可以完成安裝。

  • 安裝CPU版本,打開Windows PowerShell,輸入以下命令。可以使用==指定安裝PaddlePaddle的版本,如沒有指定版本,默認安裝是最新版本。-i後面是鏡像源地址,使用國內鏡像源可以大大提高下載速度:
pip3 install paddlepaddle==1.4.1 -i https://mirrors.aliyun.com/pypi/simple/
  • 安裝GPU版本,目前支持Windows的CUDA 8.0 cuDNN v7的GPU版本
pip3 install paddlepaddle-gpu==1.4.1 -i https://mirrors.aliyun.com/pypi/simple/
  • 測試安裝是否成功,在Windows PowerShell中輸入命令python,進入到Python 編輯環境,並輸入以下代碼,導沒有保存證明安裝成功:
import paddle.fluid

Ubuntu下安裝

下面介紹在Ubuntu系統下安裝PaddlePaddle,PaddlePaddle支持64位的Ubuntu 14.04 /16.04 /18.04系統,Python支持Python2.7.15,Python3.5.x,Python3.6.x,Python3.7.x。

  • 安裝Python 3.5(通常不需要執行)。通常情況下Ubuntu 16.04自帶的就是Python 3.5,其他Ubuntu的版本自帶的可能是其他版本,不過沒有關係,PaddlePaddle基本都支持,所以不必專門安裝Python3.5。
sudo apt install python3.5
sudo apt install python3.5-dev
  • 安裝CPU版本,打開Ubuntu的終端,快捷鍵是Ctrl+Alt+T,輸入以下命令。可以使用==指定安裝PaddlePaddle的版本,如沒有指定版本,默認安裝是最新版本。-i後面是鏡像源地址,使用國內鏡像源可以大大提高下載速度:
pip3 install paddlepaddle==1.4.1 -i https://mirrors.aliyun.com/pypi/simple/
  • 安裝GPU版本,安裝GPU版本之前,要先安裝CUDA,可以查看筆者之前的文章《Ubuntu安裝和卸載CUDA和CUDNN》,安裝完成 CUDA 9 和 CUDNN 7 之後,再安裝PaddlePaddle的GPU版本,安裝命令如下。可以使用==指定安裝PaddlePaddle的版本和CUDA、CUDNN的版本,這必須要跟讀者系統本身安裝的CUDA版本對應,比如以下命令就是安裝支持CUDA 9.0和CUDNN 7的PaddlePaddle版本。-i後面是鏡像源地址,使用國內鏡像源可以大大提高下載速度:
pip3 install paddlepaddle-gpu==1.4.1.post97 -i https://mirrors.aliyun.com/pypi/simple/
  • 測試安裝是否成功,在終端中輸入命令python3,進入到Python 編輯環境,並輸入以下代碼,正確情況下如圖所示:
import paddle.fluid

源碼編譯

這部分我們將介紹使用源碼編譯PaddlePaddle,可以通過這種方式安裝符合讀者需求的PaddlePaddle,比如筆者的電腦安裝的是CUDA 10 和 CUDNN 7,而目前官方提供的沒有支持CUDA 10 和 CUDNN 7的PaddlePaddle版本,所以筆者就可以通過源碼編譯的方式編譯PaddlePaddle安裝包,當然也要PaddlePaddle支持纔行。

Windows下源碼編譯

下面我們將介紹在Windows系統下進行源碼編譯PaddlePaddle。目前支持使用的系統是64位的Windows 10 家庭版/專業版/企業版。

  1. 安裝Visual Studio 2015 Update3。下載地址:https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/ ,因爲是舊版本,還有加入免費的 Dev Essentials 計劃才能正常下載。

  2. 安裝cmake 3.13,下載cmake的安裝包,下載地址:https://cmake.org/download/ ,一路默認,只需要在添加環境變量的時候注意添加環境變量就可以了。如何存在環境變量問題,可以重啓系統。

  3. 安裝Python的依賴庫,只要執行以下命令。關於Windows安裝Python,在“Windows下安裝”部分已經介紹過,這裏就不介紹了。
pip3 install numpy
pip3 install protobuf
pip3 install wheel
  1. 安裝 git 工具。git的下載地址:https://git-scm.com/downloads ,下載git的安裝包,安裝的時候一路默認就可以了。

  2. 右鍵打開Git Bash Here,執行以下兩條命令。將PaddlePaddle的源碼clone在當下目錄下的Paddle的文件夾中,並進入Padde目錄下,操作如下圖所示,之後的命令也是在這個終端操作:

git clone https://github.com/PaddlePaddle/Paddle.git
cd Paddle


  1. 切換到較穩定release分支下進行編譯,入筆者選擇1.2版本的代碼:
git checkout release/1.2
  1. 創建名爲build的目錄並進入:
mkdir build
cd build
  1. 執行編譯
    • 編譯CPU版本命令如下:
    cmake .. -G "Visual Studio 14 2015 Win64" -DPY_VERSION=3.5 -DPYTHON_INCLUDE_DIR=${PYTHON_INCLUDE_DIRS} -DPYTHON_LIBRARY=${PYTHON_LIBRARY} -DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE} -DWITH_FLUID_ONLY=ON -DWITH_GPU=OFF -DWITH_TESTING=OFF -DCMAKE_BUILD_TYPE=Release
-  編譯**GPU版本**,目前Windows還不支持GPU,支持後會更新。


9. 下載第三方依賴包(openblas,snappystream),下載地址:https://github.com/wopeizl/Paddle_deps ,將整個third_party文件夾放到上面第7步創建的build目錄下。
10. 使用Blend for Visual Studio 2015 打開paddle.sln文件,選擇平臺爲x64,配置爲Release,開始編譯
11. 編譯成功後進入\paddle\build\python\dist目錄下找到生成的.whl
12. 執行以下命令安裝編譯好的PaddlePaddle包:

pip3 install (whl包的名字)

Ubuntu本地下源碼編譯

下面介紹的是使用Ubuntu編譯PaddlePaddle源碼,筆者的系統是64位的Ubuntu 16.04,Python環境是Python 3.5。

安裝openCV

  1. 更新apt的源,命令如下:
sudo apt update
  1. 下載openCV源碼,官方地址:https://opencv.org/releases.html , 筆者下載的是3.4.5版本,選擇的是Sources點擊下載。

  2. 解壓openCV源碼,命令如下:

unzip opencv-3.4.5.zip
  1. 安裝可能需要的依賴庫,命令如下:
sudo apt-get install cmake
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev
  1. 開始執行cmake。
cd opencv-3.4.5/
mkdir my_build_dir
cd my_build_dir
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
  1. 開始執行編譯
make -j$(nproc)
  1. 執行安裝命令
sudo make install

安裝依賴環境

編譯PaddlePaddle源碼之前,還需要安裝以下的一些依賴環境。

sudo apt install python3.5-dev
sudo apt-get udpate
sudo apt-get install -y software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt install curl
sudo curl https://bootstrap.pypa.io/get-pip.py -o - | python3.5
sudo easy_install pip
sudo apt install swig
sudo apt install wget
sudo pip install numpy==1.14.0
sudo pip install protobuf==3.1.0
sudo pip install wheel
sudo apt install patchelf

編譯PaddlePaddle

  1. 將PaddlePaddle的源碼clone在當下目錄下的Paddle的文件夾中,並進入Padde目錄下,命令如下:
git clone https://github.com/PaddlePaddle/Paddle.git
cd Paddle
  1. 切換到較穩定release分支下進行編譯,比如筆者使用的是1.2版本,讀者可以根據自己的情況選擇其他版本:
git checkout release/1.4
  1. 創建並進入一個叫build的目錄下:
mkdir build && cd build
  1. 執行cmake,這裏分爲CPU版本和GPU版本。
    • 編譯CPU版本,命令如下。使用參數-DPY_VERSION指定編譯的PaddlePaddle支持的Python版本,筆者這裏選擇的是Python 3.5。並且使用參數-DWITH_FLUID_ONLY指定不編譯V2版本的PaddlePaddle代碼。使用參數-DWITH_GPU指定不使用GPU,也就是隻編譯CPU版本:
    cmake .. -DPY_VERSION=3.5 -DWITH_FLUID_ONLY=ON -DWITH_GPU=OFF -DWITH_TESTING=OFF -DCMAKE_BUILD_TYPE=Release
- 編譯**GPU版本**,還要安裝一下依賴環境,如下:
    1. 安裝 CUDA 和 CUDNN,可以查看筆者之前的文章[《Ubuntu安裝和卸載CUDA和CUDNN》](https://blog.csdn.net/qq_33200967/article/details/80689543)
    2. 安裝nccl2,命令如下
        wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
        dpkg -i nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
        sudo apt-get install -y libnccl2=2.2.13-1+cuda9.0 libnccl-dev=2.2.13-1+cuda9.0
    3. 執行cmake。使用參數`-DPY_VERSION`指定編譯的PaddlePaddle支持的Python版本,筆者這裏選擇的是Python 3.5。並且使用參數`-DWITH_FLUID_ONLY`指定不編譯V2版本的PaddlePaddle代碼。使用參數`-DWITH_GPU`指定使用GPU,同時編譯支持CPU和GPU版本的PaddlePaddle。
        cmake .. -DPY_VERSION=3.5 -DWITH_FLUID_ONLY=ON -DWITH_GPU=ON -DWITH_TESTING=OFF -DCMAKE_BUILD_TYPE=Release
  1. 使用以下命令正式編譯,編譯時間比較長:
make -j$(nproc)
  1. 編譯成功後進入/paddle/build/python/dist目錄下找到生成的PaddlePaddle.whl包,可以使用這個命令進入到指定目錄。
cd /paddle/build/python/dist
  1. 在當前機器或目標機器安裝編譯好的.whl包:
pip3 install (whl包的名字)

Ubuntu使用Docker源碼編譯

使用docker編譯的安裝包只能支持Ubuntu的PaddlePaddle,因爲下載docker鏡像也是Ubuntu系統的。通過使用docker編譯PaddlePaddle得到的安裝包,可以在docker本身使用,之後可以使用docker執行PaddlePaddle。也可以本地的Ubuntu上安裝使用,不過要注意的是docker中的系統是Ubuntu 16.04。

安裝Docker

  1. 安裝前準備
# 卸載系統原有docker
sudo apt-get remove docker docker-engine docker.io containerd runc
# 更新apt-get源 
sudo apt-get update
# 安裝docker的依賴 
sudo apt install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common \
    ca-certificates
# 添加密鑰:
install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# 創建源地址
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 安裝Docker,編譯CPU版本使用。
# 再次更新apt-get源 
sudo apt update
# 開始安裝docker 
sudo apt install -y docker-ce
# 加載docker 
sudo apt-cache madison docker-ce

要配置 Docker 國內鏡像源,可以按照以下步驟進行:
1. 打開 Docker 配置文件/etc/docker/daemon.json,如果該文件不存在,則可以創建該文件。

  1. 在該配置文件中添加以下內容:
{
  "registry-mirrors": ["https://ccr.ccs.tencentyun.com"]
}

如果要使用多個鏡像源,可以在registry-mirrors數組中添加多個鏡像源地址,以英文逗號分隔。

  1. 保存配置文件,並重啓 Docker 服務,以使配置生效。可以使用以下命令重啓 Docker 服務:
sudo systemctl restart docker

測試:

# 驗證docker是否安裝成功
sudo docker run hello-world

正常情況下輸出如下圖所示。

  1. 安裝nvidia-container-toolkit,編譯GPU版本使用(根據情況安裝)。安裝之前要確認本地有獨立顯卡並安裝的顯卡驅動。
# 配置生產存儲庫
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# 更新軟件包清單後
sudo apt-get update

# 安裝軟件包
sudo apt-get install -y nvidia-container-toolkit

# 配置docker
sudo nvidia-ctk runtime configure --runtime=docker

# 設置默認運行時後,重新啓動Docker守護程序以完成安裝:
sudo systemctl restart docker

# 測試
 sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi

編譯PaddlePaddle

  1. 克隆PaddlePaddle源碼:
git clone https://github.com/PaddlePaddle/Paddle.git
  1. 進入Paddle目錄下:
cd Paddle
  1. 啓動docker鏡像
    • 編譯CPU版本,使用命令
    sudo docker run --name paddle-test -v $PWD:/paddle --network=host -it hub.baidubce.com/paddlepaddle/paddle:latest-dev /bin/bash
- 編譯**GPU版本**,使用命令
    sudo nvidia-docker run --name paddle-test -v $PWD:/paddle --network=host -it hub.baidubce.com/paddlepaddle/paddle:latest-dev /bin/bash
  1. 進入Docker後進入paddle目錄下:
cd paddle
  1. 切換到較穩定release分支下進行編譯,讀者可以根據自己的情況選擇其他版本:
git checkout release/1.4
  1. 創建並進入/paddle/build路徑下:
mkdir -p /paddle/build && cd /paddle/build
  1. 使用以下命令安裝相關依賴:
pip3 install protobuf==3.1.0
apt install patchelf
  1. 執行cmake:
    • 編譯CPU版本PaddlePaddle的命令。使用參數-DPY_VERSION指定編譯的PaddlePaddle支持的Python版本,筆者這裏選擇的是Python 3.5。並且使用參數-DWITH_FLUID_ONLY指定不編譯V2版本的PaddlePaddle代碼。使用參數-DWITH_GPU指定不使用GPU,只編譯支持CPU的PaddlePaddle:
    cmake .. -DPY_VERSION=3.5 -DWITH_FLUID_ONLY=ON -DWITH_GPU=OFF -DWITH_TESTING=OFF -DCMAKE_BUILD_TYPE=Release
- 編譯**GPU版本**PaddlePaddle的命令。使用參數`-DPY_VERSION`指定編譯的PaddlePaddle支持的Python版本,筆者這裏選擇的是Python 3.5。並且使用參數`-DWITH_FLUID_ONLY`指定不編譯V2版本的PaddlePaddle代碼。使用參數`-DWITH_GPU`指定使用GPU,同時編譯支持CPU和GPU版本的PaddlePaddle。這裏要注意一下,我們拉取的這個鏡像是CUDA 8.0的,不一定跟讀者本地的CUDA版本對應,這可能導致編譯的安裝包在本地不可用:
    cmake .. -DPY_VERSION=3.5 -DWITH_FLUID_ONLY=ON -DWITH_GPU=ON -DWITH_TESTING=OFF -DCMAKE_BUILD_TYPE=Release
  1. 執行編譯:
make -j$(nproc)
  1. 編譯成功後,生成的安裝包存放在/paddle/build/python/dist目錄下,如果是想在docker中安裝PaddlePaddle,可以直接在docker中打開這個目錄。如果要在本地安裝的話,還有先退出docker,並進入到這個目錄:
# 在docker鏡像中安裝
cd /paddle/build/python/dist
# 在Ubuntu本地安裝
exit
cd build/python/dist
  1. 安裝PaddlePaddle,執行以下命令:
pip3.5 install (whl包的名字)

測試環境

下面介紹在Windows測試PaddlePaddle的安裝情況,Ubuntu環境類似。

  1. 開發工具筆者喜歡使用PyCharm,下載地址:https://www.jetbrains.com/pycharm/download/#section=windows , 筆者使用的是社區版本的PyCharm,因爲這個是免費的[壞笑]。

  2. 創建一個新項目,並選擇系統的Python環境,第一個是創建一個Python的虛擬環境,這裏選擇第二個外部的Python環境,點擊...選擇外部Python環境。

  3. 這裏選擇系統的Python環境,選擇的路徑是之前安裝Python的路徑。

  4. 創建一個Python程序文件,並命名爲test_paddle.py,編寫並執行以下測試代碼,現在看不懂沒有關係,跟着這個系列教程來學,我們會熟悉使用PaddlePaddle的:

# Include libraries.
import paddle
import paddle.fluid as fluid
import numpy
import six

# Configure the neural network.
def net(x, y):
    y_predict = fluid.layers.fc(input=x, size=1, act=None)
    cost = fluid.layers.square_error_cost(input=y_predict, label=y)
    avg_cost = fluid.layers.mean(cost)
    return y_predict, avg_cost


# Define train function.
def train(save_dirname):
    x = fluid.layers.data(name='x', shape=[13], dtype='float32')
    y = fluid.layers.data(name='y', shape=[1], dtype='float32')
    y_predict, avg_cost = net(x, y)
    sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001)
    sgd_optimizer.minimize(avg_cost)
    train_reader = paddle.batch(
        paddle.reader.shuffle(paddle.dataset.uci_housing.train(), buf_size=500),
        batch_size=20)
    place = fluid.CPUPlace()
    exe = fluid.Executor(place)
    def train_loop(main_program):
        feeder = fluid.DataFeeder(place=place, feed_list=[x, y])
        exe.run(fluid.default_startup_program())

        PASS_NUM = 1000
        for pass_id in range(PASS_NUM):
            total_loss_pass = 0
            for data in train_reader():
                avg_loss_value, = exe.run(
                    main_program, feed=feeder.feed(data), fetch_list=[avg_cost])
                total_loss_pass += avg_loss_value
                if avg_loss_value < 5.0:
                    if save_dirname is not None:
                        fluid.io.save_inference_model(
                            save_dirname, ['x'], [y_predict], exe)
                    return
            print("Pass %d, total avg cost = %f" % (pass_id, total_loss_pass))

    train_loop(fluid.default_main_program())

# Infer by using provided test data.
def infer(save_dirname=None):
    place = fluid.CPUPlace()
    exe = fluid.Executor(place)
    inference_scope = fluid.core.Scope()
    with fluid.scope_guard(inference_scope):
        [inference_program, feed_target_names, fetch_targets] = (
            fluid.io.load_inference_model(save_dirname, exe))
        test_reader = paddle.batch(paddle.dataset.uci_housing.test(), batch_size=20)

        test_data = six.next(test_reader())
        test_feat = numpy.array(list(map(lambda x: x[0], test_data))).astype("float32")
        test_label = numpy.array(list(map(lambda x: x[1], test_data))).astype("float32")

        results = exe.run(inference_program,
                          feed={feed_target_names[0]: numpy.array(test_feat)},
                          fetch_list=fetch_targets)
        print("infer results: ", results[0])
        print("ground truth: ", test_label)


# Run train and infer.
if __name__ == "__main__":
    save_dirname = "fit_a_line.inference.model"
    train(save_dirname)
    infer(save_dirname)

正常情況下會輸出:

Pass 0, total avg cost = 13527.760742
Pass 1, total avg cost = 12497.969727
Pass 2, total avg cost = 11737.727539
Pass 3, total avg cost = 11017.893555
Pass 4, total avg cost = 9801.554688
Pass 5, total avg cost = 9150.510742
Pass 6, total avg cost = 8611.593750
Pass 7, total avg cost = 7924.654297
......

PaddlePaddle的安裝已經介紹完成,那我們開始進入深度學習的大門吧。本系列教程將會一步步介紹如何使用PaddlePaddle,並使用PaddlePaddle應用到實際項目中。

項目代碼GitHub地址:https://github.com/yeyupiaoling/LearnPaddle2/tree/master/note1

注意: 最新代碼以GitHub上的爲準


下一章:《PaddlePaddle從入門到煉丹》二——計算1+1


參考資料

  1. http://www.paddlepaddle.org/documentation/docs/zh/1.2/beginners_guide/install/install_Ubuntu.html
  2. http://www.paddlepaddle.org/documentation/docs/zh/1.2/beginners_guide/install/install_Windows.html
  3. https://blog.csdn.net/cocoaqin/article/details/78163171
小夜