์ ์: Anupam Bhatnagar ๋ฒ์ญ: Jaeseong Park
์ด ํํ ๋ฆฌ์ผ์์๋ ๋ถ์ฐ ํ์ต ์์ ์ ์ถ์ ์ ๋ถ์ํ๊ธฐ ์ํด ์ ์ฒด๋ก ์ ์ถ์ ๋ถ์(Holistic Trace Analysis, HTA)์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์์ํ๋ ค๋ฉด ์๋ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
HTA๋ฅผ ์ค์นํ๊ธฐ ์ํด Conda ํ๊ฒฝ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. Anaconda๋ฅผ ์ค์นํ๋ ค๋ฉด `๊ณต์ Anaconda ๋ฌธ์ <https://docs.anaconda.com/anaconda/install/index.html>`_๋ฅผ ์ฐธ์กฐํ์ธ์.
pip๋ฅผ ์ฌ์ฉํ์ฌ HTA ์ค์น:
pip install HolisticTraceAnalysis
(์ ํ์ฌํญ์ด์ง๋ง ๊ถ์ฅ) Conda ํ๊ฒฝ ์ค์ :
# env_name ๊ฐ์ํ๊ฒฝ ์์ฑ conda create -n env_name # ํ๊ฒฝ ํ์ฑํ conda activate env_name # ์์ ์ด ๋๋๋ฉด ``conda deactivate``๋ฅผ ์คํํ์ฌ ํ๊ฒฝ์ ๋นํ์ฑํํ์ธ์
Jupyter ๋
ธํธ๋ถ์ ์คํํ๊ณ trace_dir
๋ณ์๋ฅผ ์ถ์ ํ์ผ์ด ์๋ ์์น๋ก ์ค์ ํ์ธ์.
from hta.trace_analysis import TraceAnalysis
trace_dir = "/path/to/folder/with/traces"
analyzer = TraceAnalysis(trace_dir=trace_dir)
GPU๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ธฐ ์ํด์๋ ํน์ ์์ ์ ๋ํด GPU๊ฐ ์๊ฐ์ ์ด๋ป๊ฒ ์ฌ์ฉํ๊ณ ์๋์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. GPU๊ฐ ์ฃผ๋ก ๊ณ์ฐ, ํต์ , ๋ฉ๋ชจ๋ฆฌ ์ด๋ฒคํธ์ ์ฌ์ฉ๋๊ณ ์๋์ง, ์๋๋ฉด ์ ํด ์ํ์ธ์ง? ์๊ฐ์ ๋ถ์ ๊ธฐ๋ฅ์ ์ด ์ธ ๊ฐ์ง ๋ฒ์ฃผ์์ ์ฌ์ฉ๋ ์๊ฐ์ ๋ํ ์์ธํ ๋ถ์์ ์ ๊ณตํฉ๋๋ค.
- ์ ํด ์๊ฐ - GPU๊ฐ ์ ํด ์ํ์ ๋๋ค.
- ๊ณ์ฐ ์๊ฐ - GPU๊ฐ ํ๋ ฌ ๊ณฑ์ ์ด๋ ๋ฒกํฐ ์ฐ์ฐ์ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
- ๋น๊ณ์ฐ ์๊ฐ - GPU๊ฐ ํต์ ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ด๋ฒคํธ์ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
๋์ ํ์ต ํจ์จ์ฑ์ ๋ฌ์ฑํ๊ธฐ ์ํด์๋ ์ฝ๋๊ฐ ๊ณ์ฐ ์๊ฐ์ ์ต๋ํํ๊ณ ์ ํด ์๊ฐ๊ณผ ๋น๊ณ์ฐ ์๊ฐ์ ์ต์ํํด์ผ ํฉ๋๋ค. ๋ค์ ํจ์๋ ๊ฐ ๋ญํฌ์ ๋ํ ์๊ฐ ์ฌ์ฉ์ ์์ธํ ๋ถ์์ ์ ๊ณตํ๋ ๋ฐ์ดํฐํ๋ ์์ ์์ฑํฉ๋๋ค.
analyzer = TraceAnalysis(trace_dir = "/path/to/trace/folder")
time_spent_df = analyzer.get_temporal_breakdown()
get_temporal_breakdown ํจ์์์ visualize
์ธ์๋ฅผ ``True``๋ก ์ค์ ํ๋ฉด ๋ญํฌ๋ณ ๋ถ์์ ๋ํ๋ด๋ ๋ง๋ ๊ทธ๋ํ๋ ์์ฑ๋ฉ๋๋ค.
GPU๊ฐ ์ ํด ์ํ๋ก ๋ณด๋ด๋ ์๊ฐ๊ณผ ๊ทธ ์ด์ ์ ๋ํ ํต์ฐฐ์ ์ป์ผ๋ฉด ์ต์ ํ ์ ๋ต์ ์๋ฆฝํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. GPU์์ ์คํ ์ค์ธ ์ปค๋์ด ์์ ๋ GPU๋ ์ ํด ์ํ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ ํด ์๊ฐ์ ์ธ ๊ฐ์ง ๋๋ ทํ ๋ฒ์ฃผ๋ก ๋ถ๋ฅํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋ฐํ์ต๋๋ค:
- ํธ์คํธ ๋๊ธฐ: CPU๊ฐ GPU๋ฅผ ์์ ํ ํ์ฉํ๊ธฐ ์ํด ์ถฉ๋ถํ ๋น ๋ฅด๊ฒ ์ปค๋์ ๋๊ธฐ์ด์ ๋ฃ์ง ์์ ๋ฐ์ํ๋ GPU์ ์ ํด ์๊ฐ์ ๋งํฉ๋๋ค. ํด๋น ์ ํ์ ๋นํจ์จ์ฑ์ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ ์ ํ์ ๊ธฐ์ฌํ๋ CPU ์ฐ์ฐ์๋ฅผ ๊ฒ์ฌํ๊ณ , ๋ฐฐ์น ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ณ , ์ฐ์ฐ์ ์ตํฉ์ ์ ์ฉํ ์ ์์ต๋๋ค.
- ์ปค๋ ๋๊ธฐ: GPU์์ ์ฐ์์ ์ธ ์ปค๋์ ์คํํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๊ฐ๋จํ ์ค๋ฒํค๋๋ฅผ ๋งํฉ๋๋ค. ์ด ๋ฒ์ฃผ์ ์ํ๋ ์ ํด ์๊ฐ์ CUDA ๊ทธ๋ํ ์ต์ ํ๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ํํ ์ ์์ต๋๋ค.
- ๊ธฐํ ๋๊ธฐ: ํ์ฌ ์ ๋ณด๊ฐ ๋ถ์กฑํ์ฌ ํน์ ์์ธ์ ํ์ ํ ์ ์๋ ์ ํด ์๊ฐ์ด ์ด ๋ฒ์ฃผ์ ํฌํจ๋ฉ๋๋ค. ๊ฐ๋ฅํ ์์ธ์ผ๋ก๋ CUDA ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ CUDA ์คํธ๋ฆผ ๊ฐ์ ๋๊ธฐํ์ ์ปค๋ ์คํ ์ง์ฐ ๋ฑ์ด ์์ต๋๋ค.
ํธ์คํธ ๋๊ธฐ ์๊ฐ์ CPU๋ก ์ธํด GPU๊ฐ ์ ์ฒด๋๋ ์๊ฐ์ผ๋ก ํด์ํ ์ ์์ต๋๋ค. ์ ํด ์๊ฐ์ ์ปค๋ ๋๊ธฐ๋ก ๋ถ๋ฅํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ํด๋ฆฌ์คํฑ(heuristic)์ ์ฌ์ฉํฉ๋๋ค:
์ฐ์์ ์ธ ์ปค๋ ์ฌ์ด์ ๊ฐ๊ฒฉ < ์๊ณ๊ฐ
๊ธฐ๋ณธ ์๊ณ๊ฐ์ 30 ๋๋
ธ์ด์ด๋ฉฐ consecutive_kernel_delay
์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํด ์๊ฐ ๋ถ์์ ๋ญํฌ 0์ ๋ํด์๋ง ๊ณ์ฐ๋ฉ๋๋ค. ๋ค๋ฅธ ๋ญํฌ์ ๋ํด ๋ถ์์ ๊ณ์ฐํ๋ ค๋ฉด get_idle_time_breakdown ํจ์์์ ranks
์ธ์๋ฅผ ์ฌ์ฉํ์ธ์. ์ ํด ์๊ฐ ๋ถ์์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค:
analyzer = TraceAnalysis(trace_dir = "/path/to/trace/folder")
idle_time_df = analyzer.get_idle_time_breakdown()
์ด ํจ์๋ ๋ฐ์ดํฐํ๋ ์ ํํ์ ๋ฐํํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐํ๋ ์์ ๊ฐ ๋ญํฌ์ ๊ฐ ์คํธ๋ฆผ์ ๋ํ ์ ํด ์๊ฐ ๋ฒ์ฃผ๋ณ ์๊ฐ์ ํฌํจํฉ๋๋ค.
๋ ๋ฒ์งธ ๋ฐ์ดํฐํ๋ ์์ `show_idle_interval_stats`๊ฐ `True`๋ก ์ค์ ๋์์ ๋ ์์ฑ๋ฉ๋๋ค. ์ด ๋ฐ์ดํฐํ๋ ์์ ๊ฐ ๋ญํฌ์ ๊ฐ ์คํธ๋ฆผ์ ๋ํ ์ ํด ์๊ฐ์ ์์ฝ ํต๊ณ๋ฅผ ํฌํจํฉ๋๋ค.
Tip
๊ธฐ๋ณธ์ ์ผ๋ก ์ ํด ์๊ฐ ๋ถ์์ ๊ฐ ์ ํด ์๊ฐ ๋ฒ์ฃผ์ ๋ฐฑ๋ถ์จ์ ํ์ํฉ๋๋ค. visualize_pctg ์ธ์๋ฅผ `False`๋ก ์ค์ ํ๋ฉด ํจ์๋ y์ถ์ ์ ๋ ์๊ฐ์ ํ์ํฉ๋๋ค.
์ปค๋ ๋ถ์ ๊ธฐ๋ฅ์ ๋ชจ๋ ๋ญํฌ์์ ํต์ (COMM), ๊ณ์ฐ(COMP), ๋ฉ๋ชจ๋ฆฌ(MEM)์ ๊ฐ์ ๊ฐ ์ปค๋ ์ ํ์ ๋ํด ์ฌ์ฉ๋ ์๊ฐ์ ๋ถ์ํ๊ณ ๊ฐ ๋ฒ์ฃผ์์ ์ฌ์ฉ๋ ์๊ฐ์ ๋น์จ์ ์ ์ํฉ๋๋ค. ๋ค์์ ๊ฐ ๋ฒ์ฃผ์์ ์ฌ์ฉ๋ ์๊ฐ์ ๋ฐฑ๋ถ์จ์ ์ํ ์ฐจํธ๋ก ๋ํ๋ธ ๊ฒ์ ๋๋ค:
์ปค๋ ๋ถ์์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐํ ์ ์์ต๋๋ค:
analyzer = TraceAnalysis(trace_dir = "/path/to/trace/folder")
kernel_type_metrics_df, kernel_metrics_df = analyzer.get_gpu_kernel_breakdown()
ํจ์๊ฐ ๋ฐํํ๋ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐํ๋ ์์ ์ํ ์ฐจํธ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ ์๋ ๊ฐ์ ํฌํจํฉ๋๋ค.
get_gpu_kernel_breakdown ํจ์๊ฐ ๋ฐํํ๋ ๋ ๋ฒ์งธ ๋ฐ์ดํฐํ๋ ์์๋ ๊ฐ ์ปค๋์ ๋ํ ๊ธฐ๊ฐ ์์ฝ ํต๊ณ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ํนํ, ์ด๋ ๊ฐ ์ปค๋์ ๋ํด ๋ญํฌ๋ณ๋ก ์นด์ดํธ, ์ต์, ์ต๋, ํ๊ท , ํ์ค ํธ์ฐจ, ํฉ๊ณ, ๊ทธ๋ฆฌ๊ณ ์ปค๋ ์ ํ์ ํฌํจํฉ๋๋ค.
์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ HTA๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ธฐ ์ํ ์ฌ๋ฌ ์๊ฐํ๋ฅผ ์์ฑํฉ๋๋ค.
- ๊ฐ ๋ญํฌ๋ณ๋ก ๊ฐ ์ปค๋ ์ ํ์ ๋ํ ์์ ์ปค๋์ ์ํ ์ฐจํธ.
- ์์ ์ปค๋ ๋ฐ ๊ฐ ์ปค๋ ์ ํ์ ๋ํด ๋ชจ๋ ๋ญํฌ์ ๊ฑธ์น ํ๊ท ๊ธฐ๊ฐ์ ๋ง๋ ๊ทธ๋ํ.
๋ชจ๋ ์ด๋ฏธ์ง๋ plotly๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค. ๊ทธ๋ํ ์์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ์ฐ์ธก ์๋จ์ ๋ชจ๋ ๋ฐ๊ฐ ๋ํ๋๋ฉฐ, ์ด๋ฅผ ํตํด ํ๋, ์ด๋, ์ ํ ๋ฐ ๊ทธ๋ํ ๋ค์ด๋ก๋๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์์ ์ํ ์ฐจํธ๋ ์์ 5๊ฐ์ ๊ณ์ฐ, ํต์ , ๋ฉ๋ชจ๋ฆฌ ์ปค๋์ ๋ณด์ฌ์ค๋๋ค. ๊ฐ ๋ญํฌ์ ๋ํด ์ ์ฌํ ์ํ ์ฐจํธ๊ฐ ์์ฑ๋ฉ๋๋ค. ์ํ ์ฐจํธ๋ get_gpu_kernel_breakdown ํจ์์ ์ ๋ฌ๋ num_kernels ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ k๊ฐ์ ์ปค๋์ ๋ณด์ฌ์ฃผ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค. ๋ํ, duration_ratio ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์๋ ์๊ฐ์ ๋น์จ์ ์กฐ์ ํ ์ ์์ต๋๋ค. num_kernels`์ `duration_ratio ๋ชจ๋ ์ง์ ๋ ๊ฒฝ์ฐ, `num_kernels`๊ฐ ์ฐ์ ํฉ๋๋ค.
์์ ๋ง๋ ๊ทธ๋ํ๋ ๋ชจ๋ ๋ญํฌ์ ๊ฑธ์น NCCL AllReduce ์ปค๋์ ํ๊ท ๊ธฐ๊ฐ์ ๋ณด์ฌ์ค๋๋ค. ๊ฒ์ ์ ์ ๊ฐ ๋ญํฌ์์์ ์ต์ ๋ฐ ์ต๋ ์๊ฐ์ ๋ํ๋ ๋๋ค.
Warning
jupyter-lab์ ์ฌ์ฉํ ๋ "image_renderer" ์ธ์์ ๊ฐ์ "jupyterlab"์ผ๋ก ์ค์ ํด์ผ ๋ ธํธ๋ถ์์ ๊ทธ๋ํ๊ฐ ๋ ๋๋ง๋ฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋ํ ์์ธํ ์ค๋ช ์ ์ ์ฅ์์ ์์ ํด๋์ ์๋ `gpu_kernel_breakdown notebook <https://github.com/facebookresearch/HolisticTraceAnalysis/blob/main/examples/kernel_breakdown_demo.ipynb>`_์ ์ฐธ์กฐํ์ธ์.
๋ถ์ฐ ํ์ต์์ ์๋นํ ์๊ฐ์ด GPU ๊ฐ์ ํต์ ๋ฐ ๋๊ธฐํ ์ด๋ฒคํธ์ ์๋น๋ฉ๋๋ค. ๋์ GPU ํจ์จ์ฑ(TFLOPS/GPU)์ ๋ฌ์ฑํ๊ธฐ ์ํด์๋ GPU๊ฐ ๊ณ์ฐ ์ปค๋๋ก ๊ณผ๋ํ๊ฒ ํ ๋น๋ ์ํ๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฆ, GPU๋ ํด๊ฒฐ๋์ง ์์ ๋ฐ์ดํฐ ์์กด์ฑ์ผ๋ก ์ธํด ์ฐจ๋จ๋์ด์๋ ์ ๋ฉ๋๋ค. ๊ณ์ฐ์ด ๋ฐ์ดํฐ ์์กด์ฑ์ ์ํด ์ฐจ๋จ๋๋ ์ ๋๋ฅผ ์ธก์ ํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํต์ ๊ณ์ฐ ์ค์ฒฉ์ ๊ณ์ฐํ๋ ๊ฒ์ ๋๋ค. ํต์ ์ด๋ฒคํธ๊ฐ ๊ณ์ฐ ์ด๋ฒคํธ์ ๊ฒน์น ๋ ๋ ๋์ GPU ํจ์จ์ฑ์ด ๊ด์ฐฐ๋ฉ๋๋ค. ํต์ ๊ณผ ๊ณ์ฐ์ ์ค์ฒฉ์ด ๋ถ์กฑํ๋ฉด GPU๊ฐ ์ ํด ์ํ๊ฐ ๋์ด ๋ฎ์ ํจ์จ์ฑ์ผ๋ก ์ด์ด์ง๋๋ค. ์์ฝํ์๋ฉด, ๋ ๋์ ํต์ ๊ณ์ฐ ์ค์ฒฉ์ด ๋ฐ๋์งํฉ๋๋ค. ๊ฐ ๋ญํฌ์ ๋ํ ์ค์ฒฉ ๋น์จ์ ๊ณ์ฐํ๊ธฐ ์ํด ๋ค์ ๋น์จ์ ์ธก์ ํฉ๋๋ค:
(ํต์ ์ค์ ์๋น๋ ๊ณ์ฐ ์๊ฐ) / (ํต์ ์ ์๋น๋ ์๊ฐ)
ํต์ ๊ณ์ฐ ์ค์ฒฉ์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐํ ์ ์์ต๋๋ค:
analyzer = TraceAnalysis(trace_dir="/path/to/trace/folder")
overlap_df = analyzer.get_comm_comp_overlap()
์ด ํจ์๋ ๊ฐ ๋ญํฌ์ ๋ํ ์ค์ฒฉ ๋น์จ์ ํฌํจํ๋ ๋ฐ์ดํฐํ๋ ์์ ๋ฐํํฉ๋๋ค.
visualize
์ธ์๊ฐ True๋ก ์ค์ ๋๋ฉด, get_comm_comp_overlap ํจ์๋ ๋ํ ๋ญํฌ๋ณ ์ค์ฒฉ์ ๋ํ๋ด๋ ๋ง๋ ๊ทธ๋ํ๋ฅผ ์์ฑํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์ญํญ ์นด์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ(memcpy) ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ค์ (memset) ์ด๋ฒคํธ์ ์ํด ๋ฐ์ดํฐ๋ฅผ H2D, D2H ๋ฐ D2D๋ก ๋ณต์ฌํ ๋ ์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ ๋์ญํญ์ ์ธก์ ํฉ๋๋ค. HTA๋ ๋ํ ๊ฐ CUDA ์คํธ๋ฆผ์์ ์งํ ์ค์ธ ์์ ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ **ํ ๊ธธ์ด**๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์คํธ๋ฆผ์ ํ ๊ธธ์ด๊ฐ 1024 ์ด์์ผ ๋, ๊ทธ ์คํธ๋ฆผ์ ์๋ก์ด ์ด๋ฒคํธ๊ฐ ์ค์ผ์ค๋ ์ ์์ผ๋ฉฐ, GPU ์คํธ๋ฆผ์ ์ด๋ฒคํธ๊ฐ ์ฒ๋ฆฌ๋ ๋๊น์ง CPU๋ ๋ฉ์ถฐ์์ต๋๋ค.
generate_trace_with_counters API๋ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ ๋ฐ ํ ๊ธธ์ด ์นด์ดํฐ๊ฐ ํฌํจ๋ ์๋ก์ด ์ถ์ ํ์ผ์ ์ถ๋ ฅํฉ๋๋ค. ์๋ก์ด ์ถ์ ํ์ผ์๋ memcpy/memset ์์ ์ ์ํด ์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ์ ๋ํ๋ด๋ ํธ๋๊ณผ ๊ฐ ์คํธ๋ฆผ์ ํ ๊ธธ์ด๋ฅผ ๋ํ๋ด๋ ํธ๋์ด ํฌํจ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก, ์ด๋ฌํ ์นด์ดํฐ๋ ๋ญํฌ 0 ์ถ์ ํ์ผ์ ์ฌ์ฉํ์ฌ ์์ฑ๋๋ฉฐ, ์ ํ์ผ์ ์ด๋ฆ์๋ ``_with_counters``๋ผ๋ ์ ๋ฏธ์ฌ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ฌ์ฉ์๋ generate_trace_with_counters API์ ranks ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๋ญํฌ์ ๋ํ ์นด์ดํฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
analyzer = TraceAnalysis(trace_dir="/path/to/trace/folder")
analyzer.generate_trace_with_counters()
์ฆ๊ฐ๋ ์นด์ดํฐ๊ฐ ํฌํจ๋ ์์ฑ๋ ์ถ์ ํ์ผ์ ์คํฌ๋ฆฐ์ท.
HTA๋ ๋ํ ๋ค์ API๋ฅผ ์ฌ์ฉํ์ฌ ํ๋กํ์ผ๋ ์ฝ๋ ๋ถ๋ถ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ ๋์ญํญ ๋ฐ ํ ๊ธธ์ด ์นด์ดํฐ์ ์์ฝ๊ณผ ์๊ณ์ด์ ์ ๊ณตํฉ๋๋ค:
- get_memory_bw_summary
- get_queue_length_summary
- get_memory_bw_time_series
- get_queue_length_time_series
์์ฝ ๋ฐ ์๊ณ์ด์ ๋ณด๊ธฐ ์ํด ๋ค์์ ์ฌ์ฉํ์ธ์:
# ์์ฝ ์์ฑ
mem_bw_summary = analyzer.get_memory_bw_summary()
queue_len_summary = analyzer.get_queue_length_summary()
# ์๊ณ์ด ๊ฐ์ ธ์ค๊ธฐ
mem_bw_series = analyzer.get_memory_bw_time_series()
queue_len_series = analyzer.get_queue_length_series()
์์ฝ์๋ ์นด์ดํธ, ์ต์, ์ต๋, ํ๊ท , ํ์ค ํธ์ฐจ, 25๋ฒ์งธ, 50๋ฒ์งธ, 75๋ฒ์งธ ๋ฐฑ๋ถ์์๊ฐ ํฌํจ๋ฉ๋๋ค.
์๊ณ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ํฌ์ธํธ๋ฅผ ํฌํจํฉ๋๋ค. ์ผ๋จ ๊ฐ์ด ๊ด์ฐฐ๋๋ฉด ๋ค์ ์ ๋ฐ์ดํธ๊น์ง ์๊ณ์ด์ ์ผ์ ํ๊ฒ ์ ์ง๋ฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ ๋ฐ ํ ๊ธธ์ด ์๊ณ์ด ํจ์๋ ํค๊ฐ ๋ญํฌ์ด๊ณ ๊ฐ์ด ๊ทธ ๋ญํฌ์ ๋ํ ์๊ณ์ด์ธ ๋์ ๋๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก, ์๊ณ์ด์ ๋ญํฌ 0์ ๋ํด์๋ง ๊ณ์ฐ๋ฉ๋๋ค.
GPU์์ ์คํ๋ ๊ฐ ์ด๋ฒคํธ์๋ CudaLaunchKernel, CudaMemcpyAsync, `CudaMemsetAsync`์ ๊ฐ์ CPU์์์ ๋์ํ๋ ์ค์ผ์ค๋ง ์ด๋ฒคํธ๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ์ด๋ฒคํธ๋ ์ถ์ ์์ ๊ณตํต์ ์๊ด ID๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค - ์์ ๊ทธ๋ฆผ์ ์ฐธ์กฐํ์ธ์. ์ด ๊ธฐ๋ฅ์ CPU ๋ฐํ์ ์ด๋ฒคํธ์ ์ง์ ์๊ฐ, ํด๋น GPU ์ปค๋ ๋ฐ ์คํ ์ง์ฐ์ ๊ณ์ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด, GPU ์ปค๋ ์์๊ณผ CPU ์คํผ๋ ์ดํฐ ์ข ๋ฃ ๊ฐ์ ์ฐจ์ด์ ๋๋ค. ์ปค๋ ์คํ ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค:
analyzer = TraceAnalysis(trace_dir="/path/to/trace/dir")
kernel_info_df = analyzer.get_cuda_kernel_launch_stats()
์์ฑ๋ ๋ฐ์ดํฐํ๋ ์์ ์คํฌ๋ฆฐ์ท์ ์๋์ ์์ต๋๋ค.
CPU ์คํผ๋ ์ด์ ์ ์ง์ ์๊ฐ, GPU ์ปค๋, ๊ทธ๋ฆฌ๊ณ ์คํ ์ง์ฐ์ ํตํด ๋ค์์ ์ฐพ์ ์ ์์ต๋๋ค:
- ์งง์ GPU ์ปค๋ - GPU ์ปค๋์ ์ง์ ์๊ฐ์ด ํด๋น CPU ๋ฐํ์ ์ด๋ฒคํธ๋ณด๋ค ์งง์ ๊ฒฝ์ฐ.
- ๋ฐํ์ ์ด๋ฒคํธ ์ด์์น - ๊ณผ๋ํ ์ง์ ์๊ฐ์ ๊ฐ์ง CPU ๋ฐํ์ ์ด๋ฒคํธ.
- ์คํ ์ง์ฐ ์ด์์น - ์ค์ผ์ค๋๊ธฐ๊น์ง ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋ GPU ์ปค๋.
HTA๋ ์์์ ์ธ๊ธํ ์ธ ๊ฐ์ง ์นดํ ๊ณ ๋ฆฌ ๊ฐ๊ฐ์ ๋ํ ๋ถํฌ ํ๋กฏ์ ์์ฑํฉ๋๋ค.
์งง์ GPU ์ปค๋
์ผ๋ฐ์ ์ผ๋ก CPU ์ธก์์์ ์คํ ์๊ฐ์ 5-20 ๋ง์ดํฌ๋ก์ด ๋ฒ์์ ๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ GPU ์คํ ์๊ฐ์ด ์คํ ์๊ฐ๋ณด๋ค ๋ ์งง์ต๋๋ค. ์๋ ๊ทธ๋ํ๋ ์ด๋ฌํ ์ฌ๋ก๊ฐ ์ฝ๋์์ ์ผ๋ง๋ ์์ฃผ ๋ฐ์ํ๋์ง ์ฐพ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ฐํ์ ์ด๋ฒคํธ ์ด์์น
๋ฐํ์ ์ด์์น๋ ์ด์์น๋ฅผ ๋ถ๋ฅํ๋ ๋ฐ ์ฌ์ฉ๋ ์ปท์คํ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค, ๋ฐ๋ผ์ get_cuda_kernel_launch_stats API๋ ๊ฐ์ ๊ตฌ์ฑํ๊ธฐ ์ํ runtime_cutoff ์ธ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
์คํ ์ง์ฐ ์ด์์น
์คํ ์ง์ฐ ์ด์์น๋ ์ด์์น๋ฅผ ๋ถ๋ฅํ๋ ๋ฐ ์ฌ์ฉ๋ ์ปท์คํ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค, ๋ฐ๋ผ์ get_cuda_kernel_launch_stats API๋ ๊ฐ์ ๊ตฌ์ฑํ๊ธฐ ์ํ launch_delay_cutoff ์ธ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์ HTA๋ฅผ ์ค์นํ๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ต๋๋ค. HTA๋ ๋ถ์ฐ ํ์ต ์ํฌํ๋ก์ฐ์์ ๋ณ๋ชฉ ํ์์ ๋ถ์ํ ์ ์๊ฒ ํด์ฃผ๋ ์ฑ๋ฅ ๋๊ตฌ์ ๋๋ค. HTA ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ ์ด์ค ๋น๊ต ๋ถ์์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ๋ฐฐ์ฐ๋ ค๋ฉด, `Trace Diff using Holistic Trace Analysis <https://tutorials.pytorch.kr/beginner/hta_trace_diff_tutorial.html>`__๋ฅผ ์ฐธ์กฐํ์ธ์.