背景
自从华为开源了MIndSpore深度学习框架,题主就始终惦记着要充分利用手里有且仅有的游戏本,给它加持一套高大上的支持GPU的MindSpore环境,但让人泪奔的是——MindSpore-gpu不兼容Windows!!!
虽然MindSpore也能在Windows里运行,但那是CPU的安装版。可连GPU都不能用还有什么资格配叫深度学习机?
那么,在Windows上运行Docker行不行呢?这个空子没法钻。
那么,安装VMWare虚拟机行不行呢?这个选项大概率也走不通。
对这些问题有兴趣的同学请参考这些资源:
那么,装双系统行不行呢?肯定行,不过上个世纪就已经体验过两个系统来回切换的“安全方案”,那些痛苦至今还会在梦里找回来。怕了。
再添一台机器总可以了吧?肯定能完美解决,但这不是本文讨论的问题,所以不差钱的朋友完全没有必要继续在本文上浪费时间了。
难道说只能弃Windows转投Ubuntu的怀抱吗?可是使用习惯已经被微软悉(WU)心(QING)培(DU)养(HAI)了二十多年,又怎么可能能说改就改呢?就要有个过渡吧。
为了让Windows和MindSpore-GPU和睦共处,题主启动了“金字塔”项目,前前后后折腾了近一个月,经历了各种幻想、折磨、无奈和期待,终于苦尽甘来,成功在一台Win10游戏本上让华为MindSpore-gpu版本狂奔起来。之所以名为“金字塔”,盖因层层叠叠安装了一大堆虚拟机,Docker,最后就是为了顶上的MindSpore-GPU耀眼夺目。
闲话到此,以下干货。
一、“金字塔”项目目标:
在一台机Win10游戏本上,运行MindSpore-gpu:
-
在Win10系统中开启WSL2,运行虚拟机
-
虚拟机可以使用宿主机GPU资源
-
虚拟机运行Docker
-
运行在Docker中的MindSpore-gpu能够利用主机GPU资源进行计算加速
二、系统环境:
-
Docker镜象版本:mindspore-gpu :1.0.0
-
Docker版本: 19.03.13, build 4484c46d9d
-
WSL虚拟机OS版本:Ubuntu 18.04
-
WSL版本:WSL2
-
宿主机CUDA版本: 11.2
-
宿主机OS版本:Windows10家庭版2004(OS内部版本 20236.1000)
-
宿主机硬件:HP暗影精灵II, Intel HD630(集显)+Nvidia GTX1050Ti(独显)
三、避大坑
-
Windows 开发版(也就是OS内部版本)从20211到20215概率性不能启动WSL虚拟机。NVIDIA Drivers for CUDA on WSL不支持Windows开放版20211-20221。如果当前主机是这几个版本,一定想好要不要往下走。
-
谁也不能保证微软和Nvidia未来的更新是不是完全可用,请关闭Windows自动更新,并做好全系统备份。
-
宿主机不能安装Docker Desktop,与虚拟机Docker冲突。
四、安装过程
1、加入Windows Insider计划
我们的目标是让WSL虚拟机使用GPU资源。其实微软的WSL2已经很友好了,目前任何发行版都可以开启并运行Linux虚拟机。不过,想要虚拟机使用GPU的资源,就必须加入Windows Insider计划,激活Winows开发版。
-
使用Microsoft Store帐户登录Windows Insider主页https://insider.windows.com/zh-cn/,然后按照向导一步步往下走,都是常规的操作,如果网站慢就耐心多等一会。
-
打开”设置“,选择“更新与安全”,选择“Windows预览体验计划”,选择“Dev渠道”。
-
重新进入”更新与安全“,选择”检查更新“,系统会自动下载并安装最新开发版更新包。耐心等待升级完成。
-
安装完成后提示重新启动,现在不想重启也没关系,等到第3步激活WSL2之后再重启。重启之后按win+R,输入"winver"可以看到版本更新了。
2、安装NVIDIA Drivers for CUDA on WSL
这部分是跟显卡有关系的活。根据https://developer.nvidia.com/cuda/wsl/download指南下载对应的软件包。我的显卡是GTX1050Ti,所以下载GFORCE DRIVER。
下载启动时会提示用Nvidia开发者帐户登录。如果还没有的话,根着网页指南走就好了,都是常规的操作。下载文件名叫460.20_gameready_win10-dch_64bit_international.exe,一个646M的大文件,需要耐心等。下载完成后执行安装。安装完成也不必重启。下一步激活WSL2之后需要重启,就两步合一步了。
AMD显卡的朋友请自行实验,我没有设备帮不上忙。
3、激活WSL2
WSL2已经是Window内置的特性,开启非常简单。
-
打开”设置“,选择”应用“,选择右上角”程序和功能“(如果看不到,就最大化窗口)。
-
在弹出的程序和功能窗口中,选择“启动或关闭Windows功能”;在弹出的Windows功能窗口中选择”Windows Subsystem for Linux“和”虚拟机平台“。
-
重启机器
-
去https://aka.ms/wsl2kernel,根据指南下载并安装升级的Linux内核文件wsl_update_x64.msi。WSL2运行真正的Linux内核的,想象一下在Windows上运行的是”真正的“Linux机器就有些小爽。
-
以管理员身份,打开PowerShell窗口,输入以下命令激活WSL2
1 |
|
4、安装Ubuntu
-
打开Microsoft Sotre,在搜索框里输入Ubuntu,挑你喜欢的版本。最左边不带版本号的就是20.04。我最终使用了18.04。20.04老报错。
-
选择版本,等待下载完成(系统会有提示),然后在启动菜单中可以看到“Ubuntu-18.04 LTS”。点击启动虚拟机。
-
弹出Ubuntu终端窗口,系统自动安装,等一会安装成功,系统提示输入用户名和密码。
这里有一个错误提示,是因为宿主机的备份卷被锁了,子系统访问不到。这里展现了用WSL2的好处之一是:子系统可以把宿主机的文件夹挂在自己下面,同样的,宿主机也可 以直接访问子系统的目录,这样一来,相互之间拷贝文件简直不要太方便,不用cp,mv的敲半天。
-
输入用户名和密码,进入子系统。
5、在Ubuntu中安装Docker
-
在Ubuntu终端窗口中输入以下命令,安装Docker。
1 |
|
如果系统提示Docker已经存在了,果断ctrl+C终止就行了。
6、安装MindSpore Dcoker镜像
根据https://gitee.com/mindspore/mindspore?_from=gitee_search上的MindSpore官方指南,下载并安装mindspore-gpu:1.0.0 Dcoker镜像。
-
更新nvidia docker list
$ DISTRIBUTION=$(. /etc/os-release; echo $ID$VERSION_ID) $ sudo curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add - $ sudo curl -s -L https://nvidia.github.io/nvidia-docker/$DISTRIBUTION/nvidia-docker.list | tee /etc/apt/sources.list.d/nvidia-docker.list
-
安装nvidia-container-toolkit
$ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit nvidia-docker2
-
重启docker服务
$ sudo service docker stop $ sudo service docker start
WSL2虚拟机运行在init 1状态,因此无法systemctl命令
-
编辑docker的daemon.json文件(我感觉,这个文件已经存在了,不用再写一遍。可以先cat看一下有没有,没有再照着写好了。)
$ sudo vim /etc/docker/daemon.json { "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } } }
-
再次重启docker服务
$ sudo service docker stop $ sudo service docker start
-
在Ubuntu终端窗口中输入以下命令,把mindspore-gpu:1.0.0 Dcoker镜像拉到本机来。
$ sudo docker pull mindspore/mindspore-gpu:1.0.0
-
把MindSpore docker跑起来
sudo docker run -it --runtime=nvidia --privileged=true mindspore/mindspore-gpu:1.0.0 /bin/bash
-
终于到了测试这一步了。在docker内,打开python窗口。
在docker里,操作员获得管理员的权限,所以不用每条命令都要打sudo了。
-
输入下面的脚本
import numpy as np import mindspore.context as context from mindspore import Tensor from mindspore.ops import functional as F context.set_context(mode=context.PYNATIVE_MODE, device_target="GPU") x = Tensor(np.ones([1,3,3,4]).astype(np.float32)) y = Tensor(np.ones([1,3,3,4]).astype(np.float32)) print(F.tensor_add(x, y))
如果得到下面的结果,就大功造成了!从资源管理器GPU1的图表上看出这段脚本消耗了GPU的资源。
五、后记
题主本来只是一枚Linux小白,一个月以前对Docker除了名字更是一无所知,在“金字塔”项目执行过程中真可谓真是大坑小坑不断落,大包小包满脑袋。回想着各种错误带着诚意扑面而来时的目瞪狗呆不知所措,每次一有新的开发版推出就满心欢喜地以为问题跑光光最后又一次次失望,各种在神的各种神贴的有话说七分,有时候真是把机器拍碎的心都有。
话说无知无谓。就在发稿之前的一刻,题主大脑抽筋想再试一下Windows上直接跑Docker,安装了Docker Desktop,然后虚拟机里的Docker容器文件全不见了!!!以为辛苦工作的成果全都飞升了,当时真想嚎啕大哭,后来想了半天,感觉有可能是宿主机Docker Desktop把虚拟机的Docker给接管了?试着把宿主机Docker Desktop删除重启,才恢复如常了。反正为什么会出问题也不知道,问题解决了也不知道为什么。
所以奉劝各位朋友,要是精神上能够受得了折磨,不妨也试着弄一弄。友情提示:开发版可以提前尝鲜新功能,代价就是不稳定,切记如果决定使用,那么一定要把可以运行的环境备份好。在一个持续变化的环境里,再怎么强调备份都不过分。当然,技术流弊的,做这点事儿自然不在话下。不太差钱的就不如多搞台机器来直接装Ubuntu。实在不差钱就干脆到华为云上租个Atlas主机更加好了。
转自文章链接:https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=82598
感谢作者的努力与分享,侵权立删!