PaddlePaddle 代码错误:GPU 设备不可用,如何修复?
PaddlePaddle 代码错误:GPU 设备不可用,如何修复?
以下是源代码,到运行的时候发生了错误,发生了什么错误?怎么修改,给出修改后的代码
# 调用resnet50模型
paddle.vision.set_image_backend('cv2')
model = paddle.vision.models.resnet50(pretrained=True, num_classes=12)
# 定义数据迭代器
train_dataloader = DataLoader(train_data, batch_size=256, shuffle=True, drop_last=False)
# 定义优化器
opt = paddle.optimizer.Adam(learning_rate=1e-4, parameters=model.parameters(), weight_decay=paddle.regularizer.L2Decay(1e-4))
# 定义损失函数
loss_fn = paddle.nn.CrossEntropyLoss()
# 设置gpu环境
paddle.set_device('gpu:0')
# 整体训练流程
for epoch_id in range(15):
model.train()
for batch_id, data in enumerate(train_dataloader()):
# 读取数据
features, labels = data
features = paddle.to_tensor(features)
labels = paddle.to_tensor(labels)
# 前向传播
predicts = model(features)
# 损失计算
loss = loss_fn(predicts, labels)
# 反向传播
avg_loss = paddle.mean(loss)
avg_loss.backward()
# 更新
opt.step()
# 清零梯度
opt.clear_grad()
# 打印损失
if batch_id % 2 == 0:
print('epoch_id:{}, batch_id:{}, loss:{}'.format(epoch_id, batch_id, avg_loss.numpy()))
model.eval()
print('开始评估')
i = 0
acc = 0
for image, label in valid_data:
image = paddle.to_tensor([image])
pre = list(np.array(model(image)[0]))
max_item = max(pre)
pre = pre.index(max_item)
i += 1
if pre == label:
acc += 1
if i % 10 == 0:
print('精度:', acc / i)
paddle.save(model.state_dict(), 'acc{}.model'.format(acc / i))
错误:
100%|██████████| 151272/151272 [00:29<00:00, 5127.18it/s]
/opt/conda/lib/python3.10/site-packages/paddle/fluid/dygraph/layers.py:1652: UserWarning: Skip loading for fc.weight. fc.weight receives a shape [2048, 1000], but the expected shape is [2048, 12].
warnings.warn(('Skip loading for {}. '.format(key) + str(err)))
/opt/conda/lib/python3.10/site-packages/paddle/fluid/dygraph/layers.py:1652: UserWarning: Skip loading for fc.bias. fc.bias receives a shape [1000], but the expected shape is [12].
warnings.warn(('Skip loading for {}. '.format(key) + str(err)))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[19], line 15
12 loss_fn = paddle.nn.CrossEntropyLoss()
14 # 设置gpu环境
---> 15 paddle.set_device('gpu:0')
17 # 整体训练流程
18 for epoch_id in range(15):
File /opt/conda/lib/python3.10/site-packages/paddle/device/__init__.py:316, in set_device(device)
294 def set_device(device):
295 '''
296 Paddle supports running calculations on various types of devices, including CPU, GPU, XPU, NPU, MLU and IPU.
297 They are represented by string identifiers. This function can specify the global device
(...)
314 data = paddle.stack([x1,x2], axis=1)
315 '''
--> 316 place = _convert_to_place(device)
317 framework._set_expected_place(place)
318 return place
File /opt/conda/lib/python3.10/site-packages/paddle/device/__init__.py:257, in _convert_to_place(device)
255 if avaliable_gpu_device:
256 if not core.is_compiled_with_cuda():
--> 257 raise ValueError(
258 'The device should not be {}, since PaddlePaddle is '
259 'not compiled with CUDA'.format(avaliable_gpu_device))
260 device_info_list = device.split(':', 1)
261 device_id = device_info_list[1]
ValueError: The device should not be <re.Match object; span=(0, 5), match='gpu:0'>, since PaddlePaddle is not compiled with CUDA
错误原因: PaddlePaddle没有使用CUDA编译,因此无法使用GPU进行计算。
修改方法: 将设备设置为CPU,即将第15行改为:
paddle.set_device('cpu')
修改后的代码如下:
# 调用resnet50模型
paddle.vision.set_image_backend('cv2')
model = paddle.vision.models.resnet50(pretrained=True, num_classes=12)
# 定义数据迭代器
train_dataloader = DataLoader(train_data, batch_size=256, shuffle=True, drop_last=False)
# 定义优化器
opt = paddle.optimizer.Adam(learning_rate=1e-4, parameters=model.parameters(), weight_decay=paddle.regularizer.L2Decay(1e-4))
# 定义损失函数
loss_fn = paddle.nn.CrossEntropyLoss()
# 设置cpu环境
paddle.set_device('cpu')
# 整体训练流程
for epoch_id in range(15):
model.train()
for batch_id, data in enumerate(train_dataloader()):
# 读取数据
features, labels = data
features = paddle.to_tensor(features)
labels = paddle.to_tensor(labels)
# 前向传播
predicts = model(features)
# 损失计算
loss = loss_fn(predicts, labels)
# 反向传播
avg_loss = paddle.mean(loss)
avg_loss.backward()
# 更新
opt.step()
# 清零梯度
opt.clear_grad()
# 打印损失
if batch_id % 2 == 0:
print('epoch_id:{}, batch_id:{}, loss:{}'.format(epoch_id, batch_id, avg_loss.numpy()))
model.eval()
print('开始评估')
i = 0
acc = 0
for image, label in valid_data:
image = paddle.to_tensor([image])
pre = list(np.array(model(image)[0]))
max_item = max(pre)
pre = pre.index(max_item)
i += 1
if pre == label:
acc += 1
if i % 10 == 0:
print('精度:', acc / i)
paddle.save(model.state_dict(), 'acc{}.model'.format(acc / i))
原文地址: https://www.cveoy.top/t/topic/oHrg 著作权归作者所有。请勿转载和采集!