Локальное отображение matplotlib в PyCharm с удаленным ssh-интерпретатором из Compute Engine Google Cloud Platform - PullRequest
0 голосов
/ 09 октября 2018

В настоящее время я запускаю скрипты Python 3.5 на двух экземплярах виртуальной машины в GCP из локального сеанса PyCharm, работающего на моем Mac (подробные спецификации среды см. Ниже).

У меня есть два разных проекта в GCP, которые выглядят одинаково,Я проверил их настройку с нашим облачным администратором, и мы не видим никаких существенных отличий, по крайней мере, тривиальных.Я создал два образа Deep Learning на GCP, используя следующую облачную командную строку SDK, по одной в каждом проекте:

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

Оба изображения полностью похожи.

Я настроил два удаленных интерпретатора ssh в PyCharmи развернул мой код Python на обеих виртуальных машинах.Все абсолютно одинаково с точки зрения конфигурации экземпляра виртуальной машины (ОС, версия / библиотеки Python, исходный код и т. Д.) И конфигурации удаленного интерпретатора PyCharm.В обоих случаях входное соединение ssh с экземпляром (на порту 22) работает довольно хорошо.

Тем не менее, при вызове plt.show() для отображения изображений с помощью matplotlib изображения отображаются в одной настройке, но не вдругой.

Это не вопрос установки правильной конфигурации ssh (опция -X в командной строке, X11Forwarding и т. д.).Я уже проверил это, и в любом случае одна из моих виртуальных машин довольно неплохо справляется с отображением моих изображений в этой конфигурации.

Я отладил выполнение и обнаружил, что PyCharm автоматически обрабатывает отображение X, реализуя собственный matplotlib FigureCanvas,В удаленном ssh функция show() фактически открывает сокет на указанном хосте (то есть на моем локальном Mac) и отправляет отображаемый буфер:

    sock = socket.socket()
    sock.connect((HOST, PORT))
    [..]
    sock.send(buffer)

Именно в этом случае две мои конфигурации расходятся:

  1. Один рабочий пытается подключиться к 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)>

  2. Один не удается подключиться к localhost:53725но также получает исключение.

Мое самое сильное предположение состоит в том, что некоторая конфигурация сети в двух проектах GCP несколько отличается и препятствует соединению на localhost:53725 для второго.Однако, кроме этого, я понятия не имею, что может произойти и / или как это исправить.

Любая идея / предложение будет оценено.

Спасибо, Лоран

-

Подробные спецификации среды: PyCharm 2018.2.4 (Professional Edition), сборка № PY-182.4505.26, построена 19 сентября 2018 г. Лицензия для PyCharm Evaluator Дата окончания срока действия: 27 октября 2018 г. JRE: 1.8.0_152-release-1248-b8 x86_64 JVM: 64-битная виртуальная машина OpenJDK от JetBrains sro macOS 10.14

1 Ответ

0 голосов
/ 10 октября 2018

Хорошо.Кажется, это ошибка, и я нашел обходной путь.Я делюсь этим, так как это может сэкономить часы на устранение неполадок и отладку для всех, кто сталкивается с той же проблемой.

Проблема действительно возникает, когда вы остаетесь в том же сеансе PyCharm и переключаетесь с одного переводчика на другой.Если вы выйдете из PyCharm и запустите его снова, локальный дисплей будет работать с любым из интерпретаторов / виртуальных машин, которые вы запускаете первыми.Затем, если вы переключитесь на второй, это не удается.Все выглядит так, как будто PyCharm установил какую-то блокировку на порту или где-либо еще, что не позволяет вам беспрепятственно переключаться с одного переводчика на другой.

Я поделюсь этими знаниями с командой поддержки PyCharm.Кстати, кроме этого, эта локальная функция отображения с удаленными переводчиками потрясающая и работает просто отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...