TensorFlow スライド 機械学習

テンソルフロー

 テンソルフローは、機械学習モデルを容易に作るフレームワークです。このフレームワークを用いると、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周波数を使ってテンソルフローを実装していないので無視して結構です。

-TensorFlow, スライド, 機械学習
-,