2021年12月10日金曜日

Fedora 35 でTensorflow 2.7(CUDA11.5 cuDNN8.3.1)をビルドする

目的


Tensorflowの2.7をFedora 35でソースビルドする。


環境


  • SW
    • Fedora 35 x86_64
    • Python 3.10.0
    • GCC 11.2.1 20210728
    • CUDA 11.5 + cuDNN v8.3.1
  • HW
    • CPU AMD Ryzen 7 1700
    • GPU GeForce GTX 1070


事前の準備


CUDA、cuDNNのインストール


これは、以前と同様。
RPM FusionからCUDAを、NVIDIAよりcuDNNをそれぞれインストールする。

BAZELのインストール


FedoraのCOPR repositoryからインストールが可能。
3.x系と4.x系が選択可能なので3.x系をインストールする。



TensorFlow v2.7(後述のTensorFlow I/Oも含めて)のビルドにはBazel v3.7.2が必要(4.x系の場合、TensorFlow I/Oのビルドでエラーとなるため)。
しかし、現時点(2021.12.08)ではバージョンがv3.7.1。v3.7.2をソースコードからビルドするにはGCCのバージョンダウン(ソースビルド)が必要になる(Fedora 35のGCC11ではビルドができないため)。今回はv3.7.1で押し通すことにする。


TensorFlow I/Oのビルド


TensorFlow v2.7をビルド後、wheelパッケージをインストールする際にtensorflow_io_gcs_filesystemとtensorflow_ioのインストールを要求される(依存関係)。

しかしながら、Python3.10のパッケージは用意されていないためインストールできない。そこで、TensorFlow I/Oをビルド、io、io_gcs_filesystemのwheelパッケージも作成する。

なお、TensorFlow I/OのビルドにはTensorFlow v2.7が必要なため、デッドロックしてしまう。。。


なんでだよ。

さらにBazelが利用するモジュールがPython3.10に対応していないため、ビルドでエラーが発生してしまう。

ここで、TensorFlow I/Oのビルドは2つの手順に分かれている(TensorFlow I/Oのビルド手順を参照)。
  • Bazelを使ったビルド(共有ライブラリの作成)
  • Wheelパッケージの作成

    このため、ビルドはPython3.9環境で行い、パッケージ作成時にPython3.10環境に切り替えて行うこととする。Python3.9環境であれば、TensorFlowも公式のパッケージが提供されているのでデッドロックも回避できる。
    TensorFlow I/OのGithub Actionがこのような手順になっていたので参考にした。

    (じゃあ、Python3.9環境でよくない?というのは置いておく)


    まず、Python3.9をインストールし、virtualenvwrapper(virtualenv)でビルド用環境を作成し、必要なモジュールをインストールしておく。



    TensorFlow I/Oのリポジトリをクローンする。
    今回はPython3.10ビルドに対応となっていたmainブランチとする(でも対応していないけど、、、)。



    先程述べたBazelのバージョンが一致しない問題があるので、.bazelversionの内容を変更しておく。



    ビルド。


    wheelパッケージの作成。
    setup.pyがpython3.10をサポートしていないので修正。



    TensorFlowをインストールするためのPython3.10環境を作成、切り替えて、wheelパッケージを作成。できたパッケージをインストール。



    TensorFlowのビルド


    さて、あとは本題。

    TensorFlowのリポジトリをクローンしてv2.7.0をチェックアウト。
    Python3.10ではビルドが失敗するため、以下のコミットをcherry-pickする。



    Bazel3.7.1でビルドするために.bazelversionを修正。



    configureの実行。
    ccacheをインストールしているとビルドに失敗するため、host compilerにはGCCを指定する。



    ビルド。あとは待つだけ。



    ビルドが完了すれば、wheelパッケージを作成してインストールする!



    確認


    • tf.__version__が2.7であること。
    • GPUデバイスを認識していること



    OK〜✌

    0 件のコメント:

    コメントを投稿