更新日志
- 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 服務器。
注意:
- 如果需要讓 docker 使用 gpu,則需要在 「Environment variables]中增加
--gpus all
選項,如下圖所示
- 如果要掛載服務器中的數據目錄到 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及代碼自動上傳與運行