Diffusers documentation

병렬성

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

병렬성

병렬화 전략은 계산을 여러 장치에 분산시켜 추론/학습 시간을 단축함으로써 diffusion transformer의 속도를 높이는 데 도움이 됩니다. 자세한 내용은 Distributed inference 가이드를 참고하세요.

ParallelConfig

클래스 diffusers.ParallelConfig

< >

( context_parallel_config: diffusers.models._modeling_parallel.ContextParallelConfig | None = Nonetensor_parallel_config: diffusers.models._modeling_parallel.TensorParallelConfig | None = None_rank: int = None_world_size: int = None_device: device = None_mesh: DeviceMesh = None )

매개변수

  • context_parallel_config (ContextParallelConfig, 선택 사항) — 컨텍스트 병렬성을 위한 설정입니다.
  • tensor_parallel_config (TensorParallelConfig, 선택 사항) — 텐서 병렬화를 위한 설정입니다.

서로 다른 병렬성을 적용하기 위한 구성

ContextParallelConfig

class diffusers.ContextParallelConfig

< >

( ring_degree: int | None = Noneulysses_degree: int | None = Noneconvert_to_fp32: bool = Truerotate_method: typing.Literal['allgather', 'alltoall'] = 'allgather'mesh: typing.Optional[torch.distributed.device_mesh.DeviceMesh] = Noneulysses_anything: bool = Falsering_anything: bool = False_rank: int = None_world_size: int = None_device: device = None_mesh: DeviceMesh = None_flattened_mesh: DeviceMesh = None_ring_mesh: DeviceMesh = None_ulysses_mesh: DeviceMesh = None_ring_local_rank: int = None_ulysses_local_rank: int = None )

매개변수

  • ring_degree (int, 선택 사항, 기본값 1) — Ring Attention에 사용할 장치의 수입니다. 시퀀스는 장치 간에 분할됩니다. 각 장치는 링을 따라 순차적으로 전달되는 로컬 Q와 KV 청크 간의 attention을 계산합니다. 메모리 사용량이 낮아(한 번에 KV의 1/N만 보유), 계산과 통신이 오버랩되지만, 모든 토큰을 확인하려면 N번의 반복이 필요합니다. 메모리/대역폭이 제한된 긴 시퀀스에 가장 적합합니다. 컨텍스트 병렬 영역 내에서 ring attention에 사용할 장치의 수입니다. 컨텍스트 병렬 메시의 총 장치 수의 약수여야 합니다.
  • ulysses_degree (int, 선택 사항, 기본값 1) — Ulysses Attention에 사용할 장치의 수입니다. 시퀀스는 장치 간에 분할됩니다. 각 장치는 로컬 QKV를 계산한 후, 모든 KV 청크를 all-gather하여 한 번의 패스에서 전체 attention을 계산합니다. 메모리 사용량이 높으며(모든 KV를 저장), 높은 대역폭의 all-to-all 통신이 필요하지만 지연 시간은 낮습니다. 중간 길이의 시퀀스와 좋은 인터커넥트 대역폭을 가진 환경에 가장 적합합니다.
  • convert_to_fp32 (bool, 선택 사항, 기본값 True) — 링 어텐션의 수치적 안정성을 위해 출력과 LSE를 float32로 변환할지 여부.
  • rotate_method (str, 선택 사항, 기본값 "allgather") — ring attention에서 디바이스 간 key/value 상태를 회전하는 데 사용할 방법입니다. 현재 "allgather"만 지원됩니다.
  • ulysses_anything (bool, 선택 사항, 기본값 False) — ulysses_degree로 나누어 떨어지지 않는 임의의 시퀀스 길이와 헤드 수를 지원하는 “Ulysses Anything” 모드를 활성화할지 여부입니다. 활성화하면 ulysses_degree는 1보다 커야 하고 ring_degree는 1이어야 합니다.
  • ring_anything (bool, 선택 사항, 기본값 False) — 임의의 시퀀스 길이를 지원하는 “Ring Anything” 모드를 활성화할지 여부입니다. 활성화된 경우, ring_degree는 1보다 커야 하고 ulysses_degree는 1이어야 합니다.
  • mesh (torch.distributed.device_mesh.DeviceMesh, 선택 사항) — 컨텍스트 병렬성에 사용할 사용자 지정 디바이스 메시입니다. 제공된 경우, 새 메시를 생성하는 대신 이 메시가 사용됩니다. 이는 컨텍스트 병렬성을 동일한 디바이스 메시를 공유하는 다른 병렬성 전략(예: FSDP, 텐서 병렬성)과 결합할 때 유용합니다. 메시에는 “ring” 및 “ulysses” 차원이 모두 있어야 합니다. 사용하지 않는 차원의 크기는 1로 설정합니다(예: FSDP와 함께 ring attention만 사용할 경우 mesh_shape=(2, 1, 4) 및 mesh_dim_names=("ring", "ulysses", "fsdp")).

