当前位置: 首页 > news >正文

Docker+PyCharm远程调试环境隔离解决方案

Docker+PyCharm+Miniconda实现深度学习代码远程调试和环境隔离

pic-heading

本文详细介绍了如何在局域网环境下,利用Docker、PyCharm和Miniconda构建一个高效的深度学习远程调试平台。首先在服务器(server)上,通过Docker构建包含不同CUDA环境的镜像,以运行容器并实现环境的隔离。通过位于主机(host)的PyCharm,将项目代码deploy至容器中,从而实现远程debug或代码运行。为了处理容器内产生的大量数据文件,这些文件将被挂载到服务器的存储设备上。此外,通过在服务器(Windows系统)上设置文件分享,与主机建立连接,便于用户在主机上访问和浏览由深度学习应用产生的数据。这种配置确保Host内的项目代码只能在Host上被修改,而server上的数据文件只能在host上被预览且不可更改,从而最大程度上保障了数据的安全性和完整性。

环境说明

  • Windows 11 23H2
  • Docker Desktop 4.34.2(Windows)
  • Docker Engine v27.2.0
  • PyCharm 2024.2.1
  • GeForce 3060Ti

路由配置

WAN口接入互联网,LAN口接host和servers,为LAN口配置静态ip(例如本文主图的静态ip配置)。

关于路由:我选用的是水星(Mercury)MR100GP-AC 商用5口千兆有线路由-250元。

Docker设置(Windows系统)

以Windows上Docker Desktop 4.34.2 (167172)为例。

环境配置

docker图标右键,switch to Linux containers切换至Linux container!如果显示switch to Windows containers说明已经在Linux container环境了,跳过该步骤即可。

在这里插入图片描述

设置里builders把desktop-Linux设置为default builder.

在这里插入图片描述

网络配置

设置里general->expose daemon on tcp://localhost:2375选项开启。(让其他软件可以调用docker的daemon接口)

在这里插入图片描述

that only can be accessed via tcp://127.0.0.1, My inner IP address 192.168.3.9 doesn’t work. The document said to edit the C:\ProgramData\Docker\config\daemon.json and add “hosts”: [“tcp://0.0.0.0:2375”], but it’s doesn’t work for any IP address, I’m very sure I did it as the document.
不要尝试上述方案,因为不起作用。请按下述方式进行。

管理员身份运行Windows powershell,运行(监听+防火墙):

netsh interface portproxy add v4tov4 listenport=2375 connectaddress=127.0.0.1 connectport=2375 listenaddress=192.168.1.3 protocol=tcp
netsh advfirewall firewall add rule name="docker_daemon" dir=in action=allow protocol=TCP localport=2375

listenaddress=192.168.1.3是我server的静态ip,你应当修改为你的server的实际地址。

设置docker的proxy才能拉取镜像,或者换源(大部分镜像最近都失效了或者只能在校园/公司网内部使用)。

在这里插入图片描述

注意,上述ip和port应当改成你自己局域网内的proxy地址。

连接测试

pycharm(2024.2): settings->build,execution,deployment->docker

在这里插入图片描述

通过TCP socket连接server’s docker,若virtual machine path那个框内有项目,可以先把里面的项目删掉。看是否显示connection successful.

在这里插入图片描述

然后你可以在pycharm里远程控制docker on the server.(找到侧边栏services或快捷键alt+8)。你可以自行探索一下pycharm的远程docker控制功能有哪些。

在这里插入图片描述

构建image

直接pull image

我构建好的镜像已上传my docker hub,可以直接pull,避免手动构建失败:

  • GeForce 3060Ti适用
  • 此镜像从nvidia官方镜像nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu20.04构建
docker pull sylvanding/my-cuda:11.3.1-cudnn8-runtime-ubuntu20.04

image push命令:

docker push sylvanding/my-cuda:11.3.1-cudnn8-runtime-ubuntu20.04
# The push refers to repository [docker.io/sylvanding/my-cuda]

