2020.12.30晚记
在上一篇中已经介绍了用自己的电脑配置了GPU,配置完后训练速度确实是大大提升,但是因为自己的轻薄本显存太少了,只有2G,而我们的数据集还挺大,图片分辨率也高,所以尽管把batchsize调到2了,每每到解冻参数训练的时候都还是因为参数过多导致内存溢出训练不下去。看了老师分享到群里的博客,发现可以登录Google,上传文件到谷歌云盘,然后链接到Colaboratory进行在线训练,这个时候用的就是谷歌服务器那边16G显存的GPU进行训练的。
Colaboratory是 Google 的一个研究项目,旨在提供给开发者一个云端训练神经网络的工具。它是 一个Jupyter 的笔记本环境,完全运行在云端。Colaboratory 存储在 Google Drive 中,可以进行共享。Colaboratory 向开发者提供了免费的 Tesla K80 GPU 使用。
这里提前提醒一下大家,如果要训练的话,一定要保证谷歌硬盘的内存还够存放生成的模型文件(权重文件),因为非VIP用户只被提供15G的存储空间。同组的小赵同学就是有一次没注意到内存不够了,后来在训练过程中被迫中断,白白训练了这么多回合(还没训练到想要的地步)。清理内存把不需要的权重文件删除掉,要彻底删除文件不只是简单的右击选择删除,而是要在谷歌硬盘个人主页的左边双击Trash(这跟电脑的回收站有点像),选定特定文件右击delete forever,如果这里面的文件确实都不需要的话,也可直接点击右上角的Empty trash。
好了,现在就能开始按照步骤一步一步来梳理了。
不过还是先声明一下,以下步骤可能不够准确,因为自己当时在尝试的时候真实情况与CSDN中的教程也不完全相符,所以自己探索了一些东西才成功。而且距离当时配置环境也过去好几天时间了,有些过程自己可能记得不太清楚,但大致是没问题的。如果大家有遇到什么问题,可以随时私信和我交流。
一、下载谷歌浏览器
我们需要使用Google浏览器进入外网,登录谷歌云盘,所以第一步自然需要下载谷歌浏览器。
[Google Chrome官网]https://www.google.cn/chrome/
## 二、注册账号
要使用Google就需要注册一个账号,这个账号可以登录后续要用到的谷歌云盘。而我们只需要注册一个谷歌邮箱的账号就相当于有了谷歌的账号了。我这里是用QQ邮箱的手机APP进行注册。
如下图所示进入QQ邮箱APP,在首页点击点击Gmail
点击之后会弹出下面的登录界面,点击创建账号
按要求填写信息后点击下一步
之后输入自己的手机号,在号码左边记得选择中国国旗,输入电话号码
之后就是等待验证码,输入验证码点击验证
这个过程真的特别久,而且很多次会验证失败,去CSDN查找了一下博客,发现这个问题到现在也还是没有很好的解决办法。算是个玄学吧,我当天晚上验证了特别多次,一直抖提示验证失败,后来第二天睡醒再去试一试,竟然验证成功了,验证成功后继续按照提示填写相关注册信息,走到最后就注册成功了。最关键的还是手机号验证那个部分,真是个玄学,多试几次,或者重启一下,重新连一下网多试几次可能某一次就通过验证了。
三、爬梯子
之前从来没有爬过梯子,在网上查找了一下相关步骤,没想到,竟然查不到什么!第一次感觉到,监管部门对这一块的管理得还挺严的。后来,刚好有同学找到了比较好的软件,我们直接下载了安装包,点击该软件后,选择以Google为默认浏览器打开。记得在此之前保证自己的网连接是正常的。如下图即在浏览器打开后的界面,点击“点击连接”,即可连入外网。
验证是否连入外网的方法还可以点击浏览器左上角的“YouTube”,如果可以成功加载出页面,说明外网连入成功。
连入外网后,登录刚刚注册的谷歌账号,进入谷歌云盘
四、上传文件到谷歌云盘,并链接到Google Colabratory
点击左上角的“New”。选择Folder upload,将自己的工程文件夹上传到云端硬盘,如果文件夹很大的话,需要等好一些时间。而且中途会有断网的现象,这都没关系,稍微等待一下网络就又连上了,就会继续上传。不要随意点击刷新,有可能刷新一下会从头开始上传。
上传完毕后,点击New,再点击More,选择“Google Colaboratory”就会新建一个窗口到Google Colaboratory。
一开始的时候可能看不到Google Colaboratory这个选项,就需要点击下方的 Connect more apps,如下图在其中查找到该应用后进行安装添加。
但是我当时在查找的时候并没有查找到该选项,所以点击了浏览器左上角的“应用”选项,直接在那边查找Google Colaboratory。(其实这真的是瞎试,因为在CSDN并没有找到解决方案,但是好在后面这个方法是可行的)如下图,查找后选择Open in Colab。点开之后点击Add to Chrome
加入后再点击“应用”,就能发现Google Colaboratory,双击进入
进入Colaboratory界面后,运行提示的单元格,即可装载谷歌云端硬盘
进入之后可在上方修改工程的名字
点击界面右上角的“连接”
在左上角的“修改”选择笔记本设置,然后将硬件加速器设置为GPU,这样之后在训练文件的时候就可以使用GPU加速训练了。然后点击保存
补充:点击如图所示图标也可连接到Google云端硬盘
连接完之后会在页面左边看到如下的文件,也就是在谷歌云盘中上传的所有文件。(我上传的文件直接是在本地的工程文件,建议上传的就是你在Pycharm打开的工程文件夹)
选择要运行的一个工程文件,然后开一个代码块,将下列代码粘贴进去,运行该代码。运行后会依次出现两个链接(点击第一个链接运行成功后才会继续运行产生第二个链接)。这两个链接其实就是让我们用刚才注册的谷歌邮箱账号登录,将得到的验证码输入确认。
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret= {creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret= {creds.client_secret}
接下来还是要运行一些代码块,这些代码不放在同一个代码块是为了保证模块性,之后可以根据需要运行自己需要的代码块。而且这个环境其实类似于Jubyter笔记本环境,是通过运行命令来执行代码的。
而这些代码有一部分我也是参考教程的,并不知道具体是什么作用。但只要按顺序输入,亲测是可以的。
接着运行下列的代码块,运行之后出现下面两个信息就证明执行成功了。
执行下列语句,配置整体环境(给该环境安装一些基本的必要的包)
执行下列语句可以显示出该路径下的所有文件。(路径需要改为之前自己所选择的文件的路径)
如下图再新开两个代码块,分别执行下面两个语句,安装对应版本的tensorflow-gpu(要用GPU进行训练需要该包)和keras。
执行下面代码块。这里比较奇怪的是,按理说不需要上面安装1.13.2的版本直接安装1.14.0的版本即可(我在本地是用的1.13.2进行训练,但是在线上训练的话,最开始1.13.2并不能成功执行,网上搜索后才知道用1.14.0版本的可以成功执行,所以才先先安装了1.13.2再卸载再重装),但一组的小赵同学直接安装1.14.0并不能成功,还是得按照我这个顺序后面才顺利执行。
安装完这些之后就可以运行程序啦。线上训练比较麻烦的是,每次登陆进入该环境,都需要走一遍上面的配置流程,给环境安装需要的包,才能运行。
而且程序中的文件也都要全部改为线上的路径,这意味着文件夹中的所有跟路径有关的都需要改变。那么怎么查看某个文件的路径呢?如下图所示,在左边右击需要的文件,弹出复制路径,点击之后粘贴到需要的位置即可。
而且在运行某个Python文件之前,需要进入到该文件所在的目录之下,即使用如下语句
%cd +文件路径
在进入文件所在的目录后,使用下面的语句即可执行某个python文件。
!python +需要执行的文件.py
之后就可以看到用GPU进行训练的过程啦。
不过我们遇到的一个大问题是,似乎16G的GPU还是满足不了我们的需求(按理来说应该是能满足要求的,但是不知道为何还是经常内存溢出)。其实我们训练的轮次并不是很多最多总共也就100回合,而且最多训练到六十几回合就early stopping了,当然early stopping是由于程序中设置了防止过拟合。但是我们的Batch size最多只设置到16,如果设置到32的话,到第二轮训练时(解冻部分参数后)马上就内存溢出了。
我们去查了查资料,有的网友说,对于比较“陌生”的网友,从安全来考虑,Google端并不会真的分配这么多的显存给该用户。有的网友查询完后甚至只有差不多2G的显存。我在想,我们也是第一次翻墙,第一次注册谷歌账号,第一次使用谷歌硬盘和 Colaboratory,也许我们就是对Google来说“陌生”的那一批用户吧。网友提供了一个方法可以查询我们使用的GPU是否真的有16G那么多,如下所示,新开一个代码块,输入下列代码并运行。
# memory footprint support libraries/code
!ln -sf /opt/bin/nvidia-smi /usr/bin/nvidia-smi
!pip install gputil
!pip install psutil
!pip install humanize
import psutil
import humanize
import os
import GPUtil as GPU
GPUs = GPU.getGPUs()
# XXX: only one GPU on Colab and isn’t guaranteed
gpu = GPUs[0]
def printm():
process = psutil.Process(os.getpid())
print("Gen RAM Free: " + humanize.naturalsize( psutil.virtual_memory().available ), " | Proc size: " + humanize.naturalsize( process.memory_info().rss))
print("GPU RAM Free: {0:.0f}MB | Used: {1:.0f}MB | Util {2:3.0f}% | Total {3:.0f}MB".format(gpu.memoryFree, gpu.memoryUsed, gpu.memoryUtil*100, gpu.memoryTotal))
printm()
如下所示是我本机运行之后的效果,可以看出Google给我提供的显存大小是没有问题的,那为什么似乎batch size还是无法调高,为何解冻参数进行第二轮测试时batch size还是得调这么小才能保证不内存溢出呢?这里也希望知道原因的朋友们能给点指示。
好了,这就是我使用Google Colaboratory进行训练的全过程了。如果哪里有错误的,欢迎大家指正,有什么问题也欢迎大家私信我一起交流~