Распараллеливание функций и моделей машинного обучения в 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 раза.
Позвольте мне рассказать вам о некоторых ключевых моментах приведенного выше кода:
- Во-первых, мы импортируем лучи и инициализируем кластер лучей с 3 процессорами;
- Во-вторых, мы добавляем
@ray.remote
декоратор к нашей функции, чтобы мы могли использовать его в распределенной настройке; - Наконец, мы выполняем функцию 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, потому что эта статья лишь поверхностно описывает его возможности.