Из-за всей шумихи вокруг графических процессоров возможности центральных процессоров часто упускают из виду при развертывании модели глубокого обучения для логического вывода. Текущая зависимость отрасли от графических процессоров создает две проблемы: доступность графических процессоров в настоящее время ограничена, и, во-вторых, надбавка, связанная с графическими процессорами. Обе эти проблемы еще больше усугубляются при развертывании производственных рабочих нагрузок AI/ML в облаке, где в настоящее время для некоторых CSP дорого или невозможно использовать новейшие графические процессоры (Nvidia A100/H100) в любом масштабе без значительных предварительных обязательств.

ЦП по-прежнему могут обеспечивать приемлемую производительность логических выводов при большей доступности цепочки поставок и меньшей стоимости в сочетании с последними предложениями и некоторыми оптимизациями. В этом конкретном сообщении в блоге я сосредоточусь на новейшей архитектуре процессоров Intel, Sapphire Rapids, и расширении Intel для PyTorch (IPEX), которое оптимизирует PyTorch для процессоров Intel. Как мы увидим, оба они являются ключевыми для достижения приемлемой производительности логического вывода.

Sapphire Rapids, новейшая архитектура Intel и масштабируемый процессор Xeon 4-го поколения, были запущены в январе. Учитывая спрос на рабочие нагрузки AI/ML, Intel добавила два важных расширения, которые ускоряют обучение и вывод моделей глубокого обучения — Advanced Matrix Extensions (AMX) и AVX512-FP16. Оба они значительно улучшают производительность матричных операций (сложение, умножение и т. д.), используемых при обучении и выводе.

Расширение Intel для PyTorch (IPEX) обеспечивает оптимизацию среды выполнения для всех процессоров Intel, поддерживающих AVX-512 и более поздние версии (Skylake или более поздние версии). Оптимизация времени выполнения сводит к минимуму любые изменения кода в вашем коде PyTorch и в некоторых случаях повышает производительность обучения ЦП и логического вывода в 4 раза и более.

В приведенных ниже тестах я обучил модель ResNet-50, общую архитектуру сверточной нейронной сети, используемую для классификации изображений, с набором данных CIFAR-10 и PyTorch на нескольких различных типах экземпляров GCP: Intel Cascade Lake, Ice Lake, Sapphire Rapids. . Кроме того, предоставляется эталонный тест графического процессора с использованием Nvidia Tesla T4 в качестве основы для сравнения. В то время как производительность обучения будет обеспечена, основное внимание будет уделено выводу моделей, поскольку это по-прежнему является наиболее жизнеспособным вариантом использования ЦП в производстве — как с практической, так и с экономической точки зрения. Блокноты PyTorch, которые я использовал для тестов, доступны на моем Github.

Код

Как я упоминал выше, изменения кода, необходимые для использования IPEX, очень минимальны. Изменения, необходимые в блокноте PyTorch, выделены ниже.

# Imports

!pip install intel_extension_for_pytorch
import intel_extension_for_pytorch as ipex
...
# Training loop w/ float32

model.train()
# ipex.optimize() needs to be called to optimize the model and optimizer.
model, optimizer = ipex.optimize(model, optimizer=optimizer)

for batch_idx, (data, target) in enumerate(train_loader):
    data, target = data.to(device), target.to(device)
    optimizer.zero_grad()
    output = model(data)
    loss = criterion(output, target)
    loss.backward()
    optimizer.step()
    loss_plot.append(loss.item())
    print('batch_idx: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
        batch_idx, batch_idx * len(data), len(train_loader.dataset),
        100. * batch_idx / len(train_loader), loss.item()))
# Inference w/ float32

model.eval()

# ipex.optimize() needs to be called to optimize the model before inference.
model = ipex.optimize(model)

...

Использование типа данных тензора bfloat16 требует нескольких дополнительных изменений как в коде обучения, так и в коде логического вывода.

# Training loop w/ bfloat16

model.train()
# We still call ipex.optimize() to optimize the model and optimizer; however,
# we also specify the torch.bfloat16 datatype should be utilized.
model, optimizer = ipex.optimize(model, optimizer=optimizer, dtype=torch.bfloat16)

for batch_idx, (data, target) in enumerate(train_loader):
    data, target = data.to(device), target.to(device)
    optimizer.zero_grad()
    # Use PyTorch Automatic Mixed Precision's autocast() to automatically cast
    # tensor datatypes to bfloat16.
    with torch.cpu.amp.autocast():
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
    optimizer.step()
    loss_plot.append(loss.item())
    print('batch_idx: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
        batch_idx, batch_idx * len(data), len(train_loader.dataset),
        100. * batch_idx / len(train_loader), loss.item()))
# Inference w/ bfloat16

model.eval()
# Optimize model for inference w/ IPEX and specify the bfloat16 datatype
# should be used
model = ipex.optimize(model, dtype=torch.bfloat16)

