安装WSL2
按照教程我们需要更改Windows10的配置“启用或关闭Windows功能”。
可以在控制面板–》程序–》启用或关闭Windows功能
打开以上内容,之后系统会自动下载并安装WSL。
之后还需要设置默认的WSL为WSL2,需要执行如下命令:
wsl --set-default-version 2
具体要不要再安装Ubuntu发行版的问题(我一般用Ubuntu),额我这里开始装过,但是又卸载了,卸载后不影响我后面的运行。如果大家后面发现容器内无法使用GPU,则需要安装一下Ubuntu的发行版,可以直接再微软应用商店搜索Ubuntu安装。欢迎在评论区留言回复这个问题。
安装docker for desktop
https://www.docker.com/products/docker-desktop/
下载安装
配置容器
这里以pytorch1.4.0-gpu的镜像为例子,比较小,2G多一点点
下载镜像:
docker pull pytorch/pytorch:1.4-cuda10.1-cudnn7-runtime
开启一个容器:
docker run --gpus all -it -v D:\:/root/data1 pytorch/pytorch:1.4-cuda10.1-cudnn7-runtime /bin/bash
必须要加上–gpus all 才能使用GPU
-it代表交互启动
-v D::/root/data1代表将D:\盘这个路径挂载到容器内的/root/data1。
pytorch/pytorch:1.4-cuda10.1-cudnn7-runtime;pytorch/pytorch代表镜像名称;1.4-cuda10.1-cudnn7-runtime代表镜像的TAG
使用pycharm连接容器内的解释器(选读,需要时可配置)
容器内配置
启动容器时,我们需要映射出一个端口:-p 23:22
docker run --gpus all -p 23:22 -it -v D:\:/root/data1 pytorch/pytorch:1.4-cuda10.1-cudnn7-runtime /bin/bash
之后我们在容器内部进行配置,分别执行如下内容:
apt-get update
apt-get install openssh-server
apt-get install vim
之后我们更改以下ssh的配置:
vim /etc/ssh/sshd_config
找到PermitRootLogin prohibit-password这一行,修改为PermitRootLogin yes,允许通过ssh远程访问docker。
如果找不到,直接添加一行新的:PermitRootLogin yes。保存退出
然后我们更改root的密码:
passwd root
输入新的密码,假如为123456。
最后我们重启一下ssh服务:
service ssh restart
至此,我们就配置好了容器内的内容。
如果以后再启动容器,需要每次启动容器后执行启动ssh的服务:
service ssh start
Tips:容器的退出命令为ctrl+p+q(不停止容器退出)、exit命令直接停止容器并退出。
容器启动命令:docker start 容器id
容器停止命令:docker stop 容器id
进入正在运行的容器:docker attach 容器id、docker exec -it 容器id /bin/bash
容器强行停止:docker kill 容器id
pycharm配置
首先新打开一个Windows的命令行窗口,执行ipconfig
找到本地连接的IPV4地址,记录下来
在pycharm的setting界面:
密码输入刚刚我们设置的容器内的root的密码:123456
就可以连接了。
最后再进行python解释器的选择和同步路径的选择即可:
WSL C盘占用存储过大解决
本博客最后可能还会遇到一个C盘内存占用过多的问题,比如C盘直接少30-40G的存储,是因为我们虚拟机和镜像都安装在了C盘,解决方法比较简单,可以参考:https://stackoverflow.com/questions/62441307/how-can-i-change-the-location-of-docker-images-when-using-docker-desktop-on-wsl2
vmmem内存占用过高解决
在docker运行时,需要使用WSL的虚拟机,因此会由vmmem进程为虚拟机开辟内存空间。
同样在运行完所有的内容需要关闭的时候,将容器停止后。
我们可能会发现电脑的内存占用依然很高,这是因为WSL的虚拟机导致的,可以执行如下命令关闭wsl的虚拟机。
wsl --shundown
执行上面的命令先将WSL进行关闭,可以查看以下是否所有的WSL虚拟机都处于关闭状态,关闭状态时状态显示STOP,运行显示RUN:
wsl --list --verbose
关闭后,再任务栏右击docker选择退出docker,然后我们打开当前用户文件夹:按下Windows + R 键,输入 %UserProfile% 并运行进入用户文件夹
使用记事本创建一个名为.wslconfig的文件,并使用记事本打开,然后输入以下内容,下面的2GB代表最大不超过2GB,你也可以根据电脑需要更改:
[wsl2]
memory=2GB
当然其实还有很多其他的参数可以改,但是对我来说没有必要,列出一些其他参数:
# Settings apply across all Linux distros running on WSL 2
[wsl2]
# Limits VM memory to use no more than 4 GB, this can be set as whole numbers using GB or MB
memory=8GB
# Sets the VM to use two virtual processors
# processors=24
# Specify a custom Linux kernel to use with your installed distros. The default kernel used can be found at https://github.com/microsoft/WSL2-Linux-Kernel
# kernel=C:\\temp\\myCustomKernel
# Sets additional kernel parameters, in this case enabling older Linux base images such as Centos 6
# kernelCommandLine = vsyscall=emulate
# Sets amount of swap storage space to 8GB, default is 25% of available RAM
# swap=8GB
# Sets swapfile path location, default is %USERPROFILE%\AppData\Local\Temp\swap.vhdx
# swapfile=C:\\temp\\wsl-swap.vhdx
# Disable page reporting so WSL retains all allocated memory claimed from Windows and releases none back when free
# pageReporting=false
# Turn off default connection to bind WSL 2 localhost to Windows localhost
# localhostforwarding=true
# Disables nested virtualization
# nestedVirtualization=false
# Turns on output console showing contents of dmesg when opening a WSL 2 distro for debugging
# debugConsole=true
然后我们重启docker,双击docker for desktop,打开任务管理器,即可查看到vmmem不会超过我们memory的设定值。
连接容器内jupyter
前面我们使用pycharm连接docker内的解释器时已经明确,docker启动时使用-p可以对端口进行映射。
由于jupyter的默认端口就是8888,所以我们只需要在容器内部启动jupyter,并把jupyter的8888端口映射出来即可在本地使用容器内的jupyter。
按照前面的pycharm的例子,改写命令如下:
docker run --gpus all -p 23:22 -p 7777:8888 -it -v D:\:/root/data1 pytorch/pytorch:1.4-cuda10.1-cudnn7-runtime /bin/bash
到容器内后我们需要安装jupyter notebook:
pip install jupyter notebook
或者使用conda安装:
conda init 不一定都需要执行这个命令,根据环境需要,这个命令执行完毕后需要重启一下shell,或者重启一下docker
conda activate base 这里的base其实是环境名称
conda install jupyter notebook
如果在安装过程中提示某些软件包需要升级,则需按照要求升级对应的软件包。
在容器内输入python,并写入以下代码:
from notebook.auth import passwd
passwd()
然后输入一个密码用来登录jupyter notebook。
密码输入完毕后,会输出一个由单引号引出的密钥,我们需要复制下来保存到一个位置以方便后面使用。
最后我们输入exit()退出python解释器,如果自动退出了就不需要了。
下面生成jupyter notebook的配置文件:
jupyter notebook --generate-config
然后安装vim:
apt-get update
apt-get install vim
使用vim工具将我们刚刚生成的jupyter notebook配置文件内加入以下内容,保存并退出:
c.NotebookApp.ip='*'
c.NotebookApp.password = u'这里输入保存的密钥'
c.NotebookApp.open_browser = False
c.NotebookApp.port =8888
打开jupyter notebook:
jupyter notebook --allow-root
最后我们在电脑本机的浏览器访问本地的localhost:7777即可进入jupyter notebook:
localhost:7777