环境安装,BERT、GPT、T5 性能测试,和横向对比【100亿模型计划】

几个常见GPU性能对比
3090ti是目前性价比最高的显卡

RTX40系列即将要出来了,这个结论很可能会被推翻
本期针对那些有可能对Bert和GPT不感兴趣,有可能对另外的模型感兴趣,
教大家怎样评测一个任务在实际硬件上的性能
以及怎样理解你测到的性能和你理论的一个性能的区别,到底是哪些因素导致你达不到理论的上线
给大家讲的代码都开源在github上面,大家可以在这个代码的基础上修改它来测试自己的任务和自己的硬件,这样一方面可以帮助你根据自己的任务来选择合适的硬件,另一方面可以帮助你理解你的任务里面他的计算瓶颈在什么地方,也许可以通过简单的调参使你的性能有大幅度的提升
代码地址:https://github.com/mli/transformers-benchmarks
本期有两个任务
- 怎样接着上期的干净操作系统怎样将一些软件装上
- 讲代码怎样在Bert、GPT、T5这三种不同的transformer架构下的核心的一个层他的性能是什么样子,以及他跟我们的理论上线的距离到底有多大
假设你有一个操作系统什么都没安装的情况下,有以下三个方法来安装深度学习的框架,这里以Pytorch举例

- 先安装cuda的大礼包,然后找到对应的pytorch版本用pip或conda命令安装Pytorch就行
- 不安装cuda的大礼包,直接安装最基本的nvidia驱动,然后用conda安装pytorch,然后装上对应的cuda的运行环境
- 也先安装最基本的nvidia驱动,然后使用nvidia提供的docker镜像
第一个方法搜cuda

选操作系统
这里的一个坏处是就算你装了一个比较流行的linux发行版ubuntu,假设使用比较老的版本这里可能就没有显示对应的cuda版本,使用比较新的Ubuntu这里也不一定提供,所以对于服务器使用的操作系统来讲,最好不要太老也不要太新,用比较好的稳定版本就行了,这样子会使其他你要用的软件支撑会好一些

接下来会下载一个G的文件大礼包,里面提供了一个nvidia驱动,以及它cuda的运行环境和开发环境,运行这个基本没有问题

最后运行这个命令的时候的时候可能会有报错驱动安装失败,这个时候你可以先去下载nvidia的最新驱动,然后安装cuda的时候选不用安装你的驱动就行了,

自己安装驱动的话一般要比这个515.60这个驱动版本要高一些,低一些可能会安装失败或者兼容性的问题,但一般来说你用比较新的驱动是没有问题的
假如你的系统已经安装了一个驱动的话,你安装cuda的时候,如果你安装的驱动版本比这个515高,也可以在安装cuda的时候不安装这个驱动就行啦

安装好后就来到了Pytorch的安装

找到对应cuda版本,如果这里刚好有对应的版本,选择好后直接复制这个命令,安装大概下载1个G的文件,

有可能你安装的是11.7,这里只有11.6怎么办,一个办法是安装cuda前来看看pytorch支持cuda有什么版本,一个办法是虽然这个界面只列了三个版本,你可以去这个URL把cu116改为cu117看看存不存在这个页面,如果不存在就说明暂不支持

然后可以安装更前的版本11.6等


不存在cu117


但如果是更老的版本的话,可能是存在的,

第一个方法是最老的方法,cuda相对来说不是一个那么好安装的包,比较大,一旦你安装成功的话,整个系统层面的就安装成功了,之后只有找到对应的框就行啦,cuda相对来说不需要怎么动就行了,而且这是一个cuda大礼包,安装了这个就不需要担心其他什么没有安装了。
但这方法存在两个问题,一个是当你使用比较新的GPU情况下,可能需要是不是的更新cuda版本,这是因为nvidia的GPU是没有版本兼容性的,每次出来了一个新的架构之后,那么它所有的东西都可能跟着变,然后会发现cuda是不会向前面兼容的,即一个老的cuda版本是不能支持新的GPU,但是在未来,nvidia会针对这个架构做性能的提升,所以你需要安装更新的cuda来获得更好的性能,所以在你用一个比较新的GPU的时候,当升级了cuda之后你会发现性能得到了很大的提升,那是因为你在系统层面安装了cuda,导致你每次升级之后会影响后面安装的一些包。
第二个缺点是,你在系统层面安装了cuda,后面在安装包的时候会发现找不到它对应的cuda版本,因为cuda的兼容性做的比较差,最好是你要安装对应cuda版本编译出来的你后面的包才行

第二个方法
首先安装nvidia驱动,比如在Ubuntu系统
先更新包

搜索nvidia driver

nvidia 515是目前最新的版本,装这个

使用apt get这个方法安装一般不会有一个驱动兼容的问题,大概1个G大小

