Можно ли добавить память двух видеокарт вместе, чтобы запустить большую нейронную сеть? - PullRequest
1 голос
/ 01 февраля 2020

Если у меня есть видеокарта с 24 ГБ ОЗУ, могу ли я добавить вторую карту, которая точно такая же, чтобы удвоить мою память до 48 ГБ?

Я хочу запустить большой 3D- UNet но меня остановили из-за размера томов, которые я передаю. Позволит ли добавление второй карты увеличить объем?

** Обновление: я работаю на Linux (Red Hat Enterprise Linux 8). Мой код работает для обучения на обоих графических процессорах.

** Обновление кода:

def get_model(optimizer, loss_metric, metrics, lr=1e-3):
    inputs = Input((sample_width, sample_height, sample_depth, 1))
    with tf.device('/device:gpu:0'): 
        conv1 = Conv3D(32, (3, 3, 3), activation='relu', padding='same')(inputs)
        conv1 = Conv3D(32, (3, 3, 3), activation='relu', padding='same')(conv1)
        pool1 = MaxPooling3D(pool_size=(2, 2, 2))(conv1)
        drop1 = Dropout(0.5)(pool1)
        conv2 = Conv3D(64, (3, 3, 3), activation='relu', padding='same')(drop1)
        conv2 = Conv3D(64, (3, 3, 3), activation='relu', padding='same')(conv2)
        pool2 = MaxPooling3D(pool_size=(2, 2, 2))(conv2)
        drop2 = Dropout(0.5)(pool2)
        conv3 = Conv3D(128, (3, 3, 3), activation='relu', padding='same')(drop2)
        conv3 = Conv3D(128, (3, 3, 3), activation='relu', padding='same')(conv3)
        pool3 = MaxPooling3D(pool_size=(2, 2, 2))(conv3)
        drop3 = Dropout(0.3)(pool3)
        conv4 = Conv3D(256, (3, 3, 3), activation='relu', padding='same')(drop3)
        conv4 = Conv3D(256, (3, 3, 3), activation='relu', padding='same')(conv4)
        pool4 = MaxPooling3D(pool_size=(2, 2, 2))(conv4)
        drop4 = Dropout(0.3)(pool4)
        conv5 = Conv3D(512, (3, 3, 3), activation='relu', padding='same')(drop4)
        conv5 = Conv3D(512, (3, 3, 3), activation='relu', padding='same')(conv5)
    with tf.device('/device:gpu:1'):
        up6 = concatenate([Conv3DTranspose(256, (2, 2, 2), strides=(2, 2, 2), padding='same')(conv5), conv4], axis=4)
        conv6 = Conv3D(256, (3, 3, 3), activation='relu', padding='same')(up6)
        conv6 = Conv3D(256, (3, 3, 3), activation='relu', padding='same')(conv6)
        up7 = concatenate([Conv3DTranspose(128, (2, 2, 2), strides=(2, 2, 2), padding='same')(conv6), conv3], axis=4)
        conv7 = Conv3D(128, (3, 3, 3), activation='relu', padding='same')(up7)
        conv7 = Conv3D(128, (3, 3, 3), activation='relu', padding='same')(conv7)
        up8 = concatenate([Conv3DTranspose(64, (2, 2, 2), strides=(2, 2, 2), padding='same')(conv7), conv2], axis=4)
        conv8 = Conv3D(64, (3, 3, 3), activation='relu', padding='same')(up8)
        conv8 = Conv3D(64, (3, 3, 3), activation='relu', padding='same')(conv8)
        up9 = concatenate([Conv3DTranspose(32, (2, 2, 2), strides=(2, 2, 2), padding='same')(conv8), conv1], axis=4)
        conv9 = Conv3D(32, (3, 3, 3), activation='relu', padding='same')(up9)
        conv9 = Conv3D(32, (3, 3, 3), activation='relu', padding='same')(conv9)
        conv10 = Conv3D(1, (1, 1, 1), activation='sigmoid')(conv9)
    model = Model(inputs=[inputs], outputs=[conv10])    
    model.compile(optimizer=optimizer(lr=lr), loss=loss_metric, metrics=metrics)    
    return model


model = get_model(optimizer=Adam, loss_metric=dice_coef_loss, metrics=[dice_coef], lr=1e-3)
model_checkpoint = ModelCheckpoint('save.model', monitor=observe_var, save_best_only=False, period = 1000)
model.fit(train_x, train_y, batch_size = 1, epochs= 2000, verbose=1, shuffle=True, validation_split=0.2, callbacks=[model_checkpoint])
model.save('final_save.model')

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Я считаю, что в настоящее время невозможно объединить несколько графических процессоров для создания одного абстрактного графического процессора с объединенной памятью. Однако вы можете сделать что-то похожее: разделить модель на несколько графических процессоров, что все равно будет иметь желаемый эффект от возможности запуска моделей, размер которых превышает объем памяти любого отдельного графического процессора.

Проблема заключается в том, что для этого требуется указать вручную какие части модели будут работать на каждом устройстве, что может быть трудно сделать эффективно. Я также не уверен, как это можно сделать с готовой моделью.

Общий код выглядит так:

with tf.device('/gpu:0'):
    # create half the model

with tf.device('/gpu:1'):
    # create the other half of the model

# combine the two halves

Подробнее:

0 голосов
/ 01 февраля 2020

Короткий ответ - да, но на практике все сводится к программному обеспечению, которое вы используете, которое обращается к памяти от вашего имени. Я очень мало знаю об этих операционных системах, но я верю, что Cuda может стать местом, где можно начать искать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...