由于某些需要,目前需要把BERT在GLUE数据集上实现一下验证,在github上down了一份BERT的代码,里面是直接给好了验证代码的(run_classifier.py)只需要按照requirement.txt安装一下tensorflow1.x就可以开始测试了
首先肯定是在本机上运行测试一下代码是否有坑,于是马上上手做,下载model,下载数据集,建立虚拟环境,装包等一系列操作,另外参考这位大佬的CSDN文章编写了一个自己的测试类,如果除去下载过程中遇到的奇怪问题,在本机上还算是比较顺利,很快代码就能运行了,我很开心,电脑主机应该也很开心,我听它的风扇声音一直都没停。我想了想,既然能跑,代码是某门忒的,好!开始上服务器吧!!!
这真就开始了心酸历程
首先最主要的问题是,实验室的服务器它断网了。。。
好吧,既然没法用pip,那我开始寻找python虚拟环境迁移的资料,这真是不找不知道,一找吓一跳,网上关于环境迁移的资料好少哦,还有好多不良网站剽窃别人的原文,看起来好像很多,点开看到图片加载不出的看过的原文。。。哼哼有点恶心人。。。这还不是最误人子弟的,网上的方法很多都有问题,,害本傻蛋踩了好多的坑。。。
首先,我图方便按照网上的教程,在自己的linux服务器上装好了一个虚拟环境,然后直接把venv打包下载再上传服务器,解压后将bin目录下的activate中环境的路径改掉,然后用source bin/activate激活。欸嘿成功进入虚拟环境,BUT,这种方法事后想想肯定是不行的,先不论安装好的包是否能直接迁移,就说bin目录下,就有不止一个文件包含环境的绝对路径。
好的,这种方法失败 当我真正意识到这种方法不行的时候。。。已经废了很久的时间了 哭了
中间还穿插各种小问题,想想真是辛酸泪
下面就讲讲该怎么往不联网的服务器上迁移python环境
由于我拿到的linux服务器只有py2.x,又不能联网,所以首先需要在一台linux服务器建一个py3的虚拟环境
conda create env -n bert-env python=3.6
然后把bert-env打包下载之后传到服务器
注意批量修改一下bin目录下的文中中的环境路径
我这边是这样改,把root更换为home/yxr065
sed -i "s/root/home\/yxr065/g" `grep root -rl ./`
之后返回自己的linux服务器,重装一个虚拟环境,最好也测试一下代码能不能运行,(我第一次测试是在windows上做的),然后用下面命令:
pip freeze --all > requirements.txt
把需要的包集成到requirements中,然后把包的whl文件下载下来
mkdir whl
cd whl
pip download -r requirements.txt
做到这一步,算是成功了一小半
然后把reuquirement放到whl文件夹,之后打包,再上传到服务器,激活虚拟环境,开始装包
source bert-venv/bin/activate
进入whl文件夹
pip install -r requirements.txt --no-index -f ./
这个时候可能还是会有问题,大概会报以下的错误:
xxx.whl is not a supported wheel on this platform
这是由于python版本与whl包不匹配,首先你要知道目前的环境适配何种后缀的包,查询命令由于pip版本的不同有所不同:推荐文章:https://blog.csdn.net/sinat_26811377/article/details/99947448
比如说我这边pip21.3用命令pip debug --verbose就可以看到
cp36-cp36m-manylinux_2_17_x86_64
cp36-cp36m-manylinux2014_x86_64
cp36-cp36m-manylinux_2_16_x86_64
cp36-cp36m-manylinux_2_15_x86_64
cp36-cp36m-manylinux_2_14_x86_64
cp36-cp36m-manylinux_2_13_x86_64
cp36-cp36m-manylinux_2_12_x86_64
cp36-cp36m-manylinux2010_x86_64
cp36-cp36m-manylinux_2_11_x86_64
cp36-cp36m-manylinux_2_10_x86_64。。。。。。
然后上华为的镜像网站
修改后面simple的标签,寻找自己想要的包,再ctrl+F筛选适合自己的包下载再上传
循环这个操作,直到不再报错。
如果数据量比较大,模型比较复杂,在服务器上跑的时候记得把进程加入后台
nohup sh train.sh > out.file 2>&1 &
sh train.sh是我的进程,记得修改成你自己的哦
最后最后,祝天下所有服务器都可以联网。。pip大法好