【发布时间】:2021-10-12 01:21:31
【问题描述】:
我有一个非常非常大的神经网络和一个接收我的 16GB GPU RAM 的 Google Colab Pro 订阅。不幸的是,这还不够。我现在的想法是,将模型(Unet)分别拆分为编码器和解码器部分,如下进行:
- 将编码器加载到 GPU
- 通过编码器处理数据
- 将编码器加载到 CPU,将解码器加载到 GPU
- 通过解码器处理编码器输出
- 将解码器加载到 cpu aaa 并重复。
这通常是可能的吗?我编写了一个示例,但它不起作用:
def train(epoch, loader, loss_fn, optimizer, scaler, model1, model2):
model1.train()
model2.train()
loop = prog(loader)
running_loss = []
for batch_index, (data, target) in enumerate(loop):
optimizer.zero_grad(set_to_none=True)
model1 = model1.to(DEVICE)
data, skip_connections = model1(data.to(DEVICE))
model1 = model1.cpu()
model2 = model2.to(DEVICE)
data = model2(data, skip_connections)
model2 = model2.cpu()
target = target.to(DEVICE)
with torch.cuda.amp.autocast():
loss = loss_fn(data, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
model1 = model1.to(DEVICE)
loss_value = loss.item()
loop.set_postfix(info="Epoch {}, train, loss={:.5f}".format(epoch, loss_value))
running_loss.append(loss_value)
return s.mean(running_loss)
对于设置/初始化,我得到了以下信息:
DEVICE = "cuda"
model1 = UNET_FIRST_HALVE(in_channels=4).to(DEVICE)
model2 = UNET_SECOND_HALVE(out_channels=NUM_CLASSES).cpu()
for epoch in range(epochs_done + 1, num_epochs + 1):
training_loss = train(..., model1, model2)
.
.
.
我收到以下错误:
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!
我当然理解错误,但我确信我会在正确的时间将所有内容推入和拉出 GPU...或者也许有更好的分割模型的方法?
【问题讨论】:
标签: python neural-network pytorch gpu