PyCharm+Docker:打造最舒适的深度学习炼丹炉

2023-10-30

 
 
 
 

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

来自|知乎  作者|刘震

链接|https://zhuanlan.zhihu.com/p/52827335

编辑|人工智能前沿讲习

一般炼丹都在服务器上,很少有人在本机跑代码的。之前自己捣鼓怎么用本地的编辑器配上远程服务器的环境来营造一个最舒乎的姿势。最开始用VS Code的SFTP插件,但是用着还是不顺手,因为不能用远程的环境,最后还是选择了强大的PyCharm。下面的这个教程最开始只是自己用,后来写了一篇博客分享给实验室的人,没想到大家都开始用上了。这次专门写一篇更详细的放到知乎供有缘人使用。

开始之前你可以对比以下条件来确定自己是否真的需要这样做:

  • 使用PyCharm作为主力IDE写Python而不是其他(我非常推荐大家用)

  • 深度学习炼丹师(当然你可以不是,但如果是,你会更舒服)

  • 服务器在远程或者局域网(局域网的体验最佳)

  • 使用Docker(能够熟练使用最佳)

当你配置完成之后,你将能在本地PyCharm IDE上使用远程服务器的Python解释器和环境进行调试和运行,同时能够很方便的将代码在本地和服务器上进行同步。

OK,废话不多说,正式开始我们的PyCharm+Docker的远程环境配置之旅。

首先你需要满足以下两个必备条件:

  • 使用PyCharm专业版,记住一定是专业版(社区版不提供远程服务)

  • 在服务器上安装docker和nvidia-docker

01

新建docker container

首先按照如下命令新建一个docker容器(关于docker的使用这里不废话,建议不熟悉的童鞋先去学一下如何使用docker,教程很多):

sudo nvidia-docker run -it -p [host_port]:[container_port](do not use 8888) --name:[container_name] [image_name] -v [container_path]:[host_path] /bin/bash

举个栗子:

sudo nvidia-docker run -p 5592:5592 -p 5593:5593 -p 8022:22 --name="liuzhen_tf" -v ~/workspace/liuzhen/remote_workspace:/workspace/liuzhen/remote_workspace -it tensorflow/tensorflow:latest-gpu /bin/bash

正确执行完之后,现在我们就处在新建的docker容器里了(端口映射,容器名,镜像和路径映射这些换成你自己的就行,但是一定要留一个端口映射到容器22端口,因为SFTP默认使用22端口)。


02

配置SSH服务

接着我们在刚刚新建的容器里配置SSH服务,首先安装openssh-server:

 
 
$ apt update
$ apt install -y openssh-server

然后建立一个配置文件夹并进行必要的配置:

 
 
$ mkdir /var/run/sshd
$ echo 'root:passwd' | chpasswd
# 这里使用你自己想设置的用户名和密码,但是一定要记住!
$ sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
$ sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
$ echo "export VISIBLE=now" >> /etc/profile

如果连不上SSH服务,可能是某些版本的PermitRootLogin yes默认被注释了,可以使用如下(感谢 @Chenjie Xing 的反馈):

sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

重启SSH激活配置:

$ service ssh restart

在服务器(宿主机)上(不是服务器的docker里)测试刚刚新建docker容器中哪个端口转发到了服务器的22端口:

$ sudo docker port [your_container_name] 22
# 如果前面的配置生效了,你会看到如下输出
# 0.0.0.0:8022

最后测试能否用SSH连接到远程docker:

$ ssh root@[your_host_ip] -p 8022
# 密码是你前面自己设置的

到这里说明服务器的docker端已经完成配置。


03

在PyCharm里配置部署环境

打开PyCharmTools > Deployment > Configuration, 新建一个SFTP服务器,名字自己取:

9b533c317ee1d30cd093ed5fd9544945.jpeg

输入如下图配置,注意这里的端口是你刚刚设置的映射到容器22端口的宿主机中的端口,我这里使用的是8022,账号密码是你刚刚自己设置的,这里的Root Path设置一个远程docker容器里的路径:

16505fdd3b0f47623f6e6fa865e2fbae.jpeg

配置完点击Test SFTP connection,如果成功就恭喜你,可以进行下一步了。

