PyCharm 部署 Docker 鏡像解釋器


更新日志

  • 2020.05.22 增加了 docker 中使用 gpu 的相關文字和配圖
  • 2020.06.03 增加了掛載數據目錄到 docker 中相關說明
  • 2021.10.25 更新失效鏈接

需求說明/適用場景:

  • python 解釋器:指向服務器上 Docker 鏡像中的 python 解釋器
  • 文件和代碼:位於服務器主機,而非 Docker 鏡像中

實驗環境:

  • PyCharm:2020.1
  • 服務器:Ubuntu 16.04.4 LTS
  • Docker:19.03.4, build 9013bf583a

假定 164 服務器中的 Docker 容器已配置完成。接下來,我們將詳細說明如何在 Pycharm 中,將項目的 python 解釋器指向 Docker 容器。

1 配置 Docker

(1)依次點擊 View --> Tool Windows --> Docker.

(2)然后點擊鉛筆圖標,開始配置 Docker。

(3) 彈出「Docker」窗口后,在如下圖所示的「Engine API URL」中填入:tcp://192.168.7.164:2375,其中 2375 為服務器端 Docker 容器的端口(端口查看方法見附件)。

當看到如上圖所示的「Connection successful」,則表示已成功連接到了 docker 鏡像。然后點擊 「OK」。

2 新建項目

「新建項目」窗口如下圖所示。

3 配置該項目的 python 解釋器

(1)依次點擊:File --> Settings --> Project Interpreter。彈出如下窗口,然后點擊「齒輪圖標」,選擇「add」。

(2) 在彈出的「Add Python Interpreter」窗口中,選擇所需的包含 python解釋器「Image name」。然后點擊 「OK」。

(3)按需更改 「Python Interpreter path:」,默認值為 python。這里我們更改為 python3。然后點擊 「OK」。

(4) 在彈出的「Settings」窗口中點擊「OK」。

至此,已將 Pycharm 中該項目的 python 解釋器指向了 Docker 容器。接下來,我們將對該項目的 python 源碼運行環境進行配置。

4 編輯腳本

新建一名為 fibonacci_numbers.py 的源文件,輸入如下內容:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import tensorflow as tf

print(sys.executable)

a, b = 0, 1
while a < 10:
    print(a, end=', ')
    a, b = b, a+b

# print('\n', tf.test.is_gpu_available()) # 如果使用 gpu,去掉前面的 #

5 配置服務器和文件映射關系

項目相關的配置包括三部分:

  • 配置遠程服務器
  • 配置本地和服務器端的目錄映射關系
  • 配置本地文件與服務器文件間的同步方式

(1)配置遠程服務器。

(2)配置本地文件與服務器文件間的映射關系。

(3)配置文件或目錄上傳服務器的方式。

這里我們選擇「On explicit save action (Ctrl +S)」

6 上傳腳本文件到服務器

當看到如下圖綠色框所示的提示,則表示上傳服務器成功。

7 配置腳本運行環境

接下來,我們將對 fibonacci_numbers.py python 腳本運行環境進行配置。
(1)第一步,依次單擊 Run --> Run,

彈出如下窗口, 選擇編輯配置信息。

(2)第二步,開始配置遠程服務器、本地工作目錄、以及 Docker 容器地址。

① 假設 Docker 中的工作目錄為:/home/leaf/project,配置 「Path Mappings」如下。

② 配置 「Docker container settings」,默認情況下,其地址是指向本地的。這里我們將其更改為 164 服務器。

注意

  1. 如果需要讓 docker 使用 gpu,則需要在 「Environment variables]中增加 --gpus all 選項,如下圖所示
  2. 如果要掛載服務器中的數據目錄到 Docker 中,可以增加 -v 服務器目錄:容器目錄
    相關路徑設置如下。

③ 最終配置完成后的效果圖如下。
只使用 cpu

使用 gpu(備注:由於使用 gpu 的是另外一個項目,這里可能文件路徑與 cpu 有所不同)

8 運行腳本

cpu 情況下的運行結果

使用gpu 情況下的運行結果

