簡體   English   中英

通過 vscode 的 SSH 隧道打開一個 Matplotlib 圖

[英]Open a Matplotlib figure through SSH tunnel of vscode

我正在設置一個遠程工作站,以在另一台包含 GPU 的計算機上從我的筆記本電腦運行機器學習相關的 python 代碼。

我使用 vscode 的 SSH 遠程功能來遠程運行和調試我的代碼,我對界面非常滿意。 但是,我無法生成來自“matplotlib”庫的圖形。

我試圖修改一些matlplotlib選項,但沒有成功:

import matplotlib
matplotlib.use('Agg')

按照指示: _tkinter.TclError: no display name and no $DISPLAY environment variable

簡而言之,我的問題出現在以下示例代碼中:

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 筆記本

您可以輕松地繪制到 Jupyter Notebook 中。 這里是一個教程如何設置一個樹莓派通過ssh創建Jupyter筆記本電腦的遠程服務器。

在 Jupyter Notebook 上,您需要在 Notebook 的第一行添加,在導入matplotlib之前,在單元格之后繪制圖像。

%matplotlib inline

另一種方法是使用 Tensorboard,它現在可通過 VS 代碼中的擴展獲得。 您可以保存圖像或繪圖(以及其他類型的數據),並通過 VS 代碼選項卡中的 Tensorboard 界面立即查看。 我一直通過 ssh 使用它。 但是,您確實需要 Tensorflow 或 Pytorch 來執行此操作。

這是 Pytorch 中 numpy.array 或 torch.Tensor 格式圖像的示例。 確保首先啟動您的 Tensorboard 會話。

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()

刷新您的 Tensorboard,您應該立即看到它。

您還可以使用 pickle 將服務器計算機上的文件變啞,然后在本地計算機上重新繪制它們。 您可以使用“SCP”將原始數據復制到本地計算機。 有時它會有所幫助,因為您可以與情節進行實時交互。 我按照這兩個鏈接:

  1. 保存繪制數據python matplotlib 將圖形保存為數據文件
  2. 使用 SCP 復制 使用 SSH 將文件從服務器復制到本地計算機

我建議簡單地創建一個新筆記本並在此筆記本中運行 python 文件。 這最適合我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM