Accelerate documentation
ð€ accelerate ã«ãããã·ãŒã±ã³ã¹äžŠå
ð€ accelerate ã«ãããã·ãŒã±ã³ã¹äžŠå
ãã®ã¬ã€ãã§ã¯ãð€accelerateã§ã·ãŒã±ã³ã¹äžŠåæ§ã䜿çšããåºæ¬çãªå
容ã«ã€ããŠèª¬æããŸãã
é¢é£æ§ã®éåžžã«é«ãContext Parallelismãåç §ããŠãã ããã
ãªãã·ãŒã±ã³ã¹äžŠåæ§ãå¿ èŠãªã®ã
å€§èŠæš¡èšèªã¢ãã«ããããŠæè¿ã®æšè«ã¢ãã«ã®ç»å Žã«ãããã·ãŒã±ã³ã¹é·ã¯æ¥éã«äŒžã³ãŠããŸããããã«ã¢ãã³ã·ã§ã³ã®äºæ¬¡çãªã¡ã¢ãªè€é床ãå ãã£ãããšã§ãé·ãã·ãŒã±ã³ã¹ãæã€ã¢ãã«ãèšç·Žããããã®ããå¹ççãªææ³ã®å¿
èŠæ§ãé«ãŸã£ãŠããŸãã
ã·ãŒã±ã³ã¹é·ã128kã®å Žåãããã©ãªã¢ãã³ã·ã§ã³å®è£
ãåæãšãããšãbf16粟床ã«ãããã¢ãã³ã·ã§ã³è¡åã®ã¡ã¢ãªèŠä»¶ã¯128k * 128k * 2 bytes * num_heads = ~32 GB * num_headsãšãªããŸãã確ãã«ããããã®ã¢ãã³ã·ã§ã³éã¿ãç©åããªãflash attentionãSDPAã䜿çšããã°ãã¡ã¢ãªäœ¿çšéã¯å€§å¹
ã«æžå°ããŸãããã¡ã¢ãªèŠä»¶ã®å¢å ã¯äŸç¶ãšããŠç¡èŠã§ããªãèŠæš¡ã§ãã
Ulysses Sequence parallelismã«ãããattentionèšç®ã®å ¥åãã·ãŒã±ã³ã¹æ¬¡å ã«æ²¿ã£ãŠã·ã£ãŒãåããattentionãéåžžéãèšç®ããªãããåGPUã§ã¯attentionãããã®äžéšã®ã¿ã䜿çšã§ããŸããããã«ãããããã€ãã®è¿œå ããŒã«ãçšããããšã§ã15M以äžã®ã·ãŒã±ã³ã¹é·ã«ã¹ã±ãŒã«ããŠã¢ãã«ããã¬ãŒãã³ã°ã§ããŸããUlysses SPã«TiledMLPãLiger-KernelãCPUãžã®Activation checkpoint offloadãããã³ãã®ä»ã®ããã€ãã®ãã¯ããã¯ãçµã¿åãããæ¹æ³ã«ã€ããŠã¯ãè«æArctic Long Sequence Training: Scalable And Efficient Training For Multi-Million Token Sequencesãåç §ããŠãã ããã
Ulysses SPãšFSDP CPã®éãã¯äœã§ãã
ããã¥ã¡ã³ãContext Parallelismã§ã¯ãã·ãŒã±ã³ã¹æ¬¡å ã§ã¹ã©ã€ã¹ããç¹ã¯ãã®æè¡ãšåæ§ã§ããããããæ¬¡å ã§ã®ã¹ã©ã€ã¹ã®ä»£ããã«Ring Attentionã䜿çšããå¥ã®æè¡ã§ããContext Parallelismã®ãããã€æ¹æ³ã«ã€ããŠåŠã¶ããšãã§ããŸãã
以äžã®èšäºã§ã¯ã2ã€ã®æè¡ã®éãã«ã€ããŠéåžžã«è©³çްã«èª¬æããŠããŸãã
- 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ã®æ°ã«å¶çŽãããããããããã¯ãŒã¯ããããžãŒã«å¯ŸããŠç¹å®ã®èŠä»¶ïŒåäžã®ã¬ããªã«ã«ã€ããŠãattention headsã®æ°ãåå ããGPUã®æ°ã§å²ãåããããšïŒããããŸããAll-to-alléä¿¡ã¯ã¬ã€ãã³ã·ã«ææã§ãããDeepspeedãå¿ èŠã§ãã
- FSDP CP Ring-Attentionã®P2Pãªã³ã°éä¿¡ã«ã¯ãåè¿°ã®å²ãåããèŠä»¶ã¯ãããŸããããéä¿¡éãå€ããªããŸãã
æåŸã«ãè«æUSP: A Unified Sequence Parallelism Approach for Long Context Generative AIã§èª¬æãããŠããããã«ãSP + CPãçµã¿åãããããšã§ãããã«é·ãã·ãŒã±ã³ã¹é·ããµããŒãã§ããããã«ãªãã¯ãã§ãããã ããããã¯ãŸã ð€accelerateã«çµ±åãããŠããŸããã
ãµããŒããããŠããã·ãŒã±ã³ã¹äžŠååããã¯ãšã³ã
çŸåšãã·ãŒã±ã³ã¹äžŠååã®ããã¯ãšã³ããšããŠå©çšå¯èœãªãã®ã¯deepspeedã®ã¿ã§ããããã¯ãArctic Long Sequence Training technologyã®äžéšã§ããã¢ãã³åããã Ulysses SP ã«ç±æ¥ããŠããŸãããèªèº«ã®ã³ãŒãã«çŽæ¥çµ±åãããå Žåã¯ããã¥ãŒããªã¢ã«ãçšæãããŠããŸãã
ã·ãŒã±ã³ã¹äžŠåæ§ã䜿çšããã«ã¯ã©ãããã°ããã§ããïŒ
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ã§ããããšã確èªããå¿ èŠããããŸããäŸãã°ã8ã€ã®GPUã§sp_size=8ã®å Žåãdp_shard_size=1ãå¿ èŠã§ãïŒ1 à 1 à 8 = 8ã®ããïŒã4ã€ã®GPUã§sp_size=2ã®å Žåã2D䞊ååã®ããã«dp_shard_size=2ã䜿çšã§ããŸãïŒ1 à 2 à 2 = 4ã®ããïŒã
ALST/Ulysses SPããã¯ãšã³ãã®æ§æ
ALST/UlyssesSP ã¯ããã®è«æã§èª¬æãããŠããããã«ãã¢ãã³ã·ã§ã³ãããäžŠåæ§ãçšããŠã·ãŒã±ã³ã¹äžŠåæ§ãå®è£ ããŠããŸãã簡䟿ãã®ãããã·ãŒã±ã³ã¹äžŠåæ§ã®æŠå¿µãšã»ããã¢ãããåå©çšããŸããããŠãŒã¶ãŒã®èŠç¹ããã¯åãã§ã: è€æ°ã® GPU ã 1 ã€ã®ãããã®åŠçã«äœ¿çšãããŸãã
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ã®å€ã¯ã·ãŒã±ã³ã¹äžŠå床ã§å²ãåããå€ã«èšå®ããããå šãèšå®ããªããŠãæ§ããŸããããã®å Žåãåforwardã«ãããŠã·ãŒã±ã³ã¹å€æ°ã¯å ¥åããå°åºãããŸããFalseã®å Žåãseq_lengthã¯ãããã®ã·ãŒã±ã³ã¹é·æ¬¡å ãšäžèŽããå¿ èŠãããããã®æ¬¡å ã¯åžžã«åãã«ãªãããããã£ã³ã°ããå¿ èŠããããŸããããã©ã«ãã¯Trueã§ããsp_attn_implementationã¯sdpaãflash_attention_2ããŸãã¯flash_attention_3ã®ããããã§ãããã®ã·ãŒã±ã³ã¹äžŠåå®è£ ã¯attention_maskã®ä»£ããã«position_idsã䜿çšãããããeagerã¯position_idsã§ã®åäœããµããŒããããŸã§ããã§ã¯æ©èœããŸããããŸããsdpaã¯è€æ°ã®ãµã³ãã«ã1ã€ã«çµåããå Žåãæ£ããåŠçããªãç¹ã«ã泚æãã ãããçµåããããµã³ãã«å šäœã1ã€ãšããŠã¢ãã³ã·ã§ã³ãè¡ããŸãããµã³ãã«ãçµåãããŠããªãå Žåã¯ã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 ã®èšå®ãã¡ã€ã«åœ¢åŒã§èšå®ããããšãã§ããŸããäŸãã°ã2 ã€ã® GPU ã®å Žå:
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ã·ãŒã±ã³ã¹äžŠååã¯éåžžãããŒã¿äžŠååãšéããŠé©çšãããŸããã€ãŸããåãã©ã³ã¯ããŠããŒã¯ãªããŒã¿ã¹ããªãŒã ãäŸçµŠãã圹å²ãšãUlyssesã·ãŒã±ã³ã¹äžŠååã®å®è¡ãå ŒããŸããããããæ¬¡ã®ããã«ã¬ããªã«ãäœæããããšãã§ããŸãã
# 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ã€èšå®ããŠããŸããããŒã¿äžŠåæ§ãé§åããã®ã¯Deepspeed-ZeROã§ãã
UlyssesSPDataLoaderAdapter ã®å
éšã«ã¯å€ãã®åŠçãé ãããŠããŸããããã¯è£åŽã§åäœããå
ã® DataLoader ãªããžã§ã¯ããã©ããããŸãããåé¡ãçºçããå Žåã«åããŠããã®ååšãèªèããŠããããšããå§ãããŸãããŸããããããåå ããã©ã³ã¯éã§ã·ã£ãŒãåãããåã«ããããèŸæžã«æ£ãã 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 ããããã«ååšããå Žåãã¢ãã«ã¯ãããèªåçã«åŠçããç¹ã«æ³šæããŠãã ãããã¢ãã«ã®ãã©ã¯ãŒããã¹ã¯**kwargs ãä»ããŠshift_labels ãåãåããæå€±é¢æ°ã«æž¡ããŸããããã«ãããã·ãŒã±ã³ã¹äžŠåæ§ã«å¯Ÿããæå€±ãæ£ããèšç®ãããŸããLiger Kernel ã䜿çšããå Žåããshift_labels ãã·ãŒã ã¬ã¹ã«åŠçããéåžžã«ã¡ã¢ãªå¹çã®é«ãæ¹æ³ã§æå€±ãèšç®ããŸããLiger ã¯é·ãã·ãŒã±ã³ã¹é·ã«å¯ŸããŠåŒ·ãæšå¥šãããŸããããã¯ãèåæŒç®ïŒã¡ã¢ãªã«å®å
šãª logits ãã³ãœã«ããããªã¢ã©ã€ãºããªãèå logits-loss èšç®ãªã©ïŒã䜿çšããããšã§ GPU ã¡ã¢ãªãè§£æŸããããã§ãã
HF Accelerate ãè£ã§ã©ã®ãããªåŠçãè¡ã£ããã確èªãããå Žåã¯ããã®å®å šãªçµ±åãã¥ãŒããªã¢ã«ããèªã¿ãã ããã
ALST/UlyssesSPãæå¹ã«ããAccelerateã®ãã¬ãŒãã³ã°ã«ãŒãã®äŸã«ã€ããŠã¯ãexamples/alst_ulysses_sequence_parallelismãåç §ããŠãã ããã
[!Warning]
ãã®APIã¯éåžžã«æ°ããããŸã å®é𿮵éã«ãããŸããå®å®ããAPIã®æäŸã«åªããŠããŸããããããªãã¯APIã®äžéšãå°æ¥å€æŽãããå¯èœæ§ããããŸãã
ããã¯Deepspeedããã¯ãšã³ãã§ãããããéåžžã®Deepspeedèšå®ãé©çšãããŸãããã®ãããã·ãŒã±ã³ã¹äžŠåæ§ããªããã£ãã€ã¶ç¶æ ããã³/ãŸãã¯éã¿ã®ãªãããŒããšçµã¿åãããããšã§ãããå€ãã®GPUã¡ã¢ãªãè§£æŸããããã«é·ãã·ãŒã±ã³ã¹é·ãæå¹ã«ã§ããŸãããã®æè¡ã¯ãDeepSpeed ZeROã¹ããŒãž2ããã³3ã§åäœããããšããã¹ããããŠããŸãã
Update on GitHub