TensorFlow on Apple M2

Hi,

What is the best way to install TensorFlow with GPU support on a MacBook Air with M2 chip?

Any tutorial?

Thanks!

Fadi

1 Like

Hi @Fadi_Badine maybe you could refer to the following video

Hope it helps

2 Likes

Thanks @Shirshak_Ghatak! I’ll have a look

As of January 2024 you just need to do this ( I am on a Macbook Air 15-inch, M2, 2023, Ventura)

pip install tensorflow-macos
pip install tensorflow-metal

I found the video in the previous answer outdated, redundant and relies on Anaconda which I don’t use.

Hope this helps :slight_smile:

1 Like

Doesn’t seem to be working either!
ERROR: Could not find a version that satisfies the requirement tenserflow-macos (from versions: none)
ERROR: No matching distribution found for tenserflow-macos

The errors mentioned above likely originated from the version requirements of Python and NumPy. TensorFlow-Metal 1.1.0 works fine with Python 3.11, but not with Python 3.12 at the moment.

Hello All, After following the instructions outlined in the forum, I find that the training goes awry on my M2 MacBook pro. I am using Tensorflow-Keras (Version. 2.15 on Mac M2 pro with tensorflow-metal and other supporting files in a Conda environment. Training the Fashion-MNIST dataset goes awry with exponential increase in loss and decrease in accuracy after 15 epochs… but the same program runs fine on Kaggle / CoLab and Windows machines… what is wrong with my installation? Please help.

Here is the tensorflow related packages on my system:

Name Version Build Channel

tensorflow 2.15.0 pypi_0 pypi
tensorflow-addons 0.23.0 pypi_0 pypi
tensorflow-datasets 4.9.3 pypi_0 pypi
tensorflow-estimator 2.15.0 pypi_0 pypi
tensorflow-hub 0.15.0 pypi_0 pypi
tensorflow-io-gcs-filesystem 0.34.0 pypi_0 pypi
tensorflow-macos 2.15.0 pypi_0 pypi
tensorflow-metadata 1.14.0 pypi_0 pypi
tensorflow-metal 1.1.0 pypi_0 pypi
tensorflow-serving-api 2.14.1 pypi_0 pypi
conda version 24.5 python 3.10.13 Processor: M2 Pro 16 GB

Here is the training output… notice the loss and others after Epoch 15…:

Epoch 1/30
8/1719 […] - ETA: 13s - loss: 2.5446 - sparse_categorical_accuracy: 0.1094
2024-06-02 21:48:10.697034: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:117] Plugin optimizer for device_type GPU is enabled.
1719/1719 [==============================] - 9s 5ms/step - loss: 0.7242 - sparse_categorical_accuracy: 0.7537 - val_loss: 0.5245 - val_sparse_categorical_accuracy: 0.8198
Epoch 2/30
1719/1719 [==============================] - 9s 5ms/step - loss: 0.5111 - sparse_categorical_accuracy: 0.8232 - val_loss: 0.4899 - val_sparse_categorical_accuracy: 0.8220
Epoch 3/30
1719/1719 [==============================] - 9s 5ms/step - loss: 0.4750 - sparse_categorical_accuracy: 0.8340 - val_loss: 0.4568 - val_sparse_categorical_accuracy: 0.8382
Epoch 4/30
1719/1719 [==============================] - 8s 5ms/step - loss: 0.4595 - sparse_categorical_accuracy: 0.8405 - val_loss: 0.4389 - val_sparse_categorical_accuracy: 0.8480
Epoch 5/30
1719/1719 [==============================] - 8s 5ms/step - loss: 0.4480 - sparse_categorical_accuracy: 0.8439 - val_loss: 0.4393 - val_sparse_categorical_accuracy: 0.8482
Epoch 6/30
1719/1719 [==============================] - 8s 5ms/step - loss: 0.4400 - sparse_categorical_accuracy: 0.8471 - val_loss: 0.4511 - val_sparse_categorical_accuracy: 0.8412
Epoch 7/30
1719/1719 [==============================] - 9s 5ms/step - loss: 0.4367 - sparse_categorical_accuracy: 0.8484 - val_loss: 0.4400 - val_sparse_categorical_accuracy: 0.8436
Epoch 8/30
1719/1719 [==============================] - 9s 5ms/step - loss: 0.4342 - sparse_categorical_accuracy: 0.8495 - val_loss: 0.4384 - val_sparse_categorical_accuracy: 0.8434
Epoch 9/30
1719/1719 [==============================] - 8s 5ms/step - loss: 0.4337 - sparse_categorical_accuracy: 0.8488 - val_loss: 0.4239 - val_sparse_categorical_accuracy: 0.8534
Epoch 10/30
1719/1719 [==============================] - 8s 5ms/step - loss: 0.4357 - sparse_categorical_accuracy: 0.8503 - val_loss: 0.4594 - val_sparse_categorical_accuracy: 0.8382
Epoch 11/30
1719/1719 [==============================] - 8s 5ms/step - loss: 0.4455 - sparse_categorical_accuracy: 0.8458 - val_loss: 0.6570 - val_sparse_categorical_accuracy: 0.7694
Epoch 12/30
1719/1719 [==============================] - 8s 5ms/step - loss: 0.4735 - sparse_categorical_accuracy: 0.8388 - val_loss: 0.4893 - val_sparse_categorical_accuracy: 0.8388
Epoch 13/30
1719/1719 [==============================] - 9s 5ms/step - loss: 0.5207 - sparse_categorical_accuracy: 0.8320 - val_loss: 0.7607 - val_sparse_categorical_accuracy: 0.7774
Epoch 14/30
1719/1719 [==============================] - 9s 5ms/step - loss: 0.6125 - sparse_categorical_accuracy: 0.8208 - val_loss: 0.6150 - val_sparse_categorical_accuracy: 0.8212
Epoch 15/30
1719/1719 [==============================] - 9s 5ms/step - loss: 0.7335 - sparse_categorical_accuracy: 0.8117 - val_loss: 0.8825 - val_sparse_categorical_accuracy: 0.8070
Epoch 16/30
1719/1719 [==============================] - 9s 5ms/step - loss: 0.9291 - sparse_categorical_accuracy: 0.8005 - val_loss: 1.6653 - val_sparse_categorical_accuracy: 0.7470
Epoch 17/30
1719/1719 [==============================] - 9s 5ms/step - loss: 1.3758 - sparse_categorical_accuracy: 0.7846 - val_loss: 2.0585 - val_sparse_categorical_accuracy: 0.7672
Epoch 18/30
1719/1719 [==============================] - 9s 5ms/step - loss: 2.3946 - sparse_categorical_accuracy: 0.7643 - val_loss: 2.7167 - val_sparse_categorical_accuracy: 0.7496
Epoch 19/30
1719/1719 [==============================] - 9s 5ms/step - loss: 5.2811 - sparse_categorical_accuracy: 0.7405 - val_loss: 6.2060 - val_sparse_categorical_accuracy: 0.7630
Epoch 20/30
1719/1719 [==============================] - 9s 5ms/step - loss: 13.4853 - sparse_categorical_accuracy: 0.7262 - val_loss: 12.5058 - val_sparse_categorical_accuracy: 0.7404
Epoch 21/30
1719/1719 [==============================] - 9s 5ms/step - loss: 50.5050 - sparse_categorical_accuracy: 0.7054 - val_loss: 87.1311 - val_sparse_categorical_accuracy: 0.6666
Epoch 22/30
1719/1719 [==============================] - 9s 5ms/step - loss: 311.9028 - sparse_categorical_accuracy: 0.6932 - val_loss: 446.3747 - val_sparse_categorical_accuracy: 0.7274
Epoch 23/30
1719/1719 [==============================] - 9s 5ms/step - loss: nan - sparse_categorical_accuracy: 0.5486 - val_loss: nan - val_sparse_categorical_accuracy: 0.1042
Epoch 24/30
1719/1719 [==============================] - 9s 5ms/step - loss: nan - sparse_categorical_accuracy: 0.0996 - val_loss: nan - val_sparse_categorical_accuracy: 0.1042
Epoch 25/30
1719/1719 [==============================] - 9s 5ms/step - loss: nan - sparse_categorical_accuracy: 0.0996 - val_loss: nan - val_sparse_categorical_accuracy: 0.1042
Epoch 26/30
1719/1719 [==============================] - 9s 5ms/step - loss: nan - sparse_categorical_accuracy: 0.0996 - val_loss: nan - val_sparse_categorical_accuracy: 0.1042
Epoch 27/30
1719/1719 [==============================] - 9s 5ms/step - loss: nan - sparse_categorical_accuracy: 0.0996 - val_loss: nan - val_sparse_categorical_accuracy: 0.1042
Epoch 28/30
1719/1719 [==============================] - 9s 5ms/step - loss: nan - sparse_categorical_accuracy: 0.0996 - val_loss: nan - val_sparse_categorical_accuracy: 0.1042
Epoch 29/30
1719/1719 [==============================] - 9s 5ms/step - loss: nan - sparse_categorical_accuracy: 0.0996 - val_loss: nan - val_sparse_categorical_accuracy: 0.1042
Epoch 30/30
1719/1719 [==============================] - 9s 5ms/step - loss: nan - sparse_categorical_accuracy: 0.0996 - val_loss: nan - val_sparse_categorical_accuracy: 0.1042

This could be a known issue as shown: Apple Silicon M2 Loss Goes Up After 1-2 (Few) Epochs but not on Google Colab · Issue #140 · keras-team/tf-keras · GitHub

Thanks, do you know any workaround?

This might help: python - Loss increasing to extremely high numbers during training - Stack Overflow

Don’t use tensorflow-metal.

Think there’s a bug in that lib.

Thanks, I think so too - have now moved the model to PyTorch and it works like a dream under device = mps.

1 Like