我想将最小的cuda运行时文件安装到alpine linux中,并使用cuda创建一个比nvidia自己提供的要小得多的docker基础。 英伟达官方的像往常一样巨大。
如何在 docker 构建期间不拉取整个 cuda 8 工具包的情况下获取这些运行时文件?
我不能说可能需要哪些其他文件。然而,英伟达的驱动程序是用glibc
编译的,而阿尔派使用musl
来保持其较小的占用空间。您可能需要 nvidia 驱动程序的源代码,以便您可以使用musl
或实现glibc
的 alpine 基础映像重新编译它,例如这个。我还没有尝试使用它,但我能够成功地使用musl
编译libcudacore
并在 alpine 3.8 容器上gcc/make
。我还没有能够编译整个Nvidia/Cuda工具包。当我有更多的时间时,我会尝试对此进行更多测试。
现实情况是,Alpine Linux Musl 或其 libc 端口不支持 Nvidia/CUDA,即使您在炼金术士冒险中取得成功,您最终也会得到一个片状的图像。
Nvidia 驱动程序和 CUDA 工具包是非常复杂的系统,老实说,我看不出自己为不受支持的系统库或不支持的 libc 端口编译它有什么意义,即使在编译的情况下也会发生所有意外。使用 Debian 的纤薄映像或 Ubuntu 最小值并手动安装官方支持的文件,因为这是您可以使用的最小文件。或者更好地使用"巨大的"Nvidia DockerHub映像(基于ubuntu LTS)。
无论如何,除了这个问题之外,Nvidia DockerHub是最好的选择,它们得到了CUDA Toolkit本身的创建者的支持,而且它们不是大脑。如果你想挑剔,去他们的Gitlab的dockers仓库,你可以非常容易和快速地手动构建Debian/Ubuntu。
是的,它们 Nvidia DockerHub 映像是 1-2 GB 的大,但通常您只需下载一次,因为您使用映像作为基础,如果您将代码添加到其中,则只会重复拉取/推送那些通常小到数十 Mbi 的代码层,而不是整个映像, 所以老实说,我看不出人们如此关心图像尺寸的原因,毫无疑问,小更好,但在某种程度上,将宝贵的时间花在实际需求上要好得多。
某人对高山库达的解决方案:
https://arto.s3.amazonaws.com/notes/cuda
Drivers
https://developer.nvidia.com/vulkan-driver
$ lsmod | fgrep nvidia
$ nvidia-smi
Driver Installation
https://us.download.nvidia.com/XFree86/Linux-x86_64/390.77/README/
https://github.com/NVIDIA/nvidia-installer
Driver Installation on Alpine Linux
https://github.com/sgerrand/alpine-pkg-glibc
https://github.com/sgerrand/alpine-pkg-glibc/releases
https://wiki.alpinelinux.org/wiki/Running_glibc_programs
$ apk add sudo bash ca-certificates wget xz make gcc linux-headers
$ wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub
$ wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.27-r0/glibc-2.27-r0.apk
$ wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.27-r0/glibc-bin-2.27-r0.apk
$ wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.27-r0/glibc-dev-2.27-r0.apk
$ wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.27-r0/glibc-i18n-2.27-r0.apk
$ apk add glibc-2.27-r0.apk glibc-bin-2.27-r0.apk glibc-dev-2.27-r0.apk glibc-i18n-2.27-r0.apk
$ /usr/glibc-compat/bin/localedef -i en_US -f UTF-8 en_US.UTF-8
$ bash NVIDIA-Linux-x86_64-390.77.run --check
$ bash NVIDIA-Linux-x86_64-390.77.run --extract-only
$ cd NVIDIA-Linux-x86_64-390.77 && ./nvidia-installer
Driver Uninstallation
$ nvidia-uninstall
Driver Troubleshooting
Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 390.77NVIDIA-Linux-x86_64-390.77.run: line 998: /tmp/makeself.XXX/xz: No such file or directorynExtraction failed.
$ apk add xz # Alpine Linux
bash: ./nvidia-installer: No such file or directory
Install the glibc compatibility layer package for Alpine Linux.
ERROR: You do not appear to have libc header files installed on your system. Please install your distribution's libc development package.
$ apk add musl-dev # Alpine Linux
ERROR: Unable to find the kernel source tree for the currently running kernel. Please make sure you have installed the kernel source files for your kernel and that they are properly configured
$ apk add linux-vanilla-dev # Alpine Linux
ERROR: Failed to execute `/sbin/ldconfig`: The installer has encountered the following error during installation: 'Failed to execute `/sbin/ldconfig`'. Would you like to continue installation anyway?
Continue installation.
Toolkit
https://developer.nvidia.com/cuda-toolkit
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/
Toolkit Download
https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604&target_type=runfilelocal
$ wget -c https://developer.nvidia.com/compute/cuda/9.2/Prod2/local_installers/cuda_9.2.148_396.37_linux
Toolkit Installation
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/
Toolkit Installation on Alpine Linux
$ apk add sudo bash
$ sudo bash cuda_9.2.148_396.37_linux
# You are attempting to install on an unsupported configuration. Do you wish to continue? y
# Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 396.37? y
# Do you want to install the OpenGL libraries? y
# Do you want to run nvidia-xconfig? n
# Install the CUDA 9.2 Toolkit? y
# Enter Toolkit Location: /opt/cuda-9.2
# Do you want to install a symbolic link at /usr/local/cuda? y
# Install the CUDA 9.2 Samples? y
# Enter CUDA Samples Location: /opt/cuda-9.2/samples
$ sudo ln -s cuda-9.2 /opt/cuda
$ export PATH="/opt/cuda/bin:$PATH"
Toolkit Uninstallation
$ sudo /opt/cuda-9.2/bin/uninstall_cuda_9.2.pl
Toolkit Troubleshooting
Cannot find termcap: Can't find a valid termcap file at /usr/share/perl5/core_perl/Term/ReadLine.pm line 377.
$ export PERL_RL="Perl o=0"
gcc: error trying to exec 'cc1plus': execvp: No such file or directory
$ apk add g++ # Alpine Linux
cicc: Relink `/usr/lib/libgcc_s.so.1' with `/usr/glibc-compat/lib/libc.so.6' for IFUNC symbol `memset'
https://github.com/sgerrand/alpine-pkg-glibc/issues/58
$ scp /lib/x86_64-linux-gnu/libgcc_s.so.1 root@alpine:/usr/glibc-compat/lib/libgcc_s.so.1
$ sudo /usr/glibc-compat/sbin/ldconfig /usr/glibc-compat/lib /lib /usr/lib
Compiler
https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/
$ nvcc -V
请定义"进入Alpine Linux"的实际含义。
无论是直接在主机上还是在容器或 chroot 中运行工作负载,都需要在主机上安装整个 NVidia 驱动程序堆栈(包括 Cuda 库、内核驱动程序等)。此外,内核和用户空间驱动程序是同一产品的两面,两者都必须具有相同的版本。
这意味着:无论主机操作系统实际是什么,它都必须是NVidia直接支持的操作系统之一。您必须完全使用 Nvidia 为其专有/仅二进制驱动程序构建的内核版本(和配置)。使用不同的内核版本或使用不同的配置重新编译它可能有效,但这很危险。即使完全有官方支持的发行版,它仍然是赌博,取决于月相或是否有一些中国米袋掉下来。它通常有效,但当它不再有效时,您很可能不走运。
现在,当您将工作负载放入某个单独的操作系统映像(例如 chroot 或容器)时,您还必须在该映像中具有相同的驱动程序包版本。使用容器或chroots 的主要原因之一 - 将应用程序与主机操作系统隔离和解耦(因此您不再需要将它们放入并独立进行升级,甚至具有独立于主机操作系统的容器映像) - 现在立即失效。主机和工作负载需要完全配合在一起。
简而言之:如果您想拥有 CUDA 工作负载,主机操作系统和工作负载映像(容器、chroot 等)都需要得到支持,并且它们都需要安装相同的驱动程序版本。其他任何东西都只是俄罗斯轮盘赌。
因为有人提到了"nvidia-docker"。这打破了 docker 最初用于的安全隔离。(只需查看源代码,它实际上可以在 GitHub 上的某个地方找到)。这只不过是一个更好的chroot。尽管如此,主机和 docker 映像仍需要安装相同的驱动程序堆栈版本。
最后,我想问一个问题,你的实际用例是什么。
请注意:这一切都可能适合在完全不重要的家用计算机上玩游戏,但实际上不适合任何专业的东西,稳定性和安全性很重要。如果您受某些数据安全/隐私法规(如GDPO)的约束,请远离此 - 您只是无法使用这些专有驱动程序遵守这些法规。在法律上是危险的。
--MTX
附录:为什么专有内核驱动程序永远无法可靠地工作? 明确回答:Linux 内核从来没有为此而生过,只是不支持。
更长的答案:内核模块不是外部程序,它们在某些隔离的环境中执行(例如,使用用户空间程序完成)——它们是(根据定义)内核的组成部分,恰好在需要时延迟加载。(它们甚至不像共享库/DLL)。这意味着它们必须在二进制级别上完全适合您正在运行的内核的实际构建。在编译内核时,有许多配置选项以微妙的方式影响实际的内部二进制布局,例如启用/禁用某些功能可以更改某些数据结构的布局,特定于 CPU 的优化可以更改数据结构、调用约定、锁定机制等等。 这些东西也会从内核版本更改为另一个内核版本。例如,我们正在进行大量内部重构(例如在数据结构、宏和内联函数中),之后相同的源代码会生成非常不同的二进制代码。
因此,任何内核模块始终需要针对特定的内核映像进行精确编译(使用相同的配置选项,针对相同的包含,使用相同的编译器标志),否则您将面临可能导致锁定、安全漏洞、数据损坏甚至完全数据丢失的可怕故障。
你已经被警告了。
澄清一下,这只是驱动程序。不是库达。那是另一回事了。
事实上,这比预期的要容易得多。 我只是不太明白 nvidia-docker 项目已经走了多远以及它是如何工作的。
基本上,下载并安装最新的nvidia-docker。来自 nvidia-docker 项目。
https://github.com/NVIDIA/nvidia-docker/releases
然后创建一个 alpine linux Dockerfile。
FROM alpine:3.5
LABEL com.nvidia.volumes.needed="nvidia_driver"
ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64
RUN /bin/sh
构建它。
docker build -t alpine-nvidia
跑
nvidia-docker run -ti --rm alpine-nvidia
请注意,使用 nvidia-docker cli 而不是普通的 docker cli。
nvidia-docker
使用额外的参数调用 docker cli。