本文介紹使用Docker容器結合PyCharm快速搭建機器學習類任務開發環境。機器學習的開發往往會涉及到很多python的包,環境的搭建和維護是一件頭疼的事,使用Docker現成的機器學習工具Deepo能跳過環境搭建的過程,再結合PyCharm可以實現本地開發調試。本文在Mac上做的嘗試,linux操作系統同理,windows也有相應的docker軟體使用,Pycharm的設置都是相似的。最終的效果是省略環境搭建的步驟,使用PyCharm進行代碼的開發和調試。

Docker

??Docker是一種容器技術,類似於虛擬機,但比虛擬機更輕便。Docker容器內的應用程序直接運行於宿主的內核,而沒有自己的內核,而且也沒有硬體虛擬。更多Docker的相關知識可以看《Docker-從入門到實踐》。

Deepo

Deepo是一個包含一系列Docker鏡像

的項目,這些鏡像中包含了TensorFlow、Caffe和Torch等多種深度學習框架。也就是說,在這些鏡像中已經包含了大部分流行的機器學習框架,只需要將鏡像下載到本地,運行容器即可直接使用這些框架。

??Deepo提供了GPU和CPU版本的框架,這裡使用的mac以CPU的鏡像為例子,對於GPU版本的鏡像需要先安裝Nvidia官方的nividia-docker和相應版本的NVIDIA驅動。

??在github頁面可以看到Deepo擁有眾多的不同的鏡像,以tag來區分,可以根據需要下載對應的鏡像。這裡以docker pull ufoym/deepo:cpu為例,這樣會下載包含cpu版本的機器學習框架的鏡像。

Deepo-ssh鏡像

??在有了Deepo鏡像之後,為了方便使用,可以在Deepo鏡像基礎上配置ssh服務,以便於mac通過ssh連接登錄到容器,以及PyCharm調用遠程的python的interpreter。

??登錄到現有的Deepo容器,以docker run -it ufoym/deepo:cpu bash互動式的進入deepo容器中。

配置容器ssh連接 ? 這一步可以使用mac通過ssh連接ubuntu容器。首先通過apt-get install openssh-server用於開啟ssh服務的外部連接。

配置sshd ?修改sshd的默認配置,編輯文件/etc/ssh/sshd_config,修改文件中的以下三行:

PermitRootLogin yes # 可以登錄 root 用戶
PubkeyAuthentication yes # 可以使用 ssh 公鑰許可
AuthorizedKeysFile .ssh/authorized_keys # 公鑰信息保存到該文件中

重啟sshd /etc/init.d/ssh restart使得這些配置生效。

添加mac的公鑰到容器 ?這一步是為了能免密碼ssh登錄到容器中。
  1. 在容器中mkdir ~/.ssh
  2. touch ~/.ssh/authorized_keys
  3. 新開一個mac終端窗口,ssh-keygen -t rsa -C "[email protected]"(替換為你自己的郵箱),會在~/.ssh目錄下生成三個文件id_rsaid_rsa.pubknown_hosts。複製id_rsa.pub文件中的內容。
  4. 將複製的內容粘貼到容器~/.ssh/authorized_keys文件中。

提交修改到鏡像 ?以上對容器的修改並不會改變鏡像文件,需要提交修改生成一個新的鏡像。

  1. docker ps -a查看剛剛使用deepo容器,記錄下該容器的CONTAINER ID,例如8b5a86d18e58
  2. docker commit -m add ssh -a your-name 8b5a86d18e58 deepo-ssh這樣會將剛剛在deepo容器中配置的ssh服務保存,並生成新的deepo-ssh鏡像。在後續使用docker images命令可以查看到新的鏡像已經被保存。

運行最終的容器

docker run -d -p 12622:22 -v ~/data:/data -v ~/config:/config deepo-ssh /usr/sbin/sshd -D
  • -d | 後臺運行
  • -p 12622:22 | 綁定當前mac的12622埠到deepo-ssh容器的22埠(ssh服務默認為22埠)
  • -v ~/data:/data | 將mac的~/data目錄掛載到容器/data目錄
  • /usr/sbin/sshd -D | 容器運行的命令和參數,開啟ssh服務?

這樣就可以通過ssh -p 12622 root@localhost連接到容器,可以進入python解釋程序,執行import torch等命令查看機器學習框架是否能正常使用。在exit退出ssh連接後,容器仍運行在後臺。

??以上的操作是在mac本地,同樣適合在一臺遠程的linux伺服器上,部署一個docker容器。那麼在ssh連接時,localhost就需要改為該伺服器的公網或者內網IP。同時本地的~/data~/config目錄和deepo-ssh容器中的/data/config目錄相互綁定。如果是遠程伺服器的情景,那麼就是伺服器上的目錄和容器中的目錄相互綁定,不再和本地mac有關。

PyCharm+Docker

??經過以上的操作,可以理解成本地12622埠開啟了ssh服務,運行一個獨立的ubuntu伺服器。接下來介紹如何使用PyCharm調用Docker容器中的解釋器。(注意需要PyCharm專業版)

在Pycharm中PyCharm-->Project-->Project Interpreter,如下圖所示:

點擊右上按鈕選擇添加解釋器。

選擇SSH Interpreter,按圖中內容。

選用openssh連接,並添加私鑰文件。

選擇docker容器內的python解釋器。 這樣在PyCharm寫代碼時就會調用已經包含機器學習框架的python解釋器,能夠代碼提醒和智能補全。

接下來配置Run/Debug Configurations,

??如上配置,這裡解釋器是docker中的解釋器,注意Working Directory是docker容器中的目錄,這為/data,由於docker的設置,本機~/data和docker容器中的/data目錄相映射,因此需要執行的文件可以放入本機~/data目錄。以上就可以在Pycharm調用容器內的解釋器以使用容器中已安裝的機器學習框架,而且執行和調試可以在本地進行,提高開發效率。

??以上結合Docker和PyCharm快速搭建機器學習開發環境,這例子的情景是在mac後臺運行容器,並將本機的埠映射到容器的22埠,實現ssh連接容器,並在PyCharm中調用容器的解釋器,以實現本地的機器學習任務的開發調式。以上的模式對於一個遠程的伺服器同樣適用,在伺服器上創建docker容器並運行在後臺,映射到伺服器的一個埠。在Pycharm中調用遠程伺服器的解釋器,並創建本地目錄和伺服器目錄的映射(在Deployment配置),就可以實現在本地寫代碼和調試。
最終效果

推薦閱讀:
相關文章