16-дюймовый зверь от Apple за 2499 долларов против полностью бесплатной среды — что лучше для TensorFlow?

Apple второй год подряд полностью изменила индустрию ноутбуков. Новые 14-дюймовые и 16-дюймовые мониторы — это то, чего профессиональные пользователи ждали с момента выпуска базовой версии M1 в 2020 году. Выгодно ли это? Определенно, но сможет ли полностью бесплатный Google Colab превзойти его? Вот что мы ответим сегодня.

Хотите увидеть, как база M1 2020 года сравнивается с Google Colab для науки о данных? Я тебя прикрыл:



Сегодня мы проведем два теста обработки данных с помощью TensorFlow и сравним MacBook Pro M1 Pro и Google Colab. Мы проигнорируем очевидные преимущества молниеносного ноутбука и сосредоточимся только на скорости обучения модели.

Вот таблица, в которой приведены характеристики аппаратного обеспечения между ними:

M1 Pro имеет больше оперативной памяти и более новый процессор, но нас волнует именно графический процессор. Тот, что я тестировал от Apple, имеет 16 ядер, но вы можете настроить его на 24 или 32. Среда Colab, которая была назначена мне, совершенно случайна. Скорее всего, вы получите другой, поэтому результаты тестов могут отличаться.

Не хочется читать? Лучше посмотрите мое видео:

MacBook M1 Pro против Google Colab — настройка сравнительного анализа данных

Вам понадобится установленный TensorFlow, если вы будете следовать дальше. Вот целая статья, посвященная установке TensorFlow на Apple M1:



Кроме того, вам понадобится набор данных изображения. Я использовал набор данных Dogs vs. Cats от Kaggle, который находится под лицензией Creative Commons License. Короче говоря, вы можете использовать его бесплатно.

Обратитесь к следующей статье за ​​подробными инструкциями по организации и предварительной обработке:



Сегодня мы проведем два теста:

  1. TensorFlow с пользовательской архитектурой модели — использует два сверточных блока, описанных в моей статье CNN.
  2. TensorFlow с трансферным обучением — использует предварительно обученную сеть VGG-16 для классификации изображений.

Давайте рассмотрим код, используемый в тестах.

Пользовательская модель TensorFlow — код

Я разделил этот тест на две части — модель с увеличением данных и без него. Используйте только одну пару train_datagen и valid_datagen за раз:

import os
import warnings
from datetime import datetime
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
warnings.filterwarnings('ignore')

import numpy as np
import tensorflow as tf
tf.random.set_seed(42)

# COLAB ONLY
from google.colab import drive
drive.mount('/content/drive')

####################
# 1. Data loading
####################
# USED ON A TEST WITHOUT DATA AUGMENTATION
train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1/255.0
)
valid_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1/255.0
)

# USED ON A TEST WITH DATA AUGMENTATION
train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1/255.0,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest'
)
valid_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1/255.0
)

train_data = train_datagen.flow_from_directory(
    directory='data/train/',
    target_size=(224, 224),
    class_mode='categorical',
    batch_size=64,
    seed=42
)
valid_data = valid_datagen.flow_from_directory(
    directory='data/validation/',
    target_size=(224, 224),
    class_mode='categorical',
    batch_size=64,
    seed=42
)

####################
# 2. Model
####################
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), input_shape=(224, 224, 3), activation='relu'),
    tf.keras.layers.MaxPool2D(pool_size=(2, 2), padding='same'),
    tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu'),
    tf.keras.layers.MaxPool2D(pool_size=(2, 2), padding='same'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(2, activation='softmax')
])
model.compile(
    loss=tf.keras.losses.categorical_crossentropy,
    optimizer=tf.keras.optimizers.Adam(),
    metrics=[tf.keras.metrics.BinaryAccuracy(name='accuracy')]
)

####################
# 3. Training
####################
time_start = datetime.now()
model.fit(
    train_data,
    validation_data=valid_data,
    epochs=5
)
time_end = datetime.now()
print(f'Duration: {time_end - time_start}')

Давайте рассмотрим код трансферного обучения.

Модель TensorFlow для переноса обучения — код

Большая часть кода импорта и загрузки данных одинакова. Еще раз, используйте только одну пару train_datagen и valid_datagen за раз:

import os
import warnings
from datetime import datetime
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
warnings.filterwarnings('ignore')

import numpy as np
import tensorflow as tf
tf.random.set_seed(42)

# COLAB ONLY
from google.colab import drive
drive.mount('/content/drive')

####################
# 1. Data loading
####################
# USED ON A TEST WITHOUT DATA AUGMENTATION
train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1/255.0
)
valid_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1/255.0
)

# USED ON A TEST WITH DATA AUGMENTATION
train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1/255.0,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest'
)
valid_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1/255.0
)

train_data = train_datagen.flow_from_directory(
    directory='data/train/',
    target_size=(224, 224),
    class_mode='categorical',
    batch_size=64,
    seed=42
)
valid_data = valid_datagen.flow_from_directory(
    directory='data/validation/',
    target_size=(224, 224),
    class_mode='categorical',
    batch_size=64,
    seed=42
)

####################
# 2. Base model
####################
vgg_base_model = tf.keras.applications.vgg16.VGG16(
    include_top=False, 
    input_shape=(224, 224, 3), 
    weights='imagenet'
)
for layer in vgg_base_model.layers:
    layer.trainable = False
    
####################
# 3. Custom layers
####################
x = tf.keras.layers.Flatten()(vgg_base_model.layers[-1].output)
x = tf.keras.layers.Dense(128, activation='relu')(x)
out = tf.keras.layers.Dense(2, activation='softmax')(x)

vgg_model = tf.keras.models.Model(
    inputs=vgg_base_model.inputs,
    outputs=out
)
vgg_model.compile(
    loss=tf.keras.losses.categorical_crossentropy,
    optimizer=tf.keras.optimizers.Adam(),
    metrics=[tf.keras.metrics.BinaryAccuracy(name='accuracy')]
)

####################
# 4. Training
####################
time_start = datetime.now()
vgg_model.fit(
    train_data,
    validation_data=valid_data,
    epochs=5
)
time_end = datetime.now()
print(f'Duration: {time_end - time_start}')

Наконец, давайте посмотрим на результаты тестов.

MacBook M1 Pro против Google Colab — результаты сравнительного анализа данных

Теперь мы сравним среднее время обучения за эпоху как для M1 Pro, так и для Google Colab в пользовательской архитектуре модели. Имейте в виду, что были обучены две модели, одна с добавлением данных, а другая без него:

M1 Pro был определенно быстрее в этом тесте TensorFlow. Без дополнений M1 Pro был примерно на 23% быстрее, чем Google Colab. Разница возрастает до 124%, если мы говорим о модели, использующей расширенный набор данных изображений.

Но кто в наши дни пишет модели CNN с нуля? Трансферное обучение всегда рекомендуется, если у вас ограниченные данные и ваши изображения не являются узкоспециализированными. Вот результаты для моделей трансферного обучения:

Результаты, ну, удивительные. На модели без аугментации и Google Colab, и M1 Pro MacBook практически идентичны — разница всего в 2,4 секунды в пользу Colab), что незначительно. Мы видим разницу во времени обучения чуть выше 100% при сравнении модели, использующей набор данных дополненного изображения.

Теперь вы знаете цифры, но должны ли вы принимать решение о покупке, основываясь только на них? Давайте обсудим.

Напутствие

Я потратил много денег на MacBook Pro 16 M1 Pro, и правда в том, что вы можете получить ту же производительность на ноутбуках за полцены или даже бесплатно с Colab. Я не страдаю угрызениями совести покупателя, так как у M1 Pro есть много других вещей. Он быстрый, отзывчивый, легкий, с превосходным экраном и аккумулятором, работающим в течение всего дня. Черт возьми, он упаковывает экран 16,2 в корпус меньше, чем большинство 15 ноутбуков!

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

Что вы думаете о лучшей портативной среде обработки данных? Идти ва-банк с M1 Pro / M1 Max или купить более дешевый ноутбук и потратить остаток на облачные кредиты? Или что-то среднее? Дайте мне знать в разделе комментариев ниже.

Подробнее

Оставайтесь на связи

  • Подпишитесь на мою рассылку"
  • Подпишитесь на Ютуб
  • Подключиться в LinkedIn

Первоначально опубликовано на https://betterdatascience.com 20 января 2022 г.