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

news2024/9/21 9:37:07

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.04

LABEL 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=noninteractive

RUN 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 bash

WORKDIR /repos

EXPOSE 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 torch

print(torch.cuda.is_available())

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2151968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MCS-51汇编

伪指令: EQU: Equal,定义常量 COUNT EQU 10H ; 定义一个符号名COUNT,其值为10H DELAY EQU 500 ; 定义一个符号名DELAY,其值为500 数据传送: MOV: MOVE,传送数据 MOVC: 算术运算: 跳转…

详解npm源及其使用方法

详解npm源及其使用方法 npm源是一个用于存储和提供npm包的服务器地址,npm在安装包时会通过这个源地址下载对应的依赖包。默认情况下,npm使用官方的npm源(https://registry.npmjs.org/),该源存储了海量的Node.js开源包…

Android Studio 汉化教程,直接授人以渔,又菜又爱学英语还不好,不愧是我

Android Studio 汉化教程,直接授人以渔 查看使用的 Android Studio 版本号 当前版本号:241.18034.62.2412.12266719 打开官网插件地址 插件地址选择对应版本进行下载 版本怎么选? 我的版本号 241.18034.62.2412.12266719选择的版本号只有前三位对应的…

【JAVA开源】基于Vue和SpringBoot的网上超市系统

本文项目编号 T 037 ,文末自助获取源码 \color{red}{T037,文末自助获取源码} T037,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

全国31省对外开放程度、经济发展水平、政府干预程度指标数据(2000-2022年)

旨在分析2000-2022年间中国31个省份的对外开放程度、经济发展水平和政府干预程度,探讨其背后的动因与影响。 2000年-2022年 全国31省对外开放程度、经济发展水平、政府干预程度指标数据https://download.csdn.net/download/2401_84585615/89478612 数据概览 对外…

Hexo博客私有部署Twikoo评论系统并迁移评论记录(自定义邮件回复模板)

部署 之前一直使用的artalk,现在想改用Twikoo,采用私有部署的方式。 私有部署 (Docker) 端口可以根据实际情况进行修改 docker run --name twikoo -e TWIKOO_THROTTLE1000 -p 8100:8100 -v ${PWD}/data:/app/data -e TWIKOO_PORT8100 -d imaegoo/twi…

英集芯IP5912:集成开关充电功能的低功耗8位POWER MCU芯片

英集芯IP5912是一款功能丰富的、集成了降压充电管理功能的8位MCU芯片,它内置了一个5V输入的同步降压充电DC-DC,功率管也是内置的,同时提供最大1.5A的充电电流。封装方式采用SOP16,方案应用时只需要很少的外围器件,就可…

Java面试篇基础部分-ReentrantLock详解(二)

Lock 接口的主要方法 void lock():给对象加锁,如果锁没有被其他线程使用,则当前线程获取到这个锁;如果锁正在被其他线程持有,则将禁用当前线程,直到当前线程获取到锁。boolean tryLock():试图给对象进行加锁操作,如果锁没有被其他线程使用,则将获取到这个锁并且返回tr…

基于JAVA+SpringBoot+Vue的智能无人仓库管理

基于JAVASpringBootVue的智能无人仓库管理 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈…

单样本Cellchat(V2)细胞通讯分析学习和整理

细胞通讯分析是一种研究不同细胞类型之间如何通过信号分子(如配体和受体)进行相互交流和调控的分析方法。它在揭示细胞间相互作用的机制,理解组织和器官如何协调运作方面具有重要意义。 细胞通讯分析的主要内容如下: 配体-受体相…

新品亮相|美格智能SLM530/SLM530P智能模组,助力金融新零售智慧升级

随着金融支付产业数字化与智能化不断推进,泛支付场景一体化解决方案成为行业发展的新趋势,从手持POS机到智能收款机,金融支付领域需要更快速、更精准、更安全的解决方案,加快推进数字化升级进程。 近期,美格智能正式发…

Github 2024-09-21Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-09-21统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Move项目1JavaScript项目1Deno: 现代JavaScript和TypeScript运行时 创建周期:2118 天开发语言:Rust, JavaScript协议类型:MIT Lic…

【面试宝典】面试基础指导

目录 🍔 简历怎么写 🍔 ⾯试前针对项⽬撰写完成项⽬⽂档 🍔 ⾯试前 🍔 ⾯试中 4.1 投递简历当天没有收到⾯试邀约 4.2 讲解项⽬ 4.3 讲解知识 4.4 ⾯试中关于技术选型的演变 🍔 ⾯试后 🍔 小结 &…

openssl-AES-128-CTR加解密结构体

源码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/aes.h> #include <openssl/evp.h> #include <openssl/rand.h>#define length 1024typedef struct {char id[length];char pwd[length];int age;int …

Kubelet 核心指标监控

How to Monitor the Kubelet | Sysdig Kubernetes / Kubelet | Grafana Labs https://github.com/flashcatcloud/categraf/blob/main/inputs/kubelet/dashboard-by-ident.json 在生产环境中运行 Kubernetes 时&#xff0c;监控 Kubelet 至关重要。Kubelet 是 Kubernetes 集群…

自制网络连接工具(支持tcpudp,客户端服务端)

自制网络连接工具&#xff08;支持tcp/udp,客户端/服务端&#xff09; 将网络连接工具制作成共享库 network.h #ifndef NETWORK_H #define NETWORK_H#include<netinet/in.h> #include<sys/socket.h> #include<stdbool.h> typedef struct Network {int type…

AI是否会带来一场认知革命?Reid Hoffman 的独特见解

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;关于AI对人类社会及认知的影响&#xff0c;已经成为了学术界和业界热议的话题。硅谷著名投资人、LinkedIn联合创始人Reid Hoffman&#xff0c;在斯坦福大学的演讲中分享了他对AI的深刻看法。他认为&#xff0…

系统优化工具 | Windows Manager v2.0.5 便携版

Windows Manager 是一款专为Microsoft Windows 10/11设计的系统优化和管理软件。它集成了多种实用程序&#xff0c;旨在帮助用户更好地管理和优化Windows操作系统。该软件的功能包括系统清理、系统优化、系统修复、硬件信息查看和系统设置调整等。 系统清理&#xff1a;Window…

队列基础概念

文章目录 &#x1f34a;自我介绍&#x1f34a;现实生活中的例子&#x1f34a;队列的介绍&#x1f34a;循环队列&#x1f34a;小结 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介…

简明linux系统编程--互斥锁--TCP--UDP初识

目录 1.互斥锁 2.信号 2.1介绍 2.2信号的内核机制 3.linux网络编程概述 3.1一览七层协议 3.2一览数据传输过程 3.3四层网络模型 3.4服务端和客户端的数据交互 4.TCP服务端编程 5.TCP客户端编程 6.UDP服务端编程 7.UDP客户端编程 1.互斥锁 互斥锁也是和信号量一样&a…