Este repositorio mantiene los servicios públicos mantenidos por Nvidia para racionalizar la precisión mixta y la capacitación distribuida en Pytorch. Parte del código aquí se incluirá en Pytorch aguas arriba eventualmente. La intención de APEX es poner en cuenta las utilidades actualizados a los usuarios lo más rápido posible.
Desapercibido. Use amplificador de pytorch
apex.amp
es una herramienta para habilitar el entrenamiento de precisión mixta cambiando solo 3 líneas de su script. Los usuarios pueden experimentar fácilmente con diferentes modos de capacitación de precisión pura y mixta suministrando diferentes banderas para amp.initialize
.
Webinar Introducting AMP (la bandera cast_batchnorm
ha sido renombrada para keep_batchnorm_fp32
).
Documentación de API
Ejemplo integral de Imagenet
Ejemplo de dcgan próximamente ...
Pasar a la nueva API de AMP (para los usuarios de las apisas "AMP" y "FP16_Optimizer" en desordenadas)
apex.parallel.DistributedDataParallel
está en desuso. Use torch.nn.parallel.DistributedDataParallel
apex.parallel.DistributedDataParallel
es un envoltorio de módulo, similar a torch.nn.parallel.DistributedDataParallel
. Permite una capacitación distribuida de multiprocesos conveniente, optimizado para la biblioteca de comunicación NCCL de NVIDIA.
Documentación de API
Fuente de Python
Ejemplo/Tutorial
El ejemplo de ImageNet muestra el uso de apex.parallel.DistributedDataParallel
junto con apex.amp
.
Desapercibido. Use torch.nn.SyncBatchNorm
apex.parallel.SyncBatchNorm
extiende torch.nn.modules.batchnorm._BatchNorm
para admitir Bn sincronizado. Allreduce las estadísticas en los procesos durante el entrenamiento multiprocesado (distributedDataparallel). Se ha utilizado BN síncrono en los casos en que solo una pequeña minibatch local puede caber en cada GPU. Las estadísticas alredadas aumentan el tamaño de lote efectivo para la capa BN al tamaño del lote global en todos los procesos (que, técnicamente, es la formulación correcta). Se ha observado que BN síncrono mejora la precisión convergente en algunos de nuestros modelos de investigación.
Para guardar y cargar correctamente su entrenamiento amp
, presentamos el amp.state_dict()
, que contiene todos loss_scalers
y sus pasos no marcados correspondientes, así como amp.load_state_dict()
para restaurar estos atributos.
Para obtener precisión bit a bit, recomendamos el siguiente flujo de trabajo:
# Initialization
opt_level = 'O1'
model , optimizer = amp . initialize ( model , optimizer , opt_level = opt_level )
# Train your model
...
with amp . scale_loss ( loss , optimizer ) as scaled_loss :
scaled_loss . backward ()
...
# Save checkpoint
checkpoint = {
'model' : model . state_dict (),
'optimizer' : optimizer . state_dict (),
'amp' : amp . state_dict ()
}
torch . save ( checkpoint , 'amp_checkpoint.pt' )
...
# Restore
model = ...
optimizer = ...
checkpoint = torch . load ( 'amp_checkpoint.pt' )
model , optimizer = amp . initialize ( model , optimizer , opt_level = opt_level )
model . load_state_dict ( checkpoint [ 'model' ])
optimizer . load_state_dict ( checkpoint [ 'optimizer' ])
amp . load_state_dict ( checkpoint [ 'amp' ])
# Continue training
...
Tenga en cuenta que recomendamos restaurar el modelo utilizando el mismo opt_level
. También tenga en cuenta que recomendamos llamar a los métodos load_state_dict
después de amp.initialize
.
Cada módulo apex.contrib
requiere una o más opciones de instalación que no sean --cpp_ext
y --cuda_ext
. Tenga en cuenta que los módulos Contrib no necesariamente admiten liberaciones estables de Pytorch.
Los contenedores Nvidia Pytorch están disponibles en NGC: https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch. Los contenedores vienen con todas las extensiones personalizadas disponibles en este momento.
Consulte la documentación de NGC para obtener detalles como:
Para instalar APEX desde la fuente, recomendamos usar el Pytorch nocturno que se puede obtener de https://github.com/pytorch/pytorch.
La última versión estable que se puede obtener de https://pytorch.org también debería funcionar.
Recomendamos instalar Ninja
para hacer la compilación más rápido.
Para el rendimiento y la funcionalidad completa, recomendamos instalar APEX con extensiones CUDA y C ++ a través de
git clone https://github.com/NVIDIA/apex
cd apex
# if pip >= 23.1 (ref: https://pip.pypa.io/en/stable/news/#v23-1) which supports multiple `--config-settings` with the same key...
pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --config-settings " --build-option=--cpp_ext " --config-settings " --build-option=--cuda_ext " ./
# otherwise
pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --global-option= " --cpp_ext " --global-option= " --cuda_ext " ./
APEX también admite una construcción solo de Python a través de
pip install -v --disable-pip-version-check --no-build-isolation --no-cache-dir ./
Una construcción solo de Python omite:
apex.optimizers.FusedAdam
.apex.normalization.FusedLayerNorm
y apex.normalization.FusedRMSNorm
.apex.parallel.SyncBatchNorm
.apex.parallel.DistributedDataParallel
y apex.amp
. DistributedDataParallel
, amp
y SyncBatchNorm
seguirá siendo utilizable, pero pueden ser más lentos. pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --config-settings "--build-option=--cpp_ext" --config-settings "--build-option=--cuda_ext" .
Puede funcionar si pudiera construir pytorch desde la fuente en su sistema. Una compilación solo de Python a través de pip install -v --no-cache-dir .
es más probable que funcione.
Si instaló PyTorch en un entorno de conda, asegúrese de instalar Apex en ese mismo entorno.
Si no se cumple un requisito de un módulo, entonces no se construirá.
Nombre del módulo | Opción de instalación | Maga |
---|---|---|
apex_C | --cpp_ext | |
amp_C | --cuda_ext | |
syncbn | --cuda_ext | |
fused_layer_norm_cuda | --cuda_ext | apex.normalization |
mlp_cuda | --cuda_ext | |
scaled_upper_triang_masked_softmax_cuda | --cuda_ext | |
generic_scaled_masked_softmax_cuda | --cuda_ext | |
scaled_masked_softmax_cuda | --cuda_ext | |
fused_weight_gradient_mlp_cuda | --cuda_ext | Requiere cuda> = 11 |
permutation_search_cuda | --permutation_search | apex.contrib.sparsity |
bnp | --bnp | apex.contrib.groupbn |
xentropy | --xentropy | apex.contrib.xentropy |
focal_loss_cuda | --focal_loss | apex.contrib.focal_loss |
fused_index_mul_2d | --index_mul_2d | apex.contrib.index_mul_2d |
fused_adam_cuda | --deprecated_fused_adam | apex.contrib.optimizers |
fused_lamb_cuda | --deprecated_fused_lamb | apex.contrib.optimizers |
fast_layer_norm | --fast_layer_norm | apex.contrib.layer_norm . Diferente de fused_layer_norm |
fmhalib | --fmha | apex.contrib.fmha |
fast_multihead_attn | --fast_multihead_attn | apex.contrib.multihead_attn |
transducer_joint_cuda | --transducer | apex.contrib.transducer |
transducer_loss_cuda | --transducer | apex.contrib.transducer |
cudnn_gbn_lib | --cudnn_gbn | Requiere cudnn> = 8.5, apex.contrib.cudnn_gbn |
peer_memory_cuda | --peer_memory | apex.contrib.peer_memory |
nccl_p2p_cuda | --nccl_p2p | Requiere nccl> = 2.10, apex.contrib.nccl_p2p |
fast_bottleneck | --fast_bottleneck | Requiere peer_memory_cuda y nccl_p2p_cuda , apex.contrib.bottleneck |
fused_conv_bias_relu | --fused_conv_bias_relu | Requiere cudnn> = 8.4, apex.contrib.conv_bias_relu |