XnneHang

XnneHang

github
steam_profiles
douban

Deepin 使用 docker 編譯 paddlepaddle

Deepin 使用 docker 編譯 paddlepaddle#

Reference:#

前言:#

這裡只是記錄一下從 docker 拉取 paddlepaddle 鏡像,然後編譯 paddlepaddle 的過程,Docker 的安裝,如何配置 docker_proxy, 如何在容器內訪問 github, 這裡默認你已經會了。

當然這裡指個方向,我以前寫過類似的:

另外是一點建議,請保證你使用的節點是穩定的,在 github clone 的過程中儘量不要出現一些奇怪的報錯。我先前用一個很快的節點,但是四十分鐘裡失敗了好幾次,導致我的 third-party 不全。

每一次折騰依賴都非常費時間,特別是需要排查你是不是有某些 third-party 沒裝上。

步驟和思路:#

我們的代碼在本地編寫,然後在 docker 容器內編譯,容器映射到代碼目錄,編譯生成 whl 文件直接生成在源代碼根目錄 build 文件夾下。再把編譯好的 whl 文件用本地的 miniconda 虛擬環境安裝和測試。

clone paddlepaddle 源碼:#

你需要保證使用 clone 而不是 download zip,因為編譯的時候需要一些 git hash 等信息。

你可以使用你的本地 fork 倉庫,但是需要保證某些 tag 是一樣的,比如 develop, 不然編譯的時候會出現一些問題。

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

拉取 paddlepaddle 鏡像:#

docker pull paddlepaddle/paddle:latest-dev

進入源代碼根目錄運行 paddlepaddle 鏡像:#

cd Paddle/
docker run --name paddle-test -v $PWD:/paddle --network=host -it paddlepaddle/paddle:latest-dev /bin/bash

--network=host代表我們 localhost 使用主機的 localhost 而不是容器的。

我的 http_proxy,https_proxy 放在主機的 localhost:7890, 然後通過這個共享到容器內。

-v $PWD:/paddle代表我把當前目錄映射到容器的 /paddle 目錄下,我共享的是源代碼根目錄。

在容器內可以直接用cd /paddle就可以看到源代碼根目錄。後續,build 的目錄,和 third-party 以及最終生成的 whl 文件都會在這裡,同時這些生成文件也會同步到主機的源代碼根目錄。下次再進來編譯,就不需要反復下 third-party, 初次編譯的緩存也都會存在,可以直接進行二次編譯,時間大概從一個小時縮短到四五分鐘甚至幾十秒。

配置 http_proxy,https_proxy:#

分別是用戶變量和 git config,這裡的代理是我自己的,你需要根據自己的代理配置。

export http_proxy=http://localhost:7890
export https_proxy=http://localhost:7890
git config --global http.proxy http://localhost:7890
git config --global https.proxy http://localhost:7890

安裝一些 make 需要的依賴:#

pip install protobuf
apt install patchelf

以及很重要的,networkx, 這個在官方文檔裡面沒有提到,但是缺失的話編譯最後會報錯。

保證你在根目錄:

λ xnne-PC /paddle ls
AUTHORS.md             paddle/         security/
build/                 patches/        SECURITY_cn.md
cmake/                 pyproject.toml  SECURITY_ja.md
CMakeLists.txt         python/         SECURITY.md
CODE_OF_CONDUCT_cn.md  r/              setup.py
CODE_OF_CONDUCT.md     README_cn.md    test/
CONTRIBUTING.md        README_ja.md    third_party/
doc/                   README.md       third_party.tar.gz
LICENSE                RELEASE.md      tools/

然後:

pip install -r python/requirements.txt

切換到 develop 分支:#

如果像文檔裡直接 git checkout develop, 會導致後面找不到 develop tag 的 hash, 但是 grep 是可以找出那個 hash 的。

當然我建議你也先這麼運行:

git checkout develop

因為我流程裡有這個操作,我也不清楚缺少它是否會產生某些影響。

查看當前分支:

λ xnne-PC /paddle git branch -a
* (HEAD detached at origin/develop)
  develop
  remotes/origin/1.8.5
  remotes/origin/HEAD -> origin/develop
  remotes/origin/a246d2cc8876d9efb0b733f0ae02e1bd973
  remotes/origin/add_kylinv10
  remotes/origin/ascendrelease
  remotes/origin/cinn-trivalop-fuse
  ...

你可以找找有沒有remotes/origin/HEAD,如果沒有,可以運行一下git fetch

當然我建議運行git fetch,因為似乎編譯後面會檢查一些 tag hash, 如果沒有 fetch, 可能會缺少一些 tag hash。

這時候我再運行了:

git checkout origin/develop

它會彈出來一些 Note 像這樣:

λ xnne-PC /paddle git checkout origin/develop
Note: switching to 'origin/develop'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

如果看到 note 應該就是成功了,然後再運行。你就可以進行下一步。

編譯 paddlepaddle:#

保證你在根目錄:

cd /paddle
mkdir build/
cd build/

然後運行 cmake, 你需要確認你的 DPY_VERSION,它決定你編譯出來 whl 的 python 版本。
#

git config --global --add safe.directory '*' # 這個是解決中斷輸入的
time cmake .. -DPY_VERSION=3.10 -DWITH_GPU=OFF

第一次運行這個會很久,和你的網速有關,同時也是先前我提到,請保證你的節點是穩定的,不然會出現一些奇怪的報錯。

以及中間可能會需要中斷出來輸入一些指令,比如:

git config --global --add safe.directory /paddle/third_party/absl

而且不少,你可以留意一下,當然如果你找到解決方法也可以告訴我,不然一直中斷會很煩。

ps: 我這裡找到了一種方法:

git config --global --add safe.directory '*'

之前用的git config --global --add safe.directory /paddle在這裡並不起效果。

以及結束後可以二次運行看是否缺少某些 third-party,如果依然缺少,你可以手動 clone 它。

多核編譯 (我這裡使用 10 核):
#

make -j10

同樣需要很久很久...

驗證編譯結果:#

如果前面都沒問題的話,你應該會在源代碼根目錄的 build 目錄下看到一些 whl 文件。

這個時候我們用 miniconda 來安裝它:

conda activate paddle-test # 自己創哈,保證DPY_VERSION和你的環境一致
pip install -U build/python/dist/paddlepaddle-0.0.0-cp39-cp39-linux_x86_64.whl
python

>>> import paddle
/home/xnne/miniconda3/envs/paddle/lib/python3.9/site-packages/paddle/utils/cpp_extension/extension_utils.py:686: UserWarning: No ccache found. Please be aware that recompiling all source files may be required. You can download and install ccache from: https://github.com/ccache/ccache/blob/master/doc/INSTALL.md
  warnings.warn(warning_message)
>>> paddle.utils.run_check()
Running verify PaddlePaddle program ...
I1105 10:44:10.085186 70641 pir_interpreter.cc:1492] New Executor is Running ...
I1105 10:44:10.085837 70641 pir_interpreter.cc:1515] pir interpreter is running by multi-thread mode ...
PaddlePaddle works well on 1 CPU.
PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now.
>>> exit()

第一個警告似乎可以通過apt install ccache解決,但是我沒有試過。

你看到PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now.就代表你編譯成功了。

二次編譯:#

  • 修改底層的頭文件:paddle/fluid/platform/enforce.h
  • 修改 Op 的 cc 文件:paddle/fluid/operators/rank_loss_op.cc
  • 修改 python 文件:python/paddle/tensor/math.py

這些俺打算放到下篇博客講。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。