Cómo VirtuSwap acelera sus simulaciones comerciales basadas en pandas con un contenedor personalizado de Amazon SageMaker Studio e instancias de GPU de AWS

Esta publicación está escrita en colaboración con Dima Zadorozhny y Fuad Babaev de VirtuSwap.

VirtuSwap es una empresa emergente que desarrolla tecnología innovadora para el intercambio descentralizado de activos en blockchains. La tecnología de VirtuSwap proporciona operaciones más eficientes para activos que no tienen un par directo entre ellos. La ausencia de un par directo conduce a operaciones indirectas costosas, lo que significa que se requieren dos o más operaciones para completar un intercambio deseado, lo que genera costos comerciales dobles o triples. La tecnología de grupos virtuales basados ​​en reservas de VirtuSwap resuelve el problema al hacer que cada operación sea directa, ahorrando hasta un 50% de los costos comerciales. Lea mas en virtuswap.io.

En esta publicación, compartimos cómo VirtuSwap utilizó la función de traer su propio contenedor en Amazon SageMaker Estudio para construir un entorno robusto para alojar sus simulaciones con uso intensivo de GPU para resolver problemas de optimización lineal.

El reto

El motor VirtuSwap Minerva crea recomendaciones para una distribución óptima de la liquidez entre diferentes grupos de liquidez, teniendo en cuenta múltiples parámetros, como los volúmenes de negociación, la liquidez actual del mercado y la volatilidad de los activos negociados, limitados por una cantidad total de liquidez disponible para distribución. Para brindar estas recomendaciones, VirtuSwap Minerva utiliza miles de pares comerciales históricos para simular su recorrido a través de varias configuraciones de liquidez para encontrar la distribución óptima de liquidez, tarifas del grupo y más.

La implementación inicial se codificó utilizando marcos de datos de pandas. Sin embargo, a medida que crecieron los datos de la simulación, el tiempo de ejecución casi se cuadruplicó, junto con el tamaño del problema. El resultado de esto fue que las iteraciones se ralentizaron y fue casi imposible ejecutar tareas de dimensionalidad más grandes. VirtuSwap se dio cuenta de que necesitaban utilizar instancias de GPU para la simulación para permitir resultados más rápidos.

VirtuSwap necesitaba una biblioteca tipo panda compatible con GPU para ejecutar su simulación y eligió CuDFuna biblioteca GPU DataFrame de Rápidos. cuDF se utiliza para cargar, unir, agregar, filtrar y manipular datos de otro modo, en un pandas-API similar que acelera el trabajo en marcos de datos, utilizando CUDA para un rendimiento significativamente más rápido que los pandas.

Descripción general de la solución

VirtuSwap eligió SageMaker Studio para el desarrollo de un extremo a otro, comenzando con el desarrollo iterativo e interactivo en portátiles. Debido a la flexibilidad de SageMaker Studio, decidieron usarlo también para su simulación, aprovechando Amazon SageMaker imágenes personalizadas, que permiten a VirtuSwap traer sus propias bibliotecas personalizadas y el software necesario, como cuDF. El siguiente diagrama ilustra el flujo de trabajo de la solución.

En las siguientes secciones, compartimos las instrucciones paso a paso para crear y utilizar una imagen cuDF de Rapids en SageMaker.

Requisitos previos

Para ejecutar esta guía paso a paso, necesita una cuenta de AWS con permisos para SageMaker, Registro de contenedores elásticos de Amazon (Amazon ECR), Gestión de acceso e identidad de AWS (Soy y Construcción de código AWS. Además es necesario tener un Dominio SageMaker listo.

Crear roles y políticas de IAM

Para el proceso de construcción de cuadernos personalizados de SageMaker, utilizamos AWS CloudShell, que proporciona todos los paquetes necesarios para crear la imagen personalizada. En CloudShell, usamos Construcción de Docker de SageMaker, una CLI para crear imágenes de Docker para y en SageMaker Studio. La CLI puede crear el repositorio en Amazon ECR y compilar el contenedor mediante CodeBuild. Para ello, debemos proporcionar a la herramienta una función de IAM con los permisos adecuados. Complete los siguientes pasos:

  1. Inicie sesión en la Consola de administración de AWS y abra el consola IAM.
  2. En el panel de navegación de la izquierda, elija Políticas.
  3. Cree una política denominada sm-build-policy con los siguientes permisos:
    {
        "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:repository/*",
                    "arn:aws:ecr:*:462105765813:repository/*"
                ]
            },
            {
                "Sid": "EcrAuthorizationTokenRetrieval",
                "Effect": "Allow",
                "Action": [
                    "ecr:GetAuthorizationToken"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:DeleteObject",
                    "s3:PutObject"
                ],
                "Resource": "arn:aws:s3:::sagemaker-*/*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:CreateBucket"
                ],
                "Resource": "arn:aws:s3:::sagemaker*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "iam:GetRole",
                    "iam:ListRoles"
                ],
                "Resource": "*"
            },
            {
                "Effect": "Allow",
                "Action": "iam:PassRole",
                "Resource": "arn:aws:iam::*:role/*",
                "Condition": {
                    "StringLikeIfExists": {
                        "iam:PassedToService": "codebuild.amazonaws.com"
                    }
                }
            },
            {
                "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/*"
            }
        ]
    }

