KSpeed mempercepat pemuatan data gambar untuk pelatihan visi komputer. Topik ini menjelaskan langkah-langkah mengintegrasikan KSpeed dengan model ResNet50 berdasarkan DeepLearningExamples sumber terbuka dari NVIDIA, menggunakan patch git untuk modifikasi kode yang diperlukan. Untuk detailnya, lihat Integrasi Modul Utama KSpeed.
Persiapan Kode
-
Repositori basis kode:
https://github.com/NVIDIA/DeepLearningExamples/commit/174b3d40bfc26f2adcf252676d38d6d5ffa7cbdc
git clone https://github.com/NVIDIA/DeepLearningExamples.git cd DeepLearningExamples git checkout master git reset --hard 174b3d40bfc26f2adcf252676d38d6d5ffa7cbdc -
Integrasikan Kode KSpeed
# Tetap berada di direktori DeepLearningExamples wget http://kspeed-release.oss-cn-beijing.aliyuncs.com/kspeed_resnet50.patch git apply kspeed_resnet50.patch
Konfigurasi lingkungan
Jalankan perintah berikut untuk memulai kontainer pelatihan:
docker run -it --gpus all --name=resnet50_kspeed_test --net=host --ipc host --device=/dev/infiniband/ --ulimit memlock=-1:-1 -v /{path-to-imagenet}:/{path-to-imagenet-in-docker} -v /{path-to-DeepLearningExamples}:/{path-to-DeepLearningExamples-in-docker} eflo-registry.cn-beijing.cr.aliyuncs.com/eflo/ngc-pytorch-kspeed-22.05-py38:v2.2.0
Dalam perintah di atas:
-
{path-to-imagenet}merepresentasikan path ke dataset ImageNet pada mesin fisik; -
{path-to-imagenet-in-docker}merepresentasikan path tempat pengguna memetakan dataset ke dalam kontainer; -
{path-to-DeepLearningExamples}menunjukkan path ke kode pelatihan model pada mesin fisik; -
{path-to-DeepLearningExamples-in-docker}menunjukkan path tempat kode pelatihan model dipetakan ke dalam kontainer.
Atur path-path tersebut sesuai dengan lingkungan Anda.
Struktur direktori dataset ImageNet:
imagenet
├── train
│ ├── n01440764
│ │ ├── n01440764_10026.JPEG
│ │ ├── n01440764_10027.JPEG
│ │ └── ......
│ ├── n01443537
│ └── ......
└── val
├── n01440764
│ ├── ILSVRC2012_val_00000293.JPEG
│ ├── ILSVRC2012_val_00002138.JPEG
│ └── ......
├── n01443537
└── ......
Referensi metode perolehan dataset: https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Classification/ConvNets/resnet50v1.5
Jalankan pelatihan model
# Tetap berada di direktori DeepLearningExamples
cd ./PyTorch/Classification/ConvNets
# Baseline delapan GPU satu mesin
bash ./resnet50v1.5/training/AMP/DGXA100_resnet50_AMP_multi.sh pytorch {path-to-imagenet-in-docker}
# KSpeed delapan GPU satu mesin
bash ./resnet50v1.5/training/AMP/DGXA100_resnet50_AMP_multi.sh kspeed {path-to-imagenet-in-docker}
# DALI+KSpeed delapan GPU satu mesin
bash ./resnet50v1.5/training/AMP/DGXA100_resnet50_AMP_multi.sh dali-kspeed {path-to-imagenet-in-docker}
-
Dalam perintah di atas:
{path-to-imagenet-in-docker} merepresentasikan path dataset ImageNet di dalam kontainer, yang harus konsisten dengan path yang ditetapkan saat memulai kontainer.
-
Sebelum menjalankan pengujian KSpeed, pastikan layanan kspeed telah dideploy.
Deskripsi Modul Utama untuk Integrasi KSpeed
Tambahkan file modul kspeeddataloader
Tambahkan file DeepLearningExamples/PyTorch/Classification/ConvNets/image_classification/kspeeddataloader.py, yang mengimplementasikan Dataloader PyTorch berbasis KSpeed dan Dataloader DALI berbasis KSpeed.
Dataloader PyTorch Berbasis KSpeed
Untuk mengimplementasikan Dataloader PyTorch berbasis KSpeed, modifikasi Dataset dan integrasikan dengan Sampler serta Dataloader native PyTorch:
-
Impor modul kspeeddataset
import kspeed.utils.data.kspeeddataset as KSpeedDataset -
Ganti
torchvison.datasets.ImageFolderdenganKSpeedDataset.KSpeedImageFolderuntuk mengaktifkan akselerasi pemuatan data KSpeed.train_dataset = KSpeedDataset.KSpeedImageFolder( traindir, None, workers, kspeed_iplist, "admin", "admin", transforms.Compose(transforms_list), ) val_dataset = KSpeedDataset.KSpeedImageFolder( valdir, None, workers, kspeed_iplist, "admin", "admin", transforms.Compose( [ transforms.Resize( image_size + crop_padding, interpolation=interpolation ), transforms.CenterCrop(image_size), ] ), ) -
Implementasikan metode
get_kspeed_train_loaderdanget_kspeed_val_loader. Untuk detailnya, lihat baris 16–72 dan 74–128 pada filekspeeddataloader.py.
Dataloader DALI Berbasis KSpeed
Untuk mengimplementasikan Dataloader DALI berbasis KSpeed, atur sumber data input pipeline DALI ke KSpeedCallable:
-
KSpeedCallable
KSpeedCallable mewarisi
KSpeedDataset.KSpeedFolderdan membaca sampel dataset ImageNet melaluiself.dataset.getBIN(path)(lihat baris 164–179 pada filekspeeddataloader.py).def __call__(self, sample_info): if self.dataset is None: self.load() if sample_info.iteration >= self.full_iters: raise StopIteration() if self.last_seen_epoch != sample_info.epoch_idx: self.last_seen_epoch = sample_info.epoch_idx self.perm = np.random.default_rng(seed=42 + sample_info.epoch_idx).permutation(len(self.files)) idx = self.perm[sample_info.idx_in_epoch + self.shard_offset] path = os.path.join(self.root, self.files[idx]) dout = self.dataset.getBIN(path) sample = np.frombuffer(dout, dtype=np.uint8) label = np.int32([self.labels[idx]]) return sample, label -
Pipeline DALI Berbasis KSpeedCallable
Baris 223–229 pada file
kspeeddataloader.pymenggunakan KSpeedCallable sebagai sumber data eksternal untuk Pipeline DALI:if kspeed: images, labels = fn.external_source(source=kscallable, num_outputs=2, batch=False, parallel=True, dtype=[types.UINT8, types.INT32], device='cpu')
Tambahkan opsi DATA_BACKEND_CHOICES
Pada baris 40 file DeepLearningExamples/PyTorch/Classification/ConvNets/image_classification/dataloaders.py, ubah DATA_BACKEND_CHOICES = ["pytorch", "synthetic"] menjadi seperti berikut:
DATA_BACKEND_CHOICES = ["pytorch", "syntetic", "kspeed", "dali-kspeed", "dali"]
Tambahkan opsi args.data_backend
Pada file DeepLearningExamples/PyTorch/Classification/ConvNets/main.py, tambahkan kode berikut ke cabang args.data_backend pada baris 512–520:
elif args.data_backend == "kspeed":
get_train_loader = get_kspeed_train_loader
get_val_loader = get_kspeed_val_loader
elif args.data_backend == "dali":
get_train_loader = get_dali_kspeed_train_loader(dali_cpu=True, kspeed=False)
get_val_loader = get_dali_kspeed_val_loader(dali_cpu=True, kspeed=False)
elif args.data_backend == "dali-kspeed":
get_train_loader = get_dali_kspeed_train_loader(dali_cpu=True)
get_val_loader = get_dali_kspeed_val_loader(dali_cpu=True)