简单的 tensorflow LSTM 网络卡在苹果硅上

Simple tensorflow LSTM network get stucks on apple silicon

我正在使用 Tensorflow 中的 imdb 数据集构建一个非常简单的 LSTM 网络,特别是在 Apple Silicon 芯片(最大 M1)上 运行。

我的代码如下:

import tensorflow as tf
def get_and_pad_imdb_dataset(num_words=10000, maxlen=None, index_from=2):
    from tensorflow.keras.datasets import imdb

    # Load the reviews
    (x_train, y_train), (x_test, y_test) = imdb.load_data(path='imdb.npz',
                                                          num_words=num_words,
                                                          skip_top=0,
                                                          maxlen=maxlen,
                                                          start_char=1,
                                                          oov_char=2,
                                                          index_from=index_from)

    x_train = tf.keras.preprocessing.sequence.pad_sequences(x_train,
                                                        maxlen=None,
                                                        padding='pre',
                                                        truncating='pre',
                                                        value=0)
    
    x_test = tf.keras.preprocessing.sequence.pad_sequences(x_test,
                                                           maxlen=None,
                                                           padding='pre',
                                                           truncating='pre',
                                                           value=0)
    return (x_train, y_train), (x_test, y_test)


def get_imdb_word_index(num_words=10000, index_from=2):
    imdb_word_index = tf.keras.datasets.imdb.get_word_index(
                                        path='imdb_word_index.json')
    imdb_word_index = {key: value + index_from for
                       key, value in imdb_word_index.items() if value <= num_words-index_from}
    return imdb_word_index

(x_train, y_train), (x_test, y_test) = get_and_pad_imdb_dataset(maxlen=25)

imdb_word_index = get_imdb_word_index()

max_index_value = max(imdb_word_index.values())

embedding_dim = 16

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(input_dim = max_index_value+1, output_dim = embedding_dim, mask_zero = True),
    tf.keras.layers.LSTM(units = 16),
    tf.keras.layers.Dense(units = 1, activation = 'sigmoid')
])

model.compile(loss = 'binary_crossentropy', metrics = ['accuracy'], optimizer = 'adam')


history = model.fit(x_train, y_train, epochs=3, batch_size = 32)

该代码在 Google Colab 上运行得非常好,我很确定它是正确的。然而,在我的 Apple Silicon 芯片上,它卡在了第一个 epoch 上,似乎根本没有进步。

这是我从日志中得到的全部信息:

Epoch 1/3
2022-02-15 22:10:34.093907: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:112] Plugin optimizer for device_type GPU is enabled.

我已经将我的 Apple Silicon 芯片与其他 tensorflow 模型一起使用,没有任何问题。

有没有办法 debug/see 在 fit 调用期间我的 apple silicon 上的 tensorflow 发生了什么?有谁知道这可能是问题所在?如果可能,有人可以在另一台 M1 机器上测试这段代码吗?

TensorFlow is not supported by M1 silicon.

安装它时可以使用某些功能,但任何在后台使用任何 C 的东西都无法使用。有一些解决方法,例如 installing with MiniForge,但您总会遇到一些问题。

tensorflow-macos 更新为 2.8 并将 tensorflow-metal 更新为 0.4 解决了问题。

这似乎是一个影响以前 tensorflow 版本的常见错误,尤其是在处理与文本相关的 layers/model 时。例如,在我的例子中,问题是 Embedding 层。

已打开类似问题 here,已通过更新 tensorflow 修复。