假设你已经安装好了nvidia
使用以下命令nvidia-smi查看驱动版本
然后会发现这里写了一个cuda的版本,但是并没有安装

输入nvcc 会提示没有安装

但是不建议用它推荐的命令去安装cuda,因为
它给你安装大量的零散的包,但是它的cuda版本不一定是你想要的,你不好控制它的版本是哪一个,我们还是建议使用conda命令安装

方法二的优点是只要在系统层面把驱动装好就行啦,只要这个驱动够新,它比你需要的cuda版本要新,那么一般是没有问题的,再用conda来安装cudatoolkit,就解决了我的
cudatoolkit和我的后面的包的不兼容性,而且我要安装一个别的版本,它对应的别的cudakit都是安装在对应的一个文件夹里面,它不是一个系统级的安装,只是在这个环境里面的安装,如果我不需要,我可以删掉他,但坏处也有两个,其中一个是对应每一个环境它的conda其实都是一个文件夹,它都会去安装一个cudatoolkit,如果你安装很多版本的话,你会发现发现你的磁盘占用率是挺高的,每个环境可能几个GB就没了。
第二个问题是,通过这样的方式安装的cudatoolkit,他只是一个运行的环境,它会少了很多包,比如nvcc是cuda的编译器是没有了,假设你需要cuda的编译器来做开发,你需要额外的安装,甚至有一些包之后要用的deepsbit,它有些kernel其实是需要在实时编译的,pytorch也提供了一些实时编译的工具包,那些包都是需要依赖nvcc的,这个时候你就去装有对应nvcc的一个包,但是在conda上面,这样子的发布不一定是很及时的
比如在conda里搜cudatoolkit-dev会发现最新的版本是11.4.0而没有11.6版本

第三个方法和二个方法类似
先装nvidia驱动,再安装nvidia docker容器,假如你用过容器会发现挺简单的,假如没用过建议大家去试一试,这个在工业界用的还是非常广的,

nvidia docker安装教程放在开源代码里

如果你使用Ubuntu的话,基本上按照这里面的复制粘贴运行是没问题,如果你使用别的操作系统它也有对应的教程
它首先干的事是安装docker
用curl命令安装,但是这要求你的Ubuntu系统不能太旧,


安装好后找到这个页面去到pytorch的镜像

nvidia里提供了很多镜像
我们要的pytorch


安装好了Pytorch后运行命令

假设你的系统装好了nvidia驱动和docker
复制这个命令运行到命令行

然后运行nvidia-smi

再运行Jupyter notebook
这样你在docker里也运行了一个jupyter因为做了映射

把hostname改为localhost复制就可以在主机上打开并使用,但运行的环境在docker的里面
总结方法三的优点,很明显,用起来比较简单,当系统安装好nvidia驱动,和nvidia docker,后面的应用相对来说不用关心所有的安装了,基本上下载下来就可以运行,出错的概率并不大。
第二个好处是相对方法二而言,这里装上了所有要的包,它也是大礼包的安装,不像之前一样只装运行环境,这里基本上所有的开发工具已经装好了,不仅nvcc,包括其他库的优化也装好了,这样后面就不用关心太多。
第三个好处来自你的容器内部运行的是ubuntu,对于外部的操作系统来讲就可能不重要了,甚至你装的windows也是能跑
坏处,第一个是比较占磁盘,因为他每次下载下来6个GB 的文件就没了,如果下载网速慢的话也很耗费时间,解压后,实际占有可能10GB就没了,意味着如果你换一个镜像或者换一个版本号都有可能给你带来很多GB的稳健增长
第二个问题是使用体验,在长时间运行特别是测这个一会是out of memory,一会出错的情况下,好像运行一阵子之后docker里面的驱动会出一点问题,会发现找不到GPU了,这时需要把docker重启,所以你进了docker之后,在安装了一些别的包或者干了一些别的事情的时候,这个东西除非你把它保存下来,否则可能就回到了一个原生的情况了,这时需要重新安装
第三个问题,在容器里面运行会不会带来一个性能的问题,通常在docker里面运行系统指令的时候,会有一定的额外开销,比如有些安全性的检查,但是就算对于非常密集的系统调用可能也就带来5%或者10%的开销,但这里是用python来跑机器学习,感觉是问题不大,因为Python本身是很慢的语言,每一次的调用它的额外开销都是非常大的,另外如果你是在nvidia的机器上跑东西的话,主要开销在于运行这些cuda的kernel,所以这里不用太担心docker带来的性能损失
总体如果关心算法做开发的话选择方法二比较好,如果关心性能,要做相对来说比较低层的一些调参或者开发的话,方法三是个不错的选择,由于现在cuda更新很快如果用第一个方法,包也要对应的时不时更新,这个时候多了一个额外匹配的过程,相对来说就不那么推荐一些了
评测代码