Los permisos brindan la posibilidad de utilizar la utilidad en su totalidad: crear repositorios, crear un trabajo CodeBuild, usar Servicio de almacenamiento simple de Amazon (Amazon S3) y enviar registros a Amazon CloudWatch.

  1. Crea un rol llamado sm-build-role con la siguiente política de confianza y agregue la política sm-build-policy que creaste anteriormente:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "codebuild.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }

Ahora, revisemos los pasos en CloudShell.

Cree una imagen cuDF Docker en CloudShell

Para nuestros propósitos, necesitábamos una imagen CUDA de Rapids, que también incluye una ipykernelpara que la imagen pueda usarse en un Cuaderno SageMaker Studio.

Usamos una imagen CUDA existente por RapidsAI que esta disponible en el oficial Centro Docker AI de Rapidsy agregue el ipykernel instalación.

En una terminal de CloudShell, ejecute el siguiente comando:

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

Esto creará el Dockerfile que creará nuestra imagen de Docker personalizada para SageMaker.

Construya y envíe la imagen a un repositorio

Como se mencionó, utilizamos el Biblioteca de compilación SageMaker Docker, que permite a los científicos y desarrolladores de datos crear fácilmente imágenes de contenedores personalizadas. Para obtener más información, consulte Uso de la CLI de creación de imágenes de Amazon SageMaker Studio para crear imágenes de contenedores desde sus cuadernos de Studio.

El siguiente comando crea un repositorio ECR (si el repositorio no existe). sm-docker lo creará, compilará y enviará la nueva imagen de Docker al repositorio creado:

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

En caso de que te falte sm-docker en su CloudShell, ejecute el siguiente código:

pip3 install sagemaker-studio-image-build

Al finalizar, se devolverá el URI de la imagen ECR.

Crear una imagen personalizada de SageMaker

Una vez que haya creado una imagen de Docker personalizada y la haya enviado a su repositorio de contenedores (Amazon ECR), puede configurar SageMaker para usar esa imagen de Docker personalizada. Complete los siguientes pasos:

  1. En la consola de SageMaker, elija Imágenes en el panel de navegación.
  2. Elegir Crear imagen.
  3. Ingrese la salida del URI de la imagen de la sección anterior, luego elija Próximo.
  4. Para Nombre de la imágen y Nombre para mostrar de la imageningresar rapids.
  5. Para Descripcióningrese una descripción.
  6. Para Rol de IAMelija la función de IAM adecuada para su dominio de SageMaker.
  7. Para Ruta de montaje EFSingresar /home/sagemaker-user (por defecto).
  8. Expandir Configuración avanzada.
  9. Para ID de usuarioingresar 1000.
  10. Para Identificación del grupoingresar 100.

  1. En el Tipo de imagen sección, seleccione Imagen de estudio SageMaker.
  2. Elegir Agregar núcleo.
  3. Para Nombre del kernelingresar conda-env-rapids-py.
  4. Para Nombre para mostrar del kernelingresar rapids.
  5. Elegir Entregar para crear la imagen de SageMaker.

Adjunte la nueva imagen a su dominio de SageMaker Studio

Ahora que ha creado la imagen personalizada, debe hacerla disponible para su uso adjuntándola a su dominio. Complete los siguientes pasos:

  1. En la consola de SageMaker, elija Dominios en el panel de navegación.
  2. Elige tu dominio. Este paso es opcional; puede crear y adjuntar la imagen personalizada directamente desde el dominio y omitir este paso.

  1. En la página de detalles del dominio, elija el Ambiente pestaña, luego elija Adjuntar imagen.
  2. Seleccionar Imagen existente y seleccione la nueva imagen (rapids) de la lista.
  3. Elegir Próximo.

  1. Revise la configuración de imagen personalizada y asegúrese de establecerla Tipo de imagen como Imagen de estudio SageMakercomo en el paso anterior, con el mismo nombre de kernel y nombre para mostrar del kernel.
  2. Elegir Entregar.

La imagen personalizada ahora está disponible en SageMaker Studio y lista para usar.

Crea un nuevo cuaderno con la imagen.

