1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Python_Ai_Road-eat_tensorflow2_in_30_days

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Chapter6-3.md 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 03.12.2024 15:14 374a95e

6-3 Обучение модели с использованием одного графического процессора

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

Время в основном расходуется на два этапа: подготовку данных и итерацию параметров.

Мы можем увеличить количество процессов, чтобы решить эту проблему, если подготовка данных занимает большую часть времени.

Однако, если большая часть времени уходит на итерацию параметров, нам нужно использовать 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)

1. Конфигурация GPU

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

2. Подготовка данных

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()
          

3. Определение модели

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
_________________________________________________________________

4. Обучение модели

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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/Python_Ai_Road-eat_tensorflow2_in_30_days.git
git@api.gitlife.ru:oschina-mirror/Python_Ai_Road-eat_tensorflow2_in_30_days.git
oschina-mirror
Python_Ai_Road-eat_tensorflow2_in_30_days
Python_Ai_Road-eat_tensorflow2_in_30_days
master