<p align="center">
<img src="https://raw.githubusercontent.com/facebookincubator/dynolog/main/docs/dyno_logo.svg" />
</p>
Dynolog: 이종(Heterogeneous) CPU-GPU 시스템용 성능 모니터링 데몬
License
DynologCI
GitHub Release
Issues
PRs Welcome
<!-- TOC is a TODO -->
소개 (Introduction) {#introduction} ---
Dynolog는 이종(heterogeneous) CPU-GPU 시스템을 위한 경량 모니터링 데몬입니다. 항시 성능 모니터링과 심층 프로파일링(deep-dive profiling) 모드를 모두 지원합니다. 후자는 데몬에 원격 프로시저 호출(remote procedure call)을 수행하여 활성화할 수 있습니다.
아래는 나중에 이 Readme에서 더 자세히 다룰 몇 가지 주요 기능들입니다.
클라우드 환경에서 많이 활용되기 때문에 Linux 플랫폼에 중점을 두고 있습니다.
동기(Motivation)<!-- {#motivation} -->
대규모 AI 모델은 여러 컴퓨팅 노드를 가로질러 분산 AI 학습을 사용합니다. 또한 성능 향상을 위해 GPU와 같은 하드웨어 가속기를 활용합니다. 근본적인 하드웨어를 최대한 활용하면서 성능 병목 현상을 피하기 위해서는 AI 애플리케이션을 신중하게 최적화해야 합니다. 바로 이 지점에서 뛰어난 성능 모니터링 및 프로파일링 도구가 필수적이 됩니다.
모니터링(1, 2) 및 CPU(Intel’s VTune) 및 GPU(NSight)에 대한 기존 솔루션이 존재하지만, 이들을 모두 모아 시스템의 전체적인(holistic) 시각을 얻는 것은 어렵습니다. 예를 들어, 통신 패브릭과 같은 한 리소스의 비효율성이 전체 계산 속도를 늦추고 있는지 이해해야 합니다. 또한 이러한 솔루션들은 성능 저하를 일으키지 않으면서 프로덕션 환경에서 작동해야 합니다.
Dynolog은 Linux 커널의 근본적인 모니터링 및 프로파일링 인터페이스, CPU Performance Monitoring Units (PMU), 그리고 GPU를 활용합니다. 또한 온디맨드(on-demand) 프로파일링을 지원하기 위해 애플리케이션 내의 pytorch profiler와 상호작용합니다. 이러한 방식으로 시스템의 다양한 지점에서 병목 현상을 식별하는 데 도움을 줍니다.
지원되는 메트릭 (Supported Metrics)
Dynolog의 항상 작동(always-on) 또는 연속 모니터링은 다음 클래스의 메트릭을 지원합니다:
- 시스템/커널 메트릭.
- linux perf_event를 사용한 CPU Performance Monitoring Unit (PMU) 메트릭.
- 활성화된 경우 DCGM을 통한 NVIDIA GPU 메트릭.
상세하게 커버되는 메트릭 목록은 docs/Metrics.md에서 확인할 수 있습니다.
시작하기 (Getting Started)
설치 (Installation)
Dynolog은 사용자가 선택한 패키지 관리자를 사용하여 CentoOS의 경우 RPM, Ubuntu와 같은 배포판의 경우 Debian을 이용해 설치할 수 있습니다. 저희는 비(非)Linux 플랫폼은 지원하지 않습니다.
GPU를 모니터링해야 하는 경우 DCGM을 제외하고는 필수 종속성(dependencies)이 없습니다. 자세한 내용은 아래 GPU 모니터링 섹션을 참조하십시오.
최신 dynolog 릴리스를 얻거나 여기에서 릴리스 중 하나를 선택하세요.
wget https://github.com/facebookincubator/dynolog/releases/downdload/v0.2.1/dynolog-0.2.1-1.el8.x86_64.rpm
sudo rpm -i dynolog-0.2.1-1.el8.x86_64.rpm
...
sudo 권한이 없나요?
Dynolog은 대부분의 기능이 작동하는 유저스페이스(userspace) 모드로 실행될 수 있습니다. Dynolog을 유저스페이스로 실행하는 몇 가지 방법이 있습니다.
한 가지 방법은 아래에 표시된 것처럼 RPM 또는 debian 패키지를 단순히 압축 해제하는 것입니다.
mkdir -p dynolog_pkg; cd dynolog_pkg
wget https://github.com/facebookincubator/dynolog/releases/download/v0.2.1/dynolog_0.2.1-0-amd64.deb
ar x dynolog_0.2.1-0-amd64.deb; tar xvf data.tar.xz
...
또는 소스에서 dynolog를 빌드할 수 있습니다. 바이너리는 build/bin 디렉터리에 있을 것입니다.
패키지는 서버를 데몬으로 실행하기 위한 systemd 지원을 제공합니다. 하지만 여전히 별도의 터미널에서 dynolog server를 직접 실행할 수 있습니다.
dynolog 실행 (Running dynolog)
systemd를 사용하여 Dynolog 서비스를 시작합니다 -
sudo systemctl start dynolog
참고:
- dynolog 서비스는 파일이 존재하는 경우
/etc/dynolog.gflags에서 런타임 플래그를 가져옵니다.
- 출력 로그는
/var/logs/dynolog.log에 기록되며, 로그는 자동으로 로테이션됩니다.
출력 로그 파일에서 방출되는 메트릭의 값을 확인할 수 있습니다.
$> tail /var/log/dynolog.log
I20220721 23:42:34.141083 3632432 Logger.cpp:37] Logging : 12 values
I20220721 23:42:34.141104 3632432 Logger.cpp:38] time = 2022-07-21T23:42:34.141Z data = {"cpu_i":"71.342" …
dyno 명령줄 도구는 로컬 또는 원격 시스템의 dynolog 데몬과 통신합니다.
예를 들어, status 하위 명령을 사용하여 데몬이 실행 중인지 확인할 수 있습니다.
$> dyno status
response length = 12
response = {"status":1}
...
다른 하위 명령에 대한 도움말은 dyno --help를 실행하세요.
서버 명령줄 옵션 (Server Command Line options)
마지막으로, dynolog 서버는 다양한 플래그를 제공하며, 여기서 주요 플래그들을 나열합니다. 더 많은 정보는 dynolog --help를 실행하세요.
--port (기본값 = 1778) - 원격 쿼리 서비스를 설정하는 데 사용되는 포트입니다.
--reporting_interval_s (기본값=60) - 메트릭의 보고 간격입니다. 자세한 내용은 로깅 섹션을 참조하세요.
--enable_ipc_monitor는 프로세스 간 통신(inter-process communication, IPC) 엔드포인트를 설정합니다. 이는 pytorch 트레이너와 같은 애플리케이션과 통신하는 데 사용될 수 있습니다.
pytorch/GPU 추적 수집 (Collecting pytorch/GPU traces)#
PyTorch 프로파일링을 활성화하려면 --enable_ipc_monitor 플래그를 추가하세요. 이 플래그는 서버가 PyTorch 프로세스와 통신할 수 있도록 합니다.
시스템d로 서버를 실행하는 경우 다음 단계를 따르세요:
echo "--enable_ipc_monitor" | sudo tee -a /etc/dynolog.gflags
sudo systemctl restart dynolog
또한 pytorch v1.13.0의 호환 가능한 버전을 사용하고, PyTorch 프로그램을 실행하기 전에 환경 변수 KINETO_USE_DAEMON=1을 설정해야 합니다.
자세한 내용은 docs/pytorch_profiler.md를 참조하세요.
이제 gputrace 서브커맨드를 사용하여 트레이스를 캡처할 수 있습니다.
dyno gputrace --pids <프로세스 pid> --log_file <출력 파일 경로>
Dynolog는 또한 1) 원격 노드에서 트레이스를 캡처하거나, 2) 분산 학습 작업(slurm job scheduler 사용 시) 전반에 걸쳐 트레이싱을 조정할 수 있습니다. 이 기능에 대한 자세한 워크스루는 docs/pytorch_profiler.md의 레시피를 참고하세요.
GPU 모니터링<!-- {#gpu-monitoring} -->
Dynolog는 현재 NVIDIA GPU의 경우 NVIDIA Datacenter GPU Manager DCGM를 활용합니다. DCGM은 Kepler/Volta V100 이후 모델의 GPU를 지원하며, 자세한 내용은 이 페이지를 참조하세요. 현재 Dynolog는 시스템에 설치된 공유 라이브러리 libdcgm.so 버전에 따라 DCGM 2.x와 DCGM 3.x를 동적으로 모두 지원합니다.
전제 조건: 여기의 지침에 따라 시스템에 DCGM을 설치하세요. 설치 후에는 다음 명령어를 사용하여 dcgm 서비스를 초기화했는지 확인하세요:
sudo systemctl --now enable nvidia-dcgm
GPU 모니터링으로 dynolog를 실행하려면 이러한 플래그를 추가하거나 수정할 수 있습니다.
--enable_gpu_monitor (기본값=false): DCGM을 사용하여 GPU 모니터링 활성화.
--dcgm_lib_path (기본값=/lib64/libdcgm.so): DCGM 공유 라이브러리 libdcgm.so의 경로. 기본 경로가 존재하지 않으면 조정해야 합니다.
--dcgm_fields (기본값=”100,155,204,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012”): 모니터링할 DCGM 필드 ID의 쉼표로 구분된 문자열. 필드 정의는 Nvidia headers를 참조하십시오.
--dcgm_report_interval_s (기본값=10): 초당 각 DCGM 카운터 업데이트 간격. 이 값이 너무 작으면 DCGM이 카운터를 다중화(multiplexing)하기 시작하여 카운터 정확도에 영향을 줄 수 있음에 유의하십시오.
echo "--enable_gpu_monitor" | sudo tee -a /etc/dynolog.gflags
sudo systemctl restart dynolog
CPU 성능 이벤트<!-- {#cpu-performance-events} -->
Dynolog은 또한 CPU 하드웨어 성능 이벤트를 수집하는 기능을 지원합니다. 가장 첫 번째 카운터 세트로 CPU 명령어 및 사이클을 추가했으며, 이는 mips (초당 백만 명령어)와 mega_instructions_per_second로 지칭됩니다. 자세한 내용은 docs/Metrics.md를 참조하십시오.
다음 플래그들은 하드웨어 PMU 성능 모니터링과 관련이 있습니다:
--enable_perf_monitor (기본값=false): 하드웨어 PMU 성능 모니터링 활성화.
--perf_monitor_reporting_interval_s (기본값=60): 초 단위의 성능 지표 보고 간격 설정.
로그 파일에 출력되는 샘플 로그:
I20221208 15:28:34.730270 3345417 Logger.cpp:55] Logging : 2 values
I20221208 15:28:34.730316 3345417 Logger.cpp:56] time = 1969-12-31T16:00:00.000Z data = {"mega_cycles_per_second":"735.696","mips":"691.497"}
I20221208 15:29:34.731652 3345417 Logger.cpp:55] Logging : 2 values
...
소스에서 빌드<!-- {#building-from-source} -->
Dynolog은 두 개의 바이너리, 즉 1) dynolog 서버와 2) dyno 명령줄 도구로 구성됩니다.
소스에서 빌드하려면 프로젝트를 확인하고 서브모듈을 초기화하십시오.
요구사항 (Requirements)<!-- {#requirements} -->
이 프로젝트는 주로 C++20 및 Rust 컴파일러 툴체인에 의존합니다. 다른 종속성으로는 cmake와 ninja 빌드 시스템이 포함됩니다.
저희는 dynolog가 다음 버전의 C++ 및 Rust 툴체인과 함께 작동하는지 테스트했습니다.
<table>
<tr>
<td>언어 (Language)</td>
<td>툴체인 (Toolchain)</td>
</tr>
<tr>
<td>C++</td>
<td>gcc 10+ 또는 clang 10+</td>
</tr>
<tr>
<td>Rust</td>
<td>Rust 1.58.1 (clap 종속성에는 1.56 이상 필요)</td>
</tr>
</table>
시스템에 따라 다음 지침 중 하나를 사용할 수 있습니다:
RHEL/CentOS
cmake, ninja, 그리고 cargo (Rust용)를 설치합니다.
sudo dnf install cmake ninja cargo
대안으로, 제공된 스크립트 여기를 사용하여 rust를 설치할 수 있습니다.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Ubuntu/Debian
cmake와 ninja를 설치합니다.
sudo apt-get install -y cmake ninja-build
제공된 스크립트 여기를 사용하여 rust를 설치합니다.
Conda