Para obtener instrucciones para iniciar una nueva computadora portátil, consulte Inicie una imagen personalizada de SageMaker en Amazon SageMaker Studio. Complete los siguientes pasos:

  1. En la consola de SageMaker Studio, elija Lanzador abierto.
  2. Elegir Cambiar ambiente.

  1. Para Imagenelija la imagen recién creada, rapids v1.
  2. Para Núcleoelegir rapids.
  3. Para tipo de instancia¸ elige tu instancia.

SageMaker Studio ofrece la opción de personalizar su potencia informática eligiendo una instancia de las familias de computación acelerada de AWS, computación de propósito general, optimización de computación o optimización de memoria. Esta flexibilidad le permitió realizar una transición perfecta entre CPU y GPU, así como aumentar o reducir dinámicamente el tamaño de las instancias según fuera necesario. Para nuestra computadora portátil, utilizamos el tipo de instancia ml.g4dn.2xlarge para probar el rendimiento de cuDF mientras utilizamos el acelerador de GPU.

  1. Elegir Seleccionar.

  1. Selecciona tu entorno y elige Crear cuadernoluego espere hasta que el kernel del portátil esté listo.

Valida tu imagen personalizada

Para validar que su imagen personalizada se lanzó y cuDF está listo para usar, cree una nueva celda, ingrese import cudfy ejecútelo.

Limpiar

Apague la instancia de Jupyter que ejecuta el cuaderno de prueba en SageMaker Studio eligiendo Ejecución de terminales y kernels y apagar la instancia en ejecución.

Resultados de la comparación de tiempo de ejecución

Realizamos una comparación del tiempo de ejecución de nuestro código utilizando CPU y GPU en instancias SageMaker g4dn.2xlarge, con una complejidad temporal de O(N). Los resultados, como se muestra en la siguiente figura, revelan la eficiencia del uso de GPU en lugar de CPU.

La principal ventaja de las GPU radica en su capacidad para realizar procesamiento en paralelo. A medida que aumentamos el valor de N, el tiempo de ejecución de las CPU aumenta a una velocidad de 3N. Por otro lado, con las GPU, la tasa de aumento se puede describir como 2N, como se ilustra en la figura anterior. Cuanto mayor es el tamaño del problema, más eficiente se vuelve la GPU. En nuestro caso, usar una GPU fue al menos 20 veces más rápido que usar una CPU. Esto pone de relieve la creciente importancia de las GPU en la informática moderna, especialmente para tareas que requieren el procesamiento rápido de grandes cantidades de datos.

Con las instancias de GPU de SageMaker, VirtuSwap puede aumentar drásticamente la dimensionalidad de los problemas resueltos y encontrar soluciones más rápido.

Conclusión

En esta publicación, mostramos cómo VirtuSwap personalizó SageMaker Studio mediante el uso de una imagen personalizada para resolver un problema complejo. Con la capacidad de cambiar fácilmente el entorno de ejecución y cambiar entre diferentes instancias, tamaños y kernels, VirtuSwap pudo experimentar rápidamente y acelerar el tiempo de ejecución 15 veces y ofrecer una solución escalable.

Como siguiente paso, VirtuSwap está considerando ampliar el uso de SageMaker y ejecutar su procesamiento en Procesamiento de Amazon SageMaker para procesar los datos masivos que están recopilando de varias cadenas de bloques en su plataforma.


Sobre los autores

Adir Sharabi es arquitecto principal de soluciones en Amazon Web Services. Trabaja con clientes de AWS para ayudarlos a diseñar aplicaciones seguras, resilientes, escalables y de alto rendimiento en la nube. También le apasionan los datos y ayudar a los clientes a aprovecharlos al máximo.

Omer Haim es arquitecto senior de soluciones de inicio en Amazon Web Services. Ayuda a las empresas emergentes en su viaje a la nube y le apasionan los contenedores y el aprendizaje automático. En su tiempo libre, a Omer le gusta viajar y, de vez en cuando, jugar con su hijo.

Dmitri Zadorozhny es analista de datos en virtuswap.io. Es responsable de la extracción, el procesamiento y el almacenamiento de datos, así como de la integración de servicios en la nube como AWS. Antes de unirse a virtuswap, trabajó en el campo de la ciencia de datos y fue embajador líder de análisis en la fundación dydx. Dima tiene una maestría en Ciencias de la Computación. A Dima le gusta jugar juegos de computadora en su tiempo libre.

Fuad Babaev se desempeña como especialista en ciencia de datos en Virtuswap (virtuswap.io). Aporta experiencia para abordar desafíos complejos de optimización, crear simulaciones y diseñar modelos para procesos comerciales. Fuera de su carrera profesional, a Fuad le apasiona jugar al ajedrez.