如何在Alpine linux中安装最小的cuda驱动程序文件

时间:2017-06-22 00:25:40

标签: docker cuda alpine

我想将最小的cuda运行时文件安装到alpine linux中,并使用cuda创建一个比nvidia自己提供的小得多的docker库。 nvidia的官方版像往常一样巨大。

如何在docker build期间不提取整个cuda 8工具包的情况下获取这些运行时文件?

5 个答案:

答案 0 :(得分:1)

我无法确定可能还需要哪些其他文件。但是,Nvidia驱动程序是使用glibc编译的,而alpine使用musl来保持其较小的占用空间。您可能需要nvidia驱动程序的source code,以便可以使用musl或实现glibc的高山基础映像(例如this one)对其进行重新编译。我还没有尝试使用它,但是我能够在高山3.8容器上用libcudacoremusl成功编译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的解决方案:

CSS Tricks

<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。来自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。