基于eGPU優(yōu)化套件的ResNet50模型訓(xùn)練和推理
本文以卷積神經(jīng)網(wǎng)絡(luò)模型ResNet50的訓(xùn)練和推理為例,為您介紹如何通過Docker或Kubernetes使用eGPU優(yōu)化套件,進(jìn)行GPU容器虛擬化和資源共享。本實踐中的ResNet50模型基于NVIDIA官方開源代碼DeepLearningExamples實現(xiàn)。
步驟一:準(zhǔn)備模型和數(shù)據(jù)集
準(zhǔn)備代碼庫。執(zhí)行以下命令,獲取模型:
git clone https://github.com/NVIDIA/DeepLearningExamples.git
下載ImageNet數(shù)據(jù)集。數(shù)據(jù)集的獲取方式,請參見ResNet50 v1.5 For PyTorch。ImageNet數(shù)據(jù)集目錄結(jié)構(gòu)如下所示。
imagenet ├── train │ ├── n01440764 │ │ ├── n01440764_10026.JPEG │ │ ├── n01440764_10027.JPEG │ │ └── ...... │ ├── n01443537 │ └── ...... └── val ├── n01440764 │ ├── ILSVRC2012_val_00000293.JPEG │ ├── ILSVRC2012_val_00002138.JPEG │ └── ...... ├── n01443537 └── ......
步驟二:配置環(huán)境
選擇鏡像。
使用NVIDIA PyTorch鏡像,本文以
nvcr.io/nvidia/pytorch:22.11-py3
為例。您可以通過兩種方式啟動eGPU容器。
通過Docker啟動eGPU容器。
使能eGPU容器,配置資源和其他參數(shù)。更多信息,請參見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虛擬化的調(diào)度能力,更多信息,請參見使用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>
表示靈駿節(jié)點中ImageNet數(shù)據(jù)集所在路徑。<docker-path-to-imagenet>
表示數(shù)據(jù)集掛載到容器中的路徑。<local-path-to-DeepLearningExamples>
表示靈駿節(jié)點中模型訓(xùn)練代碼所在路徑。<docker-path-to-DeepLearningExamples>
表示模型訓(xùn)練代碼掛載到容器中的路徑。重要使用
nvcr.io/nvidia/pytorch:22.11-py3
鏡像可能出現(xiàn)dllogger缺失的問題,可在容器內(nèi)手動安裝dllogger。更多信息,請參見DLLogger for Python。pip install git+https://github.com/NVIDIA/dllogger#egg=dllogger
步驟三:進(jìn)行模型訓(xùn)練
在容器中執(zhí)行以下命令啟動訓(xùn)練任務(wù):
# 進(jìn)入DeepLearningExamples/PyTorch/Classification/ConvNets目錄進(jìn)行訓(xùn)練
python3 ./main.py --arch resnet50 -b 128 --epochs 90 <docker-path-to-imagenet>
如果要驗證eGPU的顯存和算力切分功能,可以在host上運行nvidia-smi查看GPU資源使用情況。更多信息,請參見ResNet50 v1.5 For PyTorch。
步驟四:進(jìn)行模型推理
下載預(yù)訓(xùn)練模型。
# 使用從NGC下載的NVIDIA的預(yù)訓(xùn)練模型 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/
重要直接加載預(yù)訓(xùn)練模型可能會出現(xiàn)缺失部分keys的相關(guān)報錯,需要在
DeepLearningExamples/PyTorch/Classification/ConvNets/image_classification/models/model.py
文件第150行,修改函數(shù)load_state_dict()
為:model.load_state_dict(state_dict, strict=False)
這處修改是為了避免在加載NVIDIA的預(yù)訓(xùn)練模型進(jìn)行推理時出現(xiàn)報錯的現(xiàn)象,與是否使用eGPU無關(guān)。更多信息,請參見load_state_dict()。
啟動推理任務(wù)。
# 進(jìn)入DeepLearningExamples/PyTorch/Classification/ConvNets目錄進(jìn)行推理 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>