基于eGPU优化套件的ResNet50模型训练和推理

本文以卷积神经网络模型ResNet50的训练和推理为例,为您介绍如何通过DockerKubernetes使用eGPU优化套件,进行GPU容器虚拟化和资源共享。本实践中的ResNet50模型基于NVIDIA官方开源代码DeepLearningExamples实现。

步骤一:准备模型和数据集

  1. 准备代码库。执行以下命令,获取模型:

    git clone https://github.com/NVIDIA/DeepLearningExamples.git
  2. 下载ImageNet数据集。数据集的获取方式,请参见ResNet50 v1.5 For PyTorch。ImageNet数据集目录结构如下所示。

    imagenet
    ├── train
    │   ├── n01440764
    │   │  ├── n01440764_10026.JPEG
    │   │  ├── n01440764_10027.JPEG
    │   │  └── ......
    │   ├── n01443537
    │   └── ......         
    └── val                
        ├── n01440764
        │  ├── ILSVRC2012_val_00000293.JPEG
        │  ├── ILSVRC2012_val_00002138.JPEG
        │  └── ......
        ├── n01443537
        └── ......

步骤二:配置环境

  1. 选择镜像。

    使用NVIDIA PyTorch镜像,本文以nvcr.io/nvidia/pytorch:22.11-py3为例。

  2. 您可以通过两种方式启动eGPU容器。

    • 通过Docker启动eGPU容器。

      1. 使能eGPU容器,配置资源和其他参数。更多信息,请参见eGPU接口使用示例

      2. 启动eGPU容器,具体示例如下:

        sudo docker run \
            --runtime=nvidia \
            -e NVIDIA_DRIVER_CAPABILITIES=all \
            --network=host \
            -e AMP_VGPU_ENABLE=1 \
            -e NVIDIA_VISIBLE_DEVICES=0 \
            -e GPU_MEM_PER_DEVICE=16000000000 \
            -e GPU_UTIL_PER_DEVICE=50 \
            -e AMP_USE_HOST_DAEMON=1 \
            -v <local-path-to-DeepLearningExamples>:<docker-path-to-DeepLearningExamples> \
            -v <local-path-to-imagenet>:<docker-path-to-imagenet> \
            -P -ti \
            nvcr.io/nvidia/pytorch:22.11-py3
    • 通过Kubernetes启动eGPU容器。在Kubernetes集群中使用eGPU共享GPU资源需要:

      1. 安装eGPU device plugin使能够使用GPU虚拟化的调度能力,更多信息,请参见使用eGPU Kubernetes组件

      2. 使用YAML文件启动eGPU容器,具体示例如下:

        apiVersion: apps/v1
        kind: StatefulSet
        metadata:
          name: amp-egpu-test
          labels:
            app: amp-egpu-test
        spec:
          replicas: 1
          serviceName: "test-egpu-001"
          selector: # define how the deployment finds the pods it manages
            matchLabels:
              app: test-egpu-001
          template: # define the pods specifications
            metadata:
              labels:
                app: test-egpu-001
            spec:
              volumes:
              - name: deepLearningExamples
                hostPath:
                # directory location on host
                  path: <local-path-to-DeepLearningExamples>
              - name: imagenet
                hostPath:
                # directory location on host
                  path: <local-path-to-imagenet>
              containers:
              - name: test-egpu-001
                image: nvcr.io/nvidia/pytorch:22.11-py3
                imagePullPolicy: IfNotPresent
                command: [ "/bin/bash", "-c", "--" ]
                args: [ "while true; do sleep 30; done;" ]
                volumeMounts:
                - mountPath: <docker-path-to-DeepLearningExamples>
                  name: deepLearningExamples
                - mountPath: <docker-path-to-imagenet>
                  name: imagenet
                resources:
                  limits:
                    aliyun.com/gpu-compute: 50
                    aliyun.com/gpu-mem: 16
                env:
                  - name: AMP_VGPU_ENABLE
                    value: "1"
                  - name: AMP_USE_HOST_DAEMON
                    value: "1"
                  - name: NVIDIA_DRIVER_CAPABILITIES
                    value: all
    • 上述示例中:

      • <local-path-to-imagenet>表示灵骏节点中ImageNet数据集所在路径。

      • <docker-path-to-imagenet> 表示数据集挂载到容器中的路径。

      • <local-path-to-DeepLearningExamples>表示灵骏节点中模型训练代码所在路径。

      • <docker-path-to-DeepLearningExamples> 表示模型训练代码挂载到容器中的路径。

        重要

        使用nvcr.io/nvidia/pytorch:22.11-py3镜像可能出现dllogger缺失的问题,可在容器内手动安装dllogger。更多信息,请参见DLLogger for Python

        pip install git+https://github.com/NVIDIA/dllogger#egg=dllogger

步骤三:进行模型训练

在容器中执行以下命令启动训练任务:

# 进入DeepLearningExamples/PyTorch/Classification/ConvNets目录进行训练
python3 ./main.py --arch resnet50 -b 128 --epochs 90  <docker-path-to-imagenet>

如果要验证eGPU的显存和算力切分功能,可以在host上运行nvidia-smi查看GPU资源使用情况。更多信息,请参见ResNet50 v1.5 For PyTorch

步骤四:进行模型推理

  1. 下载预训练模型。

    # 使用从NGC下载的NVIDIA的预训练模型
    wget --content-disposition https://api.ngc.nvidia.com/v2/models/nvidia/resnet50_pyt_amp/versions/20.06.0/zip -O resnet50_pyt_amp_20.06.0.zip
    
    # 将模型下载后解压后放置在 DeepLearningExamples/PyTorch/Classification/ConvNets目录,解压后得到的文件为nvidia_resnet50_200821.pth.tar
    unzip resnet50_pyt_amp_20.06.0.zip
    mv nvidia_resnet50_200821.pth.tar <docker-path-to-DeepLearningExamples>/PyTorch/Classification/ConvNets/
    重要

    直接加载预训练模型可能会出现缺失部分keys的相关报错,需要在DeepLearningExamples/PyTorch/Classification/ConvNets/image_classification/models/model.py文件第150行,修改函数load_state_dict()为:

    model.load_state_dict(state_dict, strict=False)

    这处修改是为了避免在加载NVIDIA的预训练模型进行推理时出现报错的现象,与是否使用eGPU无关。更多信息,请参见load_state_dict()

  2. 启动推理任务。

    # 进入DeepLearningExamples/PyTorch/Classification/ConvNets目录进行推理
    cd <docker-path-to-DeepLearningExamples>/PyTorch/Classification/ConvNets
    python ./main.py --arch resnet50 --evaluate --epochs 90 -b 128 --pretrained-from-file=nvidia_resnet50_200821.pth.tar <docker-path-to-imagenet>