Accelerate documentation
๐ค accelerate์ ์ํ์ค ๋ณ๋ ฌ
๐ค accelerate์ ์ํ์ค ๋ณ๋ ฌ
์ด ๊ฐ์ด๋์์๋ ๐คaccelerate์์ ์ํ์ค ๋ณ๋ ฌ์ฑ์ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์ฌํญ์ ๋ค๋ฃน๋๋ค.
๋งค์ฐ ๊ด๋ จ์ด ์๋ Context Parallelism๋ ์ฐธ๊ณ ํ์ธ์.
์ ์ํ์ค ๋ณ๋ ฌ์ฑ์ธ๊ฐ?
๋ํ ์ธ์ด ๋ชจ๋ธ, ๊ทธ๋ฆฌ๊ณ ์ต๊ทผ์๋ ์ถ๋ก ๋ชจ๋ธ์ ๋ฑ์ฅ์ผ๋ก ์ํ์ค ๊ธธ์ด๊ฐ ๋น ๋ฅด๊ฒ ์ฆ๊ฐํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์ attention์ 2์ฐจ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ก๋๊ฐ ๋ํด์ง๋ฉด์, ๊ธด ์ํ์ค๋ก ๋ชจ๋ธ์ ํ์ตํ๋ ๋ ํจ์จ์ ์ธ ๋ฐฉ์์ ๋ํ ํ์์ฑ์ด ์ปค์ก์ต๋๋ค.
์ํ์ค ๊ธธ์ด๊ฐ 128k์ผ ๋, vanilla attention ๊ตฌํ์ ๊ฐ์ ํ๋ฉด bf16 ์ ๋ฐ๋์์ attention matrix์ ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ๋์ 128k * 128k * 2 bytes * num_heads = ~32 GB * num_heads์
๋๋ค. ๋ฌผ๋ก , ์ด๋ฌํ attention ๊ฐ์ค์น๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์์ฑํ์ง ์๋ flash attention๋ SDPA๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ํฌ๊ฒ ์ค์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ๋์ ์ฆ๊ฐ ํญ์ ์ฌ์ ํ ์๋นํฉ๋๋ค.
Ulysses Sequence parallelism์ attention ๊ณ์ฐ์ ์ ๋ ฅ์ ์ํ์ค ์ฐจ์๋ณ๋ก ์ค๋ฉํ๊ณ , ๊ฐ GPU์์ attention head์ ์ผ๋ถ๋ง ์ฌ์ฉํ์ฌ attention์ ์ ์์ ์ผ๋ก ๊ณ์ฐํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ช ๊ฐ์ง ์ถ๊ฐ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ 15M+ ์ํ์ค ๊ธธ์ด์ ์ค์ผ์ผ๋งํ์ฌ ๊ธด ์ํ์ค๋ฅผ ๊ฐ์ง ๋ชจ๋ธ์ ํ์ตํ ์ ์์ต๋๋ค. Ulysses SP์ TiledMLP, Liger-Kernel, Activation checkpoint offload to cpu ๋ฐ ๊ธฐํ ๋ช ๊ฐ์ง ํธ๋ฆญ์ ๊ฒฐํฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ๋ค์ ๋ ผ๋ฌธ์ ์ฐธ๊ณ ํ์ธ์: Arctic Long Sequence Training: Scalable And Efficient Training For Multi-Million Token Sequences.
Ulysses SP์ FSDP CP์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
Context Parallelism ๋ฌธ์์์๋ ์ํ์ค ์ฐจ์์ ์ฌ๋ผ์ด์คํ๋ ํค๋ ์ฐจ์ ์ฌ๋ผ์ด์ฑ ๋์ Ring Attention์ ์ฌ์ฉํ๋ ๋ ๋ค๋ฅธ ๊ธฐ์ ์ธ Context Parallelism์ ๋ฐฐํฌ์ ๋ํด ๋ฐฐ์ธ ์ ์์ต๋๋ค.
๋ค์ ๊ธ์์๋ ๋ ๊ธฐ์ ์ ์ฐจ์ด๋ฅผ ๋งค์ฐ ์์ธํ๊ฒ ์ค๋ช ํฉ๋๋ค:
- https://insujang.github.io/2024-01-11/tensor-parallelism-and-sequence-parallelism-detailed-analysis/
- https://huggingface.co/blog/exploding-gradients/ulysses-ring-attention
ํ ๊ธฐ์ฌ์ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ฌ ๊ฐ๋จํ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Ulysses SP๋ ํต์ ์ค๋ฒํค๋๊ฐ ์๋์ ์ผ๋ก ๋ฎ์ง๋ง, Attention Heads์ ์์ ์ํด ์ ํ๋๋ฏ๋ก ๋คํธ์ํฌ ํ ํด๋ก์ง(๋จ์ผ ๋ฆฌํ๋ฆฌ์นด์ ์ฐธ์ฌํ๋ GPU ์๋ก attention heads์ ์๊ฐ ๋๋์ด์ ธ์ผ ํจ)์ ๋ํด ํน์ ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค. All-to-all ํต์ ์ ์ง์ฐ ์๊ฐ์ ๋ฏผ๊ฐํ๋ฉฐ Deepspeed๊ฐ ํ์ํฉ๋๋ค.
- FSDP CP Ring-Attention์ P2P ๋ง ํต์ ์ aforementioned ๊ฐ๋ถ์ฑ ์๊ตฌ์ฌํญ์ด ์์ง๋ง, ํต์ ๋์ด ๋ ๋์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, USP: A Unified Sequence Parallelism Approach for Long Context Generative AI ๋
ผ๋ฌธ์์ ์ค๋ช
ํ ๋๋ก SP + CP๋ฅผ ๊ฒฐํฉํ์ฌ ๋ ๊ธด ์ํ์ค ๊ธธ์ด๋ฅผ ์ง์ํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. ๋ค๋ง, ์ด ๊ธฐ๋ฅ์ ์์ง ๐คaccelerate์ ํตํฉ๋์ง ์์์ต๋๋ค.
์ง์๋๋ ์ํ์ค ๋ณ๋ ฌ์ฑ ๋ฐฑ์๋
ํ์ฌ ์ ์ผํ ์ํ์ค ๋ณ๋ ฌ์ฑ ๋ฐฑ์๋๋ deepspeed์
๋๋ค. ์ด๋ Arctic Long Sequence Training ๊ธฐ์ ์ ์ผ๋ถ์ธ ํ๋ํ๋ Ulysses SP์์ ํ์๋์์ต๋๋ค. ์ง์ ์์ฒด ์ฝ๋์ ํตํฉํ๋ ค๋ ๊ฒฝ์ฐ๋ฅผ ์ํด ํํ ๋ฆฌ์ผ๋ ์ ๊ณต๋ฉ๋๋ค.
์ํ์ค ๋ณ๋ ฌ์ฑ(sequence parallelism)์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
from accelerate.utils import ParallelismConfig, DeepSpeedSequenceParallelConfig
+# Example: 4 GPUs with sp_size=4, dp_shard_size=1
+# Ensure: dp_replicate_size ร dp_shard_size ร sp_size = 1 ร 1 ร 4 = 4 GPUs
parallelism_config = ParallelismConfig(
+ sp_backend="deepspeed",
+ sp_size=4,
+ dp_shard_size=1, # Explicit: no data parallelism
+ sp_handler=DeepSpeedSequenceParallelConfig(
+ sp_seq_length_is_variable: true,
+ sp_attn_implementation="sdpa",
+ ),
+ )
accelerator = Accelerator(
...,
parallelism_config=parallelism_config,
)๐คaccelerate์ ๋ค๋ฅธ ๋ชจ๋ ๊ธฐ๋ฅ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, accelerate launch์ ํด๋น ํ๋๊ทธ๋ฅผ ์ ๋ฌํ์ฌ ์ํ์ค ๋ณ๋ ฌ์ฑ๋ ํ์ฑํํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค:
accelerate launch --parallelism-config-sp-size 8 ...
sp_size๋ฐ ๊ธฐํ ๊ตฌ์ฑ์accelerate config๋ช ๋ น์์ ์ค์ ํ ์๋ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉดaccelerate๊ตฌ์ฑ ํ์ผ์ ์ ์ฅ๋์ด ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋๋ง๋ค ๋งค๋ฒ ์ ๋ฌํ ํ์๊ฐ ์์ต๋๋ค.
sequence parallelism์ data parallelism๊ณผ ๊ฒฐํฉ๋ฉ๋๋ค. ์ถ๊ฐ GPU๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ 8๊ฐ์ GPU๊ฐ ์๋ ๊ฒฝ์ฐ
--parallelism-config-dp-shard-size 8 --parallelism-config-sp-size 8์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ParallelismConfigํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ค์ ํ ์๋ ์์ต๋๋ค.์ค์:
dp_replicate_size ร dp_shard_size ร sp_size = num_processes๋ฅผ ๋ฐ๋์ ํ์ธํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, GPU 8๊ฐ์sp_size=8๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐdp_shard_size=1์ด ํ์ํฉ๋๋ค(1 ร 1 ร 8 = 8). GPU 4๊ฐ์sp_size=2๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ 2D ๋ณ๋ ฌํ๋ฅผ ์ํดdp_shard_size=2๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค(1 ร 2 ร 2 = 4).
ALST/Ulysses SP ๋ฐฑ์๋ ๊ตฌ์ฑ
ALST/UlyssesSP์ ์ด ๋ ผ๋ฌธ์์ ์ค๋ช ๋ ๋๋ก ์ดํ ์ ํค๋ ๋ณ๋ ฌ์ฑ์ ์ฌ์ฉํ์ฌ ์ํ์ค ๋ณ๋ ฌ์ฑ์ ๊ตฌํํฉ๋๋ค. ๋จ์ํ๋ฅผ ์ํด ์ํ์ค ๋ณ๋ ฌ์ฑ์ ๊ฐ๋ ๊ณผ ์ค์ ์ ์ฌ์ฌ์ฉํ๋ฉฐ, ์ฌ์ฉ์ ๊ด์ ์์๋ ๋์ผํฉ๋๋ค. ์ฌ๋ฌ GPU๊ฐ ๋จ์ผ ๋ฐฐ์น ์ฒ๋ฆฌ์ ์ฌ์ฉ๋ฉ๋๋ค.
ALST๊ฐ ์ด๋ค ๊ฐ๋ฅ์ฑ์ ์ด์ด์ฃผ์๋์ง ๊ฐ์ ์ก๊ธฐ ์ํด, ์ด ๊ธฐ์ ๋๋ถ์ ๋จ์ผ H100 GPU์์ 500K ํ ํฐ, ๋จ์ผ ๋ ธ๋์์ 3.7M ํ ํฐ, ๊ทธ๋ฆฌ๊ณ Llama-8B ๋ชจ๋ธ์ ๊ฒฝ์ฐ ๋ ธ๋ 4๊ฐ๋ง์ผ๋ก 15M ํ ํฐ๊น์ง bf16์ผ๋ก ํ์ตํ ์ ์์์ต๋๋ค. HF Accelerate์ ์ด ๊ธฐ๋ฅ์ ALST์ 3๊ฐ์ง ๊ตฌ์ฑ ์์ ์ค 1๊ฐ๋ง ํ์ฑํํ๋ฏ๋ก, ๋ฌ์ฑ ๊ฐ๋ฅํ ์ํ์ค ๊ธธ์ด๋ ๋ ์งง์์ง๋๋ค. ALST์ ์ ์ฒด ์ฑ๋ฅ์ ๋ฐํํ๋ ค๋ฉด TiledMLP, CPU๋ก์ Activation checkpoint offload ๋ฐ ๊ธฐํ ๋ช ๊ฐ์ง ์ค์ ์ ํ์ฑํํด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ด ํํ ๋ฆฌ์ผ์ ์ฐธ๊ณ ํ์ธ์.
deepspeed ๋ฐฑ์๋๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด:
# Example: 4 GPUs with sp_size=4, dp_shard_size=1
# Ensure: dp_replicate_size ร dp_shard_size ร sp_size = 1 ร 1 ร 4 = 4 GPUs
parallelism_config = ParallelismConfig(
sp_backend="deepspeed",
sp_size=4,
dp_shard_size=1, # Explicit: no data parallelism
sp_handler=DeepSpeedSequenceParallelConfig(
sp_seq_length=256,
sp_seq_length_is_variable=True,
sp_attn_implementation="sdpa",
),
)
accelerator = Accelerator(
...,
parallelism_config=parallelism_config,
)sp_backend: ์ฌ๊ธฐ์๋deepspeed๋ก ์ค์ sp_size๋ ์ํ์ค ๋ณ๋ ฌ๋์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ฉฐ, ์์ ์์์์๋ 4์ด๋ฏ๋ก ๋จ์ผ ๋ฐฐ์น ์ฒ๋ฆฌ์ 4๊ฐ์ GPU๊ฐ ์ฌ์ฉ๋ฉ๋๋ค(๋์ผํ GPU์์ DP=4๋ฅผ ์ํํ๋ ๋์).sp_seq_length์sp_seq_length_is_variable์ ์ํ์ค ๊ธธ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.sp_seq_length_is_variable=True์ธ ๊ฒฝ์ฐ ๋ฐฑ์๋๋ ๋ฐฐ์น ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์๋ ์ํ์ค ๊ธธ์ด๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ, ์ด๋sp_seq_length๊ฐ์ ์ํ์ค ๋ณ๋ ฌ๋(sequence parallel degree)๋ก ๋๋์ด ๋จ์ด์ง๋ ๊ฐ์ผ๋ก ์ค์ ํ๊ฑฐ๋ ์์ ์ค์ ํ์ง ์์ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ชจ๋forward์์ ์ํ์ค ๋ณ์๊ฐ ์ ๋ ฅ์ผ๋ก๋ถํฐ ์ ๋๋ฉ๋๋ค.False์ธ ๊ฒฝ์ฐseq_length๋ ๋ฐฐ์น์ ์ํ์ค ๊ธธ์ด ์ฐจ์๊ณผ ์ผ์นํด์ผ ํ๋ฉฐ, ์ด๋ ํญ์ ๋์ผํ๋๋ก ํจ๋ฉ๋์ด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์True์ ๋๋ค.sp_attn_implementation์sdpa,flash_attention_2,flash_attention_3์ค ํ๋์ ๋๋ค. ์ด ์ํ์ค ๋ณ๋ ฌ ๊ตฌํ์attention_mask๋์position_ids๋ฅผ ์ฌ์ฉํ๋ฏ๋ก,eager๋position_ids๋ฅผ ์ง์ํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๋๊น์ง ์ฌ๊ธฐ์ ์๋ํ์ง ์์ต๋๋ค. ๋ํ,sdpa๋ ์ฌ๋ฌ ์ํ์ด ํ๋๋ก ๊ฒฐํฉ๋ ๊ฒฝ์ฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ฉฐ, ์ ์ฒด ์ํ์ ํ๋๋ก ์ทจ๊ธํ์ฌ ์ดํ ์ ์ ์ํํฉ๋๋ค. ์ํ์ด ๊ฒฐํฉ๋์ง ์์ ๊ฒฝ์ฐsdpa๋ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค. ๋ฐ๋ผ์ ํญ์ ์๋ํ๋ Flash Attention์ด ์ด์์ ์ธ ์ ํ์ ๋๋ค.
DeepSpeedSequenceParallelConfig ๊ฐ์ฒด์ ์ด๋ฌํ ๊ฐ์ ์ค์ ํ๋ ๋์ , ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์๋ ๋ชฉ๋ก์ ๋๊ณผ ๋์ํ๋ ํ๊ฒฝ ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
PARALLELISM_CONFIG_SP_BACKENDPARALLELISM_CONFIG_SP_SEQ_LENGTHPARALLELISM_CONFIG_SP_SEQ_LENGTH_IS_VARIABLEPARALLELISM_CONFIG_SP_ATTN_IMPLEMENTATION
์ฝ๋์์ ์ ๋ฌํ์ง ์์ ๊ฒฝ์ฐ, sp_size๋ --parallelism_config_sp_size CLI ์ธ์๋ฅผ ํตํด ์ค์ ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ธ์๋ค๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๋ํ, accelerate config ํ์ผ ์คํ์ผ์ ์ค์ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, GPU 2๊ฐ์ ๊ฒฝ์ฐ:
distributed_type: DEEPSPEED
deepspeed_config:
deepspeed_config_file: path/to/ds_config.json
machine_rank: 0
num_machines: 1
num_processes: 2
parallelism_config:
parallelism_config_dp_replicate_size: 1
parallelism_config_dp_shard_size: 1 # Must satisfy: 1 ร 1 ร 2 = 2 num_processes
parallelism_config_sp_size: 2
parallelism_config_sp_backend: deepspeed
parallelism_config_sp_seq_length_is_variable: true
parallelism_config_sp_attn_implementation: sdpa
์์ ์ธ๊ธํ๋ฏ์ด Ulysses sequence parallelism์ ์ผ๋ฐ์ ์ผ๋ก data parallelism๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ๋์ผํ rank๊ฐ ๊ณ ์ ํ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ณต๊ธํ๋ ๋ฐ ์ฌ์ฉ๋๊ณ , ๋์์ Ulysses Sequence Parallelism์ ์ํํฉ๋๋ค. ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ๋ฆฌํ๋ฆฌ์นด๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค:
# Example: 4 GPUs with 2D parallelism (SP=2, DP=2)
# Ensure: dp_replicate_size ร dp_shard_size ร sp_size = 2 ร 1 ร 2 = 4 GPUs
parallelism_config = ParallelismConfig(
dp_replicate_size=2,
dp_shard_size=1, # Explicit: no sharding within replicas
sp_size=2,
sp_backend="deepspeed",
sp_handler=DeepSpeedSequenceParallelConfig(...),
)์ฌ๊ธฐ์๋ 4๊ฐ์ GPU๋ฅผ 2๊ฐ์ sequence parallelism ๋ ํ๋ฆฌ์นด๋ก ์ฌ์ฉํฉ๋๋ค. ๋ฐ์ดํฐ ๋ณ๋ ฌ์ฑ์ Deepspeed-ZeRO๊ฐ ๋ด๋นํฉ๋๋ค.
UlyssesSPDataLoaderAdapter ๋ด๋ถ์๋ ๋ง์ ๋ง๋ฒ์ด ์จ๊ฒจ์ ธ ์์ต๋๋ค. ์ด ํด๋์ค๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋์ํ๋ฉฐ ์๋์ DataLoader ๊ฐ์ฒด๋ฅผ ๋ํํ์ง๋ง, ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ธ์งํ๊ณ ์์ด์ผ ํฉ๋๋ค. ๋ํ, ๋ฐฐ์น์ ์ฐธ์ฌํ๋ ๊ฐ rank๋ก ์ค๋ฉ์ด ์ํ๋๊ธฐ ์ ์ ๋ฐฐ์น ์ฌ์ ์ ์ฌ๋ฐ๋ฅธ shift_labels๋ฅผ ์๋์ผ๋ก ์ฃผ์
ํฉ๋๋ค.
์ด์ ALST/UlyssesSP๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋จ์ ๋ง์ง๋ง ๋จ๊ณ๋, ๊ทธ๋๋์ธํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ณ์ฐํ๊ธฐ ์ํด ๋ค๋ฅธ ๊ฐ๋ณ all_gather๋ฅผ ์ฌ์ฉํ์ฌ ๋ญํฌ ๊ฐ ์์ค์ ์ง๊ณํ๋ ๊ฒ์
๋๋ค. ๋ค์ ์ฝ๋๋ ์ด๋ฅผ ์ํํ๋ฉฐ, -100์ผ๋ก ๋ง์คํน๋ ํ ํฐ์ ์ ์ธํ์ฌ ์ฌ๋ฐ๋ฅธ ํ๊ท ์ ์ป์ต๋๋ค:
sp_size = parallelism_config.sp_size if parallelism_config is not None else 1
if sp_size > 1:
sp_group = accelerator.torch_device_mesh["sp"].get_group()
sp_world_size = parallelism_config.sp_size
# Normal training loop
for iter, batch in enumerate(dl):
optimizer.zero_grad()
batch = move_to_device(batch, model.device)
# The model automatically receives shift_labels via **kwargs and uses it for loss computation.
# Both standard transformers models and Liger-patched models handle this correctly.
outputs = model(**batch)
loss = outputs.loss
shift_labels = batch["shift_labels"]
if sp_size > 1:
# differentiable weighted per-shard-loss aggregation across ranks
losses_per_rank = torch.distributed.nn.functional.all_gather(loss, group=sp_group)
# special dealing with SFT that has prompt tokens that aren't used in loss computation
good_tokens = (shift_labels != -100).view(-1).sum()
good_tokens_per_rank = torch.distributed.nn.functional.all_gather(
good_tokens, group=sp_group
)
# Skip ranks with zero valid tokens to avoid NaN contamination (NaN * 0 = NaN)
total_loss = sum(
losses_per_rank[rank] * good_tokens_per_rank[rank]
for rank in range(sp_world_size)
if good_tokens_per_rank[rank] > 0
)
total_good_tokens = sum(good_tokens_per_rank)
loss = total_loss / max(total_good_tokens, 1)
if rank == 0: accelerator.print(f"{iter}: {loss=}")
accelerator.log(dict(train_loss=loss, step=iter))
accelerator.backward(loss)
optimizer.step()shift_labels๊ฐ ๋ฐฐ์น์ ์กด์ฌํ๋ ๊ฒฝ์ฐ ๋ชจ๋ธ์ด ์ด๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค๋ ์ ์ ์ ์ํ์ธ์. ๋ชจ๋ธ์ forward pass๋ **kwargs๋ฅผ ํตํด shift_labels๋ฅผ ์์ ํ์ฌ ์์ค ํจ์๋ก ์ ๋ฌํ๊ณ , ์์ค ํจ์๋ ์ํ์ค ๋ณ๋ ฌ์ฑ์ ๋ํด ์์ค์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ณ์ฐํฉ๋๋ค. Liger Kernel์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ shift_labels๋ฅผ ์ํํ๊ฒ ์ฒ๋ฆฌํ๋ฉฐ, ๋งค์ฐ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ์์ค์ ๊ณ์ฐํฉ๋๋ค. Liger๋ ์ตํฉ ์ฐ์ฐ(์: ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฒด logits ํ
์๋ฅผ ์ ๋ ์์ฑํ์ง ์๋ ์ตํฉ logit-loss ๊ณ์ฐ)์ ์ฌ์ฉํ์ฌ GPU ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๋ฏ๋ก ๊ธด ์ํ์ค ๊ธธ์ด์ ๋ํด ๊ฐ๋ ฅํ ๊ถ์ฅ๋ฉ๋๋ค.
HF Accelerate๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ํํ ์์ ์ ํ์ธํ๋ ค๋ฉด ์ด ์ ์ฒด ํตํฉ ํํ ๋ฆฌ์ผ์ ์ฝ์ด๋ณด์ธ์.
ALST/UlyssesSP๊ฐ ํ์ฑํ๋ Accelerate ํ์ต ๋ฃจํ์ ์์ ๋ examples/alst_ulysses_sequence_parallelism๋ฅผ ์ฐธ๊ณ ํ์ธ์.
[!๊ฒฝ๊ณ ]
์ด API๋ ๋น๊ต์ ์ ๊ท์ด๋ฉฐ ์์ง ์คํ ๋จ๊ณ์ ์์ต๋๋ค. ์์ ์ ์ธ API๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ง๋ง, ๊ณต๊ฐ API์ ์ผ๋ถ ์ธ๋ถ ์ฌํญ์ ํฅํ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ Deepspeed ๋ฐฑ์๋์ด๋ฏ๋ก ์ผ๋ฐ์ ์ธ Deepspeed ๊ตฌ์ฑ์ด ์ ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ํ์ค ๋ณ๋ ฌ์ฑ์ ์ตํฐ๋ง์ด์ ์ํ ๋ฐ/๋๋ ๊ฐ์ค์น ์คํ๋ก๋ฉ๊ณผ ๊ฒฐํฉํ์ฌ ๋ ๋ง์ GPU ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๊ณ ๋ ๊ธด ์ํ์ค ๊ธธ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๊ธฐ์ ์ DeepSpeed ZeRO stage 2 ๋ฐ 3๊ณผ ํจ๊ป ์๋ํ๋๋ก ํ ์คํธ๋์์ต๋๋ค.
Update on GitHub