在 AWS 上启动 Ray 集群#

本指南详细介绍了在AWS上启动Ray集群所需的步骤。

要启动一个 AWS Ray 集群,你应该使用 AWS Python SDK 的 Ray 集群启动器。

安装 Ray 集群启动器#

Ray 集群启动器是 ray CLI 的一部分。使用 CLI 通过 ray upray downray attach 等命令来启动、停止和附加到正在运行的 Ray 集群。你可以使用 pip 安装支持集群启动器的 ray CLI。更多详细说明请参考 Ray 安装文档

# install ray
pip install -U ray[default]

安装和配置 AWS Python SDK (Boto3)#

接下来,使用 pip install -U boto3 安装 AWS SDK,并按照 AWS 指南 配置您的 AWS 凭证。

# install AWS Python SDK (boto3)
pip install -U boto3

# setup AWS credentials using environment variables
export AWS_ACCESS_KEY_ID=foo
export AWS_SECRET_ACCESS_KEY=bar
export AWS_SESSION_TOKEN=baz

# alternatively, you can setup AWS credentials using ~/.aws/credentials file
echo "[default]
aws_access_key_id=foo
aws_secret_access_key=bar
aws_session_token=baz" >> ~/.aws/credentials

使用 Ray 集群启动器启动 Ray#

一旦 Boto3 配置好管理您的 AWS 账户中的资源,您应该准备好使用集群启动器启动您的集群。提供的 集群配置文件 将创建一个带有 m5.large 头节点(按需)的小型集群,该节点配置为自动扩展到最多两个 m5.large 竞价实例 工作者。

通过从本地机器运行以下命令来测试其是否工作:

# Download the example-full.yaml
wget https://raw.githubusercontent.com/ray-project/ray/master/python/ray/autoscaler/aws/example-full.yaml

# Create or update the cluster. When the command finishes, it will print
# out the command that can be used to SSH into the cluster head node.
ray up example-full.yaml

# Get a remote shell on the head node.
ray attach example-full.yaml

# Try running a Ray program.
python -c 'import ray; ray.init()'
exit

# Tear down the cluster.
ray down example-full.yaml

恭喜,您已经在AWS上启动了一个Ray集群!

如果你想了解更多关于 Ray 集群启动器的信息,请参阅这篇博客文章,里面有一个逐步指南

AWS 配置#

使用 Amazon EFS#

要在 Ray 集群中使用 Amazon EFS,您需要安装一些额外的实用程序并在 setup_commands 中挂载 EFS。请注意,这些说明仅在使用 AWS 上的 Ray 集群启动器时有效。

# Note You need to replace the {{FileSystemId}} with your own EFS ID before using the config.
# You may also need to modify the SecurityGroupIds for the head and worker nodes in the config file.

setup_commands:
    - sudo kill -9 `sudo lsof /var/lib/dpkg/lock-frontend | awk '{print $2}' | tail -n 1`;
        sudo pkill -9 apt-get;
        sudo pkill -9 dpkg;
        sudo dpkg --configure -a;
        sudo apt-get -y install binutils;
        cd $HOME;
        git clone https://github.com/aws/efs-utils;
        cd $HOME/efs-utils;
        ./build-deb.sh;
        sudo apt-get -y install ./build/amazon-efs-utils*deb;
        cd $HOME;
        mkdir efs;
        sudo mount -t efs {{FileSystemId}}:/ efs;
        sudo chmod 777 efs;

配置 IAM 角色和 EC2 实例配置文件#

默认情况下,Ray AWS 集群中的 Ray 节点具有完整的 EC2 和 S3 权限(即 arn:aws:iam::aws:policy/AmazonEC2FullAccessarn:aws:iam::aws:policy/AmazonS3FullAccess)。这对于尝试 Ray 集群是一个很好的默认设置,但出于各种原因(例如出于安全原因减少权限),您可能希望更改 Ray 节点的权限。您可以通过为相关的 node_config 提供自定义的 IamInstanceProfile 来实现这一点:

available_node_types:
  ray.worker.default:
    node_config:
      ...
      IamInstanceProfile:
        Arn: arn:aws:iam::YOUR_AWS_ACCOUNT:YOUR_INSTANCE_PROFILE

有关配置IAM角色和EC2实例配置文件的更多详细信息,请参阅此讨论

访问 S3#

在各种场景中,工作节点可能需要对 S3 存储桶的写访问权限,例如,Ray Tune 有一个选项可以将检查点写入 S3,而不是直接将它们同步回驱动程序。

如果你看到类似“无法定位凭证”的错误,请确保在你的集群配置文件中为工作节点配置了正确的 IamInstanceProfile。这可能看起来像:

available_node_types:
  ray.worker.default:
    node_config:
      ...
      IamInstanceProfile:
        Arn: arn:aws:iam::YOUR_AWS_ACCOUNT:YOUR_INSTANCE_PROFILE

你可以通过SSH进入一个工作节点并运行命令来验证设置是否正确。

aws configure list

你应该会看到类似的内容

      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************XXXX         iam-role
secret_key     ****************YYYY         iam-role
    region                <not set>             None    None

有关访问S3的更多详细信息,请参阅此讨论

使用 Amazon CloudWatch 监控 Ray#

Amazon CloudWatch 是一个监控和可观测性服务,提供数据和可操作的洞察,以监控您的应用程序,响应系统范围内的性能变化,并优化资源利用率。CloudWatch 与 Ray 的集成需要一个预装了 Unified CloudWatch Agent 的 AMI(或 Docker 镜像)。

预装了 Unified CloudWatch Agent 的 AMI 由 Amazon Ray 团队提供,目前在美国东部(弗吉尼亚北部)、美国东部(俄亥俄)、美国西部(加利福尼亚北部)和美国西部(俄勒冈)区域可用。如有任何问题、意见或问题,请向 Amazon Ray 团队 <https://github.com/amzn/amazon-ray/issues/new/choose>_ 提出。

下表列出了在每个区域预装了 Unified CloudWatch Agent 的 AMI,您也可以在 amazon-ray README <https://github.com/amzn/amazon-ray>_ 找到 AMI。

所有可用的统一 CloudWatch 代理镜像#

基础 AMI

AMI ID

区域

统一 CloudWatch 代理版本

AWS 深度学习 AMI (Ubuntu 18.04, 64 位)

ami-069f2811478f86c20

us-east-1

v1.247348.0b251302

AWS 深度学习 AMI (Ubuntu 18.04, 64 位)

ami-058cc0932940c2b8b

us-east-2

v1.247348.0b251302

AWS 深度学习 AMI (Ubuntu 18.04, 64 位)

ami-044f95c9ef12883ef

us-west-1

v1.247348.0b251302

AWS 深度学习 AMI (Ubuntu 18.04, 64 位)

ami-0d88d9cbe28fac870

us-west-2

v1.247348.0b251302

备注

使用 Amazon CloudWatch 会产生费用,详情请参阅 CloudWatch 定价 <https://aws.amazon.com/cloudwatch/pricing/>_。

入门#

1. Create a minimal cluster config YAML named cloudwatch-basic.yaml with the following contents:#

provider:
    type: aws
    region: us-west-2
    availability_zone: us-west-2a
    # Start by defining a `cloudwatch` section to enable CloudWatch integration with your Ray cluster.
    cloudwatch:
        agent:
            # Path to Unified CloudWatch Agent config file
            config: "cloudwatch/example-cloudwatch-agent-config.json"
        dashboard:
            # CloudWatch Dashboard name
            name: "example-dashboard-name"
            # Path to the CloudWatch Dashboard config file
            config: "cloudwatch/example-cloudwatch-dashboard-config.json"

auth:
    ssh_user: ubuntu

available_node_types:
    ray.head.default:
        node_config:
        InstanceType: c5a.large
        ImageId: ami-0d88d9cbe28fac870  # Unified CloudWatch agent pre-installed AMI, us-west-2
        resources: {}
    ray.worker.default:
        node_config:
            InstanceType: c5a.large
            ImageId: ami-0d88d9cbe28fac870  # Unified CloudWatch agent pre-installed AMI, us-west-2
            IamInstanceProfile:
                Name: ray-autoscaler-cloudwatch-v1
        resources: {}
        min_workers: 0

2. Download CloudWatch Agent and Dashboard config.#

首先,在与 cloudwatch-basic.yaml 相同的目录中创建一个 cloudwatch 目录。然后,下载示例 CloudWatch Agent <https://github.com/ray-project/ray/blob/master/python/ray/autoscaler/aws/cloudwatch/example-cloudwatch-agent-config.json>_ 和 CloudWatch Dashboard <https://github.com/ray-project/ray/blob/master/python/ray/autoscaler/aws/cloudwatch/example-cloudwatch-dashboard-config.json>_ 配置文件到 cloudwatch 目录。

$ mkdir cloudwatch
$ cd cloudwatch
$ wget https://raw.githubusercontent.com/ray-project/ray/master/python/ray/autoscaler/aws/cloudwatch/example-cloudwatch-agent-config.json
$ wget https://raw.githubusercontent.com/ray-project/ray/master/python/ray/autoscaler/aws/cloudwatch/example-cloudwatch-dashboard-config.json

3. Run ray up cloudwatch-basic.yaml to start your Ray Cluster.#

这将在 us-west-2 区域默认启动您的 Ray 集群。当为不同区域启动集群时,您需要更改集群配置 YAML 文件的 regionImageId。请参阅上面的“统一 CloudWatch 代理镜像”表,了解各区域可用的 AMI。

4. Check out your Ray cluster’s logs, metrics, and dashboard in the CloudWatch Console!#

通过确保已安装 AWS CLI V2+ <https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html>_ ,然后运行以下命令,可以在所有写入 CloudWatch 日志组的日志中获取尾部:

aws logs tail $log_group_name --follow

高级设置#

参考 example-cloudwatch.yaml <https://github.com/ray-project/ray/blob/master/python/ray/autoscaler/aws/example-cloudwatch.yaml>_ 获取完整示例。

1. Choose an AMI with the Unified CloudWatch Agent pre-installed.#

确保你在与AMI相同的区域启动Ray EC2集群,然后在你的集群配置YAML文件中指定ImageId以用于集群的头节点和工作节点。

以下CLI命令返回us-west-2可用的最新Unified CloudWatch Agent镜像:

aws ec2 describe-images --region us-west-2 --filters "Name=owner-id,Values=160082703681" "Name=name,Values=*cloudwatch*" --query 'Images[*].[ImageId,CreationDate]' --output text | sort -k2 -r | head -n1
available_node_types:
    ray.head.default:
        node_config:
        InstanceType: c5a.large
        ImageId: ami-0d88d9cbe28fac870
    ray.worker.default:
        node_config:
        InstanceType: c5a.large
        ImageId: ami-0d88d9cbe28fac870

要使用已安装 Unified CloudWatch Agent 构建您自己的 AMI:

  1. 按照 CloudWatch 代理安装 <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-EC2-Instance.html>_ 用户指南,在 EC2 实例上安装 Unified CloudWatch 代理。

  2. 按照 EC2 AMI 创建 <https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html#creating-an-ami>_ 用户指南,从该 EC2 实例创建一个 AMI。

2. Define your own CloudWatch Agent, Dashboard, and Alarm JSON config files.#

你可以从使用示例 CloudWatch Agent <https://github.com/ray-project/ray/blob/master/python/ray/autoscaler/aws/cloudwatch/example-cloudwatch-agent-config.json>CloudWatch Dashboard <https://github.com/ray-project/ray/blob/master/python/ray/autoscaler/aws/cloudwatch/example-cloudwatch-dashboard-config.json>CloudWatch Alarm <https://github.com/ray-project/ray/blob/master/python/ray/autoscaler/aws/cloudwatch/example-cloudwatch-alarm-config.json>_ 配置文件开始。

这些示例配置文件包含以下功能:

日志和指标: 写入 /tmp/ray/session_*/logs/**.out 的日志将在 {cluster_name}-ray_logs_out 日志组中可用,而写入 /tmp/ray/session_*/logs/**.err 的日志将在 {cluster_name}-ray_logs_err 日志组中可用。日志流的名称以发出其日志的 EC2 实例 ID 命名。包括 CPU/磁盘/内存使用情况和进程统计信息的扩展 EC2 指标可以在 {cluster_name}-ray-CWAgent 指标命名空间中找到。

仪表盘: 您将有一个集群级别的仪表盘,显示总集群CPU和可用对象存储内存。进程数、磁盘使用率、内存使用率和CPU利用率将显示为集群级别的总和以及单节点的最大值/平均值。

警报:配置了跟踪长时间高内存、磁盘和CPU使用率的节点级警报。未设置警报操作,必须在您的警报配置文件中手动提供。

有关更多高级选项,请参阅 Agent <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html>Dashboard <https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/CloudWatch-Dashboard-Body-Structure.html>Alarm <https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutMetricAlarm.html>_ 配置用户指南。

CloudWatch Agent、Dashboard 和 Alarm 的 JSON 配置文件支持以下变量:

{instance_id}: 替换为 Ray 集群中每个 EC2 实例的 ID。

{region}: 替换为您的 Ray 集群的区域。

{cluster_name}: 替换为您的 Ray 集群名称。

有关统一 CloudWatch 代理支持的本机附加变量的详细信息,请参阅 CloudWatch 代理 配置文件详细信息 <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html>_。

备注

记得在你的 CloudWatch 告警配置文件中替换 AlarmActions 占位符!

"AlarmActions":[
    "TODO: Add alarm actions! See https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html"
 ]

3. Reference your CloudWatch JSON config files in your cluster config YAML.#

指定您的 CloudWatch JSON 配置文件相对于您将运行 ray up 的工作目录的文件路径:

provider:
   cloudwatch:
       agent:
           config: "cloudwatch/example-cloudwatch-agent-config.json"

4. Set your IAM Role and EC2 Instance Profile.#

默认情况下,在Ray集群启动时会创建 ray-autoscaler-cloudwatch-v1 IAM角色和EC2实例配置文件。该角色包含所有集成CloudWatch与Ray所需的额外权限,即 CloudWatchAgentAdminPolicyAmazonSSMManagedInstanceCoressm:SendCommandssm:ListCommandInvocationsiam:PassRole 托管策略。

确保所有工作节点在您的集群配置 YAML 中配置为使用 ray-autoscaler-cloudwatch-v1 EC2 实例配置文件:

ray.worker.default:
    node_config:
        InstanceType: c5a.large
        IamInstanceProfile:
            Name: ray-autoscaler-cloudwatch-v1

5. Export Ray system metrics to CloudWatch.#

要将 Ray 的 Prometheus 系统指标导出到 CloudWatch,首先确保您的集群已安装 Ray Dashboard,然后在 example-cloudwatch.yaml 文件 <https://github.com/ray-project/ray/blob/master/python/ray/autoscaler/aws/example-cloudwatch.yaml>_ 文件中取消注释 head_setup_commands 部分。您可以在 {cluster_name}-ray-prometheus 指标命名空间中找到 Ray Prometheus 指标。

  head_setup_commands:
# Make `ray_prometheus_waiter.sh` executable.
- >-
  RAY_INSTALL_DIR=`pip show ray | grep -Po "(?<=Location:).*"`
  && sudo chmod +x $RAY_INSTALL_DIR/ray/autoscaler/aws/cloudwatch/ray_prometheus_waiter.sh
# Copy `prometheus.yml` to Unified CloudWatch Agent folder
- >-
  RAY_INSTALL_DIR=`pip show ray | grep -Po "(?<=Location:).*"`
  && sudo cp -f $RAY_INSTALL_DIR/ray/autoscaler/aws/cloudwatch/prometheus.yml /opt/aws/amazon-cloudwatch-agent/etc
# First get current cluster name, then let the Unified CloudWatch Agent restart and use `AmazonCloudWatch-ray_agent_config_{cluster_name}` parameter at SSM Parameter Store.
- >-
  nohup sudo sh -c "`pip show ray | grep -Po "(?<=Location:).*"`/ray/autoscaler/aws/cloudwatch/ray_prometheus_waiter.sh
  `cat ~/ray_bootstrap_config.yaml | jq '.cluster_name'`
  >> '/opt/aws/amazon-cloudwatch-agent/logs/ray_prometheus_waiter.out' 2>> '/opt/aws/amazon-cloudwatch-agent/logs/ray_prometheus_waiter.err'" &

6. Update CloudWatch Agent, Dashboard and Alarm config files.#

您可以通过简单地修改Ray集群配置YAML文件引用的CloudWatch配置文件,并重新运行 ray up example-cloudwatch.yaml,来对您的集群的CloudWatch日志、指标、仪表板和警报应用更改。统一CloudWatch代理将在所有集群节点上自动重启,并且您的配置更改将被应用。