通过 vscode 的 SSH 隧道打开一个 Matplotlib 图形



我正在设置一个远程工作站,以便在另一台包含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 个选项:

  1. 不显示的绘图并通过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
  1. 使用 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 个链接:

  1. 保存绘制数据Python Matplotlib 将图形另存为数据文件
  2. 使用 SCP 进行复制使用 SSH 将文件从服务器复制到本地计算机

我建议简单地创建一个新笔记本并在此笔记本中运行python文件。这对我来说最有效。

对我来说,最快的解决方法是使用来自Python脚本的Jupyter Notebook输出。在 VSCode 中,仅在脚本开头添加#%%。这将创建一个要运行的 Jupyter Notebook 块。要创建更多块,请在所需的中断位置再次添加#%%块。因此,您的脚本仍为.py文件,但您可以像在普通脚本:)中一样快速查看图像输出和其他所有内容。我发现这比其他答案建议的要麻烦得多,例如将图像输出保存为.png

相关内容

  • 没有找到相关文章

最新更新