我正在设置一个远程工作站,以便在另一台包含GPU的计算机上从笔记本电脑运行与机器学习相关的python代码。
我使用 vscode 的 SSH 远程功能远程运行和调试我的代码,我对界面非常满意。但是,我无法生成来自"matplotlib"库的数字。
我试图修改一些 matlplotlib 选项,但它不成功:
import matplotlib
matplotlib.use('Agg')
如:_tkinter中的指示。Tcl错误:无显示名称和无$DISPLAY环境变量
简而言之,我的问题出现在以下示例代码中:
import numpy as np
from matplotlib import pyplot as plt
x = np.linspace(0,1,101)
y = x ** 2
plt.close()
plt.figure()
plt.plot(x,y)
plt.show()
~/vscode$ cd /home/*/vscode ; env PYTHONIOENCODING=UTF-8 PYTHONUNBUFFERED=1 /usr/bin/python3 /home/*/.vscode-server/extensions/ms-python.python-2019.6.24221/pythonFiles/ptvsd_launcher.py --default --client --host localhost --port 39903 /home/*/vscode/test_plot.py
Traceback (most recent call last):
File "/home/*/.vscode-server/extensions/ms-python.python-2019.6.24221/pythonFiles/ptvsd_launcher.py", line 43, in <module>
main(ptvsdArgs)
File "/home/*/.vscode-server/extensions/ms-python.python-2019.6.24221/pythonFiles/lib/python/ptvsd/__main__.py", line 434, in main
run()
File "/home/*/.vscode-server/extensions/ms-python.python-2019.6.24221/pythonFiles/lib/python/ptvsd/__main__.py", line 312, in run_file
runpy.run_path(target, run_name='__main__')
File "/usr/lib/python3.6/runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
File "/usr/lib/python3.6/runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/*/vscode/test_plot.py", line 8, in <module>
plt.figure()
File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 539, in figure
**kwargs)
File "/usr/lib/python3/dist-packages/matplotlib/backend_bases.py", line 171, in new_figure_manager
return cls.new_figure_manager_given_figure(num, fig)
File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 1049, in new_figure_manager_given_figure
window = Tk.Tk(className="matplotlib")
File "/usr/lib/python3.6/tkinter/__init__.py", line 2023, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable
非常感谢你帮助我!
我设法通过在启用 X11 转发的情况下运行并行 Putty ssh 连接并在启动 python 脚本之前在 vscode 的终端中写入export DISPLAY=localhost:10.0
来解决这个问题。
但是,我有安全问题,我想知道为什么我必须手动执行这些命令才能使其工作......任何见解将不胜感激!
我发现以前的答案略有不同,效果很好。
将绘图另存为.png
,而不是绘制它。
plt.savefig("dummy_name.png")
然后,前面的答案建议通过scp
移动文件。相反,我建议使用Visual Code打开dummy_name.png
,无需编写命令,并且只要您绘制其他内容,它就会自动刷新图像。我用SSH从美国到欧洲的服务器中测试了这个,图像在不到半秒的时间内刷新。
为了便于配置,您有 2 个选项:
- 不显示的绘图并通过SSH传输图片文件
此选项包括将plt.show()
替换为
plt.savefig('foo.png')
plt.savefig('foo.pdf')
有关保存matplotlib
图的详细信息
之后,您可以使用scp
转移此数字
scp remote_username@10.10.0.2:/path/to/foo.png /local/directory
- 使用 Jupyter Notebook
您可以轻松地绘制到 Jupyter 笔记本中。这是一个关于如何设置树莓派的教程,通过ssh
为Jupyter Notebook创建远程服务器。
在 Jupyter 笔记本上,您需要在导入matplotlib
之前在笔记本的第一行添加,以在单元格之后绘制图像。
%matplotlib inline
另一种方法是使用Tensorboard,现在可以通过VS代码中的扩展获得。您可以保存图像或绘图(以及其他类型的数据(,并立即通过 VS 代码选项卡中的 Tensorboard 界面查看它。我一直通过 ssh 使用它。但是,您确实需要Tensorflow或Pytorch来执行此操作。
下面是 Pytorch 中 numpy.array 或 torch 中图像的示例。张量格式。确保先启动您的张量板会话。
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('log_dir')
# for some image "im"
writer.add_image('My image', im, 0)
write.close()
下面是 matplotlib 数字的示例:
def examplePlot(data):
fig = plt.figure()
# do some plotting
return fig
writer.add_figure('My plot', examplePlot(data), 0)
writer.close()
刷新你的张量板,你应该马上看到它。
使用 pickle 将服务器计算机上的文件静音,然后在本地计算机上重新填充它们。您可以使用"SCP"将原始数据复制到本地计算机。有时它会有所帮助,因为您可以与情节进行实时交互。我遵循以下 2 个链接:
- 保存绘制数据Python Matplotlib 将图形另存为数据文件
- 使用 SCP 进行复制使用 SSH 将文件从服务器复制到本地计算机
我建议简单地创建一个新笔记本并在此笔记本中运行python文件。这对我来说最有效。
对我来说,最快的解决方法是使用来自Python脚本的Jupyter Notebook输出。在 VSCode 中,仅在脚本开头添加#%%
。这将创建一个要运行的 Jupyter Notebook 块。要创建更多块,请在所需的中断位置再次添加#%%
块。因此,您的脚本仍为.py文件,但您可以像在普通脚本:)中一样快速查看图像输出和其他所有内容。我发现这比其他答案建议的要麻烦得多,例如将图像输出保存为.png