# 为ubuntu22.04安装P40显卡

aki 终于是攒下一些钱了。念想了很久的 AI 绘图多少是可以搞点小动作了。

本着话不能睁着眼睛乱说（一支眉笔赛黄金），钱不能张开手来乱花的原则，考虑购入一张 “高性能”（过气）计算卡来玩一玩 Stable Diffussion（以下简称 SD）

原本显卡是打算给服务器买的，但到头来发现塞不下，着实有些尴尬。

PC 机上装了 ubuntu22.04，原本用的显卡是 1660TI 那现在正好可以腾出来位置给新显卡用。

主机配置

核心组件 | 更换前 | 更换后
CPU | AMD Ryzen 5 3500X | 不变
主板 | 微星的 B450M | 不变
内存 | 40G | 不变
显卡 1 | NVIDIA GTX 1660TI | TESLA P40
显卡 2 | 无 | NVIDIA GF 310

GF 310 仅作为亮机卡。更换前这些组件需要的额定功率（不考虑超频的情况）约为 215W，更换后功率变为了 335W（国家电网合作伙伴兼外围职工），电费肉眼可见的上涨。

为什么选择 tesla P40

首先，来看看这张卡的技术规格

显卡规格

|
GPU 架构 | NVIDIA Pascal™
单精度浮点运算能力 | 12 TeraFLOPS*
整数运算能力 (INT8) | 47 TOPS* （万亿次 运算 / 秒）
GPU 显存 | 24 GB
显存带宽 | 346 GB/s
系统接口 | PCI Express 3.0 x16
外形 | 4.4”（高）x 10.5”（长）， 双插槽，全高
最大功耗 | 250 W
已使用页面迁移引擎提升 编程能力 | 是
ECC 保护 | 是
硬件加速视频引擎 | 1 个解码引擎， 2 个编码引擎

P40 的实际使用性能等同于 GTX 1080TI，网友为其做了详细对比，详见：知乎

话又说回来了，为什么就一定要选择 P40？

除了什么单精度浮点运算能力、整数运算能力之类的我看不懂的技术指标，其实我更看中他的 24GB 显存，这篇知乎的回答是在 2018 年，而 P40 首发是在 2016 年，毫无疑问，这种专业用途的计算卡价格昂贵是必然的。时过境迁，现在某鱼市场上的二手显卡二者对比下来反而是 1080TI 略贵一些（这还是上半年 AI 模型多次迭代导致二手市场上做训练用途的显卡价格上涨后的结果）。

p40 的 24GB 的现存相比 1080TI 的 12GB，可以用来跑更多类型的 AI 模型

再加上服务器本身自带集显，不用考虑亮机问题，所以首选了 P40（950R）

P40 官方告示

P40 安装前后的一些操作

给 ubuntu 打显卡驱动正确步骤应当是先屏蔽开源驱动 nouveau，并进入 init 3 纯命令行模式
由于早先给 1660TI 打驱动时做过这些步骤，因此本文省略
如果有小伙伴参考了本文给 linux 操作系统打驱动一定要先做好上述准备

由于这台 PC 最早搭载的显卡是 1660TI，现在更换下来后，没有输出显示，需要再备一张亮机卡。匆匆忙忙去附近电脑店花 “高价” 购入了一张 GF310 显卡作为亮机卡（否则无法点亮，过不了自检）

ubuntu 操作系统上先不能安装 P40 显卡，只装上 GF310，然后卸载原有驱动，并更新安装新的驱动

Copy
~$ lspci | grep -i nvidia
25:00.0 VGA compatible controller: NVIDIA Corporation GT218 [GeForce 310] (rev a2)

~$ apt remove --purge nvidia-*
~$ nvidia-smi

找不到命令 “nvidia-smi”，但可以通过以下软件包安装它：

Copy
~$ apt autoremove

lspci用于查看当前 pci 上安装的显卡型号

apt remove --purge nvidia-* 用于卸载原有 1660TI 的驱动

nvidia-smi 提示找不到命令则表示驱动卸载完毕

apt autoremove 保证残余依赖包完全卸载

GF310 显卡需要安装的驱动为 340 版本，使用ubuntu-drivers devices命令无法找到合适的驱动版本，尝试通过官网下载驱动文件进行安装也失败了（这版本得是有多老啊）。

原因在于 ppa 源中没有包含 340 版本的驱动包，需要扩展

Copy
~$ add-apt-repository ppa:graphics-drivers/ppa
~$ apt-get update
~$ apt-get install nvidia-340

安装完成后重启依旧无法使用 nvidia-smi 命令查看到现有的显卡驱动。

Copy
~$ apt-get install nvidia-340
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成
nvidia-340 已经是最新版 (340.108-0ubuntu8)。
升级了 0 个软件包，新安装了 0 个软件包，要卸载 0 个软件包，有 2 个软件包未被升级。

但重新执行apt-get install nvidia-340 命令却提示已经安装，所以亮机卡的驱动应当是安装完成了的，从显示器也可以观察到分辨率已经自动调整，亮机显示问题已经解决。

在安装 P40 显卡之前，先要进入 bios 开启 Above4GDecoding 并且关闭 secure boot

再次关机，重新插上 P40 显卡后开机。

这次可以看到 pci 通道上可以显示 p40 显卡了。

Copy
~$ lspci | grep -i nvidia
25:00.0 VGA compatible controller: NVIDIA Corporation GT218 [GeForce 310] (rev a2)
25:00.1 Audio device: NVIDIA Corporation High Definition Audio Controller (rev a1)
26:00.0 3D controller: NVIDIA Corporation GP102GL [Tesla P40] (rev a1)

由于更新了 ppa 源，接下来打驱动就简单多了

Copy
~$ ubuntu-drivers autoinstall

安装完成后再次重启，执行命令可以看到显卡信息了

Copy
~$ nvidia-smi
Wed Oct 25 16:55:35 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.23.06 Driver Version: 545.23.06 CUDA Version: 12.3 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 Tesla P40 Off | 00000000:26:00.0 Off | Off |
| N/A 41C P8 12W / 250W | 0MiB / 24576MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| No running processes found |
+---------------------------------------------------------------------------------------+

此时可以看到 p40 显卡右侧有个 off，这对应的是 Persistence-M 模式，该模式默认关闭，persistence mode 开启后能够让 GPU 更快响应任务，但待机功耗会增加。

想要显卡能快速响应计算则应当开启

Copy
~$ nvidia-smi -pm 1
Enabled persistence mode for GPU 00000000:26:00.0.
All done.
~$ nvidia-smi
Wed Oct 25 16:55:35 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.23.06 Driver Version: 545.23.06 CUDA Version: 12.3 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 Tesla P40 On | 00000000:26:00.0 Off | Off |
| N/A 41C P8 12W / 250W | 0MiB / 24576MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| No running processes found |
+---------------------------------------------------------------------------------------+

在上方还有个 CUDA Version，这里显示的是本机可安装的 CUDA 版本，并不是说已经安装好了，要确定有没有安装只需要到 /usr/local 目录下查看有没有 cuda 相关的文件即可，没有就表示没装

安装 cuda

Copy
~$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
~$ dpkg -i cuda-keyring_1.1-1_all.deb
~$ apt-get update
~$ apt-get -y install cuda

当安装完成后，可以看到类似的提示

Copy
*****************************************************************************
*** Reboot your computer and verify that the NVIDIA graphics driver can ***
*** be loaded. ***
*****************************************************************************

~$ cd /usr/local
~$ ls
bin cuda cuda-12 cuda-12.3 etc games include lib man sbin share src

意味着此时重启可以应用 cuda, 并且切换到 /usr/local 墓库可以看到 cuda 的目录

不急，重启前先做好相关配置

Copy
~$ vim ~/.bashrc
#添加下述内容，注意版本号
export PATH=/usr/local/cuda-12.3/bin${PATH:+:${PATH}}

完成后重启

前面说到 GF310 这张显卡无法在 nvidia-smi 中无法显示的问题，疑似因版本过旧和现有的 nvidia-smi 不兼容导致无法识别，但能亮机。

由于无法显示是否正常驱动，/dev 目录下也没有相关的硬件信息，因此依旧存在一点问题，考虑下一步更换 gtx750ti 或者外接显卡坞的形式用较新的可以备 nvidia-smi 识别的显卡做为亮机卡

这是后话了

部署 stable-deffusion

Copy
git clone https://github.com/AbdBarho/stable-diffusion-webui-docker.git
cd stable-diffusion-webui-docker
# 安装docker显卡依赖
apt install nvidia-docker2 nvidia-container-toolkit nvidia-container-runtime
# 安装依赖套件，会自动下载Stable Diffusion v1.5的模型。
docker compose --profile download up --build
# 启动容器，选取auto代表启动AUTOMATIC1111开发的WebUI
docker compose --profile auto up --build

启动完成后通过http://ip:7860 可以访问 SD 的 web 页面，默认只有 Stable Diffusion v1.5 模型

尝试绘图

提示词（网上套来的）：

beautiful render of a Tudor style house near the water at sunset, fantasy forest. photorealistic, cinematic composition, cinematic high detail, ultra realistic, cinematic lighting, Depth of Field, hyper-detailed, beautifully color-coded, 8k, many details, chiaroscuro lighting, ++dreamlike, vignette

实测生成图片约需要 3-5 秒。可见这张显卡还是好用的

在图片生成过程中可以观察到显卡的变化

Copy
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.23.06 Driver Version: 545.23.06 CUDA Version: 12.3 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 Tesla P40 On | 00000000:26:00.0 Off | Off |
| N/A 50C P0 54W / 250W | 210MiB / 24576MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 32634 C python 208MiB |
+---------------------------------------------------------------------------------------+

可以说是轻轻松松（参数啥的都没改，当然轻松）

参考资料

[1] Tesla P40 技术规格

[2] Tesla P40 发布资料

[3] Tesla P40 与 GTX 1080TI 对比

[4] Ubunut 操作系统打驱动正确步骤

[5] NVIDIA CUDA 列表

[6] docker 部署 stable deffusion