Diffusers documentation
Paralelismo
Paralelismo
Las estrategias de paralelismo ayudan a acelerar los transformers de difusión distribuyendo los cálculos en varios dispositivos, lo que permite tiempos de inferencia/entrenamiento más rápidos. Consulte la guía de inferencia distribuida para obtener más información.
ParallelConfig
clase 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 )
Configuración para aplicar diferentes paralelismos.
ContextParallelConfig
clase 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 )
Parámetros
- ring_degree (
int, opcional, valor predeterminado1) — Número de dispositivos a utilizar para Ring Attention. La secuencia se divide entre los dispositivos. Cada dispositivo calcula la atención entre su Q local y los fragmentos de KV que se pasan secuencialmente alrededor del anillo. Menor uso de memoria (solo mantiene 1/N de KV a la vez), solapa el cálculo con la comunicación, pero requiere N iteraciones para ver todos los tokens. Ideal para secuencias largas con memoria o ancho de banda limitados. Número de dispositivos a utilizar para ring attention dentro de una región de paralelismo de contexto. Debe ser un divisor del número total de dispositivos en la malla de paralelismo de contexto. - ulysses_degree (
int, opcional, valor predeterminado1) — Número de dispositivos a utilizar para Ulysses Attention. La secuencia se divide entre los dispositivos. Cada dispositivo calcula los QKV locales y luego realiza un all-gather de todos los fragmentos KV para calcular la atención completa en una sola pasada. Mayor uso de memoria (almacena todos los KV), requiere comunicación all-to-all de alto ancho de banda, pero con menor latencia. Ideal para secuencias moderadas con buen ancho de banda de interconexión. - convert_to_fp32 (
bool, opcional, valor predeterminadoTrue) — Si se debe convertir la salida y el LSE a float32 para la estabilidad numérica de ring attention. - rotate_method (
str, opcional, por defecto"allgather") — Método a utilizar para rotar los estados de clave/valor entre dispositivos en ring attention. Actualmente, solo se admite"allgather". - ulysses_anything (
bool, opcional, valor predeterminadoFalse) — Si se habilita el modo “Ulysses Anything”, que admite longitudes de secuencia y números de cabeceras arbitrarios que no son divisibles uniformemente porulysses_degree. Cuando está habilitado,ulysses_degreedebe ser mayor que 1 yring_degreedebe ser 1. - ring_anything (
bool, opcional, valor predeterminadoFalse) — Si se habilita el modo “Ring Anything”, que admite longitudes de secuencia arbitrarias. Cuando está habilitado,ring_degreedebe ser mayor que 1 yulysses_degreedebe ser 1. - mesh (
torch.distributed.device_mesh.DeviceMesh, opcional) — Una malla de dispositivos personalizada para usar en la paralelización de contexto. Si se proporciona, esta malla se usará en lugar de crear una nueva. Esto es útil al combinar la paralelización de contexto con otras estrategias de paralelización (p. ej., FSDP, paralelización de tensores) que comparten la misma malla de dispositivos. La malla debe tener las dimensiones “ring” y “ulysses”. Use tamaño 1 para las dimensiones que no se estén usando (p. ej.,mesh_shape=(2, 1, 4)conmesh_dim_names=("ring", "ulysses", "fsdp")para solo ring attention con FSDP).
Configuración para el paralelismo de contexto.
diffusers.hooks.apply_context_parallel
< source >( module: Moduleparallel_config: ContextParallelConfigplan: dict )
Aplicar el paralelismo de contexto en un modelo.
TensorParallelConfig
clase 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 )
Parámetros
- tp_degree (
int, por defecto1) — Número de dispositivos en los que se dividirá el modelo. Debe ser un divisor del número de cabezas de atención (y de las dimensiones ocultas del FFN) del modelo que se está paralelizando. - mesh (
torch.distributed.device_mesh.DeviceMesh, opcional) — Una malla de dispositivos personalizada para usar. Si se proporciona,tp_degreese infiere a partir demesh.size()y el argumento se ignora. Útil al combinar TP con otras estrategias de paralelismo (p. ej. CP) que comparten la misma malla.
Configuración para el paralelismo de tensores.
La paralelización de tensores divide las matrices de pesos (por columnas y por filas) entre dispositivos. Cada dispositivo calcula un resultado parcial; un AllReduce/AllGather en los límites de las capas reconstruye la salida completa. Utiliza torch.distributed.tensor.parallelize_module con los estilos de partición ColwiseParallel / RowwiseParallel. Los tipos de dispositivos admitidos son "cuda", "neuron" y "tpu".
diffusers.hooks.apply_tensor_parallel
< source >( model: Moduleconfig: TensorParallelConfigtp_plan: dictweights_already_sharded: bool = False )
Parámetros
- model (
torch.nn.Module) — El modelo que se va a fragmentar in situ. - config (
TensorParallelConfig) — The tensor-parallel config. Its device mesh must already be set up withconfig.setup(...). - tp_plan (
dict) — Un mapeo plano de glob de nombres de módulos a un estilo"colwise"/"rowwise"(o una variante empaquetada), normalmente el_tp_plandel modelo. - weights_already_sharded (
bool, por defectoFalse) — Indica si los parámetros planificados ya son fragmentos deDTensor, como ocurre después de una carga defrom_pretraineden streaming. Si esTrue, solo se registran los hooks de forward. Este valor se pasa de forma explícita en lugar de detectarse, porque un parámetro planificado que falte en el checkpoint seguiría siendo un tensor meta y haría que la detección indicara “no fragmentado” para un modelo que en realidad está medio fragmentado.
Aplicar la paralelización de tensores en un modelo a partir de su _tp_plan plano.