最后在Mappings中配置路径,这里的路径是你本地存放代码的路径,与刚刚配置的Root Path相互映射(意思是Mapping里本机的路径映射到远程的Root Path),方便以后在本地和远程docker中进行代码和其他文件同步。

781de82d70b14f8562c2fbcbde99f975.jpeg


04

在PyCharm里配置远程解释器

点击PyCharm的File > Setting > Project > Project Interpreter右边的设置按钮新建一个项目的远程解释器:

5fbacb3cd8e691bd8b47e7bc9709b3fd.jpeg 6836d1c270a9d886968558285b62c00f.jpeg

配置完成以后在项目解释器界面就会出现如下图所示,可以看到此时已经完成远程解释器的本地化:

53797af32717264115a8751fe6696c63.jpeg

配置完成以后需要等本地和远程的环境同步一下,到这里,恭喜你,可以用最舒服的姿势。。。写代码了。

配置完成以后的日常是这样的:

80f4a79e47459d933f252fdce64db3e7.jpeg

左边是本地的文件,修改之后可以随时右键deployment->upload到远程主机,或者直接在本地调试运行;最右边是远程主机的文件,假如直接在远程修改了文件刷新一下同样可以右键下载到本地,但是我不建议这样做,因为这样很容易带来冲突(毕竟没有很好的版本控制)。目前最好的实践是在局域网的服务器上,时延低,同步速度快。

05

常见问题

1. 最常见的问题就是docker容器停了以后里面的SSH服务也会相应停止,因此当你发现自己某一天连不上的时候,记得去docker里重启一下ssh服务:

$ service ssh restart

感谢 @丁果 对这个问题提出的解决方案:

“可以在run的时候加上--restart=always,同时ssh启动的写到dockerfile里去。”

2. 在容器中执行apt update的时候可能会出现0% working 的问题

感谢 @奥古斯都 提出该问题以及解决方案:

”这里不是源的问题,因为容器环境太过纯净,这里需要安装apt-transport-https这个deb文件,下载的时候也要注意不要下载最新的版本,否则也会出现依赖问题,要下载和当前docker容器内的apt相匹配的版本。“

欢迎关注我们,看通俗干货

de66110d47e68ffd3ec52b77aec7e2da.jpeg

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyCharm+Docker:打造最舒适的深度学习炼丹炉 的相关文章

  • 打印 scrapy 请求的“响应”

    我正在尝试学习 scrapy 在遵循教程的同时 我正在尝试进行细微的调整 我想简单地从请求中获取响应内容 然后我会将响应传递到教程代码中 但我无法发出请求并获取响应内容 建议就好 from scrapy http import Respon
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 如何用 python 和 sympy 解决多元不等式?

    我对使用 python 和 Sympy 还很陌生 并且遇到了使用 sympy 解决多元不等式的问题 假设我的文件中有很多函数 如下所示 cst sqrt x 2 cst exp sqrt cst x 1 4 log log sqrt cst
  • 如何将条目中的部分文本加粗并更改其背景颜色?

    我正在创建一个基于 Tkinter 的 GUI 它有一个 Entry 小部件 我想将其文本的一部分加粗并更改其背景颜色 但我不知道我该怎么做 如果我使用文本小部件 我可以只使用标签 但看起来它们不能与条目小部件一起使用 此代码使用文本小部件
  • 在 Python 中使用 sec 函数的反函数

    我正在创建一个程序 用于计算从一定高度范围和设定初始速度发射射弹的最佳角度 在我需要使用的最终方程中 存在一个反 sec 函数 它导致了一些麻烦 我已经导入了数学并尝试使用 asec 无论如何 但是数学似乎无法计算反秒函数 我也明白 sec
  • Sorted(key=lambda: ...) 背后的语法[重复]

    这个问题在这里已经有答案了 我不太明白背后的语法sorted 争论 key lambda variable variable 0 Isn t lambda随意的 为什么是variable在看起来像的内容中陈述了两次dict 我认为这里的所有
  • VSCode pytest 测试发现失败

    Pytest 测试发现失败 用户界面指出 Test discovery error please check the configuration settings for the tests 输出窗口显示 Test Discovery fa
  • 行为:如何从另一个文件导入步骤?

    我刚刚开始使用behave http pythonhosted org behave 一个Pythonic BDD框架 使用小黄瓜语法 http docs behat org guides 1 gherkin html 行为需要一个特征 例
  • Python 中的这种赋值方式叫什么? a = b = 真

    我知道关于元组拆包 http docs python org tutorial datastructures html tuples and sequences但是当一行中有多个等号时 这个赋值被称为什么 阿拉a b True 它总是让我有
  • 使用循环将对象添加到列表(python)

    我正在尝试使用 while 循环将对象添加到列表中 基本上这就是我想做的 class x pass choice raw input pick what you want to do while choice 0 if choice 1 E
  • 负整数的Python表示

    gt gt gt x 4 gt gt gt print b format x x 4 100 gt gt gt mask 0xFFFFFFFF gt gt gt print b format x mask x mask 4294967292
  • 如何逐像素绘制正方形(Python,PIL)

    在空白画布上 我想使用 Pillow 逐像素绘制一个正方形 我尝试使用 img putpixel 30 60 155 155 55 绘制一个像素 但它没有执行任何操作 from PIL import Image def newImg img
  • 在谷歌C​​olab中使用cv2.imshow()

    我正在尝试通过输入视频来对视频进行对象检测 cap cv2 VideoCapture video3 mp4 在处理部分之后 我想使用实时对象检测来显示视频 while True ret image np cap read Expand di
  • Python 矩阵每一行的总和

    lista 1 2 3 4 5 6 7 8 9 print lista def filas lista res for elemento in lista x sum lista elemento res append x print re
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • asyncio - 多次等待协程(周期性任务)

    我正在尝试为异步事件循环创建定期任务 如下所示 但是我收到 RuntimeError 无法重用已等待的协程 异常 显然 asyncio 不允许等待相同的可等待函数 如中讨论的这个错误线程 https bugs python org issu
  • CSV 在列中查找最大值并附加新数据

    大约两个小时前 我问了一个关于从网站读取和写入数据的问题 从那时起 我花了最后两个小时试图找到一种方法来从输出的 A 列读取最大日期值 将该值与刷新的网站数据进行比较 并将任何新数据附加到 csv 文件而不覆盖旧的或创建重复项 目前 100
  • 使用 Keras 和 fit_generator 绘制 TensorBoard 分布和直方图

    我正在使用 Keras 使用 fit generator 函数训练 CNN 这似乎是一个已知问题 https github com fchollet keras issues 3358TensorBoard 在此设置中不显示直方图和分布 有
  • 将 docker-compose.yml 中的包安装到 docker 容器中

    我是 docker 和 docker compose 的初学者 我需要你的帮助 我正在使用 docker compose 制作 PHP NGINX PostgresQL symfony 开发环境 这里是 web image nginx 1
  • 使用 numpy 加速 for 循环

    下一个 for 循环如何使用 numpy 获得加速 我想这里可以使用一些奇特的索引技巧 但我不知道是哪一个 这里可以使用 einsum 吗 a 0 for i in range len b a numpy mean C d e f b i

随机推荐

  • Python中让代码 BUG 变得酷炫的利器

    当我们写的一个脚本或程序发生各种不可预知的异常时 如果我们没有进行捕获处理的时候 通常都会致使程序崩溃退出 并且会在终端打印出一堆 密密麻麻 的 traceback 堆栈信息来告诉我们 是哪个地方出了问题 就像这样子 天呐 密集恐惧症要犯了
  • 剑指offer-16 链表反转

    法一 package Leetcode ListNode Author YCKJ3803 Date 2021 3 2 22 39 Description 反转链表 最经典的题 yyds public class ReverseListNod
  • API安全

    1 API的简介 API代表应用程序编程接口 它由一组允许软件组件进行通信的定义和协议组成 作为软件系统之间的中介 API使软件应用程序或服务能够共享数据和功能 但是API不仅仅提供连接基础 它还管理软件应用程序如何被允许进行通信和交互 A
  • 带分数 -- 蓝桥杯

    带分数 蓝桥杯 题目描述 100 可以表示为带分数的形式 100 3 69258714 还可以表示为 100 82 3546197 注意特征 带分数中 数字 1 9 分别出现且只出现一次 不包含 0 类似这样的带分数 100 有 11 种表
  • 虚拟机不能上网以及无法ping通百度的解决方案

    虚拟机无法上网 看了许多博客也没有解决问题 最后自己钻研文档解决了 此处分享一下 1 点击此处编辑 2 选择虚拟网络编辑器 3 点击更改设置 4 选择v8 并将使用本地DHCP选项勾选掉 注 此处为nat模式 5 手动输入子网IP 子网掩码
  • 微信公众号支付java前后端分离开发

    微信公众号支付java前后端分离开发 微信公众号支付java前后端分离开发 我们开发的是基于河北银行的支付 支付宝微信都做了 这里就介绍一下微信公众号支付 这个公众号支付需要配置的东西太多了 官方文档写的跟s一样 看不懂 一点一点自摸索的
  • C++ Array size()实例讲解

    描述 C 函数std array size 用于获取数组中存在的元素数 声明 以下是 std array size 函数形式 std array 标头的声明 constexpr size type size noexcept 参数 空 返回
  • jxl读取excel封装成List、Map

    一 封装成List 数据格式为List
  • Moving On 第 44 届 ACM/ICPC 亚洲区域赛(银川)网络赛

    Firdaws and Fatinah are living in a country with nnn cities numbered from 111 to nnn Each city has a risk of kidnapping
  • osgEarth的Rex引擎原理分析(四十四)如何控制父子TileNode节点的显隐

    目标 三十七 中的105 rex渲染出的地球是靠一块块TileNode瓦片拼接起来的 瓦片之间存在父子关系 一般显示父TileNode就不应显示子TileNode 反之亦然 那么rex是如何做这种显隐控制呢 1 每一个TileNode瓦片在
  • Swift 原生网络请求

    iOS HTTP请求原生组要的类是URLSession 是一个单例类 例1 GET func makeLogon 构建URL let url URL URL string https xxx xxx API xxx 发送HTTP请求的的se
  • mimo节能模式选哪种_802.11协议精读11:节能模式(APSD,PSMP,SMPS)

    序言 在802 11主要的版本中 总共定义了四种节能模式 在前面一篇文档中 我们介绍了最基本的PSM模式 以及其工作方式上的一些细节 由于PSM是在最初的802 11协议下进行的设计 其用了较为保守设计 以确保最稳定的运行需求 在后来的80
  • 次时代Java编程(一):Java里的协程

    声明 本文CSDN作者原创投稿文章 未经许可禁止任何形式的转载 作者 刘小溪 Maxleap的高级开发工程师 喜欢倒腾一些有意思的技术框架 对新的技术以及语言非常有兴趣 以前在shopex担任架构师 目前在Maxleap负责基础架构以及服务
  • nohup保存代码打印结果至指定文件

    nohup python xxx py gt gt xxx out 以python为例 上述指令可以让xxx py在后台运行 并且输出结果保存至xxx out文件
  • 牛客 NC202492 仓库选址

    题目链接 https ac nowcoder com acm problem 202492 代码 include
  • Chrome 谷歌浏览器 google 复制网页上禁止复制的文本

    在你要复制文字的页面 按F12 选择 Console 输入 document body innerText 然后按回车
  • 用python画一只可爱的皮卡丘

    效果图 usr bin env python coding utf 8 from turtle import 绘制皮卡丘头部 def face x y 画脸 begin fill penup 将海龟移动到指定的坐标 goto x y pen
  • Grafana中文版本

    grafana chinese tags GitHub grafana Grafana中文汉化版本 GitHub https github com WangHL0927 grafana chinese 作者 whl email w95866
  • Vuepress码云部署及自动跳转404 的问题

    介绍 VuePress 由两部分组成 一个以 Vue 驱动的主题系统的简约静态网站生成工具 和一个为编写技术文档而优化的默认主题 它是为了支持 Vue 子项目的文档需求而创建的 由 VuePress 生成的每个页面 都具有相应的预渲染静态
  • PyCharm+Docker:打造最舒适的深度学习炼丹炉

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 来自 知乎 作者 刘震 链接 https zhuanlan zhihu com p 52827335 编辑 人工智能前沿讲习 一般炼丹都在服务器上 很少有人在本机跑代码的