pytorch 在不同机器上生成的向量不一样?

遇到了一个问题,我使用 gl18-tl-resnet50-gem-w-83fdc30.pth 生向量

在同一台机器上,输入相同,输出都是一样的!

但是相同的输入,换一台机器,输出就是不一样的!

在一台机器上,给予一个输入 x, 输出必定是 y1,不管跑几次都是 y1
但是换一台机器,输入还是 x,但是输出就是 y2 了,不管跑几次都是 y2

一开始,我以为是 python 包版本的问题,比如 pytorch 的版本,但是改成一样之后,还是不一致!

asttokens==2.2.0
autopep8==2.0.0
av==10.0.0
backcall==0.2.0
certifi==2022.9.24
cffi==1.15.1
charset-normalizer==2.1.1
cli-helpers==2.3.0
click==8.1.3
coloredlogs==15.0.1
configobj==5.0.6
cryptography==36.0.2
decorator==5.1.1
executing==1.2.0
flatbuffers==22.11.23
humanfriendly==10.0
idna==3.4
importlib-resources==5.10.0
ipython==8.7.0
jedi==0.18.2
loguru==0.6.0
matplotlib-inline==0.1.6
mpmath==1.2.1
mycli==1.26.1
numpy==1.23.5
onnx==1.12.0
onnxruntime==1.13.1
opencv-python==4.6.0.66
packaging==21.3
parso==0.8.3
pexpect==4.8.0
pickleshare==0.7.5
Pillow==9.3.0
prompt-toolkit==3.0.33
protobuf==3.20.1
psutil==5.9.4
ptyprocess==0.7.0
pure-eval==0.2.2
pyaes==1.6.1
pycodestyle==2.10.0
pycparser==2.21
pydantic==1.10.2
Pygments==2.13.0
PyMySQL==1.0.2
pyparsing==3.0.9
pyperclip==1.8.2
PyYAML==6.0
requests==2.28.1
six==1.16.0
sqlglot==10.1.1
sqlparse==0.4.3
stack-data==0.6.2
sympy==1.11.1
tabulate==0.9.0
tomli==2.0.1
torch @ file:///home/pon/code/svddb_sdk/torch-1.12.1-cp310-cp310-manylinux1_x86_64.whl
torchvision==0.13.1
traitlets==5.6.0
typing_extensions==4.4.0
urllib3==1.26.13
wcwidth==0.2.5

使用的 cpu,而不是 GPU,不可能因为 cpu 型号不一样,输出的向量就有区别吧!?

有什么排查方向可以提供?

运行平台的一个是 ubuntu20.04,另一个是 ubuntu16.04
阅读 1.8k
2 个回答

你猜对了,就是因为硬件不一样导致的。如果要保证在不同的机器上生成的向量完全相同,可以使用 PyTorch 的 deterministic 模式。在该模式下,PyTorch 会保证在不同的机器上生成的向量完全相同。

import torch

# 启用 deterministic 模式
torch.backends.cudnn.deterministic = True

# 生成向量
vec = torch.rand(5)

# 输出向量
print(vec)

确实是这样的

我试了一下,每个机器生成的都不一样,但是区别很小,用 l2 求一下距离,差别仅在小数点后 8 位。完全可以忽略

但是注意,如果在同一台机器上,每次生成的向量都不一样,那就是异常
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题