我想将最小的cuda运行时文件安装到alpine linux中,并使用cuda创建一个比nvidia自己提供的小得多的docker库。 nvidia的官方版像往常一样巨大。
如何在docker build期间不提取整个cuda 8工具包的情况下获取这些运行时文件?
答案 0 :(得分:1)
我无法确定可能还需要哪些其他文件。但是,Nvidia驱动程序是使用glibc
编译的,而alpine使用musl
来保持其较小的占用空间。您可能需要nvidia驱动程序的source code,以便可以使用musl
或实现glibc
的高山基础映像(例如this one)对其进行重新编译。我还没有尝试使用它,但是我能够在高山3.8容器上用libcudacore
和musl
成功编译gcc/make
。我还不能编译整个Nvidia / Cuda工具包。当我有更多时间时,我将尝试进行更多测试。
答案 1 :(得分:1)
现实是Alpine Linux Musl或它的libc端口不以任何方式支持Nvidia / CUDA,即使您在炼金术士的事业上取得了成功,您仍然会得到一个不稳定的印象。
Nvidia驱动程序和CUDA工具包是非常复杂的系统,老实说,我看不出自己为不支持的系统库或libc的不支持端口进行编译的意义,即使在编译的情况下,所有意外事件都可能发生。使用Debian的苗条映像或Ubuntu最小版,并手动安装官方支持的文件,因为这是您可以下载的最小文件。甚至更好地使用“巨大”的Nvidia DockerHub映像(基于Ubuntu LTS)。
无论如何,除了这个问题之外,Nvidia DockerHub是最好的选择,它们得到了CUDA Toolkit本身的创建者的支持,而且他们没有任何头脑。如果您想挑剔,请访问其Gitlab的docker仓库,您可以轻松快捷地手动构建Debian / Ubuntu。
是的,它们的Nvidia DockerHub映像是1-2 gig的大映像,但是通常您只需要下载一次即可,因为使用映像作为基础,如果您将代码添加到其中,则仅添加正常情况下的代码层小到几十个Mbi要经常拉/推,不是整个图像,所以说实话,我看不出人们如此关注图像大小的原因,毫无疑问,小是更好在一定程度上,将宝贵的时间花在实际需求上要好得多。
答案 2 :(得分:0)
某人对高山c的解决方案:
<div class="wrapper">
<div class="bed">
<img src="https://image.shutterstock.com/image-vector/default-ui-image-placeholder-wireframes-260nw-1037719192.jpg" alt="">
</div>
<div class="pillow">
<img src="https://image.shutterstock.com/image-vector/default-ui-image-placeholder-wireframes-260nw-1037719192.jpg" alt="">
</div>
<div class="kitchen">
<img src="https://image.shutterstock.com/image-vector/default-ui-image-placeholder-wireframes-260nw-1037719192.jpg" alt="">
</div>
<div class="living-room">
<img src="https://image.shutterstock.com/image-vector/default-ui-image-placeholder-wireframes-260nw-1037719192.jpg" alt="">
</div>
<div class="sofa">
<img src="https://image.shutterstock.com/image-vector/default-ui-image-placeholder-wireframes-260nw-1037719192.jpg" alt="">
</div>
</div>
答案 3 :(得分:0)
请定义“进入 Alpine Linux”的实际含义。
无论您是直接在主机上运行工作负载还是在容器或 chroot 中运行工作负载 - 您都需要在 上安装整个 NVidia 驱动程序堆栈(包括 Cuda 库、内核驱动程序等)主持人。
另外,内核和用户态驱动程序是同一产品的两个方面,两者必须具有相同的版本。
这意味着:无论主机操作系统实际上是什么,它都必须是 NVidia 直接支持的操作系统之一。您必须完全使用 Nvidia 为其构建专有/二进制驱动程序的内核版本(和配置)。
使用不同的内核版本或使用不同的配置重新编译它可能工作,但它危险。即使有官方支持的发行版,它仍然是赌博,取决于月相或一些中国米袋是否掉了下来。它通常有效,但当它不再有效时,您很可能不走运。
现在,当您将工作负载放入某个单独的操作系统映像中时,例如chroot 或容器,您还必须在该映像中具有 相同 驱动程序包版本。使用容器或 chroot 的主要原因之一 - 将应用程序与主机操作系统隔离和解耦(因此您不再需要安装它们并独立进行升级,甚至具有独立于主机操作系统的容器映像) - 现在立即无效。主机和工作负载需要完全匹配。
简而言之:如果您想要一个 CUDA 工作负载,主机操作系统和工作负载映像(容器、chroot 等)都需要得到支持,而且它们都需要安装相同的驱动程序版本。其他的都只是俄罗斯轮盘赌。
既然有人提到了“nvidia-docker”。这打破了 docker 最初的目的的安全隔离。 (只需查看源代码,它实际上可以在 Github 某处找到)。
它只不过是一个更好的 chroot。而且,主机和 docker 镜像需要安装 相同 驱动程序堆栈版本。
最后,我想问一个问题,您的实际用例是什么。
请注意:这对于在完全不重要的家用电脑上玩游戏来说可能没问题,但真的不适合任何专业人士,稳定性和安全性很重要。如果您受某些数据安全/隐私法规(如 GDPO)的约束,请远离此 - 您只是无法通过这些专有驱动程序遵守这些法规。法律上危险。
--mtx
附录:为什么专有内核驱动程序不能可靠地工作? 明确回答:Linux 内核从来没有为此设计过,只是不支持。
更长的答案:内核模块不是外部程序,它们在某些隔离的环境中执行(例如使用用户态程序完成) - 它们(根据定义)是恰好在需要时延迟加载的内核。 (它们甚至不像共享库/DLL)。
这意味着它们必须适合 - 在二进制级别 - 完全适合您正在运行的内核的实际构建。编译内核时,有很多配置选项会以微妙的方式影响实际的内部二进制布局,
例如启用/禁用某些功能可以更改某些数据结构的布局,特定于 CPU 的优化可以更改数据结构、调用约定、锁定机制等等。
而且这些东西也会从内核版本更改为另一个版本。我们是例如进行大量内部重构(例如在数据结构、宏和内联函数中),然后同一段源代码生成截然不同的二进制代码。
因此,任何内核模块总是需要为特定的内核映像完全编译(使用相同的配置选项,针对相同的包含,使用相同的编译器标志),否则你可能会面临可怕的失败,这可能会导致锁定、安全漏洞、数据损坏甚至数据完全丢失。
您已收到警告。
答案 4 :(得分:-2)
基本上,下载并安装最新的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。