Как VirtuSwap ускоряет свои симуляции торговли на основе панд виртуальным контейнером Amazon SageMaker Studio и экземплярами AWS GPU

VirtuSwap ускоряет симуляции торговли с помощью Amazon SageMaker Studio и экземпляров AWS GPU

Этот пост написан совместно с Димой Задорожным и Фуадом Бабаевым из VirtuSwap.

VirtuSwap – это стартап, разрабатывающий инновационные технологии для децентрализованного обмена активами на блокчейнах. Технология VirtuSwap обеспечивает более эффективную торговлю активами, которые не имеют прямой пары между собой. Отсутствие прямой пары приводит к дорогостоящей косвенной торговле, что означает, что для выполнения желаемого обмена требуется две или более сделки, что приводит к удвоению или утроению торговых затрат. Технология виртуальных пулов на основе резерва VirtuSwap решает эту проблему, делая каждую сделку прямой и экономя до 50% торговых затрат. Подробнее читайте на virtuswap.io.

В этом посте мы расскажем, как VirtuSwap использовал функцию “bring-your-own-container” в Amazon SageMaker Studio, чтобы создать надежную среду для размещения своих GPU-интенсивных симуляций для решения задач линейной оптимизации.

Вызов

Движок VirtuSwap Minerva создает рекомендации для оптимального распределения ликвидности между различными пулами ликвидности, учитывая несколько параметров, таких как объемы торговли, текущая рыночная ликвидность и волатильность торгуемых активов, ограниченных общим объемом ликвидности, доступным для распределения. Чтобы предоставить эти рекомендации, VirtuSwap Minerva использует тысячи исторических пар торговли для моделирования их прохождения через различные конфигурации ликвидности для поиска оптимального распределения ликвидности, комиссий пула и т. д.

Первоначальная реализация была выполнена с использованием данных в виде фреймов pandas. Однако с увеличением объема данных симуляции время выполнения почти учетверилось, а размер задачи увеличился. В результате итерации замедлились, и было практически невозможно запускать задачи большей размерности. VirtuSwap понял, что им нужно использовать GPU-экземпляры для симуляции, чтобы получать более быстрые результаты.

VirtuSwap нужна библиотека, совместимая с GPU, похожая на pandas, для выполнения своей симуляции, и они выбрали cuDF – библиотеку GPU DataFrame от Rapids. cuDF используется для загрузки, объединения, агрегации, фильтрации и другой обработки данных с использованием пандасоподобного API, который ускоряет работу с фреймами данных с помощью CUDA и обеспечивает значительно более высокую производительность по сравнению с pandas.

Обзор решения

VirtuSwap выбрал SageMaker Studio для разработки от начала до конца, начиная с итеративной, интерактивной разработки в блокнотах. Благодаря гибкости SageMaker Studio они решили использовать его и для своей симуляции, воспользовавшись преимуществами пользовательских образов Amazon SageMaker, которые позволяют VirtuSwap использовать свои собственные пользовательские библиотеки и необходимое программное обеспечение, такие как cuDF. Ниже приведена схема решения.

В следующих разделах мы расскажем пошаговые инструкции по созданию и использованию образа Rapids cuDF в SageMaker.

Предварительные требования

Для выполнения этого пошагового руководства вам понадобится учетная запись AWS с разрешениями для SageMaker, Amazon Elastic Container Registry (Amazon ECR), AWS Identity and Access Management (IAM) и AWS CodeBuild. Кроме того, вам потребуется готовый домен SageMaker.

Создание ролей и политик IAM

