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-py310el desgloce es simple
public.ecr.aws/anyscale/ray-ml:<RAY_VERSION>-<PY_VERSION>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.yaml3.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 .
puedes obtener el
ray get-head-ip config.yaml3.3 Links importantes
los links relevantes son 2
- localhost:8265 ➡️ ray dashboard
- ray://localhost:10001 ➡️ ray cluster
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.
Esto si permite ejecutar codigo desde nuestro jupyter notebook 🤩