Skip to content

Files

Latest commit

 

History

History
283 lines (162 loc) ยท 17 KB

hta_intro_tutorial.rst

File metadata and controls

283 lines (162 loc) ยท 17 KB

์ „์ฒด๋ก ์ (Holistic Trace Analysis) ์ถ”์  ๋ถ„์„ ์†Œ๊ฐœ

์ €์ž: Anupam Bhatnagar ๋ฒˆ์—ญ: Jaeseong Park

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ๋ถ„์‚ฐ ํ•™์Šต ์ž‘์—…์˜ ์ถ”์ ์„ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด๋ก ์  ์ถ”์  ๋ถ„์„(Holistic Trace Analysis, HTA)์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

HTA ์„ค์น˜ํ•˜๊ธฐ

HTA๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด Conda ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. Anaconda๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด `๊ณต์‹ Anaconda ๋ฌธ์„œ <https://docs.anaconda.com/anaconda/install/index.html>`_๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  1. pip๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTA ์„ค์น˜:

    pip install HolisticTraceAnalysis
  2. (์„ ํƒ์‚ฌํ•ญ์ด์ง€๋งŒ ๊ถŒ์žฅ) 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()

../_static/img/hta/temporal_breakdown_df.png

get_temporal_breakdown ํ•จ์ˆ˜์—์„œ visualize ์ธ์ˆ˜๋ฅผ ``True``๋กœ ์„ค์ •ํ•˜๋ฉด ๋žญํฌ๋ณ„ ๋ถ„์„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„๋„ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

../_static/img/hta/temporal_breakdown_plot.png

์œ ํœด ์‹œ๊ฐ„ ๋ถ„์„

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()

../_static/img/hta/idle_time_breakdown_percentage.png

์ด ํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ํŠœํ”Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์€ ๊ฐ ๋žญํฌ์˜ ๊ฐ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์œ ํœด ์‹œ๊ฐ„ ๋ฒ”์ฃผ๋ณ„ ์‹œ๊ฐ„์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

../_static/img/hta/idle_time.png

๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์€ `show_idle_interval_stats`๊ฐ€ `True`๋กœ ์„ค์ •๋˜์—ˆ์„ ๋•Œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์€ ๊ฐ ๋žญํฌ์˜ ๊ฐ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์œ ํœด ์‹œ๊ฐ„์˜ ์š”์•ฝ ํ†ต๊ณ„๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

../_static/img/hta/idle_time_summary.png

Tip

๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ํœด ์‹œ๊ฐ„ ๋ถ„์„์€ ๊ฐ ์œ ํœด ์‹œ๊ฐ„ ๋ฒ”์ฃผ์˜ ๋ฐฑ๋ถ„์œจ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. visualize_pctg ์ธ์ˆ˜๋ฅผ `False`๋กœ ์„ค์ •ํ•˜๋ฉด ํ•จ์ˆ˜๋Š” y์ถ•์— ์ ˆ๋Œ€ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ปค๋„ ๋ถ„์„

์ปค๋„ ๋ถ„์„ ๊ธฐ๋Šฅ์€ ๋ชจ๋“  ๋žญํฌ์—์„œ ํ†ต์‹ (COMM), ๊ณ„์‚ฐ(COMP), ๋ฉ”๋ชจ๋ฆฌ(MEM)์™€ ๊ฐ™์€ ๊ฐ ์ปค๋„ ์œ ํ˜•์— ๋Œ€ํ•ด ์‚ฌ์šฉ๋œ ์‹œ๊ฐ„์„ ๋ถ„์„ํ•˜๊ณ  ๊ฐ ๋ฒ”์ฃผ์—์„œ ์‚ฌ์šฉ๋œ ์‹œ๊ฐ„์˜ ๋น„์œจ์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ฐ ๋ฒ”์ฃผ์—์„œ ์‚ฌ์šฉ๋œ ์‹œ๊ฐ„์˜ ๋ฐฑ๋ถ„์œจ์„ ์›ํ˜• ์ฐจํŠธ๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค:

../_static/img/hta/kernel_type_breakdown.png

์ปค๋„ ๋ถ„์„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

analyzer = TraceAnalysis(trace_dir = "/path/to/trace/folder")
kernel_type_metrics_df, kernel_metrics_df = analyzer.get_gpu_kernel_breakdown()

ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์€ ์›ํ˜• ์ฐจํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ์›๋ž˜ ๊ฐ’์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ปค๋„ ๊ธฐ๊ฐ„ ๋ถ„ํฌ

get_gpu_kernel_breakdown ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์—๋Š” ๊ฐ ์ปค๋„์— ๋Œ€ํ•œ ๊ธฐ๊ฐ„ ์š”์•ฝ ํ†ต๊ณ„๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์ด๋Š” ๊ฐ ์ปค๋„์— ๋Œ€ํ•ด ๋žญํฌ๋ณ„๋กœ ์นด์šดํŠธ, ์ตœ์†Œ, ์ตœ๋Œ€, ํ‰๊ท , ํ‘œ์ค€ ํŽธ์ฐจ, ํ•ฉ๊ณ„, ๊ทธ๋ฆฌ๊ณ  ์ปค๋„ ์œ ํ˜•์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

../_static/img/hta/kernel_metrics_df.png

์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTA๋Š” ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ์‹œ๊ฐํ™”๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ฐ ๋žญํฌ๋ณ„๋กœ ๊ฐ ์ปค๋„ ์œ ํ˜•์— ๋Œ€ํ•œ ์ƒ์œ„ ์ปค๋„์˜ ์›ํ˜• ์ฐจํŠธ.
  2. ์ƒ์œ„ ์ปค๋„ ๋ฐ ๊ฐ ์ปค๋„ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ชจ๋“  ๋žญํฌ์— ๊ฑธ์นœ ํ‰๊ท  ๊ธฐ๊ฐ„์˜ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„.

../_static/img/hta/pie_charts.png

๋ชจ๋“  ์ด๋ฏธ์ง€๋Š” plotly๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„ ์œ„์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์šฐ์ธก ์ƒ๋‹จ์— ๋ชจ๋“œ ๋ฐ”๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ํ™•๋Œ€, ์ด๋™, ์„ ํƒ ๋ฐ ๊ทธ๋ž˜ํ”„ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์›ํ˜• ์ฐจํŠธ๋Š” ์ƒ์œ„ 5๊ฐœ์˜ ๊ณ„์‚ฐ, ํ†ต์‹ , ๋ฉ”๋ชจ๋ฆฌ ์ปค๋„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ฐ ๋žญํฌ์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ์›ํ˜• ์ฐจํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์›ํ˜• ์ฐจํŠธ๋Š” get_gpu_kernel_breakdown ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ num_kernels ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์œ„ k๊ฐœ์˜ ์ปค๋„์„ ๋ณด์—ฌ์ฃผ๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, duration_ratio ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์„๋  ์‹œ๊ฐ„์˜ ๋น„์œจ์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. num_kernels`์™€ `duration_ratio ๋ชจ๋‘ ์ง€์ •๋œ ๊ฒฝ์šฐ, `num_kernels`๊ฐ€ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.

../_static/img/hta/comm_across_ranks.png

์œ„์˜ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„๋Š” ๋ชจ๋“  ๋žญํฌ์— ๊ฑธ์นœ 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()

์ด ํ•จ์ˆ˜๋Š” ๊ฐ ๋žญํฌ์— ๋Œ€ํ•œ ์ค‘์ฒฉ ๋น„์œจ์„ ํฌํ•จํ•˜๋Š” ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

../_static/img/hta/overlap_df.png

visualize ์ธ์ž๊ฐ€ True๋กœ ์„ค์ •๋˜๋ฉด, get_comm_comp_overlap ํ•จ์ˆ˜๋Š” ๋˜ํ•œ ๋žญํฌ๋ณ„ ์ค‘์ฒฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

../_static/img/hta/overlap_plot.png

์ฆ๊ฐ•๋œ ์นด์šดํ„ฐ

๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ & ํ ๊ธธ์ด ์นด์šดํ„ฐ

๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ ์นด์šดํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ(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()

์ฆ๊ฐ•๋œ ์นด์šดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ์ƒ์„ฑ๋œ ์ถ”์  ํŒŒ์ผ์˜ ์Šคํฌ๋ฆฐ์ƒท.

../_static/img/hta/mem_bandwidth_queue_length.png

HTA๋Š” ๋˜ํ•œ ๋‹ค์Œ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœํŒŒ์ผ๋œ ์ฝ”๋“œ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ ๋Œ€์—ญํญ ๋ฐ ํ ๊ธธ์ด ์นด์šดํ„ฐ์˜ ์š”์•ฝ๊ณผ ์‹œ๊ณ„์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

์š”์•ฝ ๋ฐ ์‹œ๊ณ„์—ด์„ ๋ณด๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์„ธ์š”:

# ์š”์•ฝ ์ƒ์„ฑ
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๋ฒˆ์งธ ๋ฐฑ๋ถ„์œ„์ˆ˜๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

../_static/img/hta/queue_length_summary.png

์‹œ๊ณ„์—ด์€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ํฌ์ธํŠธ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ๊ฐ’์ด ๊ด€์ฐฐ๋˜๋ฉด ๋‹ค์Œ ์—…๋ฐ์ดํŠธ๊นŒ์ง€ ์‹œ๊ณ„์—ด์€ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ ๋ฐ ํ ๊ธธ์ด ์‹œ๊ณ„์—ด ํ•จ์ˆ˜๋Š” ํ‚ค๊ฐ€ ๋žญํฌ์ด๊ณ  ๊ฐ’์ด ๊ทธ ๋žญํฌ์— ๋Œ€ํ•œ ์‹œ๊ณ„์—ด์ธ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ, ์‹œ๊ณ„์—ด์€ ๋žญํฌ 0์— ๋Œ€ํ•ด์„œ๋งŒ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

CUDA ์ปค๋„ ์‹คํ–‰ ํ†ต๊ณ„

../_static/img/hta/cuda_kernel_launch.png

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()

์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ ์Šคํฌ๋ฆฐ์ƒท์€ ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

../_static/img/hta/cuda_kernel_launch_stats.png

CPU ์˜คํผ๋ ˆ์ด์…˜์˜ ์ง€์† ์‹œ๊ฐ„, GPU ์ปค๋„, ๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ ์ง€์—ฐ์„ ํ†ตํ•ด ๋‹ค์Œ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์งง์€ GPU ์ปค๋„ - GPU ์ปค๋„์˜ ์ง€์† ์‹œ๊ฐ„์ด ํ•ด๋‹น CPU ๋Ÿฐํƒ€์ž„ ์ด๋ฒคํŠธ๋ณด๋‹ค ์งง์€ ๊ฒฝ์šฐ.
  • ๋Ÿฐํƒ€์ž„ ์ด๋ฒคํŠธ ์ด์ƒ์น˜ - ๊ณผ๋„ํ•œ ์ง€์† ์‹œ๊ฐ„์„ ๊ฐ€์ง„ CPU ๋Ÿฐํƒ€์ž„ ์ด๋ฒคํŠธ.
  • ์‹คํ–‰ ์ง€์—ฐ ์ด์ƒ์น˜ - ์Šค์ผ€์ค„๋˜๊ธฐ๊นŒ์ง€ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” GPU ์ปค๋„.

HTA๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์„ธ ๊ฐ€์ง€ ์นดํ…Œ๊ณ ๋ฆฌ ๊ฐ๊ฐ์— ๋Œ€ํ•œ ๋ถ„ํฌ ํ”Œ๋กฏ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์งง์€ GPU ์ปค๋„

์ผ๋ฐ˜์ ์œผ๋กœ CPU ์ธก์—์„œ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์€ 5-20 ๋งˆ์ดํฌ๋กœ์ดˆ ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” GPU ์‹คํ–‰ ์‹œ๊ฐ„์ด ์‹คํ–‰ ์‹œ๊ฐ„๋ณด๋‹ค ๋” ์งง์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ž˜ํ”„๋Š” ์ด๋Ÿฌํ•œ ์‚ฌ๋ก€๊ฐ€ ์ฝ”๋“œ์—์„œ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

../_static/img/hta/short_gpu_kernels.png

๋Ÿฐํƒ€์ž„ ์ด๋ฒคํŠธ ์ด์ƒ์น˜

๋Ÿฐํƒ€์ž„ ์ด์ƒ์น˜๋Š” ์ด์ƒ์น˜๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ์ปท์˜คํ”„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค, ๋”ฐ๋ผ์„œ get_cuda_kernel_launch_stats API๋Š” ๊ฐ’์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ runtime_cutoff ์ธ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

../_static/img/hta/runtime_outliers.png

์‹คํ–‰ ์ง€์—ฐ ์ด์ƒ์น˜

์‹คํ–‰ ์ง€์—ฐ ์ด์ƒ์น˜๋Š” ์ด์ƒ์น˜๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ์ปท์˜คํ”„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค, ๋”ฐ๋ผ์„œ get_cuda_kernel_launch_stats API๋Š” ๊ฐ’์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ launch_delay_cutoff ์ธ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

../_static/img/hta/launch_delay_outliers.png

๊ฒฐ๋ก 

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ HTA๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. HTA๋Š” ๋ถ„์‚ฐ ํ•™์Šต ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์„ฑ๋Šฅ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. HTA ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ ˆ์ด์Šค ๋น„๊ต ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋” ๋ฐฐ์šฐ๋ ค๋ฉด, `Trace Diff using Holistic Trace Analysis <https://tutorials.pytorch.kr/beginner/hta_trace_diff_tutorial.html>`__๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.