PyCharm + Docker:打造最舒適的深度學習煉丹爐

一般煉丹都在服務器上,很少有人在本機跑代碼的。之前自己搗鼓怎麼用本地的編輯器配上遠程服務器的環境來營造一個最舒乎的姿勢。最開始用VS Code的SFTP插件,但是用著還是不順手,因為不能用遠程的環境,最後還是選擇了強大的PyCharm。下面的這個教程最開始只是自己用,後來寫了一篇博客分享給實驗室的人,沒想到大家都開始用上了。這次專門寫一篇更詳細的供有緣人使用。

PyCharm + Docker:打造最舒適的深度學習煉丹爐

開始之前你可以對比以下條件來確定自己是否真的需要這樣做:

  • 使用PyCharm作為主力IDE寫Python而不是其他(我非常推薦大家用)
  • 深度學習煉丹師(當然你可以不是,但如果是,你會更舒服)
  • 服務器在遠程或者局域網(局域網的體驗最佳)
  • 使用Docker(能夠熟練使用最佳)

當你配置完成之後,你將能在本地PyCharm IDE上使用遠程服務器的Python解釋器和環境進行調試和運行,同時能夠很方便的將代碼在本地和服務器上進行同步。

OK,廢話不多說,正式開始我們的PyCharm+Docker的遠程環境配置之旅。

首先你需要滿足以下兩個必備條件:

  • 使用PyCharm專業版,記住一定是專業版(社區版不提供遠程服務)
  • 在服務器上安裝docker和nvidia-docker

1. 新建docker container

首先按照如下命令新建一個docker容器(關於docker的使用這裡不廢話,建議不熟悉的童鞋先去學一下如何使用docker,教程很多):

<code>sudo nvidia-docker run -it -p [host_port]:[container_port](do not use 8888) --name:[container_name] [image_name] -v [container_path]:[host_path] /bin/bash/<code>

舉個栗子:

<code>sudo nvidia-docker run -p 5592:5592 -p 5593:5593 -p 8022:22 --name="liuzhen_tf" -v ~/workspace/liuzhen/remote_workspace:/workspace/liuzhen/remote_workspace -it tensorflow/tensorflow:latest-gpu /bin/bash/<code>

正確執行完之後,現在我們就處在新建的docker容器裡了(端口映射,容器名,鏡像和路徑映射這些換成你自己的就行,但是一定要留一個端口映射到容器22端口,因為SFTP默認使用22端口)。

2. 配置SSH服務

接著我們在剛剛新建的容器裡配置SSH服務,首先安裝openssh-server:

<code>$ apt update
$ apt install -y openssh-server/<code>

然後建立一個配置文件夾並進行必要的配置:

<code>$ mkdir /var/run/sshd
$ echo 'root:passwd' | chpasswd
# 這裡使用你自己想設置的用戶名和密碼,但是一定要記住!
$ sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
$ sed 's@session\\s*required\\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

$ echo "export VISIBLE=now" >> /etc/profile/<code>

重啟SSH激活配置:

<code>$ service ssh restart/<code>

在服務器(宿主機)上(不是服務器的docker裡)測試剛剛新建docker容器中哪個端口轉發到了服務器的22端口:

<code>$ sudo docker port [your_container_name] 22
# 如果前面的配置生效了,你會看到如下輸出
# 0.0.0.0:8022/<code>

最後測試能否用SSH連接到遠程docker:

<code>$ ssh root@[your_host_ip] -p 8022
# 密碼是你前面自己設置的/<code>

到這裡說明服務器的docker端已經完成配置。

3. 在PyCharm裡配置部署環境

打開PyCharmTools > Deployment > Configuration, 新建一個SFTP服務器,名字自己取:

PyCharm + Docker:打造最舒適的深度學習煉丹爐

輸入如下圖配置,注意這裡的端口是你剛剛設置的映射到容器22端口的宿主機中的端口,我這裡使用的是8022,賬號密碼是你剛剛自己設置的,這裡的Root Path設置一個遠程docker容器裡的路徑:

PyCharm + Docker:打造最舒適的深度學習煉丹爐

配置完點擊Test SFTP connection,如果成功就恭喜你,可以進行下一步了。

最後在Mappings中配置路徑,這裡的路徑是你本地存放代碼的路徑,與剛剛配置的Root Path相互映射(意思是Mapping裡本機的路徑映射到遠程的Root Path),方便以後在本地和遠程docker中進行代碼和其他文件同步。

PyCharm + Docker:打造最舒適的深度學習煉丹爐

4. 在PyCharm裡配置遠程解釋器

點擊PyCharm的File > Setting > Project > Project Interpreter右邊的設置按鈕新建一個項目的遠程解釋器:

PyCharm + Docker:打造最舒適的深度學習煉丹爐


PyCharm + Docker:打造最舒適的深度學習煉丹爐

配置完成以後在項目解釋器界面就會出現如下圖所示,可以看到此時已經完成遠程解釋器的本地化:

PyCharm + Docker:打造最舒適的深度學習煉丹爐

配置完成以後需要等本地和遠程的環境同步一下,到這裡,恭喜你,可以用最舒服的姿勢。。。寫代碼了。

配置完成以後的日常是這樣的:

PyCharm + Docker:打造最舒適的深度學習煉丹爐

左邊是本地的文件,修改之後可以隨時右鍵deployment->upload到遠程主機,或者直接在本地調試運行;最右邊是遠程主機的文件,假如直接在遠程修改了文件刷新一下同樣可以右鍵下載到本地,但是我不建議這樣做,因為這樣很容易帶來衝突(畢竟沒有很好的版本控制)。目前最好的實踐是在局域網的服務器上,時延低,同步速度快。

常見問題:

1. 最常見的問題就是docker容器停了以後裡面的SSH服務也會相應停止,因此當你發現自己某一天連不上的時候,記得去docker裡重啟一下ssh服務:

<code>$ service ssh restart/<code>

感謝 @丁果 對這個問題提出的解決方案:

“可以在run的時候加上--restart=always,同時ssh啟動的寫到dockerfile裡去。”

2. 在容器中執行apt update的時候可能會出現0% working 的問題

感謝 @奧古斯都 提出該問題以及解決方案:

”這裡不是源的問題,因為容器環境太過純淨,這裡需要安裝apt-transport-https這個deb文件,下載的時候也要注意不要下載最新的版本,否則也會出現依賴問題,要下載和當前docker容器內的apt相匹配的版本。“


私我回復 “666” 即可領取程序員技術成長大禮包。


作者 | 劉震

來源 | https://zhuanlan.zhihu.com/p/52827335


分享到:


相關文章: