В этом посте мы узнаем, как перенести модель TensorFlow EfficientNet с первоначальной работы на ЦП на обучающий процессор Habana Gaudi, специально разработанный для эффективного ускорения обучения моделей глубокого обучения ИИ.

Мы начнем с запуска модели на процессоре. Затем добавьте необходимый код, чтобы запустить его на одном процессоре Gaudi. Наконец, мы включим распределенное обучение с использованием 8 устройств Gaudi.

Эффективная сеть

Облегченная архитектура сверточной нейронной сети для классификации изображений. EfficientNet достигает самой современной точности с на порядок меньшим количеством параметров и вычислений как в ImageNet, так и в пяти других широко используемых наборах данных для обучения с передачей данных.

Модель была впервые представлена ​​Tan et al. в EfficientNet: переосмысление масштабирования модели для сверточных нейронных сетей. В этом посте мы собираемся использовать базовую модель EfficientNet EfficientNet-B0 в качестве обучающего примера.

Настраивать

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

Установите дополнительные необходимые пакеты для этой модели

python3 -m pip install gin-config tensorflow_addons tensorflow_datasets tensorflow-model-optimization

Мы будем использовать Keras EfficientNet по адресу https://github.com/tensorflow/models/tree/v2.8.0/official/vision/image_classification.

Клонируйте код модели и добавьте его в путь PYTHON.

git clone --depth 1 --branch v2.8.0 https://github.com/tensorflow/models.git export PYTHONPATH=$PYTHONPATH:/home/ubuntu/models cd models/official/vision/image_classification

Обучение на процессоре

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

В репозитории моделей TensorFlow есть только файлы конфигурации EfficientNet для GPU и TPU. Мы будем использовать следующую команду Python, чтобы переопределить существующие конфигурации для графического процессора и запустить EfficientNet-B0 на ЦП.

python3 classifier_trainer.py --mode=train_and_eval --model_type=efficientnet --dataset=imagenet --model_dir=./log_cpu --data_dir=./ --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-gpu.yaml --params_override='runtime.num_gpus=0,runtime.distribution_strategy="off",train_dataset.builder="synthetic",validation_dataset.builder="synthetic",train.steps=1000,train.epochs=1,evaluation.skip_eval=True'

Результаты обучения Efficient-B0 на ЦП выглядят следующим образом:

Из приведенного выше выходного журнала видно, что пропускная способность обучения EfficientNet-B0 на ЦП с синтетическими данными составляет около 60 примеров в секунду.

Обучение работе с одним процессором Gaudi

Теперь давайте изменим сценарий обучения, чтобы обучить его на устройстве Gaudi, также называемом «HPU». Для этого нам нужно загрузить библиотеку Habana. Отредактируйте файл models/official/vision/image_classification/classifier_trainer.py и вставьте следующие две строки кода в строку 443:

from habana_frameworks.tensorflow import load_habana_module load_habana_module()

Сохраните файл и все готово. Мы будем использовать ту же команду, что и выше, для запуска обучения. На этот раз EfficientNet будет обучаться с использованием одного устройства Gaudi.

python3 classifier_trainer.py --mode=train_and_eval --model_type=efficientnet --dataset=imagenet --model_dir=./log_hpu --data_dir=./ --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-gpu.yaml --params_override='runtime.num_gpus=0,runtime.distribution_strategy="off",train_dataset.builder="synthetic",validation_dataset.builder="synthetic",train.steps=1000,train.epochs=1,evaluation.skip_eval=True'

Из выходного журнала видно, что пропускная способность обучения EfficientNet-B0 на Habana Gaudi с синтетическими данными составляет около 400 примеров в секунду.

Тренировка со смешанной точностью

Смешанная точность — это использование как 16-разрядных (bfloat16), так и 32-разрядных типов с плавающей запятой в модели во время обучения, чтобы она работала быстрее и использовала меньше памяти. Вы можете включить смешанную точность с процессорами SynapseAI и Gaudi, используя API смешанной точности Keras.

Отредактируйте файл models/official/vision/image_classification/classifier_trainer.py и замените строку 231 следующими двумя строками кода:

from tensorflow.keras import mixed_precision mixed_precision.set_global_policy('mixed_bfloat16')

