使用容器
TAO 封装了可能跨不同训练框架开发的 DNN 训练管道。为了隔离依赖项和训练环境,这些 DNN 应用程序被安置在不同的容器中。TAO Launcher 抽象了哪个网络与哪个容器关联的细节。但是,它要求您从一个环境运行 TAO,在该环境中,docker 容器可以由 launcher 实例化。这需要提升的用户权限或 Docker IN Docker (DIND) 设置,才能从容器内部调用 Docker。在某些情况下,这可能并不理想,例如:
在远程集群上运行,其中 SLURM 在已配置的集群节点上实例化容器
在没有提升用户权限的机器上运行
运行多节点训练作业
在多实例 GPU (MiG) 实例上运行
要从多个封闭容器之一运行 DNN,您首先需要知道哪些网络被安置在哪个容器中。获取此信息的一个简单方法是在您的本地机器上安装 TAO Launcher 并运行 tao info –verbose,它包含在多个容器中。
以下是 TAO 5.0.1 的示例输出
Configuration of the TAO Instance
task_group:
model:
dockers:
nvidia/tao/tao-toolkit:
5.0.0-tf2.9.1:
docker_registry: nvcr.io
tasks:
1. classification_tf2
2. efficientdet_tf2
5.0.0-tf1.15.5:
docker_registry: nvcr.io
tasks:
1. bpnet
2. classification_tf1
3. converter
4. detectnet_v2
5. dssd
6. efficientdet_tf1
7. faster_rcnn
8. fpenet
9. lprnet
10. mask_rcnn
11. multitask_classification
12. retinanet
13. ssd
14. unet
15. yolo_v3
16. yolo_v4
17. yolo_v4_tiny
5.0.0-pyt:
docker_registry: nvcr.io
tasks:
1. action_recognition
2. centerpose
3. classification_pyt
4. deformable_detr
5. dino
6. mal
7. ml_recog
8. ocdnet
9. ocrnet
10. optical_inspection
11. pointpillars
12. pose_classification
13. re_identification
14. re_identification_transformer
15. segformer
16. visual_changenet
dataset:
dockers:
nvidia/tao/tao-toolkit:
5.0.0-dataservice:
docker_registry: nvcr.io
tasks:
1. augmentation
2. auto_label
3. annotations
4. analytics
deploy:
dockers:
nvidia/tao/tao-toolkit:
5.0.0-deploy:
docker_registry: nvcr.io
tasks:
1. centerpose
2. classification_pyt
3. classification_tf1
4. classification_tf2
5. deformable_detr
6. detectnet_v2
7. dino
8. dssd
9. efficientdet_tf1
10. efficientdet_tf2
11. faster_rcnn
12. lprnet
13. mask_rcnn
14. ml_recog
15. multitask_classification
16. ocdnet
17. ocrnet
18. optical_inspection
19. retinanet
20. segformer
21. ssd
22. unet
23. visual_changenet
24. yolo_v3
25. yolo_v4
26. yolo_v4_tiny
format_version: 3.0
toolkit_version: 5.0.0
published_date: 05/31/2023
与任务关联的容器名称可以推导为 $DOCKER_REGISTRY/$DOCKER_NAME:$DOCKER_TAG
。例如,从上面的日志中,运行 detectnet_v2
的 Docker 名称可以按如下方式推导出来:
export DOCKER_REGISTRY="nvcr.io"
export DOCKER_NAME="nvidia/tao/tao-toolkit"
export DOCKER_TAG="5.0.0-tf1.15.5"
export DOCKER_CONTAINER=$DOCKER_REGISTRY/$DOCKER_NAME:$DOCKER_TAG
一旦您有了 Docker 名称,就可以通过运行网络定义的命令来调用容器,不带 :code:`tao` 前缀。例如,以下命令将运行一个使用 4 个 GPU 的 detectnet_v2 训练作业
docker run -it --rm --gpus all \
-v /path/in/host:/path/in/docker \
$DOCKER_CONTAINER \
detectnet_v2 train -e /path/to/experiment/spec.txt \
-r /path/to/results/dir \
-k $KEY --gpus 4
从 3.0-21.11 开始,TAO 支持以下 CV 模型的多节点训练:
图像分类
多任务分类
Detectnet_v2
FasterRCNN
SSD
DSSD
YOLOv3
YOLOv4
YOLOv4-Tiny
RetinaNet
MaskRCNN
EfficientDet
UNet
对于这些网络,唯一可以运行多节点训练的任务是 train
。要调用多节点训练,只需将 --multi-node
参数添加到 train 命令。
例如,上面给出的多 GPU 训练命令可以作为多节点命令发出
detectnet_v2 train -e /path/to/experiment/spec.txt \
-r /path/to/results/dir \
-k $KEY \
--gpus 4 \
--multi-node
TAO 使用 OPEN-MPI + HOROVOD 来编排多 GPU 和多节点训练。默认情况下,以下参数将附加到 mpirun
命令
-x NCCL_IB_HCA=mlx5_4,mlx5_6,mlx5_8,mlx5_10 -x NCCL_SOCKET_IFNAME=^lo,docker
要向 mpirun
命令添加更多参数,请将它们添加到 train
命令的 --mpirun-arg
中,如下例所示
运行多节点训练时,整个数据集必须对运行训练的所有节点可见。如果数据不存在,训练作业可能会崩溃,并显示数据找不到的错误。
例如,如果您有一个 .tar
数据集,该数据集已下载到具有两个节点且每个节点有八个 GPU 的多节点作业中的一个节点(rank 0),则提取数据的一个简单方法是使用 mpirun
将其作为多节点进程运行:。
mpirun -np 16 --allow-run-as-root bash -c 'if [[ $OMPI_COMM_WORLD_LOCAL_RANK -eq 0 ]]; then set -x && tar -xf dataset.tar -C /raid; fi '
NVIDIA 多实例 GPU (MIG) 扩展了数据中心级 GPU(即 NVIDIA H100、A100 和 A30 Tensor Core GPU)的性能和价值,它允许用户将单个 GPU 分区为最多七个实例,每个实例都有其自己完全隔离的高带宽内存、缓存和计算核心。有关设置 MIG 的更多信息,请参阅 NVIDIA 多实例 GPU 用户指南。
阅读 MIG 文档 中支持的配置,以了解拆分和提高利用率的最佳方法。
以下示例命令在启用 MIG 的 GPU 上运行 DetectNet_v2 训练会话。
docker run -it --rm --runtime=nvidia \
-e NVIDIA_VISIBLE_DEVICES="MIG-<DEVICE_UUID>,MIG-<DEVICE_UUID>" \
-v /path/in/host:/path/in/container \
nvcr.io/nvidia/tao/tao-toolkit:5.0.0-tf1.15.5 \
detectnet_v2 train -e /path/to/experiment.txt \
-k <key> \
-r /path/to/store/results \
-n <name of trained model>
您必须将 --runtime=nvidia
标志添加到 docker
命令,并导出具有 GPU 实例 UUID 的 NVIDIA_VISIBLE_DEVICES
环境变量。您可以通过运行 nvidia-smi -L
命令来获取特定 MIG 实例的 UUID。
通过 TAO Launcher 运行 TAO 需要用户安装 docker-ce
,因为 launcher 与本地主机上的 Docker 服务交互以运行命令。安装 Docker 需要提升的用户权限才能以 root 身份运行。如果您在计算机器上没有提升的用户权限,则可以使用 Singularity 运行 TAO。这需要您绕过 tao-launcher
并直接与组件 docker 容器交互。有关哪些任务在不同的 Docker 中实现的信息,请运行 tao info --verbose
命令。一旦您推导出任务到 Docker 的映射,您可以使用以下步骤运行任务
使用以下
singularity
命令拉取所需的 Dockersingularity pull tao-toolkit-tf:5.0.0-tf1.15.5 py3.sif docker://nvcr.io/nvidia/tao/tao-toolkit:5.0.0-tf1.15.5 .. Note:: For this command to work, the latest version of singularity must be installed.
使用以下命令实例化 Docker
singularity run --nv -B /path/to/workspace:/path/to/workspace tao-toolkit-tf:5.0.0-tf1.15.5.sif
在容器内部运行命令,不带
tao
前缀。例如,要在tao-toolkit-tf
容器中运行detectnet_v2
训练,请使用以下命令
detectnet_v2 train -e /path/to/workspace/specs/file.txt \
-k $KEY \
-r /path/to/workspace/results \
-n name_of_final_model \
--gpus $NUM_GPUS