テンソルフローは、機械学習モデルを容易に作るフレームワークです。このフレームワークを用いると、GPUなどのスケーラブルな計算資源を効率よく使用することができます。Intel Linuxサーバーに組み込んだGPU資源やApple Siliconの内蔵 GPUなどのリソースもTensorFlowを経由することで利用可能になります。
Pythonからは、並列処理のハードウエア資源を意識せずに利用することができます。
TensorFlowはユーザー側に近いAPIとして、ニューラルネットを効率よく実装できるKerasや、以前 Edwordと読んでいたベイジアンモデルのパッケージを含めた tensorflow probabilityなどが利用可能です。
TensorFlow インストール
TensorFlowがpython 3.11を未サポートのため、'python38'という名称でバージョン 3.8 の仮想環境を作ります。osはMacOs環境へのインストールの例です。
conda create -n python38 python=3.8
conda activate python38
コマンドプロンプトの表示が(python38)に変わります。バージョンを確認してみます。
python --version
python 3.8.15
この環境にTensorFlowをインストールします。kerasも含まれています。
conda install -c apple tensorflow-deps
python -m pip install tensorflow-macos
python -m pip install tensorflow-metal
これで、keras/tensorflowが使えるようになりました。
ここに tensorflow probabilityもインストールします。
conda install -c conda-forge tensorflow-probability
この仮想環境を出る場合は、以下のコマンドで(base)環境に戻ります。
conda deactivate
仮想環境のカーネルをJupyterで切り替える
この(python38)環境には、Jupyter notebookが含まれていません。この仮想環境を(base)環境のJupyter notebookから使えるようにします。仮想環境(python38)上に移動します。ipykernelが利用できるか確認します。
conda activate python38
conda list | grep ipykernel
ipykernel 6.19.2 py38h86d0a89_0
ipykernelが入っていなければ、pipを使ってインストールしてください。
pip install ipykernel
次に仮想環境のカーネルをJupyterに追加します。
python -m ipykernel install --user --name=python38
仮想環境がJupyterに追加されているか確認します。
jupyter kernelspec list
追加されていれば、Available kernels: にリストされています。
Available kernels:
python3 /Users/username/anaconda3/envs/python38/share/jupyter/kernels/python3
python38 /Users/username/Library/Jupyter/kernels/python38
(base)環境で起動したnotebookからkernelメニューのchange kernelを選択すると、追加した環境が表示されます。TensorFlowを使用する場合は、追加したpython38環境を選択して、動作環境を変更後に操作してください。
jupyterに追加したカーネルを削除する場合は、以下のコマンドを用います。
jupyter kernelspec uninstall python38
TensorFlow稼働時にアップルシリコンのGPUの使用でエラーが発生することがありました。Metalのバージョンで問題が起きるケースがあります。
テンソルフローのプラグインのバージョンを調べて、tensorflow-depsのバージョンが tensorflow-macos のバージョンと一致しない場合、以下の例を参考に両バージョンを一致させてください。
conda list | grep tensorflow
tensorflow-deps 2.9.0 0 apple
tensorflow-estimator 2.11.0 pypi_0 pypi
tensorflow-macos 2.11.0 pypi_0 pypi <-(*)
tensorflow-metal 0.7.1 pypi_0 pypi <-(*)
tensorflow-probability 0.14.0 pyhd3eb1b0_0
プラグインtensorflow-macos 2.11.0、および tensorflow-metal 0.7.1を一旦削除して、tensorflow-depsのバージョンと一致したバージョンをインストールします。
pip uninstall tensorflow-macos
pip uninstall tensorflow-metal
python -m pip install tensorflow-macos==2.9
python -m pip install tensorflow-metal==0.5.0
tensorflow-deps 2.9.0 0 apple
tensorflow-estimator 2.9.0 pypi_0 pypi
tensorflow-macos 2.9.0 pypi_0 pypi
tensorflow-metal 0.5.0 pypi_0 pypi
tensorflow-probability 0.14.0 pyhd3eb1b0_0
確認テスト
プラグインの確認をします。MacOS環境でARMコアのApple Silicon M1/M2のGPUをTensorFlowで使う場合にプラグインを導入しています。以下のスクリプトを走らせて動作確認します。
import tensorflow as tf
cifar = tf.keras.datasets.cifar100
(x_train, y_train), (x_test, y_test) = cifar.load_data()
model = tf.keras.applications.ResNet50(
include_top=True,
weights=None,
input_shape=(32, 32, 3),
classes=100,)
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(optimizer="adam", loss=loss_fn, metrics=["accuracy"])
model.fit(x_train, y_train, epochs=5, batch_size=64)
上のコードをveryfy-tf.pyというファイル名で保存します。
python verify-tf.py
実行結果が以下のように表示されます。
python veryfy-tf.py
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz
169001437/169001437 [==============================] - 71s 0us/step
Metal device set to: Apple M2
systemMemory: 8.00 GB
maxCacheSize: 2.67 GB
2023-04-24 10:32:32.392516: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:305] Could not identify NUMA node of platform GPU ID 0, defaulting to 0. Your kernel may not have been built with NUMA support.
2023-04-24 10:32:32.393062: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:271] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 0 MB memory) -> physical PluggableDevice (device: 0, name: METAL, pci bus id: <undefined>)
2023-04-24 10:32:33.932101: W tensorflow/core/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz
Epoch 1/5
/Users/xxxxxxxxxx/anaconda3/envs/python38/lib/python3.8/site-packages/tensorflow/python/util/dispatch.py:1082: UserWarning: "`sparse_categorical_crossentropy` received `from_logits=True`, but the `output` argument was produced by a sigmoid or softmax activation and thus does not represent logits. Was this intended?"
return dispatch_target(*args, **kwargs)
2023-04-24 10:32:35.645036: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.
782/782 [==============================] - 102s 118ms/step - loss: 4.7385 - accuracy: 0.0731
Epoch 2/5
782/782 [==============================] - 90s 115ms/step - loss: 4.3313 - accuracy: 0.1094
Epoch 3/5
782/782 [==============================] - 90s 115ms/step - loss: 3.8057 - accuracy: 0.1467
Epoch 4/5
782/782 [==============================] - 90s 115ms/step - loss: 3.5212 - accuracy: 0.1946
Epoch 5/5
782/782 [==============================] - 94s 120ms/step - loss: 3.9700 - accuracy: 0.1532
”Your kernel may not have been built with NUMA support. ”というメッセージが出ていますが、M1/M2はUMA(Unified Memory アーキテクチャ)、NUMA(Non-Unified Memoryアーキテクチャ)ではないので無視して構いません。
"Failed to get CPU frequency: 0 Hz" というエラーメッセージは、がtensorflow-metalがCPU周波数を使ってテンソルフローを実装していないので無視して結構です。