모니터 시뮬레이션#

Flower를 사용하면 시뮬레이션을 실행하는 동안 시스템 리소스를 모니터링할 수 있습니다. 또한 Flower 시뮬레이션 엔진은 강력하며 클라이언트별 리소스 할당 방법을 결정하고 총 사용량을 제한할 수 있습니다. 리소스 소비에 대한 인사이트를 통해 더 현명한 결정을 내리고 실행 시간을 단축할 수 있습니다.

구체적인 지침은 macOS를 사용 중이고 ‘Homebrew <https://brew.sh/>`_ 패키지 관리자가 설치되어 있다고 가정합니다.

다운로드#

brew install prometheus grafana

`Prometheus <https://prometheus.io/>`_는 데이터 수집에 사용되며, `Grafana <https://grafana.com/>`_는 수집된 데이터를 시각화할 수 있게 해줍니다. 이 두 도구는 모두 Flower가 내부적으로 사용하는 `Ray <https://www.ray.io/>`_와 잘 통합되어 있습니다.

구성 파일을 덮어씁니다(장치에 따라 다른 경로에 설치되어 있을 수 있음).

M1 Mac을 사용 중이라면:

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

이전 세대 Intel 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 대시보드입니다. 메트릭(왼쪽 패널의 가장 아래 옵션)으로 이동할 수 있습니다.

또는 오른쪽 위 모서리인 “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 를 설정하면 두 개의 클라이언트를 실행할 수 있으므로 동시에 실행할 수 있습니다. 사용 가능한 리소스보다 더 많은 리소스를 요구하지 않도록 주의하세요. :code:`client_num_gpus = 2`를 지정하면 시뮬레이션이 시작되지 않습니다(GPU가 2개이지만 :code:`ray_init_args`에서 1개를 설정한 경우에도 마찬가지입니다).

자주 묻는 질문#

질문: 기록된 메트릭이 보이지 않습니다.

A: 기간이 제대로 설정되지 않았을 수 있습니다. 설정은 오른쪽 상단에 있습니다(기본값은 ‘지난 30분’). 시뮬레이션이 실행된 기간을 반영하도록 기간을 변경해 주세요.

질문: “Grafana 서버가 감지되지 않았습니다. Ray 대시보드의 메트릭 탭으로 이동한 후 Grafana 서버가 실행 중인지 확인하고 이 페이지를 새로고침하세요.”라는 메시지가 표시됩니다.

A: Grafana가 실행되고 있지 않을 수 있습니다. 실행 중인 서비스를 확인하세요

brew services list

Q: `<http://127.0.0.1:8265>`_로 이동할 때 “이 사이트에 연결할 수 없습니다.”라는 메시지가 표시됩니다.

A: 시뮬레이션이 이미 완료되었거나 아직 Prometheus를 시작해야 합니다.

리소스#

Ray 대시보드: https://docs.ray.io/en/latest/ray-observability/getting-started.html

Ray 메트릭: https://docs.ray.io/en/latest/cluster/metrics.html