Для процесса сборки пользовательских блокнотов SageMaker мы использовали AWS CloudShell, который предоставляет все необходимые пакеты для создания пользовательского образа. В CloudShell мы использовали SageMaker Docker Build – интерфейс командной строки для создания образов Docker в SageMaker Studio. Этот интерфейс может создавать репозиторий в Amazon ECR и создавать контейнер с помощью CodeBuild. Для этого нам необходимо предоставить инструменту роль IAM с необходимыми разрешениями. Выполните следующие шаги:

  1. Войдите в консоль управления AWS и откройте консоль IAM.

  2. В левой панели навигации выберите Политики.

  3. Создайте политику с именем sm-build-policy со следующими разрешениями:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "codebuild:DeleteProject",
                    "codebuild:CreateProject",
                    "codebuild:BatchGetBuilds",
                    "codebuild:StartBuild"
                ],
                "Resource": "arn:aws:codebuild:*:*:project/sagemaker-studio*"
            },
            {
                "Effect": "Allow",
                "Action": "logs:CreateLogStream",
                "Resource": "arn:aws:logs:*:*:log-group:/aws/codebuild/sagemaker-studio*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "logs:GetLogEvents",
                    "logs:PutLogEvents"
                ],
                "Resource": "arn:aws:logs:*:*:log-group:/aws/codebuild/sagemaker-studio*:log-stream:*"
            },
            {
                "Effect": "Allow",
                "Action": "logs:CreateLogGroup",
                "Resource": "*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "ecr:CreateRepository",
                    "ecr:BatchGetImage",
                    "ecr:CompleteLayerUpload",
                    "ecr:DescribeImages",
                    "ecr:DescribeRepositories",
                    "ecr:UploadLayerPart",
                    "ecr:ListImages",
                    "ecr:InitiateLayerUpload",
                    "ecr:BatchCheckLayerAvailability",
                    "ecr:PutImage"
                ],
                "Resource": "arn:aws:ecr:*:*:repository/sagemaker-studio*"
            },
            {
                "Sid": "ReadAccessToPrebuiltAwsImages",
                "Effect": "Allow",
                "Action": [
                    "ecr:BatchGetImage",
                    "ecr:GetDownloadUrlForLayer"
                ],
                "Resource": [
                    "arn:aws:ecr:*:763104351884:repository/*",
                    "arn:aws:ecr:*:217643126080:repository/*",
                    "arn:aws:ecr:*:727897471807:repository/*",
                    "arn:aws:ecr:*:626614931356:repository/*",
                    "arn:aws:ecr:*:683313688378:repository/*",
                    "arn:aws:ecr:*:520713654638:

    Разрешения предоставляют возможность полноценно использовать утилиту: создавать репозитории, создавать задания CodeBuild, использовать Amazon Simple Storage Service (Amazon S3) и отправлять журналы в Amazon CloudWatch.

    1. Создайте роль с именем sm-build-role со следующей политикой доверия и добавьте ранее созданную политику sm-build-policy:

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "codebuild.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole"
              }
          ]
      }

    Теперь давайте рассмотрим шаги в CloudShell.

    Создание образа Docker cuDF в CloudShell

    Для наших целей нам понадобился образ Rapids CUDA, который также включает ipykernel, чтобы образ можно было использовать в блокноте SageMaker Studio.

    Мы используем существующий образ CUDA от RapidsAI, который доступен в официальном Docker-хабе Rapids AI, и добавляем установку ipykernel.

    В терминале CloudShell выполните следующую команду:

    printf "FROM nvcr.io/nvidia/rapidsai/rapidsai:0.16-cuda10.1-base-ubuntu18.04
    RUN pip install ipykernel && \
    python -m ipykernel install --sys-prefix && \ 
    useradd --create-home --shell /bin/bash --gid 100 --uid 1000 sagemaker-user
    USER sagemaker-user" > Dockerfile

    Это создаст Dockerfile, который будет собирать наш пользовательский образ Docker для SageMaker.

    Сборка и загрузка образа в репозиторий

    Как уже упоминалось, мы использовали библиотеку SageMaker Docker Build, которая позволяет ученым-исследователям и разработчикам легко создавать пользовательские образы контейнеров. Дополнительную информацию см. в разделе Использование интерфейса командной строки Amazon SageMaker Studio Image Build CLI для создания образов контейнеров из блокнотов Studio.

    Следующая команда создает репозиторий ECR (если репозиторий не существует). sm-docker создаст его, а затем соберет и загрузит новый образ Docker в созданный репозиторий:

    sm-docker build . --repository rapids:v1 --role sm-build-role

    Если у вас нет sm-docker в CloudShell, выполните следующий код:

    pip3 install sagemaker-studio-image-build

    По завершении будет возвращен URI образа ECR.

    Создание пользовательского образа SageMaker

    После создания пользовательского образа Docker и его загрузки в ваш репозиторий контейнеров (Amazon ECR) вы можете настроить SageMaker для использования этого пользовательского образа Docker. Выполните следующие шаги:

    1. На консоли SageMaker выберите Образы в панели навигации.
    2. Выберите Создать образ.
    3. Введите URI образа, полученный на предыдущем этапе, затем выберите Далее.
    4. Для Имя образа и Отображаемое имя образа введите rapids.
    5. Для Описания введите описание.
    6. Для IAM-роли выберите соответствующую IAM-роль для вашей области SageMaker.
    7. Для Пути монтирования EFS введите /home/sagemaker-user (по умолчанию).
    8. Разверните Расширенную конфигурацию.
    9. Для Идентификатора пользователя введите 1000.
    10. Для Идентификатора группы введите 100.

    1. В разделе Тип изображения выберите Изображение SageMaker Studio.
    2. Выберите Добавить ядро.
    3. Для Имени ядра введите conda-env-rapids-py.
    4. Для Отображаемого имени ядра введите rapids.
    5. Выберите Отправить, чтобы создать изображение SageMaker.

    Присоедините новое изображение к вашему домену SageMaker Studio

    Теперь, когда вы создали пользовательское изображение, вам необходимо сделать его доступным для использования, присоединив его к вашему домену. Выполните следующие действия:

    1. На консоли SageMaker выберите Домены в панели навигации.
    2. Выберите свой домен. Этот шаг является необязательным; вы можете создать и присоединить пользовательское изображение напрямую из домена, пропустив этот шаг.

    1. На странице сведений о домене выберите вкладку Окружение, затем выберите Присоединить изображение.
    2. Выберите Существующее изображение и выберите новое изображение (rapids) из списка.
    3. Выберите Далее.

    1. Просмотрите конфигурацию пользовательского изображения и убедитесь, что установлено Тип изображения как Изображение SageMaker Studio, как в предыдущем шаге, с тем же именем ядра и отображаемым именем ядра.
    2. Выберите Отправить.

    Пользовательское изображение теперь доступно в SageMaker Studio и готово к использованию.

    Создайте новую записную книжку с изображением

    Для инструкций по запуску новой записной книжки обратитесь к разделу Запуск пользовательского изображения SageMaker в Amazon SageMaker Studio. Выполните следующие действия:

    1. На консоли SageMaker Studio выберите Открыть запускатор.
    2. Выберите Изменить окружение.

    1. Для Изображения выберите вновь созданное изображение, rapids v1.
    2. Для Ядра выберите rapids.
    3. Для Типа экземпляра выберите свой экземпляр.

    SageMaker Studio предоставляет возможность настраивать вычислительную мощность, выбирая экземпляр из семейств ускоренных вычислений AWS, вычислений общего назначения, оптимизированных для вычислений и оптимизированных для памяти. Эта гибкость позволяет плавно переходить между ЦП и ГПУ, а также динамически масштабировать размеры экземпляров по мере необходимости. Для нашей записной книжки мы использовали тип экземпляра ml.g4dn.2xlarge для тестирования производительности cuDF при использовании ускорителя GPU.

    1. Выберите Выбрать.

    1. Выберите вашу среду и выберите Создать заметку, затем дождитесь, пока ядро заметки не станет готовым.

    Проверьте ваш пользовательский образ

    Чтобы проверить, что ваш пользовательский образ был запущен и cuDF готов к использованию, создайте новую ячейку, введите import cudf и запустите ее.

    Очистка

    Выключите экземпляр Jupyter, запустивший тестовую записную книжку в SageMaker Studio, выбрав Запущенные терминалы и ядра и выключив запущенный экземпляр.

    Результаты сравнения времени выполнения

    Мы провели сравнение времени выполнения нашего кода с использованием как ЦП, так и ГП на инстансах SageMaker g4dn.2xlarge с временной сложностью O(N). Результаты, как показано на следующей диаграмме, раскрывают эффективность использования ГП перед ЦП.

    Основное преимущество ГП заключается в их способности выполнять параллельную обработку. При увеличении значения N время выполнения на ЦП увеличивается с коэффициентом 3N. С другой стороны, с ГП, коэффициент увеличения может быть описан как 2N, как показано на предыдущей диаграмме. Чем больше размер проблемы, тем более эффективной становится ГП. В нашем случае использование ГП было как минимум в 20 раз быстрее, чем использование ЦП. Это подчеркивает растущую важность ГП в современных вычислениях, особенно для задач, требующих быстрой обработки больших объемов данных.

    С помощью инстансов SageMaker с ГП, VirtuSwap способны значительно увеличить размерность решаемых задач и находить решения быстрее.

    Заключение

    В этом сообщении мы показали, как VirtuSwap настроил SageMaker Studio, используя пользовательский образ, чтобы решить сложную задачу. Благодаря возможности легко изменять среду выполнения и переключаться между различными инстансами, размерами и ядрами, VirtuSwap смогли экспериментировать быстро, ускорить время выполнения в 15 раз и предоставить масштабируемое решение.

    Как следующий шаг, VirtuSwap рассматривает возможность расширения использования SageMaker и запуска их обработки в Amazon SageMaker Processing для обработки собираемых ими массовых данных из различных блокчейнов в их платформу.