本文以卷积神经网络模型ResNet50的训练和推理为例,为您介绍如何通过Docker或Kubernetes使用eGPU优化套件,进行GPU容器虚拟化和资源共享。本实践中的ResNet50模型基于NVIDIA官方开源代码DeepLearningExamples实现。
步骤一:准备模型和数据集
准备代码库。执行以下命令,获取模型:
git clone https://github.com/NVIDIA/DeepLearningExamples.git
下载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 └── ......
步骤二:配置环境
选择镜像。
使用NVIDIA PyTorch镜像,本文以
nvcr.io/nvidia/pytorch:22.11-py3
为例。您可以通过两种方式启动eGPU容器。
通过Docker启动eGPU容器。
使能eGPU容器,配置资源和其他参数。更多信息,请参见eGPU接口使用示例。
启动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资源需要:
安装eGPU device plugin使能够使用GPU虚拟化的调度能力,更多信息,请参见使用eGPU Kubernetes组件。
使用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。
步骤四:进行模型推理
下载预训练模型。
# 使用从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()。
启动推理任务。
# 进入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>