【发布时间】:2022-10-22 08:53:55
【问题描述】:
我在一个有 4 个 A6000 GPU 的工作站上。将 Torch 张量从一个 GPU 移动到另一个 GPU 会默默地破坏数据!!!
请参阅下面的简单示例。
x
>tensor([1], device='cuda:0')
x.to(1)
>tensor([1], device='cuda:1')
x.to(2)
>tensor([0], device='cuda:2')
x.to(3)
>tensor([0], device='cuda:3')
任何想法这个问题的原因是什么?
其他可能方便的信息:
(为了解决问题,我手动删除了两个 nvlink)
GPU0 GPU1 GPU2 GPU3 CPU Affinity NUMA Affinity
GPU0 X SYS SYS SYS 0-63 N/A
GPU1 SYS X SYS SYS 0-63 N/A
GPU2 SYS SYS X SYS 0-63 N/A
GPU3 SYS SYS SYS X 0-63 N/A
nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Tue_Mar__8_18:18:20_PST_2022
Cuda compilation tools, release 11.6, V11.6.124
Build cuda_11.6.r11.6/compiler.31057947_0
NVIDIA-SMI 510.47.03 Driver Version: 510.47.03 CUDA Version: 11.6
编辑:添加一些截图
它似乎是有状态的。在启动新的 python 运行时后更改哪些 GPU 可以正常工作。
【问题讨论】:
-
是可重复的吗?你的张量是什么dtype?如果您使用
to('cuda:1')等而不只是数字,也会发生这种情况吗? -
这里的 dtype 是 int,但也坚持使用 float。是的,它是可重复的(关闭后仍然存在)。是的,即使使用 to('cuda:1'),它仍然会损坏。尝试多种其他事情也会出现更奇怪的事情(将其作为图像添加到问题中。)
-
你可以添加一个使用更长张量的例子吗?这可能会给出某种关于到底发生了什么的信号(例如,可能 2 和 3 上的整个张量都被转换为 0)。
-
您也可以考虑直接在Pytorch GitHub 上将此报告为错误。如果你这样做,请确保不是在 SO 上将其删除,因为它可能对未来的用户有用,特别是如果您在此处跟进解决错误的方法。
-
@Kraigolas,感谢您的建议。也在 PyTorch GitHub 上报告了这个问题。 github.com/pytorch/pytorch/issues/84803