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
これらについては次回のブログで説明する予定です。