Процедура обучения глубоких нейронных сетей обычно занимает много времени. На обучение могут уходить десятки дней, не говоря уже о тех случаях, когда на это требуются дни или часы.
Время в основном расходуется на два этапа: подготовку данных и итерацию параметров.
Мы можем увеличить количество процессов, чтобы решить эту проблему, если подготовка данных занимает большую часть времени.
Однако, если большая часть времени уходит на итерацию параметров, нам нужно использовать GPU или Google TPU для ускорения.
Дополнительную информацию вы можете найти в этой статье: «Ускорение работы Keras моделей с помощью GPU — как использовать бесплатные GPU Colab (на китайском)»
Нет необходимости изменять исходный код для переключения с CPU на GPU при использовании предопределённого метода fit
или пользовательских циклов обучения. Когда доступен графический процессор и устройство не указано, TensorFlow автоматически выбирает GPU для создания тензоров и вычислений.
Однако в случае использования общего графического процессора несколькими пользователями, например, при использовании сервера компании или лаборатории, нам необходимо добавить следующий код, чтобы указать идентификатор графического процессора и объём памяти графического процессора, который мы собираемся использовать, чтобы избежать того, что ресурсы графического процессора будут заняты одним пользователем (фактически TensorFlow по умолчанию использует все графические процессоры и всю память графических процессоров) и позволяет нескольким пользователям выполнять на нём обучение.
В записной книжке Colab выберите «GPU» в меню «Изменить» -> «Настройки ноутбука» -> «Аппаратный ускоритель».
Примечание: следующий код выполняется только в Colab.
Вы можете использовать следующую ссылку для тестирования (tf_singleGPU, на китайском):
https://colab.research.google.com/drive/1r5dLoeJq5z01sU72BX2M5UiNSkuxsEFe
%tensorflow_version 2.x
import tensorflow as tf
print(tf.__version__)
from tensorflow.keras import *
# Time stamp
@tf.function
def printbar():
ts = tf.timestamp()
today_ts = ts%(24*60*60)
hour = tf.cast(today_ts//3600+8,tf.int32)%tf.constant(24)
minite = tf.cast((today_ts%3600)//60,tf.int32)
second = tf.cast(tf.floor(today_ts%60),tf.int32)
def timeformat(m):
if tf.strings.length(tf.strings.format("{}",m))==1:
return(tf.strings.format("0{}",m))
else:
return(tf.strings.format("{}",m))
timestring = tf.strings.join([timeformat(hour),timeformat(minite),
timeformat(second)],separator = ":")
tf.print("=========="*8,end = "")
tf.print(timestring)
gpus = tf.config.list_physical_devices("GPU")
if gpus:
gpu0 = gpus[0] # Использовать только GPU 0 при наличии нескольких GPU
tf.config.experimental.set_memory_growth(gpu0, True) # Устанавливать использование памяти GPU в соответствии с потребностями
# Использование памяти GPU также может быть фиксированным (например, 4 ГБ)
#tf.config.experimental.set_virtual_device_configuration(gpu0,
#[tf.config.experimental.VirtualDeviceConfiguration(memory_limit=4096)])
tf.config.set_visible_devices([gpu0],"GPU")
Сравните скорость вычислений между GPU и CPU.
printbar()
with tf.device("/gpu:0"):
tf.random.set_seed(0)
a = tf.random.uniform((10000,100),minval = 0,maxval = 3.0)
b = tf.random.uniform((100,100000),minval = 0,maxval = 3.0)
c = a@b
tf.print(tf.reduce_sum(tf.reduce_sum(c,axis = 0),axis=0))
printbar()
================================================================================17:37:01
2.24953778e+11
================================================================================17:37:01
printbar()
with tf.device("/cpu:0"):
tf.random.set_seed(0)
a = tf.random.uniform((10000,100),minval = 0,maxval = 3.0)
b = tf.random.uniform((100,100000),minval = 0,maxval = 3.0)
c = a@b
tf.print(tf.reduce_sum(tf.reduce_sum(c,axis = 0),axis=0))
printbar()
================================================================================17:37:34
2.24953795e+11
================================================================================17:37:40
MAX_LEN = 300
BATCH_SIZE = 32
``` ```
(x_train,y_train),(x_test,y_test) = datasets.reuters.load_data()
x_train = preprocessing.sequence.pad_sequences(x_train,maxlen=MAX_LEN)
x_test = preprocessing.sequence.pad_sequences(x_test,maxlen=MAX_LEN)
MAX_WORDS = x_train.max()+1
CAT_NUM = y_train.max()+1
ds_train = tf.data.Dataset.from_tensor_slices((x_train,y_train)) \
.shuffle(buffer_size = 1000).batch(BATCH_SIZE) \
.prefetch(tf.data.experimental.AUTOTUNE).cache()
ds_test = tf.data.Dataset.from_tensor_slices((x_test,y_test)) \
.shuffle(buffer_size = 1000).batch(BATCH_SIZE) \
.prefetch(tf.data.experimental.AUTOTUNE).cache()
tf.keras.backend.clear_session()
def create_model():
model = models.Sequential()
model.add(layers.Embedding(MAX_WORDS,7,input_length=MAX_LEN))
model.add(layers.Conv1D(filters = 64,kernel_size = 5,activation = "relu"))
model.add(layers.MaxPool1D(2))
model.add(layers.Conv1D(filters = 32,kernel_size = 3,activation = "relu"))
model.add(layers.MaxPool1D(2))
model.add(layers.Flatten())
model.add(layers.Dense(CAT_NUM,activation = "softmax"))
return(model)
model = create_model()
model.summary()
Модель: "sequential"
_________________________________________________________________
Слой (тип) Выходная форма Количество параметров
=================================================================
Встраивание (Embedding) (Нет, 300, 7) 216874
_________________________________________________________________
conv1d (Conv1D) (Нет, 296, 64) 2304
_________________________________________________________________
max_pooling1d (MaxPooling1D) (Нет, 148, 64) 0
_________________________________________________________________
conv1d_1 (Conv1D) (Нет, 146, 32) 6176
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (Нет, 73, 32) 0
_________________________________________________________________
flatten (Flatten) (Нет, 2336) 0
_________________________________________________________________
dense (Dense) (Нет, 46) 107502
=================================================================
Всего параметров: 332 856
Обучаемых параметров: 332 856
Необучаемых параметров: 0
_________________________________________________________________
optimizer = optimizers.Nadam()
loss_func = losses.SparseCategoricalCrossentropy()
train_loss = metrics.Mean(name='train_loss')
train_metric = metrics.SparseCategoricalAccuracy(name='train_accuracy')
valid_loss = metrics.Mean(name='valid_loss')
valid_metric = metrics.SparseCategoricalAccuracy(name='valid_accuracy')
@tf.function
def train_step(model, features, labels):
with tf.GradientTape() as tape:
predictions = model(features,training = True)
loss = loss_func(labels, predictions)
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
train_loss.update_state(loss)
train_metric.update_state(labels, predictions)
@tf.function
def valid_step(model, features, labels):
predictions = model(features)
batch_loss = loss_func(labels, predictions)
valid_loss.update_state(batch_loss)
valid_metric.update_state(labels, predictions)
def train_model(model,ds_train,ds_valid,epochs):
for epoch in tf.range(1,epochs+1):
for features, labels in ds_train:
train_step(model,features,labels)
for features, labels in ds_valid:
valid_step(model,features,labels)
logs = 'Epoch={},Loss:{},Accuracy:{},Valid Loss:{},Valid Accuracy:{}'
if epoch%1 ==0:
printbar()
tf.print(tf.strings.format(logs,
``` ```
================================================================================17:13:26
Эпоха=1,Потеря:1.96735072,Точность:0.489200622,Потеря валидации:1.64124215,Точность валидации:0.582813919
================================================================================17:13:28
Эпоха=2,Потеря:1.4640888,Точность:0.624805152,Потеря валидации:1.5559175,Точность валидации:0.607747078
================================================================================17:13:30
Эпоха=3,Потеря:1.20681274,Точность:0.68581605,Потеря валидации:1.58494771,Точность валидации:0.622439921
================================================================================17:13:31
Эпоха=4,Потеря:0.937500894,Точность:0.75361836,Потеря валидации:1.77466083,Точность валидации:0.621994674
================================================================================17:13:33
Эпоха=5,Потеря:0.693960547,Точность:0.822199941,Потеря валидации:2.00267363,Точность валидации:0.6197685
================================================================================17:13:35
Эпоха=6,Потеря:0.519614,Точность:0.870296121,Потеря валидации:2.23463202,Точность валидации:0.613980412
================================================================================17:13:37
Эпоха=7,Потеря:0.408562034,Точность:0.901246965,Потеря валидации:2.46969271,Точность валидации:0.612199485
================================================================================17:13:39
Эпоха=8,Потеря:0.339028627,Точность:0.920062363,Потеря валидации:2.68585229,Точность валидации:0.615316093
================================================================================17:13:41
Эпоха=9,Потеря:0.293798745,Точность:0.92930305,Потеря валидации:2.88995624,Точность валидации:0.613535166
================================================================================17:13:43
Эпоха=10,Потеря:0.263130337,Точность:0.936651051,Потеря валидации:3.09705234,Точность валидации:0.612644672
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )