Написать пост

Как и на чём обучить модель машинного обучения

Раскатываем модель PyTorch на двух разных сетапах: проводим тренировку и выбираем оптимальный вариант.

Как и на чём обучить модель машинного обучения

Медицина, финансы, наука, бизнес, инфобез — машинное обучение используют, кажется, все и везде. Чем больше компания, тем больше и требовательнее модели. Как следствие, дата-сайентисты должны знать, как работать с этими моделями.

В статье покажем базу, полезную для крепких джунов и более опытных специалистов: объясним, как подобрать фреймворк и железо и раскатаем ML-модель.

Выбираем фреймворк: PyTorch

PyTorch — популярный, бесплатный фреймворк. Сравнительно простой в освоении, гибкий, интегрирован с Python. То есть подойдёт большинству разработчиков, которые берутся за ML-модели. Именно на нём написаны многие современные LLM, будь то ChatGPT или Llama.

Но он довольно требователен к RAM, поэтому сегодня сравним два облачных сервера и посмотрим, насколько хорошо каждый из них справится с «жадной» до оперативы моделью.

Выбираем железо: RTXA5000 16 Гб RAM GPU: 2

Чем мощнее железо, тем выше производительность и, как следствие, выше скорость обработки данных. Но «просто арендовать лучший сервер на рынке» — сомнительный вариант: во-первых, дорого; во-вторых, не факт, что вы будете использовать его на полную мощность и не потратите деньги в никуда.

Поэтому надо сперва разобраться в характеристиках. На старте разница между предлагаемыми конфигурациями может быть не ясна. Только для одной карты на сайте облачной платформы Immers.cloud их 13.

Как и на чём обучить модель машинного обучения 1

Чтобы понять, сколько ядер и Гб оперативной памяти взять, оттолкнёмся от задачи, масштабируемости облачного сервиса и цены. У нас тестовый проект и нет точных требований к железу, поэтому подойдут 8–16 Гб оперативной памяти и 2–4 ядра. Выбираем RTXA5000 на 16 Гб RAM с двумя ядрами: она полностью закрывает нашу задачу (8192 CUDA ядер позволяют выполнять тысячи параллельных вычислений одновременно) и стоит недорого. Обойдётся в 98 руб. в час, или 70 841 руб. в месяц.

Как и на чём обучить модель машинного обучения 2

Готовим рабочее окружение

Для начала создадим сервер с GeForce RTX A5000 (rtxa5000-2.16.64.160.nvlink) с Ubuntu 20.04. все дефолтные настройки оставим без изменений.

Скачиваем кред в формате .pem в разделе «Ключевые пары». Расположим его в папке проекта на своей машине, и затем, следуя инструкции по подключению для той или иной ОС, выставим права на файл.pem и зайдём на сервер:

			ssh -i \путь\до\файла.pem ubuntu@[IP-адрес]
		

Создадим директорию проекта:

			mkdir my_awesome_project && apt install python3.10-venv
		

Создадим виртуальное окружение:

			python3 -m venv my_venv && source my_venv/bin/activate
		

Установим PyTorch:

			pip3 install torch
		

Обучаем модель

Наполним скрипт huge_torch_model.py:

			vim huge_torch_model.py
		

Для начала импортируем необходимые библиотеки: PyTorch и её модуль torch.nn для создания и управления архитектурой нейросетей:

			import torch
import torch.nn as nn
		

Далее определим класс HugeModel (наследуется от nn.Module): в методе __init__ создается последовательность из 50 слоев с линейной активацией и добавляется функция активации ReLU для каждой пары слоёв. Метод forward определяет прямое прохождение данных через модель, то есть вычисление результирующих значений на основе ввода.

Если вы только начали изучать PyTorch, вот годная вводная статья, которая поможет разобраться с терминологией: слоями активации, ReLu, и нейросетями типа feedforward и прочим.

			class HugeModel(nn.Module):
    def __init__(self):
        super(HugeModel, self).__init__()
        layers = []
      # Чтобы загрузить RAM, намеренно определяю огромное число фичей -- слоев
        input_size = 10000
        for i in range(50):  # 50 слоев
            layers.append(nn.Linear(input_size, input_size))
            layers.append(nn.ReLU())
        
        self.model = nn.Sequential(*layers)
    
    def forward(self, x):
        return self.model(x)
		

Создадим экземпляр модели:

			model = HugeModel()
		

