В этом посте мы узнаем, как перенести модель 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 г.