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

English page

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

それ以降のGPU(Ampere: RTX 30x0, Ada Lovelace: RTX 40x0, Hopper: H200 H100 GH200, Blackwell: RTX 50x0 世代)、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

for Ubuntu 18.04 tensorflow-1.15.5-cp36-cp36m-linux_x86_64.whl
for Ubuntu 20.04 tensorflow-1.15.5-cp38-cp38-linux_x86_64.whl
for Ubuntu 22.04 tensorflow-1.15.5-cp310-cp310-linux_x86_64.whl
for Ubuntu 24.04 tensorflow-1.15.5-cp312-cp312-linux_x86_64.whl
for Windows python3.10 tensorflow-1.15.5-cp310-cp310-win_amd64.whl
for Windows python3.12 tensorflow-1.15.5-cp312-cp312-win_amd64.whl

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

sudo 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
sudo 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/

sudo 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/

sudo 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

Windowsなんだけど

CUDA Toolkit 12.9のインストール

CUDA Toolkit 12.9をインストールします。 https://developer.nvidia.com/compute/cuda/12.9.1/network_installers/cuda_12.9.1_windows_network.exe

cuDNN 8.9のインストール

次のリンクからダウンロードします。 https://developer.nvidia.com/downloads/compute/cudnn/secure/8.9.7/local_installers/12.x/cudnn-windows-x86_64-8.9.7.29_cuda12-archive.zip/

展開した内容を、CUDA Toolkitをインストールしたディレクトリc:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.9のbin、include、libにそれぞれコピーします。 このとき管理者権限が必要です。


ビルド方法

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

Ubuntu24.04のPython3.12でビルドする場合は、修正箇所が増えるので、 こちらのページを参考にしてください。

すみません、あなたの環境はWindowsでしたね。 こちらのページを参考にしてください。

cuda12.9にパッチ当てる

cuda-12.9.patch

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

cd /usr/local/cuda-12.9/
sudo patch -p1 < cuda-12.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の依存モジュールを入れる

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

sudo apt install python3-dev python3-pip git unzip
(cd /usr/bin && sudo ln -s python3 python)
pip3 install 'numpy<2' keras_preprocessing

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

git clone -b r1.15 https://github.com/tensorflow/tensorflow.git

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

tensorflow-1.15.5-cuda12.9.patch

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

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

configure

cd tensorflow
./configure

基本デフォルトでいいです。 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_configure.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 というファイルができるので、これをインストールして使ってください。 cp36の部分は、Pythonのバージョンによって変わります。


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まで連絡ください。

もくじへ戻る