병렬성
병렬화 전략은 계산을 여러 장치에 분산시켜 추론/학습 시간을 단축함으로써 diffusion transformer의 속도를 높이는 데 도움이 됩니다. 자세한 내용은 Distributed inferece 가이드를 참고하세요.
ParallelConfig
클래스 diffusers.ParallelConfig
< source >( 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 )
서로 다른 병렬성을 적용하기 위한 구성
ContextParallelConfig
class diffusers.ContextParallelConfig
< source >( 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
< source >( module: Moduleparallel_config: ContextParallelConfigplan: dict )
Apply context parallel on a model.
TensorParallelConfig
클래스 diffusers.TensorParallelConfig
< source >( 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 )
tensor parallelism에 대한 구성입니다.
Tensor parallelism은 가중치 행렬을 장치 간에(열 방향 및 행 방향) 분할합니다. 각 장치는 부분 결과를 계산하고, 레이어 경계에서의 AllReduce/AllGather가 전체 출력을 재구성합니다. torch.distributed.tensor.parallelize_module을 ColwiseParallel / RowwiseParallel 분할 스타일과 함께 사용합니다. 지원되는 장치 유형은 "cuda", "neuron" 및 "tpu"입니다.
diffusers.hooks.apply_tensor_parallel
< source >( 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가 평탄화된 모델에 텐서 병렬을 적용합니다.