从Dockerfile手动构建

我的server使用GeForce 3060Ti(以此为例),我们从nvidia官方镜像nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu20.04开始构建dockerfile:

  • 继承官方cuda和cudnn runtime环境
  • 安装工具包(最重要的是openssh-server将用于pycharm远程连接)
  • 修改root用户登录密码
  • 修改openssh配置文件,允许远程连接
  • 安装nvidia-container-toolkit(会根据当前容器环境自动选择合适的版本),从而使nvidia-smi等命令可以运行
  • 安装miniconda
  • 设置工作目录和暴露接口

上述dockerfile文件如下:

FROM nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu20.04LABEL maintainer="sylvanding@qq.com"# set env
# https://stackoverflow.com/questions/61388002/how-to-avoid-question-during-the-docker-build
ENV TZ=Asia/Shanghai \DEBIAN_FRONTEND=noninteractiveRUN apt-get update && apt-get install -y \wget \curl \git \bzip2 \vim \openssh-server \&& rm -rf /var/lib/apt/lists/*# change root pwd
ARG USERPWD=123456
RUN echo "root:${USERPWD}" | chpasswd# openssh config
RUN mkdir /var/run/sshd
RUN echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config.d/ssh_config.conf \&& echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config.d/ssh_config.conf
RUN service ssh restart# install nvidia-container-toolkit
# https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
## configure the production repository
RUN curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o \/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
## update the packages list from the repository
RUN apt-get update
## install the NVIDIA Container Toolkit packages
RUN apt-get install -y nvidia-container-toolkit# install Miniconda
# https://docs.anaconda.com/miniconda/#quick-command-line-install
RUN mkdir -p ~/miniconda3
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
RUN bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
RUN rm ~/miniconda3/miniconda.sh
## initialize newly-installed Miniconda
RUN ~/miniconda3/bin/conda init bashWORKDIR /reposEXPOSE 22 8080

各个组件的版本选择:显卡驱动 → CUDA → CUDA Toolkit → cuDNN → Pytorch

通过命令构建image
docker build --build-arg HTTP_PROXY=http://192.168.1.2:10811 -f ./path/to/your/Dockerfile -t sylvanding/my-cuda:11.3.1-cudnn8-runtime-ubuntu20.04 .

注意:修改你的http_proxy才能顺利构建环境(国内)。

在pycharm里构建image

打开编写的dockerfile,edit设置build image的配置:

在这里插入图片描述

name是你这个run configuration的名称,server选择你刚刚添加的docker服务器接口,注意:在build args中添加http_proxy才能顺利构建环境(国内)。之前设置的proxy只是docker desktop的proxy,这里构建镜像时要再次指定! 最后,apply和run。

在这里插入图片描述

在这里插入图片描述

创建容器

pycharm里选中image右键create container.

在这里插入图片描述

docker run配置:

  • server: 设置为之前配置的网络docker
  • bind ports: 将container 22端口映射到server的2222端口
  • bind mounts: 将container的/repos工作路径挂载到server的E:\repos,方便以后直接在server(Windows)里设置E:\repos文件夹网络共享文件
  • env variables: 为container设置proxy,记得更换为你自己的
  • run options: --gpus all
docker run -p 2222:22 -v E:\repos:/repos --env http_proxy=http://192.168.1.2:10811 --env https_proxy=http://192.168.1.2:10811 --name cuda113-cudnn8-ubuntu20 --pull missing --restart always --gpus all sylvanding/my-cuda:11.3.1-cudnn8-runtime-ubuntu20.04 

在这里插入图片描述

☑️ container创建成功:

在这里插入图片描述

PyCharm项目部署和远程同步(基于Windows文件共享)

pycharm项目部署

settings->deployment->new SFTP

在这里插入图片描述

新建ssh连接

在这里插入图片描述

❌ 若test connection提示:Cannot connect to remote host: net.schmizz.sshj.transport.TransportException: Server closed connection during identification exchange,首先尝试重启ssh服务docker exec cuda113-cudnn8-ubuntu20 service ssh restart. 若依然无法连接,检查/etc/ssh/sshd_config.d/*.conf/etc/ssh/sshd_config等ssh配置文件和防火墙配置,修改正确后重启ssh服务再次进行test connection.

root path设置为工作目录;Rsync可根据个人需求选择是否开启。

在这里插入图片描述

设置项目mapping路径:local path是本地项目路径 --mapping>> deployment path是server上相对于root path的远程项目路径。

在这里插入图片描述

向server的development path推送项目:选中需要推送的项目(比如我的project是DBlink),工具栏tools->deployment->upload…,建议开启automatic upload.

⚠️ 不推荐使用Deployment中的 Mapping 设置,为记录的完整性在此列出相关操作。更推荐在配置远程interpreter时直接设置项目同步(见下一节),原因如下:

  • Deployment 功能主要用于将本地开发环境中的文件部署到远程服务器上。这包括将代码文件、资源和相关配置文件传输到线上环境或开发测试服务器中。
  • SSH 连接解释器中的 Sync Folders 设置,主要用于同步本地和远程解释器环境中的文件,以便在远程服务器上运行和测试代码,同时保持本地和远程环境的代码一致性。非常适合于远程开发场景,可以在本地编辑代码并直接在远程环境下运行和调试。

Deployment 主要用于部署,而 Sync Folders 更侧重于持续的开发和实时调试。如果是开发过程中频繁需要测试代码,即利用远程资源和环境,则使用 SSH 解释器的 Sync Folders 更为合适;如果主要是将更新推送到生产或测试环境,使用 Deployment 功能会更直接有效。 ——generated by GPT

在这里插入图片描述

推送成功结果查看:

在这里插入图片描述

pycharm远程miniconda环境解释器配置

通过ssh连接远程container,调用miniconda,获取miniconda中的所有虚拟python环境。设置双向文件同步。

settings->project->python interpreter->add interpreter ->on ssh

在这里插入图片描述

⚠️ 这里并非创建基于docker的interpreter,因为我的之前run的container cuda环境在多个项目中是可以复用的,因此我们在container中用miniconda创建虚拟环境是一种更好的选择。

在这里插入图片描述

自动读取远程环境配置…

在这里插入图片描述

选择conda environment,设置conda虚拟环境。sync folders填写工作路径/repos/your project name,勾选自动上传到服务器。

在这里插入图片描述

查看interpreter配置结果:

在这里插入图片描述

查看同步情况:

在这里插入图片描述

查看从container->server的挂载是否成功:

在这里插入图片描述

Windows文件共享

⚠️ 测试发现,pycharm可以实现本地文件的Automatic upload,但无法实现服务器端文件更新后传回本地。事实上,在深度学习模型训练、测试过程中产生的大量数据文件也不需要传回本地,可以使用Windows的文件共享实现在server端共享挂载的文件夹,在本地预览server上的文件,选择需要的数据文件进行下载,降低本地存储大小

在host和server(均为Windows操作系统)上开启网络共享。

在这里插入图片描述

server

server: 在局域网上共享container挂载的E:\repos:/repos.

在这里插入图片描述

在这里插入图片描述

server上也可以管理共享或查看所有共享:

在这里插入图片描述

host

Host: 在host上挂载server共享的repos文件夹:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这样,数据文件存放在远端电脑,而host可以通过文件共享的方式预览文件(并不会下载文件到本地)。

Windows通过SSH连接实现远程显存监控

Server(Windows)

Windows开启SSH-server服务

检查 OpenSSH 的可用性

管理员身份打开powershell并运行:

Get-WindowsCapability -Online | Where-Object Name -like  'OpenSSH*'

在这里插入图片描述

如果任何 SSH 客户端或服务器功能不可用,请根据 PowerShell (Admin) 中的要求使用以下命令。

安装 OpenSSH 服务器
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

在这里插入图片描述

再次检查可用性。

在这里插入图片描述

修改ssh-server配置文件

默认情况下,OpenSSH 客户端和 OpenSSH 服务器位于以下目录:C:\Windows\System32\OpenSSH. 管理员身份打开记事本,再在记事本里打开配置文件sshd_config_default.

在这里插入图片描述

修改如下部分:

  • PermitRootLogin yes
  • PasswordAuthentication yes

保存。搜索service服务:

在这里插入图片描述

找到openssh ssh server服务,修改启动方式为“自动”,点“启动”。然后apply and ok.

在这里插入图片描述

Host(-)

Host通过ssh服务测试连接server(Windows ssh):

ssh admin@192.168.1.3

显卡状态监控:

nvidia-smi -l 5

测试pytorch能否正常使用显卡

参考官方文档安装pytorch后,尝试运行下述代码:

import torchprint(torch.cuda.is_available())

输出true,则pytorch cuda版运行正常。


原创声明:©️ 本文为博主原创文章,转载需注明出处——https://blog.csdn.net/IYXUAN

相关文章:

Docker+PyCharm远程调试环境隔离解决方案

DockerPyCharmMiniconda实现深度学习代码远程调试和环境隔离 本文详细介绍了如何在局域网环境下,利用Docker、PyCharm和Miniconda构建一个高效的深度学习远程调试平台。首先在服务器(server)上,通过Docker构建包含不同CUDA环境的镜…...

数字化转型的理论框架对比:从多维视角指导企业成功变革对比DPBOKIT4ITCOBITTOGAF

数字化转型的多维框架解析 在数字化时代,企业如何有效实现数字化转型已成为其生存和发展的关键问题。然而,市场上关于数字化管理的各种框架和理论并存,企业需要根据自身的需求选择最适合的指导路径。本文将通过对几个核心理论框架的对比&…...

【C++掌中宝】深入解析C++命名空间:有效管理代码的利器

文章目录 前言1. namespace 的价值2. namespace 的定义3. 命名空间的本质4. 嵌套的命名空间5. 命名空间的使用6. using 指令7. 补充结语 前言 假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外&am…...

2024/9/21 leetcode 21.合并两个有序链表 2.两数相加

目录 21.合并两个有序链表 题目描述 题目链接 解题思路与代码 2.两数相加 题目描述 题目链接 解题思路与代码 --------------------------------------------------------------------------- 21.合并两个有序链表 题目描述 将两个升序链表合并为一个新的 升序 链表并返…...

Python学习的主要知识框架

Python的主要学习知识点非常广泛且深入,但我可以为您概括一些核心的学习领域,帮助您系统地掌握Python编程。以下是Python学习的主要知识框架: 1. Python基础语法 数据类型:整数、浮点数、字符串、布尔值、列表、元组、字典、集合…...

LLaMA-Factory 使用 alpaca 格式的数据集

LLaMA-Factory 使用 alpaca 格式的数据集 flyfish alpaca 格式最初与Stanford大学的一个研究项目相关联,该项目旨在通过少量高质量的数据来微调大型语言模型。它受到了Alpaca模型(一种基于LLaMA的指令跟随模型)的影响,该模型是在…...

【Mysql】Mysql数据库基础

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...

一文彻底让你搞懂轨迹规划(总结)

机器人在运行中不可避免的会进行运动,那么就会产生出轨迹规划的概念。 轨迹规划的特点:用一定的函数形式表示控制量(位置,速度,加速度)的控制律,根据约束或最优目标,求取控制控制参…...

windows C++ 并行编程-异步消息块(二)

overwrite_buffer 类 concurrency::overwrite_buffer 类与 unbounded_buffer 类类似,只不过 overwrite_buffer 对象仅存储一条消息。 此外,当目标接收来自 overwrite_buffer 对象的消息时,不会从缓冲区中删除该消息。 因此,多个目…...

【软件基础知识】什么是 API,详细解读

想象一下,你正在使用智能手机上的天气应用。你打开应用,瞬间就能看到实时天气、未来预报,甚至是空气质量指数。但你有没有想过,这些数据是如何神奇地出现在你的屏幕上的?答案就在三个字母中:API。 API,全称Application Programming Interface(应用程序编程接口),是现代软件世…...

计算机四级-计算机网络

一、基础知识 1.对计算机网络发展具有重要影响的广域网是:ARPANET 随机争用型的介质访问控制方法起源于:ALOHANET 2.计算机网络发展阶段: A)第一阶段的主要成果是计算机技术与通信技术的结合 B)第二阶段的主要成果…...

【linux 获取时间】

linux 获取时间接口 我们在开发调试过程中,可能遇到一些和调用时序相关的问题,为了查看哪个步骤先调用,哪个步骤后调用,我们可以使用函数打印或者主动trace堆栈…但是有的时候我们需要排查2个接口调用的时间间隔,我们可…...

Dockerfile部署xxljob

使用Dockerfile部署xxljob 1. 背景 我们在使用定时任务调度时,通常会使用xxljob容器化部署xxljob,通常使用 docker pull xuxueli/xxl-job-admin:2.4.0 拉取镜像并启动容器。这种方式对于x86架构服务器来说,没有任何问题。但是在arm架构的服…...

Conda新建python虚拟环境问题

Conda新建python虚拟环境问题: 【问题1】 conda create --name yolov8 python3.10 -y Retrieving notices: …working… done Channels: defaults Platform: win-64 Collecting package metadata (repodata.json): failed UnavailableInvalidChannel: HTTP 404 NO…...

这几个优秀的工具网站真心值得推荐——搜嗖工具箱

即时工具 https://www.67tool.com/ 这是一个专注提升效率的办公工具网站;这也是一个拥有260多款自研在线工具和200多个客户端离线工具的服务网站;这还是一个可以满足包括视频处理、音频处理、图片处理、文档处理、文档转换、办公辅助、图表生成、文本工…...

ESP32开发 -- VSCODE+PlatformIO环境安装

参看官网安装:PlatformIO IDE for VSCode 一、安装PlatformIO IDE 参看:日常生活小技巧 – Visual Studio Code 简单使用 扩展中搜索platformIO IDE 当安装完提示重启之后。 打开一个要创建新工程的文件夹: 点击 Create New Project&…...

MySQL--导入SQL文件(命令行导入)

MySQL--导入SQL文件 一、前言二、导入SQL文件 一、前言 用可视化编辑工具编写,并且在控制台输入命令行在MySQL中导入SQL文件。 在导入SQL文件之前查看了目前存在的数据库 **目标:**在可视化编辑工具(这里以word文档为例)中编写SQL语句&…...

【C#基础】函数传参大总结

目录 前言参数是值类型的情况1. 按值传递(Pass by Value)2. 按引用传递(Pass by Reference)使用 ref使用 in 3. 输出参数传递(Output Parameters)参数修饰符对比小结 参数是引用类型的情况1. 按值传递类对象…...

初学51单片机之IO口上下拉电阻相关

本案本来是描述一下I2C总线的,在此之前推荐一下B站一个UP关于时序图的讲解 I2C入门第一节-I2C的基本工作原理_哔哩哔哩_bilibili 不过在描述I2C前先简单的探讨下51单片机IO口下拉电阻的基本情况,事实上这个问题困扰笔者很长时间了,这次也是一…...

Resnet50网络——口腔癌病变识别

一 数据准备 1.导入数据 import matplotlib.pyplot as plt import tensorflow as tf import warnings as w w.filterwarnings(ignore) # 支持中文 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负…...

Python 中自动打开网页并点击[自动化脚本],Selenium

要在 Python 中自动打开网页并点击第一个 <a> 标签&#xff0c;你需要使用 Selenium&#xff0c;它可以控制浏览器并执行像点击这样的操作。requests 和 BeautifulSoup 只能获取并解析网页内容&#xff0c;但不能进行网页交互操作。 步骤&#xff1a; 安装 Selenium安装…...

Spring Boot-自动配置问题

**### Spring Boot自动配置问题探讨 Spring Boot 是当前 Java 后端开发中非常流行的框架&#xff0c;其核心特性之一便是“自动配置”&#xff08;Auto-Configuration&#xff09;。自动配置大大简化了应用开发过程&#xff0c;开发者不需要编写大量的 XML 配置或是繁琐的 Jav…...

CS61B学习 part1

本人选择了2018spring的课程&#xff0c;因为他免费提供了评分机器&#xff0c;后来得知2021也开放了&#xff0c;决定把其中的Lab尝试一番&#xff0c;听说gitlab就近好评&#xff0c;相当有实力&#xff0c;并借此学习Java的基本知识&#xff0c;请根据pku的cswiki做好评分机…...

我Github的问题解决了!

看的这篇&#xff0c;解决使用git时遇到Failed to connect to github.com port 443 after 21090 ms: Couldn‘t connect to server_git couldnt connect to server-CSDN博客 之前想推送的能推送了&#xff0c;拉取的也能取了。 一、如果是在挂着梯子的情况下拉取或者推送代码…...

Pytorch构建神经网络多元线性回归模型

1.模型线性方程y W ∗ X b from torch import nn import torch#手动设置的W参数&#xff08;待模型学习&#xff09;&#xff0c;这里设置为12个&#xff0c;自己随意设置weight_settorch.tensor([[1.5,2.38,4.22,6.5,7.2,3.21,4.44,6.55,2.48,-1.75,-3.26,4.78]])#手动设置…...

如何基于Flink CDC与OceanBase构建实时数仓,实现简化链路,高效排查

本文作者&#xff1a;阿里云Flink SQL负责人&#xff0c;伍翀&#xff0c;Apache Flink PMC Member & Committer 众多数据领域的专业人士都很熟悉Apache Flink&#xff0c;它作为流式计算引擎&#xff0c;流批一体&#xff0c;其核心在于其强大的分布式流数据处理能力&…...

ActiveMQ、RabbitMQ 和 Kafka 在 Spring Boot 中的实战

在现代的微服务架构和分布式系统中&#xff0c;消息队列 是一种常见的异步通信工具。消息队列允许应用程序之间通过 生产者-消费者模型 进行松耦合、异步交互。在 Spring Boot 中&#xff0c;我们可以通过简单的配置来集成不同的消息队列系统&#xff0c;包括 ActiveMQ、Rabbit…...

火语言RPA流程组件介绍--获取关联元素

&#x1f6a9;【组件功能】&#xff1a;获取指定元素的父元素、子元素、相邻元素等关联信息 配置预览 配置说明 目标元素 支持T或# 默认FLOW输入项 通过自动捕获工具捕获(选择元素工具使用方法)或手动填写网页元素的css,xpath&#xff0c;指定对应网页元素作为操作目标 关联…...

【2024研赛】【华为杯E题】2024 年研究生数学建模比赛思路、代码、论文助攻

思路将在名片下群聊分享 高速公路应急车道紧急启用模型 高速公路拥堵现象的原因众多&#xff0c;除了交通事故外&#xff0c;最典型的就是部分路段出现瓶颈现象&#xff0c;主要原因是车辆汇聚&#xff0c;而拥堵后又容易蔓延。高速公路一些特定的路段容易形成堵点&#xff0…...

Linux——K8s集群部署过程

&#xff11;、环境准备 &#xff08;1&#xff09;配置好网络ip和主机名 control: node1: node2: 配置ip 主机名的过程省略 配置一个简单的基于hosts文件的名称解析 [rootnode1 ~]# vim /etc/hosts // 文件中新增以下三行 192.168.110.10 control 192.168.110.11 node1 1…...