目录
- 前言
- 老黄和他的核弹们
- 开发环境一览
- 显卡驱动安装
- 下载驱动
- 禁用nouveau
- 安装驱动
- 安装CUDA8.0
- 参考
- 最后
前言
在Linux下安装驱动真的不是一件简单的事情, 我在经历了无数折磨之后终于搭起了GPU编程环境. 我是很心水老黄的, 但是, 我还是想说"So, Nvidia: FUCK YOU!"(Linux之父原话)(手动滑稽).
Linux之父
老黄和他的核弹们
油管RTX2080发布会
老黄的创业路并不是一帆风顺的, 如今毁天灭地的GTX 1080 Ti甚至RTX 2080也不是一天就能够诞生的.
1993年4月, 从集成电路生产商LSI Logic出来的老黄(黄仁勋), 联合Sun公司两位年轻工程师--Chris Malachowsky和Curtis Priem共同创立了英伟达(Nvidia), 他们的初衷是研发一种专用芯片, 用来加快电子游戏中3D图像的渲染速度, 带来更逼真的显示效果.
两年之后, 推出了第一款核弹, 哦不, 产品, 首款面向游戏主机的多媒体加速器--NV1, 这款加速器集图形处理、声卡及游戏操作杆等功能于一体, 一经发布便吸引了当时最大游戏制造商世嘉的目光. 世嘉决定在其第六代家用游戏机“土星”和个人电脑上采用NV1. 当然, 现在的世嘉就只是个第三方了. 基本是大法(索尼), 老任(任天堂)和微软三分天下了. 姨夫还在的大法真的可谓是蒸蒸日上, 现在卸任了, 不知道大法还能不能继续领跑游戏主机市场. 但是注意, 这里加上本来已经式微的老任也和英伟达有关, 后面说.
但是同年, 还是巨硬的微软推出了Windows 95, 图形芯片主流市场从游戏主机转向PC, 同时还发布了Direct3D标准. 英伟达采用的是二次方程纹理贴图作为立体图形实现方式, 无法兼容行业通用标准, 因此市场销量快速下降.
两年后, 英伟达陆续推出RIVA128、RIVA128ZX、RIVATNT等图形处理器. 这些新产品不仅支持微软Direct3D和OpenGL标准, 在能效上也超越了竞争对手3Dfx的Voodoo和ATI的Rage Pro, 加上价格低廉, 逐渐获得了整机厂的青睐. 1999年1月, 在纳斯达克挂牌上市. 同年8月,英伟达推出第一款以GeForce命名的显示核心--GeForce 256, 并首次提出GPU概念. 次年底, 英伟达以7000万美元现金、100万股公司股票, 将3Dfx收入囊中, 正式成为行业老大.
到这里, 老黄眼看就要一统江湖了. 好景不长, 还是和巨硬相关.
众所周知, 巨硬花了一大笔钱进军游戏主机行业. 2000年, 巨硬请英伟达研发Xbox图形芯片、SoundStorm声音芯片以及主板解决方案. 但是巨硬时限只有一年, Xbox发布前两个月才开始生产. 最终, 微软被迫推迟首发, 错过先机, 败给了索尼PS2, 但是PS2赢的点不单单是先发, 在游戏数量和质量都是领先很多的, 这也是后来PS3失利的点, 以及PS4王者归来的点. 巨硬失了先机, 只能打压英伟达, 后来又出了品控问题. 巨硬便把订单交给了英伟达的竞争对手ATI(后被AMD收购). 这次合作失败让英伟达付出了惨痛代价, 不仅2003年营收减少, 还错过了微软DirectX 9规格确立的重要消息, 直接导致当年推出的GeForce FX由于兼容性问题败给ATI的Radeon 9700. 这和第一次NV1的折戟非常相似. 更不幸的是, GeForce FX还存在运行温度过高的问题, 引发多次自燃事故, 黄仁勋一度被游戏玩家调侃为"两弹元勋". 之前三星Note7的爆炸也是葬送了整个中国市场. 不过原因比较复杂啦, 大家懂的. 除了巨硬, 牙膏厂(英特尔)也开始扶持ATI. 英伟达为了实现突围, 一方面主动去找巨硬和解, 争取再次合作; 另一方面失去Xbox订单, 努力拿下了索尼PS3订单. 此外, 继续推出高性能芯片压倒ATI, 同时还和英特尔达成了专利交叉许可协议. 可以说很卧薪尝胆了.
眼看要一统江湖的老黄就这样被巨硬和牙膏厂打压得说不出话来. 所以就算是在硅谷, 创业也是很艰难的.
2007年, 英伟达首席科学家David Kirk说服了老黄, 投入大量资源研发出了能够让GPU变得通用化的CUDA(Compute Unified Device Architecture)技术, 就是如今GPU编程的核心, 并让每一颗英伟达GPU都支持CUDA. 这一疯狂举动成本巨大. 由于必须在硬件产品设计中增加相关CUDA逻辑电路, 使得芯片面积增大、散热增加、成本上升、故障率增高; 同时, 还要保证每款产品的软件驱动都支持CUDA, 这简直是不给英伟达的程序猿活路, 所以程序猿有啥意思, 当科学家多好玩(手动滑稽). 2008年, AMD收购英伟达老对手ATI, 形成了CPU整合GPU的新解决方案. 但是很遗憾, AMD算盘打得飞起, 但是如今都是牙膏厂CPU 英伟达GPU. 红绿之争从此开始, 或者说就是对手换了个名字.
Intel也终止了与英伟达的合作, 在自家芯片组中集成了3D图形加速器, 就是现在说的集显或者核显, 给水果机找到了不用英伟达的借口, 这也是我无可奈何去淘了二手神州代替rmbp进行GPU开发的原因, "So, Intel & Apple: FUCK YOU!".
2012年,深度神经网络技术在通用GPU的支持下实现重大突破, 包括计算机视觉、语音识别、自然语言处理, 以及各个领域的人工智能技术都得到了快速发展的条件. 英伟达的数据中心业务也蒸蒸日上, 为大大小小的公司提供强大计算力支持.
然后在2016年10月20日任天堂发布了Switch, 用的是英伟达定制的Tegra X1系统芯片. 说句实话, 如果没有switch, 就不是三分天下了, 老任就只能在掌机区自娱自乐了. 注意哈, switch不是掌机是主机哦, 虽然很多人都当掌机耍.
所以很难说是深度学习带给了老黄机会, 还是老黄带给了深度学习机会. 总之第三次AI浪潮以及AI时代的到来, 老黄功不可没. 不过就算不谈AI, 没有英伟达, 就绝对不会有现在的3A大作, 更别提超3A大作.
老黄最终能否击溃AMD, 夺下剩余的PC市场份额, 甚至是夺取还掌握在AMD手上的主机市场的大部分份额其实都不重要. 因为现在是移动时代, 我认为在AI时代完全到来之前, 抢占高通的份额才是关键. 看看华为和苹果所做的, 老黄想走得更远要做的还有很多, 更何况, 还有谷歌在虎视眈眈呢(手动害怕).
开发环境一览
- GPU: NVIDIA GT 750M
- OS: UBUNTU 14.04.1LTS 64位(之后会说为什么选这个版本, 16.04流程基本类似, 但是要注意内核版本)
显卡驱动安装
千万不要用UBUNTU附加驱动里提供的显卡驱动!!! 千万不要用UBUNTU附加驱动里提供的显卡驱动!!! 千万不要用UBUNTU附加驱动里提供的显卡驱动!!! 一般来说, 你会遇到一些奇怪的问题, 当然, 锦鲤是不会出问题的(手动滑稽). 这是第一个坑点, 大体有三种展现方式:
- 装完重启进不去系统, 卡住ubuntu加载页面;
- 无限登录;
- 装好了, 进入了系统, 然后输入nvidia-smi指令没有任何反应. 正常情况会弹出一张表, 如下所示:
nvidia-smi
下载驱动
行了, 来说说我的实操: 首先到官网下载显卡驱动, 比方说我是GT 750M, 操作系统是64位Linux, 我就找对应的版本进行下载.
下载驱动
代码语言:javascript复制删掉以往的驱动. 注意, 就算你啥都没装, 这步也是无害的.
sudo apt-get remove --purge nvidia*
代码语言:javascript复制更新并安装一些需要的库, 先装这么多, 之后装CUDA还有一波.
sudo apt-get update
sudo apt-get install dkms build-essential linux-headers-generic
禁用nouveau
代码语言:javascript复制打开blacklist.conf, 在最后加入禁用nouveau的设置, 如图所示:
sudo vim /etc/modprobe.d/blacklist.conf
代码语言:javascript复制blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
禁用nouveau
代码语言:javascript复制禁用nouveau内核模块
echo options nouveau modeset=0
sudo update-initramfs -u
代码语言:javascript复制重启. 如果运行如下指令没用打印出任何内容, 恭喜你, 禁用nouveau成功了.
lsmod | grep nouveau
安装驱动
代码语言:javascript复制来到tty1(快捷键ctrl alt f1,如果没反应就f1-f7一个个试, 不同Linux, 按键会略有不同). 关闭图形界面:
sudo service lightdm stop
代码语言:javascript复制安装驱动, 注意有坑, 一定要加–no-opengl-files, 不加这个就算安装成功, 也会出现无限登录问题.
sudo chmod u x NVIDIA-Linux-x86_64-390.87.run
sudo ./NVIDIA-Linux-x86_64-390.87.run –no-opengl-files
代码语言:javascript复制如果你已经装了, 但是没有加–no-opengl-files, 按照如下操作可以救一下.
sudo ./NVIDIA-Linux-x86_64-390.87.run –uninstall
sudo ./NVIDIA-Linux-x86_64-390.87.run –no-opengl-files
重启. 用nvidia-smi指令试一下, 如果看到类似下图, 恭喜你, 驱动安装成功. 或者看到附加驱动显示继续使用手动安装的驱动.
nvidia-smi
附加驱动
安装CUDA8.0
代码语言:javascript复制先来补库.
sudo apt-get install freeglut3-dev libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
到官网下载要的CUDA版本, 我这里是8.0第二个版本, 下载runfile(local)版本, 如下图所示:
安装CUDA8.0
代码语言:javascript复制md5检测一下, 不合格要重新下载. 下图是我的检测结果:
md5sum cuda_8.0.61_375.26_linux.run
md5检测
代码语言:javascript复制再次关闭图形界面
sudo service lightdm stop
代码语言:javascript复制安装时候依旧要加–no-opengl-files参数, 然后就是先一直空格, 之后一路默认就好.
sudo sh cuda_8.0.61_375.26_linux.run –no-opengl-files
代码语言:javascript复制然后会看到三个installed.
开启图形界面
sudo service lightdm start
代码语言:javascript复制这里又有一个坑, 如果是14.04.5, 我到这一步就开启不了了, 后来换成14.04.1了, 总之内核也要小心选择.
运行如下命令, 如果显示如图3个文件夹, 恭喜你.
ls /dev/nvidia*
代码语言:javascript复制如果少了或者都找不到, 还有一些操作要做. 用vim创建一个xxx.sh(名字随意), 输入以下内容:
#!/bin/bash
/sbin/modprobe nvidia
if [ "$?" -eq 0 ]; then
# Count the number of NVIDIA controllers found.
NVDEVS=`lspci | grep -i NVIDIA`
N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l`
NVGA=`echo "$NVDEVS" | grep "VGA compatible controller" | wc -l`
N=`expr $N3D $NVGA - 1`
for i in `seq 0 $N`; do
mknod -m 666 /dev/nvidia$i c 195 $i
done
mknod -m 666 /dev/nvidiactl c 195 255
else
exit 1
fi
/sbin/modprobe nvidia-uvm
if [ "$?" -eq 0 ]; then
# Find out the major device number used by the nvidia-uvm driver
D=`grep nvidia-uvm /proc/devices | awk '{print $1}'`
mknod -m 666 /dev/nvidia-uvm c $D 0
else
exit 1
fi
代码语言:javascript复制运行后就会看到3个文件夹.
sudo chmod x xxx.sh
sudo ./xxx.sh
ls /dev/nvidia*
/dev/nvidia0 /dev/nvidiactl /dev/nvidia-uvm
代码语言:javascript复制然后写入rc.local中, 如图所示:
sudo vim /etc/rc.local
rc.local
代码语言:javascript复制打开环境配置文件
sudo vim /etc/profile
代码语言:javascript复制最后写入:
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH
代码语言:javascript复制保存退出, 并其生效.
source /etc/profile
代码语言:javascript复制然后就能看到了.
运行一些检测命令, 如果和我显示的类似, 恭喜你, 环境配置完成.
cat /proc/driver/nvidia/version
代码语言:javascript复制nvcc -V
检测
参考
参考了非常多的文章, 有些把我带坑的, 我就不写了好吧, 原谅你们了(手动无奈). 以下都是非常有用的文章.
https://zh.wikipedia.org/wiki/英伟达 https://gist.github.com/dangbiao1991/7825db1d17df9231f4101f034ecd5a2b http://ifenxi.com/archives/1103 https://www.jianshu.com/p/35c7fde85968?from=singlemessage https://blog.csdn.net/qjk19940101/article/details/78927109 https://docs.nvidia.com/cuda/cuda-installation-guide-linux/#abstract
最后
现今并行编程和GPU编程是基础了, 学会搭建CUDA编程环境很重要, 在这个基础上还可以继续构建深度学习, Tensorflow等等.