如何在ubuntu上训练tensorflow模型?

如何在ubuntu上训练tensorflow模型?,tensorflow,ubuntu-16.04,conv-neural-network,Tensorflow,Ubuntu 16.04,Conv Neural Network,我试图在Ubuntu 16.4机器上训练tensorflow模型。然而,训练开始后,TF几乎消耗了所有可用RAM(8GB),并被OOM收割者杀死。如果我禁用OOM killer,它将以分段错误终止 到目前为止,我的搜索结果还没有显示任何可以限制RAM tensorflow使用量的内容,只有与GPU相关的参数是可配置的,但这并不能解决问题。如果我使用ulimit-linux命令将python进程的RAM限制为4GB,那么脚本将永远被卡住,甚至无法启动——这几乎就像它从未开始执行脚本的主方法一样 我

我试图在Ubuntu 16.4机器上训练tensorflow模型。然而,训练开始后,TF几乎消耗了所有可用RAM(8GB),并被OOM收割者杀死。如果我禁用OOM killer,它将以分段错误终止

到目前为止,我的搜索结果还没有显示任何可以限制RAM tensorflow使用量的内容,只有与GPU相关的参数是可配置的,但这并不能解决问题。如果我使用ulimit-linux命令将python进程的RAM限制为4GB,那么脚本将永远被卡住,甚至无法启动——这几乎就像它从未开始执行脚本的主方法一样

我已经在网上搜索了很多关于这个主题的教程,似乎从来没有人遇到过这个问题。我的问题是——人们实际上是如何做到的?很明显,我遗漏了一些东西。这个问题并没有在Windows上表现出来,培训已经完成,但速度极其缓慢

编辑:有问题的函数是:

def finetune():
    upper_model = Sequential()
    upper_model.add(Flatten(input_shape=core_model.output_shape[1:]))
    upper_model.add(Dense(256, activation='relu'))
    upper_model.add(Dropout(0.5))
    upper_model.add(Dense(len(class_indices), activation='sigmoid'))
    upper_model.load_weights(top_model_weights_filename)

    final_model = Model(inputs=core_model.input, outputs=upper_model(core_model.output))

    for layer in final_model.layers[:15]:
        layer.trainable = False

    final_model.compile(loss='binary_crossentropy',
                        # optimizer=optimizers.SGD(lr=1e-6, momentum=0.9),
                        optimizer=optimizers.RMSprop(lr=1e-5),
                        metrics=['accuracy'])

    if not Path(final_model_weights_filename).is_file():
        print("Final weights not found, calculating anew.")

        data_augmentation_datagen = ImageDataGenerator(
            rotation_range=40,
            width_shift_range=0.2,
            height_shift_range=0.2,
            shear_range=0.2,
            zoom_range=0.2,
            horizontal_flip=True,
            fill_mode='nearest')
        data_augmentation_datagen.mean = normalization_datagen.mean
        data_augmentation_datagen.std = normalization_datagen.std

        val_loss_checkpoints = []
        weights_checkpoints = []

        for e in range(epochs):
            print("-" * 100)
            print("Epoch %d" % (e + 1))
            print("-" * 100)

            for i, (x_train, y_train) in enumerate(iterate_dataset('train', converted_images_dir)):
                print('Iterating over training batch number %d at %s' % (i + 1, str(datetime.now().time())))
                train_iterator = data_augmentation_datagen.flow(
                    x_train, y_train,
                    batch_size=batch_size,
                    shuffle=False)

                steps = x_train.shape[0] // batch_size
                if x_train.shape[0] % batch_size != 0:
                    steps += 1

                final_model.fit_generator(train_iterator, steps)

            loss = []

            for i, (x_valid, y_valid) in enumerate(iterate_dataset('valid', converted_images_dir)):
                print('Iterating over validation batch number %d' % (i + 1))
                valid_iterator = normalization_datagen.flow(
                    x_valid, y_valid,
                    batch_size=batch_size,
                    shuffle=False)

                steps = x_valid.shape[0] // batch_size
                if x_valid.shape[0] % batch_size != 0:
                    steps += 1

                batch_loss = final_model.evaluate_generator(valid_iterator, steps)
                loss.append(batch_loss)

            epoch_loss = np.array(loss).mean(axis=0)[0]
            epoch_acc = np.array(loss).mean(axis=0)[1]
            print('Loss after epoch %d is %.2f' % (e + 1, epoch_loss))
            print('Accuracy after epoch %d is %.2f' % (e + 1, epoch_acc))
            print()


        final_model.save_weights(final_model_weights_filename)

    else:
        print("Reusing found final weights.")
        final_model.load_weights(final_model_weights_filename)

    return final_model

如有必要,我可以提供额外的解释。

RAM的使用与您的型号大小和培训批次大小直接相关。将“批次大小”设置为1,然后检查它是否仍然处于OOM状态(在这种情况下,您的模型太大)。如果没有,开始增加批处理大小,直到找到训练工作的最大值。我运行了一些基本数字,它应该可以正常工作。我使用VGG16而不使用FC层,我用一个14类的最终分类层替换了单个256 FC层。我的网络有21M个参数,而不是138M,大约80MB的内存。我使用的批量大小为10,对于前向和后向传递,我需要每个图像大约200M。这加起来是2000+80MB,这仍然不能解释为什么它不能在8GB RAM上工作。然后你的代码中有一个bug,在这种情况下,你需要在你的问题中发布它并上传代码的相关部分。我尝试了批号为2的代码,几乎24小时后,该过程仍然运行。这个过程占用了大约75%的内存,但这怎么可能呢?很明显,我的计算是幼稚的,肯定还有其他东西比我想象的要消耗更多。