Сгенерируем входные данные — случайный тензор размером 64 x 10000, где 64 — величина подаваемого за раз пакета, а 10000 — количество признаков (input_size):

			input_data = torch.randn(64, 10000)
		

Эти строки определяют, будет ли использован GPU или CPU для вычислений, и перемещают модель и входные данные на выбранное устройство. Если доступен GPU, вычисления ускорятся:

			device = torch.device("cuda" if torch.cuda.is_available() else "сpu")
model.to(device)
input_data = input_data.to(device)
		

Подадим данные модели для получения результата:

			output = model(input_data)print(output)
		

Запустим скрипт:

			python3 huge_torch_model.py:
		

В консоль выводятся тензоры — результаты:

			tensor([[0.0155, 0.0000, 0.0000,  ..., 0.0280, 0.0000, 0.0000],
        [0.0153, 0.0000, 0.0000,  ..., 0.0281, 0.0000, 0.0000],
        [0.0154, 0.0000, 0.0000,  ..., 0.0281, 0.0000, 0.0000],
        ...,
        [0.0154, 0.0000, 0.0000,  ..., 0.0280, 0.0000, 0.0000],
        [0.0155, 0.0000, 0.0000,  ..., 0.0279, 0.0000, 0.0000],
        [0.0155, 0.0000, 0.0000,  ..., 0.0279, 0.0000, 0.0000]],
       grad_fn=)
		

Даже авторасширения RAM не потребовалось, а на обучение ушло около минуты.

Эту модель можно сразу использовать как инструмент для решения бизнес-задач. Вот несколько примеров, что можно сделать с помощью неё:

  • «Суфлёр» техподдержки. Подаём базу реплик операторов и просим модель сгенерировать ответ на новый вопрос на основе нашей базы знаний:
Как и на чём обучить модель машинного обучения 3
  • Расшифровка ДНК. Фичами-столбцами станут последовательности зашифрованных нуклеотидов:
  • A => 1, 0, 0, 0
  • C => 0, 1, 0, 0
  • G => 0, 0, 1, 0
  • T => 0, 0, 0, 1
  • Обучение беспилотных авто. Признаками станут координаты транспорта и скорость в момент времени:
Как и на чём обучить модель машинного обучения 4

Сравниваем с Intel Xeon 2 x 3.3 ГГц CPU 16 Гб RAM

Для сравнения возьмём сервер другого провайдера: Intel Xeon, 2 ядра CPU, 8 Гб оперативной памяти. Похожие основные характеристики, но без GPU, и с картой от Intel. Настройка среды аналогична, и там, и там Ubuntu 20.04, но команда установки PyTorch выглядит так:

			pip3 install torch --no-cache-dir
		

Запускаем модель с теми же параметрами, почти сразу получаем RuntimeError: попросту нечем удерживать такой объём данных одновременно.

Как и на чём обучить модель машинного обучения 5

Только снизившись до input_size = 1000 и понизив число слоев до 10, укладываемся в выделенные мощности:

			class HugeModel(nn.Module):
    def __init__(self):
    ...
    input_size = 1000
       for i in range(10):
           layers.append(nn.Linear(input_size, input_size))
           layers.append(nn.ReLU())
		

Обучение заняло более 20 минут даже при таком понижении

Объём передаваемых данных тоже существенно снизился:

			input_data = torch.randn(10, 1000)
		

Что в итоге

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

RTX A5000 справился за минут, Intel — за 20. Что повлияло на результат: в данной ситуации:

  • GPU специально разрабатываются и оптимизируются для высокопроизводительных вычислений что важно для манипуляций с большими матрицами и векторизациями в ML и DL.
  • CPU хорошо подходит для задач, требующих последовательных вычислений и высокой тактовой частоты, но они менее эффективны для параллельных рабочих нагрузок. Так что рассчитывать на серьёзную модель и использовать ее для решения бизнес-задач при таких параметрах нельзя.

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

Immers.cloud предоставляет виртуальные GPU и CPU для работы с ИИ: обучения нейросетей, инференса и файн-тьюнинга и прочего. На сайте можно подобрать мощности по разные задачи и любой бюджет.

immers.cloud подготовил для наших читателей бонус — +20% на пополнение счёта! Регистрируйтесь и пополняйте баланс, чтобы активировать его.

Реклама, ООО «Диджитэл Тек Энд Лаб», erid: LjN8KQW4p

Следите за новыми постами
Следите за новыми постами по любимым темам
848 открытий6К показов