Deepin で Docker を使用して PaddlePaddle をコンパイルする#
参考文献:#
- Linux で make を使用してソースコードからコンパイルする
- Git 使用時の (pathspec master did not match any file (s) known to git)
前言:#
ここでは、Docker を使用して PaddlePaddle のイメージを取得し、PaddlePaddle をコンパイルするプロセスを記録します。Docker のインストール、docker_proxy の設定、コンテナ内での GitHub へのアクセス方法については、すでに知っているものとします。
もちろん、ここでは方向性を示すだけです。以前に似たようなことを書いたことがあります:
もう一つの提案として、使用するノードが安定していることを確認してください。GitHub をクローンする際に奇妙なエラーが発生しないようにしてください。以前、非常に速いノードを使用していましたが、40 分の間に何度も失敗し、サードパーティが完全ではありませんでした。
依存関係のトラブルシューティングは非常に時間がかかります。特に、特定のサードパーティがインストールされているかどうかを確認する必要があります。
手順と考え方:#
私たちのコードはローカルで作成され、その後 Docker コンテナ内でコンパイルされます。コンテナはコードディレクトリにマッピングされ、コンパイルによって生成された whl ファイルはソースコードのルートディレクトリの build フォルダに直接生成されます。次に、コンパイルされた whl ファイルをローカルの miniconda 仮想環境にインストールしてテストします。
PaddlePaddle のソースコードをクローンする:#
クローンする際は、zip をダウンロードするのではなく、必ずクローンを使用してください。コンパイル時にいくつかの git ハッシュなどの情報が必要です。
ローカルのフォークリポジトリを使用できますが、特定のタグが一致していることを確認する必要があります。例えば、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 ディレクトリ、サードパーティ、および最終的に生成された whl ファイルはすべてここにあり、これらの生成ファイルもホストのソースコードのルートディレクトリに同期されます。次回コンパイルする際は、サードパーティを再度ダウンロードする必要はなく、初回コンパイルのキャッシュも保持されているため、二次コンパイルを直接行うことができ、時間は約 1 時間から 4、5 分、さらには数十秒に短縮されます。
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 タグのハッシュが見つからなくなりますが、grep を使用するとそのハッシュを見つけることができます。
もちろん、最初にこの操作を実行することをお勧めします:
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
を実行することをお勧めします。なぜなら、コンパイル後にいくつかのタグハッシュをチェックするようで、fetch を行わないといくつかのタグハッシュが欠ける可能性があるからです。
この時点で、私は再度実行しました:
git checkout origin/develop
いくつかのノートが表示されます:
λ 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.
ノートが表示されれば成功です。その後、次のステップに進むことができます。
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
はここでは効果がありませんでした。
終了後、再度実行してサードパーティが欠けていないか確認できます。もし依然として欠けている場合は、手動でクローンしてください。
マルチコアコンパイル(ここでは 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
これらについては次回のブログで説明する予定です。