Configurar Ray en AWS

code
AWS
clustering
python
Author

Cesar A. Munoz A.

Published

May 6, 2024

En esta entrada expondré los detalles relevantes a tener en cuenta cuando intentamos levantar y ejecutar codigo en en un cluster de Ray en AWS.


Ray es una herramienta pensada para hacer computación distribuida para tareas de Machine Learning. De manera nativa, puedes hacer proceamiento de datos aprovechando las capacidades del Cluster, Optimizacion de Hyperparametros y entrenamiento Distribuido. Para aprovechar las ventajas que nos brinda Ray podemos aprovechar los diversos servicios Cloud ofrecidos por algunos distribuidores, particularmente en esta entrada nos centraremos en AWs.

1 Permisos que necesita ray para levantar workers

Permisos necesario para la cuenta que levanta el Cluster de Ray Los permisos necesarios para que el usuario pueda levantar el cluster de ray se listan como sigue:

  • CreateInstanceProfile
  • CreateRole
  • AttachRolePolicy
  • AddRoleToInstanceProfile
  • PassRole

2 Mi archivo de configuracion de ray

El archivo de configuracion de Ray es un YAML el cual le indica a Ray como levantar el cluster, y bajo que parametros hacerlo. Probablemente si empiezas a trabajar con tu propio archivo llegaras a algo similar a lo que yo tengo. Antes de pasar al archivo, me gustaría hacer incapie que Ray trabaja con imagenes de Docker preparadas para ejecutar el servidor (head) y los workers. Podemos usar los Dockers hechos por las personas de Anyscale, quienes crearon Ray. Ten encuenta que es importante compartir la misma version de Python y Ray en tu computador local y el cluster remoto. Anyscale posee en AWs sus imagenes en el servico de ECR de Anyscale. En mi caso yo uso la siguiente version, la que iguala mi intorno de desarrollo para el proyecto en particular

public.ecr.aws/anyscale/ray-ml:2.31.0-py310

el desgloce es simple

public.ecr.aws/anyscale/ray-ml:<RAY_VERSION>-<PY_VERSION>
Tip

En otra nota, explicaré como ejecutar codigo de ray, con dependencias especificas y como este trabaja con dichas dependencias aplicado a un problema particular


Ahora a lo importante, el archivo

cluster_name: brain-trainer-distributed
max_workers: 9
min_workers: 1
provider:
    type: aws
    region: us-east-1
    use_internal_ips: true
    cache_stopped_nodes: true
docker:
    image: "public.ecr.aws/anyscale/ray-ml:2.31.0-py310"
    container_name: "ray-container"
    pull_before_run: False
    run_options:
        - "--publish=5432:5432"
available_node_types:
    ray.head.default:
        resources: {}
        node_config:
            SubnetIds:
               - subnet-####158dd0cbeb
            SecurityGroupIds:
               - sg-####97bfb3e04
            InstanceType : c5.2xlarge
            BlockDeviceMappings:
              - DeviceName: /dev/sda1
                Ebs:
                  VolumeSize: 400
            TagSpecifications:
              - ResourceType: instance
                Tags:
                  - Key: MANAGER
                    Value: cmunoz
                  - Key: APPLICATION
                    Value: distributed-training
                  - Key: SERVICE
                    Value: ray-cluster
                  - Key: BILLING_CLIENT
                    Value: deep-human
                  - Key: ENVIRONMENT
                    Value: brain
    ray.worker.default:
        resources: {}
        node_config:
            SubnetIds:
                - subnet-######dd0cbeb
            SecurityGroupIds:
                - sg-########bfb3e04
            InstanceType: c5.2xlarge
            BlockDeviceMappings:
              - DeviceName: /dev/sda1
                Ebs:
                  VolumeSize: 300
            TagSpecifications:
              - ResourceType: instance
                Tags:
                  - Key: MANAGER
                    Value: cmunoz
                  - Key: APPLICATION
                    Value: distributed-training
                  - Key: SERVICE
                    Value: ray-cluster
                  - Key: BILLING_CLIENT
                    Value: deep-human
                  - Key: ENVIRONMENT
                    Value: brain
setup_commands:
  - sudo apt update
  - sudo apt upgrade -y
  - pip3 install --upgrade pip
  - pip3 install mlflow==2.13.1 more-itertools
  - pip3 install hydra-core==1.3.2 hydra-ray-launcher
  - pip3 install optuna==3.6.1 pandas==2.2.2 tqdm scikit-learn==1.5.0
  - pip3 install PyMySQL[rsa] psycopg2-binary
  
head_start_ray_commands:
    - ray stop
    - ray start --head --port=6379 --object-manager-port=8076 --autoscaling-config=~/ray_bootstrap_config.yaml --dashboard-host=0.0.0.0 --ray-client-server-port=10001
worker_start_ray_commands:
    - ray stop
    - RAY_ENABLE_RECORD_ACTOR_TASK_LOGGING=1 ray start --address=$RAY_HEAD_IP:6379 --object-manager-port=8076 

3 Workflow para trabajar con Ray

En el proyecto se incluye un archivo de configuracion para ray.

el workflow es como sigue:

3.1 Levantar el cluster

ray up config.yaml

3.2 Hacer las tuberias necesarias para conectarse al dashboard y/o ejecutar codigo local en el cluster

ssh -i .ssh/ray-autoscaler_us-east-1.pem -L 8265:localhost:8265 -L 10001:localhost:10001 ubuntu@<head-ip>

Tenga en cuenta que para este caso, es importante contar con el respectivo pem que ray por defecto guarda en en el directorio .ssh .

Tip

puedes obtener el haciendo

ray get-head-ip config.yaml

3.4 Ejecutar codigo local

Para ejecutar el codigo local en la nube es importante decirle al nuestra instancia de ejecucion local que debe apuntar al servidor en la nube

import ray
ray.init(address="raw://localhost:10001")

La manera de utilizar el cluster con nuestro codigo, es un caso particular para cada problema por lo que se recomienda leer la documentación de ray y estudiar los conceptos minimos.

Important

Esto si permite ejecutar codigo desde nuestro jupyter notebook 🤩