Большая часть моделей машинного обучения в наши дни, особенно в НЛП, публикуется в PyTorch. В этой статье рассматриваются следующие

  • Настройка облачной машины Google с помощью PyTorch (для приобретения облачной машины Google используйте эту ссылку)
  • Тестирование параллелизма на машинах с несколькими GPU на игрушечном примере
  • Изменения кода, необходимые для того, чтобы модель использовала несколько графических процессоров как для обучения, так и для логического вывода.

Настройка машины Google Cloud с PyTorch

Запуск сценариев в этом репозитории Github и следующие инструкции должны настроить облачную машину Google с драйверами для одного или нескольких графических процессоров Nvidia.

Тестирование параллелизма на машине с несколькими GPU

Включение модели для параллельной обработки данных — это буквально одна строка кода.

model = Model(input_size, output_size)
if torch.cuda.device_count() > 1:  
      model = nn.DataParallel(model) #enabling data parallelism

Полный код игрушечного теста указан здесь. Вывод этого примера (python multi_gpu.py ) на компьютере с 8 GPU показан ниже:

Размер пакета равен 32. Таким образом, первые 7 GPU обрабатывают 4 выборки, а 8-й GPU обрабатывает оставшиеся 2.

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

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

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
n_gpu = torch.cuda.device_count()

Затем для включения параллелизма данных как для обучения, так и для вывода

model = Model(input_size, output_size)
if n_gpu > 1:  
      
 #enabling data parallelism

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

if n_gpu > 1:
     loss = loss.mean()

Также данные (тензоры) необходимо преобразовать (CPU в Cuda)следующим образом. Пример показан ниже

input_ids = input_ids.to(device)
input_mask = input_mask.to(device)
segment_ids = segment_ids.to(device)
label_ids = label_ids.to(device)
with torch.no_grad():
       logits = model(input_ids, segment_ids, input_mask)

По этой ссылке показан подробный пример

Ссылка на Github для драйверов графического процессора/настройки PyTorch