컨텍스트 병렬성을 위한 구성

diffusers.hooks.apply_context_parallel

< >

( module: Moduleparallel_config: ContextParallelConfigplan: dict[str, dict[str, dict[str | int, diffusers.models._modeling_parallel.ContextParallelInput | list[diffusers.models._modeling_parallel.ContextParallelInput] | tuple[diffusers.models._modeling_parallel.ContextParallelInput, ...]] | diffusers.models._modeling_parallel.ContextParallelOutput | list[diffusers.models._modeling_parallel.ContextParallelOutput] | tuple[diffusers.models._modeling_parallel.ContextParallelOutput, ...]]] )

Apply context parallel on a model.

TensorParallelConfig

클래스 diffusers.TensorParallelConfig

< >

( tp_degree: int = 1mesh: typing.Optional[torch.distributed.device_mesh.DeviceMesh] = None_rank: int = None_world_size: int = None_device: device = None_mesh: DeviceMesh = None_tp_degree: int = None )

매개변수

  • tp_degree (int, 기본값 1) — 분할할 장치의 수입니다. 병렬화되는 모델의 어텐션 헤드(및 FFN 숨겨진 차원) 수의 약수여야 합니다.
  • mesh (torch.distributed.device_mesh.DeviceMesh, 선택 사항) — 사용할 커스텀 디바이스 메시입니다. 제공된 경우 tp_degree는 mesh.size()에서 추론되며 해당 인수는 무시됩니다. 동일한 메시를 공유하는 다른 병렬화 전략(예: CP)과 TP를 결합할 때 유용합니다.

tensor parallelism에 대한 구성입니다.

Tensor parallelism은 가중치 행렬을 장치 간에(열 방향 및 행 방향) 분할합니다. 각 장치는 부분 결과를 계산하고, 레이어 경계에서의 AllReduce/AllGather가 전체 출력을 재구성합니다. torch.distributed.tensor.parallelize_module을 ColwiseParallel / RowwiseParallel 분할 스타일과 함께 사용합니다. 지원되는 장치 유형은 "cuda", "neuron" 및 "tpu"입니다.

diffusers.hooks.apply_tensor_parallel

< >

( model: Moduleconfig: TensorParallelConfigtp_plan: dictweights_already_sharded: bool = False )

매개변수

  • model (torch.nn.Module) — 인플레이스로 샤딩할 모델.
  • config (TensorParallelConfig) — Tensor-parallel 설정입니다. 해당 device mesh는 이미 config.setup(...)로 설정되어 있어야 합니다.
  • tp_plan (dict) — 모듈 이름 글롭을 "colwise"/"rowwise" 스타일(또는 패킹된 변형)로 매핑하는 평탄한 매핑으로, 일반적으로 모델의 _tp_plan입니다.
  • weights_already_sharded (bool, 기본값 False) — 계획된 파라미터가 스트리밍 from_pretrained 로드 후와 같이 이미 DTensor 샤드인지 여부입니다. True인 경우, 포워드 훅만 등록됩니다. 체크포인트에서 누락된 계획된 파라미터는 여전히 메타 텐서이므로, 실제로는 절반만 샤딩된 모델에 대해 “샤딩되지 않음”으로 감지될 수 있기 때문에, 이 값은 감지하는 대신 명시적으로 전달됩니다.

_tp_plan가 평탄화된 모델에 텐서 병렬을 적용합니다.

Update on GitHub