Jika kita menggunakan kombinasi kelas Dataset
dan Dataloader
(seperti yang ditunjukkan di bawah), saya harus memuat data secara eksplisit ke GPU menggunakan .to()
atau .cuda()
. Apakah ada cara untuk menginstruksikan pemuat data untuk melakukannya secara otomatis/implisit?
Kode untuk memahami/mereproduksi skenario:
from torch.utils.data import Dataset, DataLoader
import numpy as np
class DemoData(Dataset):
def __init__(self, limit):
super(DemoData, self).__init__()
self.data = np.arange(limit)
def __len__(self):
return self.data.shape[0]
def __getitem__(self, idx):
return (self.data[idx], self.data[idx]*100)
demo = DemoData(100)
loader = DataLoader(demo, batch_size=50, shuffle=True)
for i, (i1, i2) in enumerate(loader):
print('Batch Index: {}'.format(i))
print('Shape of data item 1: {}; shape of data item 2: {}'.format(i1.shape, i2.shape))
# i1, i2 = i1.to('cuda:0'), i2.to('cuda:0')
print('Device of data item 1: {}; device of data item 2: {}\n'.format(i1.device, i2.device))
Yang akan menghasilkan output sebagai berikut; catatan - tanpa instruksi transfer perangkat yang eksplisit, data dimuat ke CPU:
Batch Index: 0
Shape of data item 1: torch.Size([50]); shape of data item 2: torch.Size([50])
Device of data item 1: cpu; device of data item 2: cpu
Batch Index: 1
Shape of data item 1: torch.Size([50]); shape of data item 2: torch.Size([50])
Device of data item 1: cpu; device of data item 2: cpu
Solusi yang mungkin ada di repo GitHub PyTorch ini. Masalah(masih terbuka pada saat pertanyaan ini diposting), namun, saya tidak dapat membuatnya berfungsi ketika pemuat data harus mengembalikan beberapa item data!
collate-fn
tidak berguna ketika kumpulan data mengembalikan sejumlah nilai di setiap kumpulan. Jadi masih mencari solusi yang lebih baik! - person anurag   schedule 02.02.2021