我目前正在Mac上运行的本地PyCharm会话中,在GCP的两个VM实例上运行Python 3.5脚本(有关详细的环境规格,请参见下文)。
我在GCP中有两个看起来相似的不同项目。 我与我们的云管理员一起审查了他们的设置,但看不到任何重大区别,至少没有任何微不足道的区别。 我使用以下云SDK命令行在GCP上创建了两个深度学习图像,每个项目中一个:
export PROJECT=[MY_PROJECT_NAME]
export INSTANCE_ROOT=$USER-vm
export ZONE=europe-west4-a
export IMAGE_FAMILY=tf-latest-gpu
export INSTANCE_TYPE=n1-highmem-8
export GPU_TYPE=v100
export GPU_COUNT=1
export INSTANCE_NAME=$INSTANCE_ROOT-$GPU_TYPE-$GPU_COUNT
gcloud compute instances create $INSTANCE_NAME \
--zone=$ZONE \
--image-family=$IMAGE_FAMILY \
--image-project=deeplearning-platform-release \
--maintenance-policy=TERMINATE \
--accelerator=type=nvidia-tesla-$GPU_TYPE,count=$GPU_COUNT \
--machine-type=$INSTANCE_TYPE \
--boot-disk-size=200GB \
--metadata=install-nvidia-driver=True \
--scopes=storage-rw
两种图像完全相似。
我在PyCharm中配置了两个远程ssh解释器,并将Python代码部署在两个虚拟机上。 在VM实例配置(操作系统,Python版本/库,源代码等)和PyCharm远程解释器配置方面,一切都绝对相似。 在这两种情况下,到实例的ssh入口连接(在端口22上)都运行良好。
但是,当使用matplotlib调用plt.show()
显示图像时,图像将在一种设置中显示,而在另一种设置中不显示。
这与设置正确的ssh配置(命令行上的-X
选项, X11Forwarding
等) X11Forwarding
。 我已经检查过了,无论如何,我的一台VM都能很好地在此配置下显示映像。
我调试了执行过程,发现PyCharm通过实现自己的matplotlib FigureCanvas
自动处理X显示。 在远程ssh中时, show()
函数实际上在已定义的主机(即我的本地Mac)上打开一个套接字,并发送要显示的缓冲区:
sock = socket.socket()
sock.connect((HOST, PORT))
[..]
sock.send(buffer)
这正是我的两种配置有所不同的地方:
一个正在工作的尝试在localhost:53725
上连接并成功: <socket.socket fd=28, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 42316), raddr=('127.0.0.1', 53725)>
一个失败的尝试也尝试在localhost:53725
上连接,但是会出现异常。
我最强烈的假设是,两个GCP项目中的某些网络配置有所不同,并阻止了第二个在localhost:53725
上的连接。 但是,除此之外,我不知道会发生什么和/或如何解决。
任何想法/建议将不胜感激。
谢谢,洛朗
-
详细的环境规格:PyCharm 2018.2.4(专业版)内部版本#PY-182.4505.26,建于2018年9月19日,已获得PyCharm Evaluator许可到期日期:2018年10月27日JRE:1.8.0_152-release-1248-b8 x86_64 JVM :JetBrains sro macOS 10.14的OpenJDK 64位服务器VM
好。 这似乎是一个错误,我找到了解决方法。 我将其共享是因为它可以为陷入困境的任何人节省数小时的故障排除和调试时间。
当您保持在同一个PyCharm会话中并从一个解释器切换到另一个解释器时,实际上会发生此问题。 如果退出PyCharm并重新启动,则本地显示将与您首先运行的任何解释器/ VM一起使用。 然后,如果切换到第二个,它将失败。 一切似乎都由PyCharm好像在端口上或其他任何地方设置了某种锁,阻止您从一个解释器无缝切换到另一个解释器。
我将与PyCharm支持团队分享这些见解。 顺便说一句,除此之外,带有远程口译员的本地显示功能很棒,并且可以正常工作。