监控模拟#

Flower 允许您在运行模拟时监控系统资源。此外,Flower 仿真引擎功能强大,能让您决定如何按客户端方式分配资源并限制总使用量。从资源消耗中获得的观察可以帮助您做出更明智的决策,并加快执行时间。

具体说明假定你使用的是 macOS,并且安装了 Homebrew 软件包管理器。

下载#

brew install prometheus grafana

Prometheus 用于收集数据,而 Grafana 则能让你将收集到的数据可视化。它们都与 Flower 在引擎下使用的 Ray 紧密集成。

重写配置文件(根据设备的不同,可能安装在不同的路径上)。

如果你使用的是 M1 Mac,应该是这样:

/opt/homebrew/etc/prometheus.yml
/opt/homebrew/etc/grafana/grafana.ini

在上一代英特尔 Mac 设备上,应该是这样:

/usr/local/etc/prometheus.yml
/usr/local/etc/grafana/grafana.ini

打开相应的配置文件并修改它们。根据设备情况,使用以下两个命令之一:

# M1 macOS
open /opt/homebrew/etc/prometheus.yml

# Intel macOS
open /usr/local/etc/prometheus.yml

然后删除文件中的所有文本,粘贴一个新的 Prometheus 配置文件,如下所示。您可以根据需要调整时间间隔:

global:
  scrape_interval: 1s
  evaluation_interval: 1s

scrape_configs:
# Scrape from each ray node as defined in the service_discovery.json provided by ray.
- job_name: 'ray'
  file_sd_configs:
  - files:
    - '/tmp/ray/prom_metrics_service_discovery.json'

编辑完 Prometheus 配置后,请对 Grafana 配置文件执行同样的操作。与之前一样,使用以下命令之一打开这些文件:

# M1 macOS
open /opt/homebrew/etc/grafana/grafana.ini

# Intel macOS
open /usr/local/etc/grafana/grafana.ini

您的终端编辑器应该会打开,并允许您像之前一样应用以下配置。

[security]
allow_embedding = true

[auth.anonymous]
enabled = true
org_name = Main Org.
org_role = Viewer

[paths]
provisioning = /tmp/ray/session_latest/metrics/grafana/provisioning

恭喜您,您刚刚下载了指标跟踪所需的所有软件。现在,让我们开始吧。

跟踪指标#

在运行 Flower 模拟之前,您必须启动刚刚安装和配置的监控工具。

brew services start prometheus
brew services start grafana

开始模拟时,请在 Python 代码中加入以下参数。

fl.simulation.start_simulation(
    # ...
    # all the args you used before
    # ...
    ray_init_args = {"include_dashboard": True}
)

现在,您可以开始工作了。

模拟启动后不久,您就会在终端中看到以下日志:

2023-01-20 16:22:58,620       INFO [worker.py:1529](http://worker.py:1529/) -- Started a local Ray instance. View the dashboard at http://127.0.0.1:8265

您可以在 http://127.0.0.1:8265 查看所有内容。

这是一个 Ray Dashboard。您可以导航到 "度量标准"(左侧面板,最低选项)。

或者,您也可以点击右上角的 "在 Grafana 中查看",在 Grafana 中查看它们。请注意,Ray 仪表盘只能在模拟期间访问。模拟结束后,您只能使用 Grafana 浏览指标。您可以访问 ``http://localhost:3000/``启动 Grafana。

完成可视化后,请停止 Prometheus 和 Grafana。这一点很重要,否则只要它们在运行,就会阻塞机器上的端口 3000

brew services stop prometheus
brew services stop grafana

资源分配#

您必须了解 Ray 库是如何工作的,才能有效地为自己的仿真客户端分配系统资源。

最初,模拟(由 Ray 在引擎下处理)默认使用系统上的所有可用资源启动,并在客户端之间共享。但这并不意味着它会将资源平均分配给所有客户端,也不意味着模型训练会在所有客户端同时进行。您将在本博客的后半部分了解到更多相关信息。您可以运行以下命令检查系统资源:

import ray
ray.available_resources()

在 Google Colab 中,您看到的结果可能与此类似:

{'memory': 8020104807.0,
 'GPU': 1.0,
 'object_store_memory': 4010052403.0,
 'CPU': 2.0,
 'accelerator_type:T4': 1.0,
 'node:172.28.0.2': 1.0}

不过,您可以覆盖默认值。开始模拟时,请执行以下操作(不必全部覆盖):

num_cpus = 2
num_gpus = 1
ram_memory = 16_000 * 1024 * 1024  # 16 GB
fl.simulation.start_simulation(
    # ...
    # all the args you were specifying before
    # ...
    ray_init_args = {
            "include_dashboard": True, # we need this one for tracking
            "num_cpus": num_cpus,
            "num_gpus": num_gpus,
            "memory": ram_memory,
  }
)

我们还可以为单个客户指定资源。

# Total resources for simulation
num_cpus = 4
num_gpus = 1
ram_memory = 16_000 * 1024 * 1024 # 16 GB

# Single client resources
client_num_cpus = 2
client_num_gpus = 1

fl.simulation.start_simulation(
    # ...
    # all the args you were specifying before
    # ...
    ray_init_args = {
            "include_dashboard": True, # we need this one for tracking
            "num_cpus": num_cpus,
            "num_gpus": num_gpus,
            "memory": ram_memory,
    },
    # The argument below is new
    client_resources = {
            "num_cpus": client_num_cpus,
            "num_gpus": client_num_gpus,
    }
)

现在到了关键部分。只有在资源允许的情况下,Ray 才会在拥有所有所需资源(如并行运行)时启动新客户端。

在上面的示例中,将只运行一个客户端,因此您的客户端不会并发运行。设置 client_num_gpus = 0.5 将允许运行两个客户端,从而使它们能够并发运行。请注意,所需的资源不要超过可用资源。如果您指定 client_num_gpus = 2,模拟将无法启动(即使您有 2 个 GPU,但决定在 ray_init_args 中设置为 1)。

常见问题#

问:我没有看到任何指标记录。

答:时间范围可能没有正确设置。设置在右上角(默认为 "最后 30 分钟")。请更改时间框架,以反映模拟运行的时间段。

问:我看到 "未检测到 Grafana 服务器。请确保 Grafana 服务器正在运行并刷新此页面"。

答:您可能没有运行 Grafana。请检查正在运行的服务

brew services list

问:在访问 `<http://127.0.0.1:8265>`_时,我看到 "无法访问该网站"。

答:要么模拟已经完成,要么您还需要启动Prometheus。

资源#

Ray Dashboard: https://docs.ray.io/en/latest/ray-observability/getting-started.html

Ray Metrics: https://docs.ray.io/en/latest/cluster/metrics.html