espnet是语音领域一个常用的工具包
里面有大量的shell脚本
我目前的情况是有3个机器3张卡,其中2机器安装了Linux,跑espnet非常容易
但是办公的机器安装了windows
空闲着Windows觉得非常浪费,于是研究如何在windows上运行espnet。
espnet官方是不支持windows的,为了执行shell脚本,我在windows上安装了wsl2(具体教程不赘述了)。
在wsl2中编译运行都比较顺利,安装kaldi提特征也完全没问题,可能遇到的bug一般就是内存不够了,可以在启动wsl的时候设置内存大小,或者减少nj的数量
wsl2是支持cuda的,而且只需要安装windows的驱动,wsl可以调用,这个最好看一下ubuntu的文档,不要在wsl里面再安装cuda
直到真正跑起了训练(对应我的任务就是stage 6),出现了一个很难debug的问题。
跑一段时间,显卡就休息了,wsl2中的训练程序卡死,ctrl c没有反应,如果强行kill,训练的进程会变成僵尸进程,只能重启wsl2
我开始是以为我远程连接windows导致的,下载了Powertoys保证windows不会在我断开连接后自动停止供电或睡眠
可是依旧存在这个问题,我在windows下安装了torch,写了一个小实验,发现无论多久都不会有问题
接下来使用gdb跟踪到卡住的进程里面去,看看到底是什么问题(这个文章是之后写的,就没有贴图了),如果是多进程的dataloader的问题就设置num worker为0
但是跟踪进去后,发现卡住的位置也很奇怪,卡在了to(device),调用的是libcuda.so.1,这可能是比较底层的问题了(写起来很简单,但其实用了几天才进展到这一步,开始总想能catch到问题然后把问题打出来,可是这个问题也不是运行到哪一步必发生,而是运行一段时间后)
这个问题我接下来发现并不好处理,to(device)的操作我也没法改写,内存地址显示的是remote,具体原因也不得而知,我猜测可能是wsl2的内存为了给显卡,会先给到windows的内存(训练时候windows内存占用的确很大,我给了wsl20G,Windows下一共32G,经常会占用到30G),windows内存满了就开始禁止wsl调用显卡?但是手上也没有多余内存条,没法进行实验
于是我换了个思路,windows下是可以跑torch的,只是不能运行shell脚本,我在wsl中提好了所有特征,复制到windows下面,在windows下面跑是不是就没问题了
的确跑起来再也没断开过,里面需要改espnet的一小点源码
1、os.uname这个api只在linux下才有,不过影响不大,就是一个名字,写死一个str就可以
2、espnet会一些软连接,比如train.loss.best.pth,会指向比如564.pth,windows下的软连接很别扭,而且给python的api也会奇怪,必须要管理员权限,可是就算给了管理员权限,软连接出来的文件也没法访问(如果在windows下要做文件夹的软连接不能创建快捷方式,这样python没法访问,要在cmd下用mklink命令),这段我是改成了复制,虽然会占用一定硬盘,但是也不太在乎这点啦,然后写了个log说明复制的是哪个epoch.pth,很有意思的是unlink这个api可以删除文件,完全不需要改动
改动完这两个地方就可以在Windows下跑训练了,执行命令会非常非常的长,可以在wsl中echo出来,复制到windows下run.ps1中
目前跑了2天,完全没有问题
Over(不过在windows下功率只给到250-300,Ubuntu功率能到320,不知道是不是windows太温柔了一点