Распараллеливание функций и моделей машинного обучения в Python

В этой статье представлены два примера: как распараллелить 1.) функции Python и 2.) логический вывод (использование) моделей машинного обучения.

Контур:

  • Что такое Ray и как его можно использовать для распараллеливания функций Python;
  • Как использовать предварительно обученные модели машинного обучения Huggingface;
  • Как распараллелить вывод (использование) модели.

Распараллеливание выполнения функций Python с помощью Ray

По умолчанию Python использует одноядерный процессор (ЦП). Для распараллеливания вычислений (выполнения кода на нескольких процессорах) можно использовать различные методы и инструменты. Здесь я использую Ray, который представляет собой платформу для масштабирования вычислений на одной машине (ваш ноутбук) или на большом кластере машин (несколько вычислительных серверов в облаке). Вы можете установить Ray:

pip install -U ray #if you are using terminal
!pip install -U ray #if you are using Jupyter notebook

Лучше всего понять, как работает Ray, сравнив его с сырым Python. Давайте начнем с создания простой функции, которая подсчитывает, сколько раз она может увеличить счетчик в течение 1 секунды, а затем возвращает результат. Как и ожидалось, выполнение этой функции 9 раз в чистом Python занимает чуть больше 9 секунд (посмотрите на результаты в нижней части блока кода).

Output:
duration = 9.000171661376953
results = [792793, 818272, 791557, 808990, 818746, 815934, 815764, 814871, 799357]

Если мы распараллелим это вычисление (код ниже) на 3 процессора с помощью Ray, мы сможем сократить время вычислений примерно в 3 раза.

Позвольте мне рассказать вам о некоторых ключевых моментах приведенного выше кода:

  1. Во-первых, мы импортируем лучи и инициализируем кластер лучей с 3 процессорами;
  2. Во-вторых, мы добавляем @ray.remote декоратор к нашей функции, чтобы мы могли использовать его в распределенной настройке;
  3. Наконец, мы выполняем функцию sleeper_function в удаленной настройке sleeper_function.remote(x) и собираем результаты с помощью ray.get().

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

Вы можете увеличить количество процессоров, чтобы сделать вычисления еще быстрее, или поэкспериментировать с другими функциями.

Распараллеливание вывода модели машинного обучения

А теперь давайте займемся кое-чем более интересным, распараллеливая вывод предварительно обученной модели машинного обучения. Логический вывод - это процесс запуска точек данных в реальном времени в модель машинного обучения для вычисления выходных данных. В этом примере я использую модель генерации текста GPT-2, чтобы заканчивать предложения на основе моего ввода.

Предварительно обученный GPT-2 доступен через библиотеку трансформеров Huggingface. Установите библиотеку с помощью:

pip install transformers #if you are using terminal
!pip install transformers #if you are using Jupyter notebook

Теперь мы готовы импортировать модель GPT-2 (здесь я использую уменьшенную версию GPT-2 под названием «distilgpt2»). Кроме того, я создаю 4 начала предложения, которые позже скармливаю модели для генерации текста. В этом примере я хотел бы узнать, что думает модель GPT-2 о 1. основном источнике энергии в Эстонии, 2. о главной задаче моей должности (я работаю в качестве технолога), 3. о важности возобновляемых источников энергии. и 4. что изменится с электромобилями.

Генерация текста на чистом Python (одиночный процессор) занимает 4,24 секунды и предлагает несколько «интересных» продолжений предложений :).

Чтобы распараллелить то же вычисление с помощью Ray, нам снова нужно украсить нашу continue_text() функцию @ray.remote, выполнить функцию в удаленной настройке и собрать результаты с помощью ray.get(). На этот раз наш расчет фактически занимает гораздо больше времени (9,79 секунды), чем на одном ядре. Причина в том, что наша модель машинного обучения довольно велика, и Рэю требуется некоторое время, чтобы запустить ее на нескольких ядрах. Если я выполнил расчет (только нижнюю часть кода) во второй раз, это заняло 3,37 секунды, что быстрее, чем на одном ядре, но ненамного. Опять же, мы получаем некоторые творческие результаты - GPT-2 считает, что главная задача технологического разведчика - «найти способы определить, какую часть кода можно использовать». Что ж, эта статья об этом 🙃 😊.

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