249e02c6b22a:python -u /home/workspace/ecg_binary_classify/connectivity_test.py
/usr/local/bin/python
WARNING:tensorflow:From /home/workspace/ecg_binary_classify/connectivity_test.py:11: is_gpu_available (from tensorflow.python.framework.test_util) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.config.list_physical_devices('GPU')` instead.
2020-05-22 07:26:06.108900: I tensorflow/core/platform/cpu_feature_guard.cc:143] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-05-22 07:26:06.119917: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102] CPU Frequency: 1699975000 Hz
2020-05-22 07:26:06.121030: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7f8f08000b20 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-05-22 07:26:06.121062: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
2020-05-22 07:26:06.125891: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1
2020-05-22 07:26:06.477046: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x5c191d0 initialized for platform CUDA (this does not guarantee that XLA will be used). Devices:
2020-05-22 07:26:06.477119: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): GeForce GTX 1080 Ti, Compute Capability 6.1
2020-05-22 07:26:06.477132: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (1): GeForce GTX 1080 Ti, Compute Capability 6.1
2020-05-22 07:26:06.479850: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1561] Found device 0 with properties: 
pciBusID: 0000:02:00.0 name: GeForce GTX 1080 Ti computeCapability: 6.1
coreClock: 1.582GHz coreCount: 28 deviceMemorySize: 10.92GiB deviceMemoryBandwidth: 451.17GiB/s
2020-05-22 07:26:06.482018: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1561] Found device 1 with properties: 
pciBusID: 0000:82:00.0 name: GeForce GTX 1080 Ti computeCapability: 6.1
coreClock: 1.582GHz coreCount: 28 deviceMemorySize: 10.92GiB deviceMemoryBandwidth: 451.17GiB/s
2020-05-22 07:26:06.482505: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.1
2020-05-22 07:26:06.486261: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10
2020-05-22 07:26:06.489556: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcufft.so.10
2020-05-22 07:26:06.490141: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcurand.so.10
2020-05-22 07:26:06.494082: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusolver.so.10
2020-05-22 07:26:06.496206: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusparse.so.10
2020-05-22 07:26:06.504214: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
2020-05-22 07:26:06.511782: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1703] Adding visible gpu devices: 0, 1
2020-05-22 07:26:06.511852: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.1
2020-05-22 07:26:06.516582: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1102] Device interconnect StreamExecutor with strength 1 edge matrix:
2020-05-22 07:26:06.516611: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1108]      0 1 
2020-05-22 07:26:06.516622: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1121] 0:   N N 
2020-05-22 07:26:06.516630: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1121] 1:   N N 
2020-05-22 07:26:06.522368: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1247] Created TensorFlow device (/device:GPU:0 with 10371 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0, compute capability: 6.1)
2020-05-22 07:26:06.525368: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1247] Created TensorFlow device (/device:GPU:1 with 10371 MB memory) -> physical GPU (device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:82:00.0, compute capability: 6.1)
0, 1, 1, 2, 3, 5, 8, 
 True

Process finished with exit code 0

當看到 True 時,則表示 TensorFlow 可以順利調用 GPU。

9 總結

想要實現的是:

  • 僅僅使用 Docker 鏡像中的的 python 解釋器,
  • 運行時所需的數據和代碼都存儲在主機中。

該場景多發生在團隊內有多位成員,且成員需要使用相同的大數據,而對數據建模的方式、方法,以及所需配置的環境各不相同時。
從 pycharm 的運行結果可以看到,每運行一次程序,它將會自動創建一個容器,而在運行結束后,容器會被自動刪除(因為服務器上通過 docker ps -a 找不到該 ID 的容器)。

另一種常見的使用場景是:將與該項目相關的所有數據、配置文件、代碼都放在容器中。該情況下的配置稍有不同,我們將在下一節進行說明。

附件

新建項目時指定解釋器

在創建項目文件時,我們采用了 pychram 默認的 python 解釋器配置。此時 pycharm 將在該項目下新建一個名字為 venv 的虛擬環境。如果不想創建該虛擬環境,可以在創建項目時,自行指定 python 解釋器。需要說明的是,如果此時將解釋器指向 Docker 容器是行不通的,如下圖所示。

如何查看服務器上 Docker 容器配置信息中的端口?

$ vim /lib/systemd/system/docker.service

參考資料

[1] 使用Pycharm遠程連接及管理Docker
[2] Pycharm配置Docker解釋器
[3] PY => Pycharm連接Docker及代碼自動上傳與運行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM