Hugging Face transformers库依赖的CUDA是什么?如何安装?

最近由于工作的原因,需要去尝试部署海外大厂的开源LLM模型,进行一些测试验证。逐步呢就会接触到AI生态中的一些概念。

Hugging Face的transformers库提供了使用PyTorch实现的预训练NLP模型,这些模型通过CUDA支持在GPU上进行训练和推理。

因此对于私有化部署而言,最核心的就是把GPU的驱动及CUDA都安装好,那么CUDA是什么?如何完成安装?

什么是CUDA?

CUDA是一种Nvidia推出的并行计算平台和编程模型,可利用GPU的强大处理能力进行加速计算。

它主要有以下的几个特点:

  • 加速学习训练:在深度学习中,数据对于训练非常重要。训练深度学习模型需要大量的数据,并且需要使用大量的计算资源处理这些数据。然而,大型数据集往往需要在多台计算机上同时处理。在这种情况下,CUDA可以使用支持多GPU的计算机,在不同的GPU之间拆分训练数据并行处理,以加速模型的训练过程。

  • 加速模型部署:在实际应用中,需要将训练好的深度学习模型部署到实际系统中。为了保证模型在这些设备上能够运行,需要将模型进行优化和压缩。CUDA提供了一些工具,例如TensorRT,可以对深度学习模型进行优化和压缩,从而加速模型的部署过程。

  • 并行计算能力: GPU是一种高度并行的硬件,适用于处理许多相似的计算任务。CUDA允许开发人员利用GPU的并行计算能力来显著加速计算任务,从而提高性能。

  • 科学计算和数据处理: CUDA广泛应用于科学计算领域,例如物理模拟、天文学、生物信息学等。它还用于大规模数据处理和分析,如图像处理和数据挖掘。

  • 机器学习和深度学习: GPU在机器学习和深度学习中的应用越来越重要。许多深度学习框架(如TensorFlow、PyTorch)都支持CUDA,使模型训练和推理变得更加高效。
    总之,CUDA是一种强大的并行计算平台,使开发人员能够充分利用GPU的计算能力来加速各种计算任务,从而在多个领域提高性能和效率。

官方对于CUDA的解释:

  • CUDA® is a parallel computing platform and programming model invented by NVIDIA®. It enables dramatic increases in computing performance by harnessing the power of the graphics processing unit (GPU).

  • CUDA was developed with several design goals in mind:

  1. Provide a small set of extensions to standard programming languages, like C, that enable a straightforward implementation of parallel algorithms. With CUDA C/C++, programmers can focus on the task of parallelization of the algorithms rather than spending time on their implementation.

  2. Support heterogeneous computation where applications use both the CPU and GPU. Serial portions of applications are run on the CPU, and parallel portions are offloaded to the GPU. As such, CUDA can be incrementally applied to existing applications. The CPU and GPU are treated as separate devices that have their own memory spaces. This configuration also allows simultaneous computation on the CPU and GPU without contention for memory resources.

CUDA的主要组件:

  1. CUDA编程模型: CUDA提供了一种基于C/C++编程语言的并行计算模型,通过编写CUDA核函数(CUDA Kernels),开发人员可以在GPU上执行并行计算任务。CUDA核函数可以从主机(CPU)代码中调用,并在GPU上并行执行。

  2. CUDA运行时API: CUDA运行时API允许开发人员在主机代码中控制GPU设备,分配内存,将数据传输到GPU,以及在GPU上启动并行任务。开发人员可以使用CUDA运行时API来编写并行代码。

  3. CUDA驱动API: CUDA驱动API提供更底层的访问方式,允许开发人员更精细地控制GPU硬件。这种API通常用于更高级的并行计算需求。

更加详尽的介绍,参看维基百科:https://zh.wikipedia.org/wiki/CUDA

如何安装CUDA?

安装文档:https://developer.nvidia.com/cuda-downloads

安装说明:https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#common-installation-instructions-for-ubuntu

你的GPU是否支持CUDA:https://developer.nvidia.com/cuda-gpus

下边以Ubuntu 22 举例:

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

查看历史版本:
apt-cache policy cuda
apt-cache policy nvidia-gds

安装最新版本:
apt-get -y install cuda
apt-get -y install nvidia-gds

安装指定版本:
apt-get install cuda=11.7.1-1
apt-get install nvidia-gds=11.7.1-1

注意默认的安装路径在/usr/local下,并且使用软连接进行程序的指定,可以使用如下的命令进行版本的切换:
ln -s /usr/local/cuda-11.7/ /usr/local/cuda

最后需要进行环境变量的调整,比如在~/.bashrc中加入:
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
如你使用的是其他shell,如zsh,则是在~/.zshrc下。

reboot

验证版本,主要是两条命令:
nvcc -V
nvidia-smi

nvidia-smi与nvcc -V列出的版本号可能存在不一致的情况,CUDA存在Runtime API与Driver API两种,即所谓的运行时API和驱动API。
nvidia-smi的结果除了有GPU驱动版本型号,还有CUDA Driver API的版本号,CUDADriver API是依赖于NVIDIA驱动安装的。
nvcc的结果是对应CUDA Runtime API。CUDA Runtime API 是通过CUDA toolkit安装的。

根据实际的验证,当你调整了/usr/local下的软链接之后,会对于nvcc -V的结果生效,也就是CUDA Runtime API。这个是模型实际执行时会调用的CUDA版本。

安装完成之后的截图: