【wsl2】配置跑深度学习的wsl2环境的记录

配置跑深度学习的wsl2环境的记录

  • 我的环境
  • 下载安装wsl
  • 换磁盘
  • 连接ssh
    • 端口转发问题
    • 防火墙问题
  • CUDA问题
  • apt-get问题
  • 总结
  • 参考

本文包含两部分:记录一下我折腾了3天终于配好ssh的过程,以及配置CUDA遇到的坑。

我搞这个wsl2而不去搞双系统的原因有两个:

  1. 首先是我安装了双系统之后,发现ubuntu系统间断性能上网,折腾好久发现貌似是网卡问题,于是作罢;
  2. 其次是这台电脑除了需要作为跑深度学习的debug机器之外,还肩负着运行游戏的职责,来回切换双系统真的好麻烦(主要是这台电脑64g内存…)。

我的环境

主机是win10专业版22H2,wsl2使用的子系统是ubuntu22.04.
顺便提一嘴,建议打开“windows更新-高级选项-更新windows时接收其他windows产品的更新”,然后出去检查更新,更新linux的内核版本,太旧的话可能会有些问题,见这篇博客。(先别着急按这个配置CUDA,下面会讲为什么)
再提一嘴,别乱换apt源,请看好你的版本和源能不能对上,见下面的apt-get问题。

下载安装wsl

关掉网络代理,在windows商店下载"Windows Subsystem for Linux",然后继续在windows商店下载你想要的版本的ubuntu。
详细的安装过程我就不赘述了,网上有很多的文章。

换磁盘

默认ubuntu文件放在c盘肯定不行,要换到其他盘,使用这个工具进行迁移。使用方法自行百度。

连接ssh

先按照这篇知乎的过程进行设置,如果你能正常ssh到你的wsl机器上,那么恭喜你可以不用往下看了。(但是我的开机自启怎么不好使?)

如果你和我一样,ssh出现了Connection refused的错误,那么我们从头分析:

端口转发问题

首先要注意的是,wsl2默认设置在子系统中开启的端口会自动映射到windows的相同端口中,我的子系统中sshd服务开在2222端口,因此windows的2222端口也有一个服务在监听,见:
windows下的2222端口已经在监听
可以发现,windows只监听了来自127.0.0.1的2222端口,也就是windows自己的请求,这显然不是我们想要的。因此我们明确了自己的目标,就是设立一个端口转发,接受来自所有ip的请求,并转发给本机的2222端口。然后为了控制变量,我们先把防火墙关了试一试。

【wsl2】配置跑深度学习的wsl2环境的记录_第1张图片

准备好了后在windows下输入netsh interface portproxy show all,看看是否有你设定好的端口转发。如果你按照前面那篇博文执行过了,应该有一条映射:
【wsl2】配置跑深度学习的wsl2环境的记录_第2张图片
【注】:据说listenport和connectport一样的话,可能会在多wsl机器的情况下出现问题,所以我listen2223了;另外connect不能为127.0.0.1,否则虽然会有一条映射关系,但是实际不会转发,此时你可以和我一样设置connectport为localhost,这样的话也不用考虑子系统的ip不固定问题了。

确定转发规则建立之后,输入netstat -ano | findstr {listenport,比如2223(或者直接222)},正常情况下,应该可以看到windows在监听2223端口,以转给2222。见:
windows在监听2223端口
如果没有监听2223端口,那么请把windows服务中的IP Helper服务打开,然后重启系统(或者重启bash也行?)。见:

IP Helper正在运行
此时,端口转发的问题应该解决了。现在在防火墙关闭的情况下应该可以ssh到wsl上了。打开所有防火墙,如果现在ssh不上了:

防火墙问题

检查一下防火墙的入站规则是否有你刚刚netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=2223添加的这个规则。
2223端口在防火墙入站规则中

CUDA问题

之前我图省事,使用conda安装cudatoolkit,pytorch基本功能可以正常使用。然而遇到需要编译的CUDA算子时发现,conda下载的cuda只能跑代码,不能编译,于是按照这篇博客配置了CUDA环境,需要注意的是以下几点:

  1. 像我的环境那里说的一样,建议更新一下linux内核版本。
  2. wsl2默认没有gcc等环境,别按照博客sudo apt-get install gcc下载,建议使用sudo apt-get install build-essential,能够一起下载g++,make等实用工具。
  3. 如果下载的时候提示你XX is not installable或者XX is not going to be installed之类的版本错误,请看下面apt问题。

apt-get问题

这有一篇救了命的文章:apt源配置。
忘了之前我遇到什么问题,照葫芦画瓢地在/etc/apt/sources.list中加上了不属于自己linux系统版本的源。看了上述博客之后,将源换成我的ubuntu22.04版本对应的code: jammy后,很多问题迎刃而解。(不然之前直接apt-get gcc下载的是20.04的build,我还在想为什么来着)

总结

之所以这点东西搞了这么久,还是因为自己的水平不够,比如遇到ssh -vvv报错asyio error,还以为是ssh的问题,查了好久,最后才发现是IP Helper没有打开,导致端口转发无效。


参考

https://zhuanlan.zhihu.com/p/579781027
最新ubuntu22.04 下列软件包有未满足的依赖关系 解决方案
WSL2-Ubuntu安装CUDA

你可能感兴趣的:(问题总结,ssh,服务器,linux,windows)