Docker+PyCharm快速搭建機器學習開發環境
本文介紹使用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服務的外部連接。
/etc/ssh/sshd_config
,修改文件中的以下三行:PermitRootLogin yes # 可以登錄 root 用戶
PubkeyAuthentication yes # 可以使用 ssh 公鑰許可
AuthorizedKeysFile .ssh/authorized_keys # 公鑰信息保存到該文件中
重啟sshd /etc/init.d/ssh restart
使得這些配置生效。
- 在容器中
mkdir ~/.ssh
touch ~/.ssh/authorized_keys
- 新開一個mac終端窗口,
ssh-keygen -t rsa -C "[email protected]"
(替換為你自己的郵箱),會在~/.ssh
目錄下生成三個文件id_rsa
、id_rsa.pub
、known_hosts
。複製id_rsa.pub
文件中的內容。 - 將複製的內容粘貼到容器
~/.ssh/authorized_keys
文件中。
提交修改到鏡像 ?以上對容器的修改並不會改變鏡像文件,需要提交修改生成一個新的鏡像。
docker ps -a
查看剛剛使用deepo容器,記錄下該容器的CONTAINER ID
,例如8b5a86d18e58
。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連接後,容器仍運行在後臺。
localhost
就需要改為該伺服器的公網或者內網IP。同時本地的~/data
和~/config
目錄和deepo-ssh容器中的/data
和/config
目錄相互綁定。如果是遠程伺服器的情景,那麼就是伺服器上的目錄和容器中的目錄相互綁定,不再和本地mac有關。
PyCharm+Docker
??經過以上的操作,可以理解成本地12622埠開啟了ssh服務,運行一個獨立的ubuntu伺服器。接下來介紹如何使用PyCharm調用Docker容器中的解釋器。(注意需要PyCharm專業版)
在Pycharm中PyCharm-->Project-->Project Interpreter,如下圖所示: