หากเราใช้คลาส Dataset
และ Dataloader
รวมกัน (ดังที่แสดงด้านล่าง) ฉันจะต้องโหลดข้อมูลลงใน GPU อย่างชัดเจนโดยใช้ .to()
หรือ .cuda()
มีวิธีสั่งให้ dataloader ทำโดยอัตโนมัติ/โดยปริยายหรือไม่?
รหัสเพื่อทำความเข้าใจ/สร้างสถานการณ์จำลอง:
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))
ซึ่งจะแสดงผลดังนี้ หมายเหตุ - หากไม่มีคำแนะนำในการถ่ายโอนอุปกรณ์ที่ชัดเจน ข้อมูลจะถูกโหลดไปยัง 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
วิธีแก้ไขที่เป็นไปได้อยู่ที่ repo PyTorch GitHub นี้ ปัญหา(ยังคงเปิดอยู่ในเวลาที่โพสต์คำถามนี้) แต่ฉันไม่สามารถทำให้มันทำงานได้เมื่อตัวโหลดข้อมูลต้องส่งคืนรายการข้อมูลหลายรายการ!
collate-fn
จะไม่มีประโยชน์เมื่อชุดข้อมูลส่งคืนค่าทูเพิลในแต่ละชุด ดังนั้นยังคงมองหาวิธีแก้ปัญหาที่ดีกว่า! - person anurag   schedule 02.02.2021