Cómo VirtuSwap acelera sus simulaciones comerciales basadas en pandas con un contenedor personalizado de Amazon SageMaker Studio y instancias de GPU de AWS
VirtuSwap acelera simulaciones comerciales con Amazon SageMaker Studio y 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 un comercio más eficiente para los activos que no tienen un par directo entre ellos. La ausencia de un par directo conduce a un comercio indirecto costoso, lo que significa que se requieren dos o más operaciones para completar un intercambio deseado, lo que lleva a costos de negociación dobles o triples. La tecnología de Pools Virtuales basados en Reservas de VirtuSwap resuelve el problema al hacer que cada operación sea directa, lo que permite ahorrar hasta un 50% de los costos de negociación. Obtenga más información en virtuswap.io.
En esta publicación, compartimos cómo VirtuSwap utilizó la función de traer su propio contenedor en Amazon SageMaker Studio para construir un entorno robusto para alojar sus simulaciones intensivas en GPU para resolver problemas de optimización lineal.
El desafío
El motor Minerva de VirtuSwap crea recomendaciones para la distribución óptima de la liquidez entre diferentes pools de liquidez, teniendo en cuenta múltiples parámetros, como los volúmenes de negociación, la liquidez actual del mercado y las volatilidades de los activos negociados, limitados por una cantidad total de liquidez disponible para la distribución. Para proporcionar estas recomendaciones, VirtuSwap Minerva utiliza miles de pares de negociación históricos para simular su ejecución a través de varias configuraciones de liquidez para encontrar la distribución óptima de la liquidez, las tarifas de los pools y más.
La implementación inicial se codificó utilizando pandas dataframes. Sin embargo, a medida que los datos de la simulación crecieron, el tiempo de ejecución casi se cuadruplicó, junto con el tamaño del problema. El resultado de esto fue que las iteraciones se desaceleraron y casi era imposible ejecutar tareas de mayor dimensionalidad. VirtuSwap se dio cuenta de que necesitaban utilizar instancias de GPU para la simulación para obtener resultados más rápidos.
- Cómo saber si tu IA es consciente
- La nanofotónica aplana las lentes de la cámara
- Estudio descifra el sorprendente enfoque que los ratones adoptan al...
VirtuSwap necesitaba una biblioteca compatible con GPU similar a pandas para ejecutar su simulación y eligió cuDF, una biblioteca de DataFrame para GPU desarrollada por Rapids. cuDF se utiliza para cargar, unir, agregar, filtrar y manipular datos de manera similar a pandas, utilizando una API que acelera el trabajo en dataframes mediante el uso de CUDA para obtener un rendimiento significativamente más rápido que pandas.
Descripción general de la solución
VirtuSwap eligió SageMaker Studio para el desarrollo de principio a fin, comenzando con el desarrollo iterativo e interactivo en cuadernos. Debido a la flexibilidad de SageMaker Studio, decidieron utilizarlo también para su simulación, aprovechando las imágenes personalizadas de Amazon SageMaker, que les permiten 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 construir y usar una imagen de Rapids cuDF en SageMaker.
Prerrequisitos
Para ejecutar esta guía paso a paso, necesita una cuenta de AWS con permisos para SageMaker, Amazon Elastic Container Registry (Amazon ECR), AWS Identity and Access Management (IAM) y AWS CodeBuild. Además, necesita tener un dominio de SageMaker listo.
Crear roles y políticas de IAM
Para el proceso de compilación de cuadernos personalizados de SageMaker, utilizamos AWS CloudShell, que proporciona todos los paquetes necesarios para compilar la imagen personalizada. En CloudShell, utilizamos SageMaker Docker Build, una CLI para construir imágenes de Docker para y en SageMaker Studio. La CLI puede crear el repositorio en Amazon ECR y construir el contenedor utilizando CodeBuild. Para ello, debemos proporcionar a la herramienta un rol de IAM con los permisos adecuados. Complete los siguientes pasos:
-
Inicie sesión en la Consola de administración de AWS y abra la consola de IAM.
-
En el panel de navegación de la izquierda, elija Políticas.
-
Cree una política llamada
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 proporcionan la capacidad de utilizar la utilidad en su totalidad: crear repositorios, crear un trabajo de CodeBuild, utilizar Amazon Simple Storage Service (Amazon S3) y enviar registros a Amazon CloudWatch.
-
Cree un rol llamado
sm-build-role
con la siguiente política de confianza y agregue la políticasm-build-policy
que creó anteriormente:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "codebuild.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
Ahora, revisemos los pasos en CloudShell.
Crear una imagen Docker de cuDF en CloudShell
Para nuestros propósitos, necesitamos una imagen Rapids CUDA, que también incluye un ipykernel, para que la imagen se pueda utilizar en un notebook de SageMaker Studio.
Utilizamos una imagen CUDA existente de RapidsAI que está disponible en el repositorio oficial de Docker hub de Rapids AI, y agregamos la instalación de ipykernel
.
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 construirá nuestra imagen Docker personalizada para SageMaker.
Construir y subir la imagen a un repositorio
Como se mencionó, utilizamos la biblioteca SageMaker Docker Build, que permite a los científicos de datos y desarrolladores crear fácilmente imágenes de contenedor 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 contenedor desde sus notebooks de Studio.
El siguiente comando crea un repositorio de ECR (si el repositorio no existe). sm-docker lo creará, construirá y subirá la nueva imagen Docker al repositorio creado:
sm-docker build . --repository rapids:v1 --role sm-build-role
En caso de que no tengasm-docker
en su CloudShell, ejecute el siguiente código:
pip3 install sagemaker-studio-image-build
Al completar, se devolverá la URI de la imagen de ECR.
Crear una imagen personalizada de SageMaker
Después de haber creado una imagen Docker personalizada y haberla subido a su repositorio de contenedores (Amazon ECR), puede configurar SageMaker para utilizar esa imagen Docker personalizada. Complete los siguientes pasos:
- En la consola de SageMaker, elija Imágenes en el panel de navegación.
- Elija Crear imagen.
- Ingrese la URI de la imagen obtenida en la sección anterior y luego elija Siguiente.
- Para Nombre de imagen y Nombre de visualización de imagen, ingrese
rapids
. - Para Descripción, ingrese una descripción.
- Para Rol IAM, elija el rol IAM adecuado para su dominio de SageMaker.
- Para Ruta de montaje de EFS, ingrese
/home/sagemaker-user
(predeterminado). - Expanda Configuración avanzada.
- Para ID de usuario, ingrese
1000
. - Para ID de grupo, ingrese
100
.
- En la sección Tipo de imagen, selecciona Imagen de SageMaker Studio.
- Elige Agregar kernel.
- Para Nombre del kernel, ingresa
conda-env-rapids-py
. - Para Nombre de visualización del kernel, ingresa
rapids
. - Elige Enviar para crear la imagen de SageMaker.
Adjunta la nueva imagen a tu dominio de SageMaker Studio
Ahora que has creado la imagen personalizada, necesitas hacerla disponible para su uso adjuntándola a tu dominio. Completa los siguientes pasos:
- En la consola de SageMaker, elige Dominios en el panel de navegación.
- Elige tu dominio. Este paso es opcional; puedes crear y adjuntar la imagen personalizada directamente desde el dominio y omitir este paso.
- En la página de detalles del dominio, elige la pestaña Entorno, luego elige Adjuntar imagen.
- Selecciona Imagen existente y selecciona la nueva imagen (
rapids
) de la lista. - Elige Siguiente.
- Revisa la configuración de la imagen personalizada y asegúrate de establecer Tipo de imagen como Imagen de SageMaker Studio, como en el paso anterior, con el mismo nombre de kernel y nombre de visualización del kernel.
- Elige Enviar.
La imagen personalizada ahora está disponible en SageMaker Studio y lista para su uso.
Crea un nuevo cuaderno con la imagen
Para obtener instrucciones sobre cómo iniciar un nuevo cuaderno, consulta Iniciar una imagen personalizada de SageMaker en Amazon SageMaker Studio. Completa los siguientes pasos:
- En la consola de SageMaker Studio, elige Abrir lanzador.
- Elige Cambiar entorno.
- Para Imagen, elige la imagen recién creada,
rapids v1
. - Para Kernel, elige
rapids
. - Para Tipo de instancia, elige tu instancia.
SageMaker Studio ofrece la opción de personalizar tu potencia de cálculo al elegir una instancia de las familias de computación acelerada de AWS, computación de propósito general, optimizada para cálculo o optimizada para memoria. Esta flexibilidad te permite hacer la transición sin problemas entre CPUs y GPUs, así como escalar dinámicamente el tamaño de las instancias según sea necesario. Para nuestro cuaderno, usamos el tipo de instancia ml.g4dn.2xlarge para probar el rendimiento de cuDF mientras utiliza un acelerador de GPU.
- Elige Seleccionar.
- Selecciona tu entorno y elige Crear cuaderno, luego espera hasta que el kernel del cuaderno esté listo.
Valida tu imagen personalizada
Para validar que tu imagen personalizada se haya lanzado y cuDF esté listo para usar, crea una nueva celda, ingresa import cudf
y ejecútala.
Limpieza
Apaga la instancia de Jupyter que ejecuta el cuaderno de prueba en SageMaker Studio seleccionando Terminales y kernels en ejecución y apagando la instancia en ejecución.
Resultados de comparación de tiempo de ejecución
Realizamos una comparación de tiempo de ejecución de nuestro código utilizando tanto la CPU como la GPU en instancias g4dn.2xlarge de SageMaker, con una complejidad temporal de O(N). Los resultados, como se muestra en la siguiente figura, revelan la eficiencia de usar GPUs en lugar de CPUs.
La principal ventaja de las GPUs radica en su capacidad para realizar procesamiento paralelo. A medida que aumentamos el valor de N, el tiempo de ejecución en las CPUs aumenta a una tasa de 3N. Por otro lado, con las GPUs, la tasa de aumento puede describirse como 2N, como se ilustra en la figura anterior. Cuanto mayor sea el tamaño del problema, más eficiente se vuelve la GPU. En nuestro caso, el uso de una GPU fue al menos 20 veces más rápido que el uso de una CPU. Esto destaca la creciente importancia de las GPUs en la informática moderna, especialmente para tareas que requieren procesar grandes cantidades de datos rápidamente.
Con las instancias de GPU de SageMaker, VirtuSwap puede aumentar drásticamente la dimensionalidad de los problemas resueltos y encontrar soluciones más rápidamente.
Conclusión
En esta publicación, mostramos cómo VirtuSwap personalizó SageMaker Studio utilizando una imagen personalizada para resolver un problema complejo. Con la capacidad de cambiar fácilmente el entorno de ejecución y alternar entre diferentes instancias, tamaños y kernels, VirtuSwap pudo experimentar rápidamente y acelerar el tiempo de ejecución en un 15x y ofrecer una solución escalable.
Como próximo paso, VirtuSwap está considerando ampliar su uso de SageMaker y ejecutar su procesamiento en Amazon SageMaker Processing para procesar los grandes volúmenes de datos que están recopilando de varias blockchains en su plataforma.