Zhe*_* Li 6 macos deep-learning keras tensorflow2.0 apple-m1
我正在 M1 MacBook Air 上使用 Keras 构建一个简单的网络,并安装了官方推荐的tensorflow-metal,希望获得更快的训练或预测速度。然而 GPU 的预测速度比 CPU 慢 3.5 倍,这让我很困惑。这是我的代码,启用和不启用 GPU 的输出\xef\xbc\x9a
\nimport time\n\nimport numpy as np\nfrom keras.callbacks import ModelCheckpoint\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\n\n\nclass CNNModel(object):\n def __init__(self, input_shape=(29, 1), num_classes=6, model_path=None):\n self.model = keras.Sequential(\n [\n keras.Input(input_shape),\n layers.Conv1D(16, kernel_size=3, activation="relu"),\n layers.MaxPooling1D(pool_size=3),\n layers.Conv1D(32, kernel_size=3, activation="relu"),\n layers.MaxPooling1D(pool_size=3),\n layers.Flatten(),\n layers.Dropout(0.5),\n layers.Dense(32, activation="sigmoid"),\n layers.Dense(num_classes, activation=\'softmax\')\n ]\n )\n self.model.compile(loss="categorical_crossentropy", optimizer=\'adam\', metrics=[\'accuracy\'])\n if model_path is not None:\n self.model.load_weights(model_path)\n\n def predict(self, x):\n preds = self.model.predict(x)\n preds = np.argmax(preds, axis=1)\n return preds\n\n def fit(self, x, y, model_save_path, batch_size=64, epochs=30):\n history = self.model.fit(x, y, batch_size=batch_size, epochs=epochs, validation_split=0.2,\n callbacks=[ModelCheckpoint(filepath=model_save_path, save_weights_only=True,\n monitor=\'val_accuracy\', mode=\'max\', save_best_only=True)])\n\n\nif __name__ == \'__main__\':\n model_path = "test.h5"\n sample_size = 20000\n data_x, data_y = np.random.random((sample_size, 29)), np.random.randint(0, 12, size=(sample_size, 1))\n class_num = np.unique(data_y).shape[0]\n data_y = keras.utils.to_categorical(data_y, class_num)\n Xtrain, Xtest, Ytrain, Ytest = train_test_split(data_x, data_y, test_size=0.2)\n model = CNNModel(input_shape=(Xtrain.shape[1], 1), num_classes=class_num)\n model.fit(Xtrain, Ytrain, batch_size=512, epochs=10, model_save_path=model_path)\n model = CNNModel(input_shape=(Xtrain.shape[1], 1), num_classes=class_num, model_path=model_path)\n since = time.time()\n preds = model.predict(Xtest)\n end = time.time()\n print(f\'Predict {Xtest.shape[0]} samples in {end - since : .9f}s, {(end - since) / Xtest.shape[0]: .9f}s on avg\')\n\nRun Code Online (Sandbox Code Playgroud)\n使用 GPU 时,我得到的输出如下:
\n\n\n金属设备设置为:Apple M1
\n系统内存:8.00 GB 最大缓存大小:2.67 GB
\n2022-01-10 21:07:47.974952: I\ntensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:305]\n无法识别平台 GPU ID 0 的 NUMA 节点,默认为 0。\n您的内核可能尚未内置 NUMA 支持。2022-01-10\n21:07:47.975053: I\ntensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:271]\n创建 TensorFlow 设备\n(/job:localhost/replica:0/task:0/device: GPU:0 具有 0 MB 内存) ->\n物理 PluggableDevice (设备: 0, 名称: METAL, pci 总线 id:\n) 2022-01-10 21:07:48.039236: W\ntensorflow/core/platform/profile_utils/ cpu_utils.cc:128] 无法获取\nCPU 频率:0 Hz Epoch 1/10 2022-01-10 21:07:48.206631: I\ntensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:112]\n插件优化器device_type GPU 已启用。23/25\n[==========================>...] - 预计到达时间:0 秒 - 损失:2.5483 - 准确度:\n0 .08282022-01-10 21:07:48.674379:我启用了tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:112]\ndevice_type GPU的插件优化器。25/25\n[==============================] - 1s 18ms/步 - 损耗:2.5446 -\n准确度: 0.0839 - val_loss:2.4955 - val_accuracy:0.0850 Epoch 2/10\n25/25 [================================] - 0s 15ms/步 - 损耗:2.4923 -\n准确度:0.0870 - val_loss:2.4852 - val_accuracy:0.0875 Epoch 3/10\n25/25 [==================== ==========] - 0s 13ms/步 - 损失:2.4864 -\n准确度:0.0863 - val_loss:2.4851 - val_accuracy:0.0866 Epoch 4/10\n25/25 [======== ======================] - 0s 13ms/步 - 损失:2.4866 -\n准确度:0.0841 - val_loss:2.4851 - val_accuracy:0.0862 Epoch 5/10\ n25/25 [==============================] - 0s 14ms/步 - 损耗:2.4863 -\n准确度:0.0826 - val_loss: 2.4849 - val_accuracy: 0.0869 Epoch 6/10\n25/25 [================================] - 0s 13ms /step - 损失:2.4855 -\n准确度:0.0909 - val_loss:2.4850 - val_accuracy:0.0800 Epoch 7/10\n25/25 [======================== ========] - 0s 13ms/步 - 损失:2.4861 -\n准确度:0.0843 - val_loss:2.4848 - val_accuracy:0.0884 Epoch 8/10\n25/25 [========== ====================] - 0s 13ms/步 - 损失:2.4852 -\n准确度:0.0848 - val_loss:2.4852 - val_accuracy:0.0803 Epoch 9/10\n25/ 25 [================================] - 0s 13ms/步 - 损失:2.4848 -\n准确度:0.0880 - val_loss: 2.4846 - val_accuracy:0.0866 Epoch 10/10\n25/25 [================================] - 0s 13ms/步- 损失:2.4846 -\n准确度:0.0871 - val_loss:2.4851 - val_accuracy:0.0875 2022-01-10\n21:07:51.840891:I\ntensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:112]\n插件优化器对于设备类型GPU 已启用。预测 4000 个样本\平均 0.259644985 秒、0.000064911 秒
\n
我在卸载tensorFlow-metal后得到了这个python -m pip uninstall tensorflow-metal:
\n\nEpoch 1/10 25/25 [================================] - 0s 6ms/步 -\nloss: 2.6182 -准确度:0.0824 - val_loss:2.5252 - val_accuracy:\n0.0878 纪元 2/10 25/25 [============================== ==] - 0s 3ms/步 - 损失:2.5025 - 精度:0.0863 - val_loss:2.4898 - val_accuracy:0.0791 Epoch 3/10 25/25 [================== ============] - 0s 3ms/步 - 损失:2.4901 - 准确度:0.0848 - val_loss:2.4873 - val_accuracy:0.0766 Epoch 4/10 25/25 [======== ======================] - 0s 3ms/步 - 损失:2.4894 - 准确度:0.0844 - val_loss:2.4865 - val_accuracy:0.0847 Epoch 5/10 25/ 25 [================================] - 0s 3ms/步 - 损失:2.4891 - 准确度:0.0802 - val_loss:2.4869 - val_accuracy:0.0797 Epoch 6/10 25/25 [================================] - 0s 3ms/步 - 损失:2.4876 - 准确度:0.0811 - val_loss:2.4876 - val_accuracy:0.0828 Epoch 7/10 25/25 [============================== ==] - 0s 3ms/步 - 损失:2.4866 - 精度:0.0847 - val_loss:2.4873 - val_accuracy:0.0822 Epoch 8/10 25/25 [================== ============] - 0s 3ms/步 - 损失:2.4867 - 准确度:0.0841 - val_loss:2.4867 - val_accuracy:0.0838 Epoch 9/10 25/25 [======== ======================] - 0s 3ms/步 - 损失:2.4870 - 准确度:0.0860 - val_loss:2.4867 - val_accuracy:0.0787 Epoch 10/10 25/ 25 [================================] - 0s 3ms/步 - 损失:2.4860 - 准确度:0.0883 - val_loss:2.4870 -\nval_accuracy:0.0744 在0.073775768s内预测 4000 个样本 ,\n平均 0.000018444s
\n
上周我发现了同样的问题,这也让我很困惑。在我的例子中,CPU 训练大约需要 7 秒,GPU 大约需要 100 秒。所以 GPU 慢了 14 倍!这是一个简单的 ANN,但在 CNN 上我发现 GPU 比 CPU 快大约 20%。
我认为这取决于您的输入大小。GPU 内核比 CPU 内核慢得多,但 GPU 的主要优点是可以同时运行数千个线程。在 CPU 上,您受到核心数量的限制,而且即使 M1 有 8 个核心,也只有 4 个核心可以同时工作。
因此,如果您的训练批次足够小,您将无法从 GPU 中受益,因为不会使用大量线程。由于 GPU 架构的原因,它们无法处理单独的批次。我建议您在少量 epoch 上测试 GPU 和 CPU 性能,然后选择更快的单元。
您无需卸载即可tensorflow-metal仅使用 CPU。您只需致电
tf.config.set_visible_devices([], 'GPU')
Run Code Online (Sandbox Code Playgroud)
在编译 NN 之前。此命令将从 TensorFlow 的可见设备中删除所有 GPU,因此训练将仅使用 CPU。
| 归档时间: |
|
| 查看次数: |
5729 次 |
| 最近记录: |