我试着用Docker测试pip install个JAX,我发现使用它只会放大Docker图像的大小.目前镜像大小为4.82 GB.

我确保在安装包时通过--no-cache-dir次绕过缓存.虽然这确实缩小了规模,但规模仍然是不合理的巨大.

这是我的文件档案-

FROM ubuntu:22.04

WORKDIR /app

RUN apt-get update && apt-get install -y \
    libosmesa6-dev \
    sudo \
    wget \
    curl \
    unzip \
    gcc \
    g++

ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"

RUN mkdir -p ~/miniconda3
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
RUN bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
RUN rm -rf ~/miniconda3/miniconda.sh
RUN ~/miniconda3/bin/conda init bash
RUN conda init

RUN pip install --no-cache-dir --upgrade "jax[cuda12_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html

我就是这样建造的-

docker build -t tbd_jax .

当我开到docker images英里的时候,我得到了这个-

REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
tbd_jax      latest    812292e2264e   7 minutes ago    4.82GB

在做了docker history --no-trunc tbd_jax:latest次之后-

SIZE      COMMENT
sha256:812292e2264e4340b7715956824055d7409f9546f8dfa54ccad1da056febf300   8 minutes ago    RUN |1 PATH=/root/miniconda3/bin:/root/miniconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin /bin/sh -c pip install --no-cache-dir --upgrade "jax[cuda12_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html # buildkit   3.54GB    buildkit.dockerfile.v0

我能做些什么来缩小尺寸吗?我对Docker和Linux是个新手,所以请原谅我的迟钝.

推荐答案

请注意,jax[cuda12_pip]安装所有列出的cuda驱动程序here:

'cuda12_pip': [
  ...
  "nvidia-cublas-cu12>=12.2.5.6",
  "nvidia-cuda-cupti-cu12>=12.2.142",
  "nvidia-cuda-nvcc-cu12>=12.2.140",
  "nvidia-cuda-runtime-cu12>=12.2.140",
  "nvidia-cudnn-cu12>=8.9",
  "nvidia-cufft-cu12>=11.0.8.103",
  "nvidia-cusolver-cu12>=11.5.2",
  "nvidia-cusparse-cu12>=12.1.2.141",
  "nvidia-nccl-cu12>=2.18.3",

这些nvidia驱动程序包非常大:例如nvidia_cublas_cu12 wheel超过400MB,nvidia-cudnn-cu12超过700MB.您可以通过使用系统原生CUDA CUDNN驱动程序(通过apt安装)设置Docker映像来做得更好.你可以找到一个描述的要求here.您还可以使用NVIDIA的预定义GPU容器,如前所述here.

Linux相关问答推荐

pci_user_write_config_word在哪里实现?

如何在 gcc 搜索路径上防止多个版本的 Boost?

从 curl 命令输出中获取值

使用 sed linux 命令和 i sed 命令进行 preprend 时的反向引用

使用 awk 将多行文本转换为 CSV

如何使用 shell 脚本将文本文件转换为 JSON 文件

如何在Linux中将文件的特定行号中的数字乘以2(双)?

从 Ansible 中的 shell 命令输出中提取特定数据

如何找出哪个进程正在消耗等待 CPU(即 I/O 阻塞)

Bash 变量:是否区分大小写?

通过写入 /dev/input/mice 来控制鼠标

当命令太长时,命令行会自动覆盖

Vagrant chicken-and-egg:与 uid = apache 用户共享文件夹

在 C 中检测 64 位编译

打印当前一周的星期一的日期(在 bash 中)

如何在 Bash 中对齐空格分隔表的列?

发出信号并中断比较

从核心转储中获取堆栈跟踪

如何在 Linux 中查看日志(log)文件并在查看时应用自定义过滤器?

Linux shell 中的排序和唯一性