在windows上训练espnet/在wsl上训练espnet

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太温柔了一点

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值