blog

pytorchのソースコードを読んで準備する

単一マシン上でのマルチGPU通信、MPIプログラミングをサポート。シングルPCIeで最高のパフォーマンスを発揮しますが、マルチPCIeの実行も可能です。 これは、CUDAのBLAS部分が使用されます...

Mar 2, 2020 · 4 min. read
シェア

意味論と知るためのツール

C CUDA
C++ CMake
python BLAS

ソースコードでよく使われる変数の略語

コアコードディレクトリ:/XXX/XXX/pytorch/torch

コアモジュール:

  • TH:コアにTHStorageとTHTensor、セカンダリにTHGeneral、THHalf、THAllocator、THSize。

  • THS: 疎行列 THSTensor(THLongTensor*indices; THTensor *values;)

  • THNN:Absを例とした、各操作に対して前方計算と後方計算を行うCコードのニューラルネットワーク

  • WITH_CUDA: THTHSとTHNNのGPUバージョンはlibsにあります。

  • WITH_NCCL:MPIプログラミングをサポートしたシングルマシン上でのマルチGPU通信。シングルPCIeで最高のパフォーマンスを発揮しますが、マルチPCIeでも実行可能です。

  • build THPP: Torch C++

  • build libshm: 共有管理

  • nanopb: Gooogleのプロトコル・バッファ・プロトコルを使用して定義された、RAMまたはコード空間内でメッセージを転送するための軽量なエンコード/デコード構造体。

  • pybind11: C++とPython間のシームレスなコールを軽量パッケージで。

  • build ATen: C++のautogradはここに書いていますが、全体的な機能は不明です。

  • generate_nn_wrappers():ニューラルネットワークをCで書き、C++でラップし、pythonで呼び出します。

  • C:Cのコードをカプセル化し、それ自体はC++のコードで、コアはTensor、autograd、cuda、その他はdistributed、jitなどです;

    • Torch/csrc/Module.cppがtorchモジュールにラップされました。
    • torch/csrc/generic/Tensor.cppFloatTensorBase、IntTensorBase、その他のクラスにカプセル化されています。
  • DL: pythonはRTLD_GLOBAL, RTLD_NOW変数を取得し、ライブラリのロード方法を設定できます。

  • THNN: torch/csrc/nn/THNN.cpp,NN

  • THCUNN: torch/csrc/nn/THCUNN.cpp,CUNN

  • from torch._C import *: すべての C 言語の実装をロードします。

知る必要のあるインターフェース

  • BLAS/LAPACK

  • CUBLAS/Thrust:これは使用されるCUDAのBLAS部分です。NVIDIAの公式ドキュメントを直接読めば大丈夫です!

  • CPUテンソルライブラリTH

このセクションはPyTorchの最下層ですが、僕にとってはPyTorchの最良の部分でもあります。この部分を読めば、残りのコードは読みやすくなると感じています。マクロを使ってC言語でジェネリックサポートを実装し、マクロ+ネーミングを使ってシンプルなOOPを実装し、ファイル管理部では仮想テーブルまで持っています。 これはLua版のTorchから移行したもので、当時はSIMDをフルサポートしていませんでしたが、現在はSIMDをフルサポートしています。データ構造部は主にTHStorageとTHTensorを実装しています。この2つが何に使われるかはPyTorchのPythonドキュメントに書かれています。実際、物理側で使われているTensor Networkの実装よりもシンプルです。THTensorはストレージを担当するのではなく、保存されたオブジェクトを見るためのものです。この実装アイデアは、MXNetのバックエンドであるmshadowのTensorと似ている部分があると感じます。ただし、C言語ではオーバーロードがサポートされていないため、ここでは遅延評価は一切ありませんが、もちろん使う上ではちょっと面倒かもしれません。さらに特徴的なのは、マクロによるジェネリックスの実装です。この方法は基礎となるライブラリで広く使われています。libディレクトリの上層にあるコードが、C++のテンプレートをサポートするパッケージであるTHPPを使えるようになると、見かけなくなります。例えば、REALがジェネリック型の必要性を実装するために実際に使用するソースコードはgenericディレクトリに記述され、異なる変数名の置換はいくつかのヘッダーファイルで定義されたマクロによって外部で行われます。それから、TH_TENSOR_APPLYで始まるマクロが読みにくいマクロです。これらはマップやブロードキャストに近いもので、今日の高水準言語で使用されています。異なる数のTensor間の操作をサポートするために、異なる数のTensorに対応するマクロがいくつか用意されています。たとえば、TH_TENSOR_APPLY_3は、3つのテンソルで要素ごとの演算を行う方法を示しています。そして、マクロ関数内の入力操作のCODE部分には、カンマや埋め込みマクロがないことが重要です。それから、TensorMathやConvなどの部分はPythonの関数と似ているので、直接行のPythonドキュメントを見ても分かりません。CPUニューラルネットワークライブラリTHNNこの部分は非常に簡単ですが、つまり、いくつかのPythonレイヤ 関数オブジェクトの基礎となる定義と実装です。あなたがそれを知らない場合は、単にPythonのドキュメントをチェックし、対応があります。自動微分 この部分はC++で書かれ、Pythonに接続され、変数などを格納するための3つのリストが実装されています。前方関数を書いて、後方関数を呼び出して勾配を計算するというものです。これがテープベースと呼ばれる理由です。

pslibsにあります:

C/C++のバックエンドはv0.4以降、上位パッケージとしてaten(テンソルライブラリ)ライブラリを使用し、torch/csrcの部分のglueコードを通してPythonにアクセスします。自動微分はC++で行われ、バックエンドは関連する操作を記録するためにビデオテープのような機構を使用します。自動微分はC++で行われ、バックエンドはビデオテープのようなメカニズムを使って操作を記録します。

コアとなるバックエンドのコードは主に libs にあります。

Read next

HTMLの知識を強化する

すべてのパスが計算される基準となるパスを指定します。 target:ターゲットURLを開く場所を指定します。href属性が存在する場合にのみ使用されます。 action: フォームが送信されたときにフォームデータをどこに送るかを指定します。 enctype:フォームデータをサーバに送信する際のエンコード方法を指定します。(method="post "の場合...)

Mar 2, 2020 · 6 min read