深層学習ソフトウェアのStack Structure
「詳細までは興味ないけど大枠だけ知りたい人」向けに、深層学習を実装しているコードがどのようにGPUと連携しているのかのレイヤー構成をまとめました。
順番は、最適化手法によりますが、基本的にはGPU側から下記のようになっています。
- GPU
- CUDA
- cuDNN
- C++ Backend
- Deep Learning Framework
CUDA: Compute Unified Device Architecture
CUDAはNVIDIA社製GPUで汎用の並列計算を行うためのプログラミング環境を提供しているものです。
つまり、GPUと実際にやり取りを行うのがCUDAとなります。
cuDNN: CUDA Deep Neural Network
深層学習モデルの学習はものすごい計算量が求められます。そのため、GPUとうまくやり取りを行い、効率的に計算を進めることが大切になってきます。つまりCUDAをどのように用いるかで計算効率が変わってきます。
そこで便利なのがCuDNNです。CuDNNは、深層学習でよく使われる「畳み込み」「pooling」「activation」「normalization」などのオペレーションを高度に調整して実装したものを提供しています。
まとめると、深層学習を効率よく行うためにいい感じにCUDAを使っているライブラリがCuDNNです。
C++ Backend
ほとんどの深層学習用のフレームワーク( Pytorch, TensorFlow, ONNX, etc) はC++をバックエンドとして使用しています。理由は、C++の処理が早いのもあり、cuDNNが基本C++で実装されているからです。
C++が速い
⇓
必然的にCUDAとCUDNNも基本的にC++で実装されている
⇓
それを呼ぶためにC++のバックエンドレイヤーを使用
基本的に各オペレーション(「畳み込み」「pooling」)ごとに計算を実行する場合、このバックエンドのレイヤーで直接CuDNNが呼ばれると思われます。もしより計算を最適化したい場合は、TensoRTのC++のAPIを呼んでからCuDNNが呼ばれるケースもあります。
Deep Learning Framework
ここが深層学習ソフトウェアにとっての"Front End"になります。フレームワークとしては、主流はPyTorchやTensorFlowをPythonで実装する形になるかと思います。
Pythonを実行すると、内部的にC++のバックエンドレイヤーを呼んでいる(はず、、?)。
場合によっては、LibTorch(PyTorchのC++FrontEnd)のように、C++をフロントエンドとして使用することもあります。
参考資料
- PyTorch C++ Front-end: Tensors
- Software Stack Structure
- What is CUDA and cuDNN? How to provide Tensorflow GPU support?
Writed by F.K(20代/入社3年目)