...

with torch.no_grad():
    for data, target in test_loader:
        # automatically cast to torch.bfloat16 using PyTorch's Automatic
        # Mixed Precision
        with torch.cpu.amp.autocast():
            output = model(data)
        _, predicted = torch.max(output.data, 1)
        total += target.size(0)
        correct += (predicted == target).sum().item()

В этом конкретном примере функция ipex.optimize() заменяет сверточные слои ResNet-50 специальными версиями, оптимизированными для IPEX:

GraphModule(
  (conv1): _IPEXConv2d()
  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (relu): ReLU(inplace=True)
  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
  (layer1): Module(
    (0): Module(
      (conv1): _IPEXConv2d()
      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (relu): ReLU(inplace=True)
      (conv2): _IPEXConv2d()
      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (conv3): _IPEXConv2d()
...

Ориентиры

Прежде всего, это тест GPU на Nvidia Tesla T4, чтобы установить базовый уровень.

Cascade Lake (Xeon Scalable 2-го поколения) —

Далее следует Ice Lake (Xeon Scalable 3-го поколения) —

Наконец, тема этого сообщения в блоге, Sapphire Rapids (последняя версия Xeon Scalable 4-го поколения) —

Анализ

  • IPEX обеспечивает скромный прирост производительности при включении для обучения и вывода с типом данных тензора PyTorch float32 по умолчанию для Cascade Lake, Ice Lake и Sapphire Rapids. Опять же, недостатков нет, за исключением нескольких изменений кода, позволяющих включить IPEX в ваших блокнотах или сценариях PyTorch.
  • Использование типа тензора bfloat16 в Cascade Lake и Ice Lake приводит к худшей производительности, чем float32. Вероятно, это связано с отсутствием расширения AVX512-FP16, которое было представлено вместе с Sapphire Rapids. Между поколениями также есть некоторые различия в тактовой частоте и инструкциях AVX512.
  • Оптимизация IPEX с типом данных bfloat16 и расширениями Sapphire Rapids AMX и AVX512-FP16 приводит к существенному приросту производительности — в 3,3 раза при обучении и примерно в 10 раз при скорости вывода по сравнению с Cascade Lake или Ice Lake. Это означает, что для достижения желаемой производительности логических выводов можно развернуть гораздо меньше экземпляров Sapphire Rapids, что приводит к значительной экономии средств.
  • С точки зрения стоимости инстансы типа GCP c3 (Sapphire Rapids) немного дороже, но намного быстрее, чем инстансы типа n2 (Cascade Lake и Ice Lake) — не считая различий в конфигурации памяти.
  • Как и ожидалось, тест Nvidia Tesla T4 демонстрирует значительно более высокую производительность обучения модели; однако производительность логических выводов соответствует Sapphire Rapids. Tesla T4 является старым графическим процессором и находится в нижней части корпоративного портфолио Nvidia по сравнению с A100 и недавно выпущенным H100, и, как указано выше, доступность графического процессора с CSP всегда под вопросом.

Краткое содержание

Этот пост продемонстрировал практичность и экономичность использования процессоров, в частности Intel Sapphire Rapids, для логического вывода на основе глубокого обучения в облаке или локально. В то время как графические процессоры были предпочтительным выбором, процессоры становятся жизнеспособной альтернативой из-за ограничений поставок и высоких затрат, связанных с графическими процессорами. Архитектура Intel Sapphire Rapids, оснащенная Advanced Matrix Extensions и AVX512-FP16, улучшает матричные операции, необходимые для глубокого обучения. Кроме того, используя расширение Intel для PyTorch (IPEX), пользователи могут легко оптимизировать PyTorch для процессоров Intel, что значительно повышает производительность. Тесты показывают, что Sapphire Rapids предлагает производительность логического вывода, сравнимую с графическими процессорами, при более низкой стоимости и большей доступности. Таким образом, рассмотрение ЦП для логических выводов в производственных рабочих нагрузках AI/ML может быть как с практической, так и с экономической точки зрения выгодным.

Заинтересованы в том, чтобы сделать следующий шаг в области искусственного интеллекта, машинного обучения или автоматизации? Посетите www.silexdata.com, чтобы узнать, как Silex Data Solutions может преобразовать ваш бизнес с помощью передовых стратегий и решений. Узнав из этой статьи о потенциале ЦП в выводах глубокого обучения, вы можете задаться вопросом, как эффективно интегрировать и оптимизировать эти технологии в вашей собственной инфраструктуре. Silex Data Solutions поможет вам в этом. Обладая опытом в области автоматизации, искусственного интеллекта и машинного обучения и модернизации центров обработки данных, Silex станет вашим надежным партнером в навигации по сложному ландшафту новых технологий. Не позволяйте стремительному прогрессу оставить вас позади.