公式のTensorflow1.15は、CUDA10.0までしかサポートしていません。 そのため、compute capability 7.5つまりTuring世代のGPU以降では、公式のTensorflow1.15は動きません。
それ以降のGPUで、Tensorflow1.15を動かすには、NVIDIAのビルドしたバイナリを使用するとよいのですが、 うまく動かなかったのでcuda12.9でビルドできるようにソースコードを一部修正してビルドしたので、置いておきます。
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
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
なんかダウンロードはブラウザからしないと上手くいきません。 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
なんかダウンロードはブラウザからしないと上手くいきません。 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他人の作ったバイナリなんか信用できませんね。 というわけで、ビルド方法も書いておきます。
Tensorflow1.15では、定義に矛盾が生じるので、コンパイル時はヘッダーを誤魔化します。
cd /usr/local/cuda-12.9/
patch -p1 < cuda-12.9.patch
apt install python3-dev python3-pip git unzip
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
git checkout r1.15
Tensorflow1.15のソースコードに、cuda12.9でビルドできるようにするためのパッチを当てます。
cd tensorflow
patch -p1 < ../tensorflow-1.15.5-cuda12.9.patch
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
仮想環境で作業する場合はその中で入れてください。
pip3 install numpy keras_preprocessing
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のものを外すとコンパイルが速くなります。
自動で 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
数時間かかると思うので、ゆっくりお茶して待っててください。
./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 というファイルができるので、これをインストールして使ってください。
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まで連絡ください。
もくじへ戻る