Сохраните файл и используйте ту же команду для запуска тренировки.

python3 classifier_trainer.py --mode=train_and_eval --model_type=efficientnet --dataset=imagenet --model_dir=./log_hpu --data_dir=./ --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-gpu.yaml --params_override='runtime.num_gpus=0,runtime.distribution_strategy="off",train_dataset.builder="synthetic",validation_dataset.builder="synthetic",train.steps=1000,train.epochs=1,evaluation.skip_eval=True'

Из выходного журнала видно, что пропускная способность обучения EfficientNet-B0 на Habana Gaudi с синтетическими данными увеличена почти до 600 примеров в секунду.

Распределенное обучение на 8 Gaudis

Использование Gaudi вместо процессоров уже ускорило наше обучение примерно в 10 раз. Чтобы еще больше увеличить пропускную способность нашего обучения, мы будем использовать технику, называемую распределенным обучением. Распределенное обучение позволяет запускать учебную нагрузку более чем на одном устройстве одновременно. В этом примере мы запустим его на 8 разных Gaudis.

В исходном коде tf.distribute.Strategy используется для поддержки распределенного обучения для TPU и GPU. Мы будем использовать API-интерфейсы tf.distribute, чтобы включить распределенное обучение на нескольких Gaudis с помощью HPUStrategy. HPUStrategy похожа на MultiWorkerMirroredStrategy, в которой каждый рабочий процесс выполняется в отдельном процессе.

Отредактируйте файл models/official/common/distribute_utils.py и в строке 148 вставьте следующий код:

if distribution_strategy == "hpu": 
    from habana_frameworks.tensorflow.distribute import HPUStrategy 
    return HPUStrategy()

И сохраните файл.

В нашем примере мы будем использовать MPI для запуска нескольких рабочих процессов. Мы настроим переменную среды TF_CONFIG, повторно используя существующую функцию Distribut_utils.configure_cluster() в коде:

Отредактируйте файл models/official/vision/image_classification/classifier_trainer.py и замените строки 292 и 293 следующим кодом:

if params.runtime.distribution_strategy == 'hpu': 
    hls_addresses = ["127.0.0.1"] 
    TF_BASE_PORT = 2410 from
    habana_frameworks.tensorflow.multinode_helpers import comm_size, comm_rank 
    mpi_rank = comm_rank() mpi_size = comm_size() worker_hosts = ",".join([",".join([address + ':' + str(TF_BASE_PORT + rank) 
    for rank in range(mpi_size // len(hls_addresses))]) 
        for address in hls_addresses]) task_index = mpi_rank distribute_utils.configure_cluster(worker_hosts, task_index) 
else:   
    distribute_utils.configure_cluster(params.runtime.worker_hosts, params.runtime.task_index)

И сохраните файл.

Теперь мы запустим 8 процессов с помощью команды mpirun, чтобы начать распределенное обучение для EfficientNet с использованием 8 устройств Gaudi с HPUStrategy:

mpirun --allow-run-as-root -np 8 -x TF_ENABLE_BF16_CONVERSION=1 python3 classifier_trainer.py --mode=train_and_eval --model_type=efficientnet --dataset=imagenet --model_dir=./log_hpu_8 --data_dir=./ --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-gpu.yaml --params_override='runtime.num_gpus=0,runtime.distribution_strategy="hpu",train_dataset.builder="synthetic",validation_dataset.builder="synthetic",train.steps=1000,train.epochs=1,evaluation.skip_eval=True'

Теперь вы можете видеть, что с 8 устройствами Gaudi производительность обучения значительно увеличилась примерно до 4200 изображений в секунду.

Заключение

В этом посте мы продемонстрировали, как переход от обучения ЦП к ускоренному обучению Гауди обеспечит 75-кратное увеличение пропускной способности обучения. Как вы видели, нет необходимости переписывать обучающий код. Дальнейшие оптимизации производительности обучения модели, такие как использование смешанной точности и распределенного обучения, также легко добавить благодаря тесной интеграции SynapseAI с ведущими инструментами обучения глубокому обучению.

Первоначально опубликовано на https://habana.ai 23 августа 2022 г.