Tensorflow1を無理矢理新しいGPUで動かす

公式のTensorflow1.15は、CUDA10.0までしかサポートしていません。 そのため、compute capability 7.5つまりTuring世代のGPU以降では、公式のTensorflow1.15は動きません。

それ以降のGPUで、Tensorflow1.15を動かすには、NVIDIAのビルドしたバイナリを使用するとよいのですが、 うまく動かなかったのでcuda12.9でビルドできるようにソースコードを一部修正してビルドしたので、置いておきます。

Download

cuda12.9, compute capability 7.5,8.0,8.6,8.9,9.0,10.0,10.3,12.0 を指定してビルドしたTensorflow1.15

tensorflow-1.15.5-cp36-cp36m-linux_x86_64.whl

cuda12.9ダウンロードと展開方法

    apt install wget libxml2 gcc g++ xz-utils patch
    wget https://developer.download.nvidia.com/compute/cuda/12.9.1/local_installers/cuda_12.9.1_575.57.08_linux.run
    bash cuda_12.9.1_575.57.08_linux.run --toolkit --silent

cudnn8.9のダウンロードと展開方法

なんかダウンロードはブラウザからしないと上手くいきません。 https://developer.nvidia.com/downloads/compute/cudnn/secure/8.9.7/local_installers/12.x/cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz/

    tar xvf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz --strip-components=1  --transform="s,lib$,lib64,x;s,lib/,lib64/," -C /usr/local/cuda/ --keep-directory-symlink

nccl2.30のダウンロードと展開方法

なんかダウンロードはブラウザからしないと上手くいきません。 https://developer.nvidia.com/downloads/compute/machine-learning/nccl/secure/2.30.3/agnostic/x64/nccl_2.30.3-1+cuda12.9_x86_64.txz/

    tar xvf nccl_2.30.3-1+cuda12.9_x86_64.txz --strip-components=1  --transform="s,lib$,lib64,x;s,lib/,lib64/," -C /usr/local/cuda/ --keep-directory-symlink

ブラウザで開くのがめんどい

こっそりバイナリ置いておきます。

cuda_12.9.1_575.57.08_linux.run
cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz
nccl_2.30.3-1+cuda12.9_x86_64.txz

ビルド方法

他人の作ったバイナリなんか信用できませんね。 というわけで、ビルド方法も書いておきます。

cuda12.9にパッチ当てる

cuda-12.9.patch

Tensorflow1.15では、定義に矛盾が生じるので、コンパイル時はヘッダーを誤魔化します。

    cd /usr/local/cuda-12.9/
    patch -p1 < cuda-12.9.patch

Tensorflow1.15のソースを準備する

    apt install python3-dev python3-pip git unzip
    git clone https://github.com/tensorflow/tensorflow.git
    cd tensorflow
    git checkout r1.15

Tensorflow1.15のソースにパッチを当てる

tensorflow-1.15.5-cuda12.9.patch

Tensorflow1.15のソースコードに、cuda12.9でビルドできるようにするためのパッチを当てます。

    cd tensorflow
    patch -p1 < ../tensorflow-1.15.5-cuda12.9.patch

bazelをインストールする

bazel0.26.1が必要なので、昔の置き場から持ってきてダウンロードします。最新のBazelだと上手くいきません。

    wget https://releases.bazel.build/0.26.1/release/bazel-0.26.1-installer-linux-x86_64.sh
    bash bazel-0.26.1-installer-linux-x86_64.sh

Pythonの依存モジュールを入れる

仮想環境で作業する場合はその中で入れてください。

    pip3 install numpy keras_preprocessing

configure

    cd tensorflow
    ./configure

基本デフォルトでいいですが、Python のパスを /usr/bin/python3 にしておきます。 CUDA の質問で Yes として、 Compute Capability は、7.5,8.0,8.6,8.9,9.0,10.0,10.3,12.0 を指定します。必要でないGPUのものを外すとコンパイルが速くなります。

cudaのパスをいじる

自動で CUDA12.9 が /usr/local/cuda にあることが認識されますが、このままだとなぜかインクルードのインクルードでパスが変になってて、ビルドが失敗します。 .tf_vonfigure.bazelrc を開いて、/usr/local/cuda を探して、パスを /usr/local/cuda-12.9 に修正します。

    build --action_env CUDA_TOOLKIT_PATH="/usr/local/cuda-12.9"

ビルド

    bazel build --config=opt --verbose_failures //tensorflow/tools/pip_package:build_pip_package

数時間かかると思うので、ゆっくりお茶して待っててください。

ビルドしたwhlファイルを作る

    ./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

/tmp/tensorflow_pkg に、tensorflow-1.15.5-cp36-cp36m-linux_x86_64.whl というファイルができるので、これをインストールして使ってください。


Tensorflow1.15がGPU認識してるかチェックする

pipでインストールしてから、GPUが認識されているかをチェックするには、以下のコードが参考になります。

    import tensorflow as tf
    print(tf.config.experimental.list_logical_devices("GPU"))

ライブラリの依存ファイルがロードされれば、GPUがリストされます。パスがおかしい場合はロードに失敗しているログが出ます。

    a = tf.constant(5.0)
    b = tf.constant(6.0)
    c = a * b
    sess = tf.Session()
    print(sess.run(c))

上手くいっていれば、GPUでメモリが確保されるので、nvidia-smiで確認できます。

    model = tf.keras.Sequential([tf.keras.Input(shape=(64,64,3)),tf.keras.layers.Conv2D(256,3),])
    model.summary()
    x = model(tf.random_normal([1,64,64,3]))
    init_op = tf.initialize_all_variables()
    sess.run(init_op)
    sess.run(x)

Convとかをチェックするのは、こんな感じ。


内容について何か問題やご意見がございましたら、contact@lithium03.infoまで連絡ください。

もくじへ戻る