Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 这是减小docker图像大小的正确方法吗?_Python_Docker_Pytorch - Fatal编程技术网

Python 这是减小docker图像大小的正确方法吗?

Python 这是减小docker图像大小的正确方法吗?,python,docker,pytorch,Python,Docker,Pytorch,我正在Docker容器中运行一个深度学习模型,它需要pytorch和Azure ML服务 AML的要求是Ubuntu18.04(默认情况下只有python3.6,安装python3.7+的唯一方法是从我能找到的源代码) pytorch中的变压器需要python 3.7+ 我需要Cuda的Pytork,所以我选择了abinali/Pytork 问题是图像的大小约为4GB+。所以我想将PyTorch安装移出映像,并在docker运行容器时运行install(这会增加容器运行的正常时间)。 运行基本t

我正在Docker容器中运行一个深度学习模型,它需要pytorch和Azure ML服务

AML的要求是Ubuntu18.04(默认情况下只有python3.6,安装python3.7+的唯一方法是从我能找到的源代码) pytorch中的变压器需要python 3.7+ 我需要Cuda的Pytork,所以我选择了
abinali/Pytork

问题是图像的大小约为4GB+。所以我想将PyTorch安装移出映像,并在docker运行容器时运行install(这会增加容器运行的正常时间)。 运行基本torch命令时出错

File "test.py", line 1, in <module>
    import torch
  File "/home/user/miniconda/lib/python3.8/site-packages/torch/__init__.py", line 135, in <module>
    _load_global_deps()
  File "/home/user/miniconda/lib/python3.8/site-packages/torch/__init__.py", line 93, in _load_global_deps
    ctypes.CDLL(lib_path, mode=ctypes.RTLD_GLOBAL)
  File "/home/user/miniconda/lib/python3.8/ctypes/__init__.py", line 373, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /home/user/miniconda/lib/python3.8/site-packages/torch/lib/../../../../libnvToolsExt.so.1: invalid ELF header

可能python slim base image是不可能的,因为您需要cuda,但我认为您可以尝试多级构建

您可以在第一个基本映像中安装所有依赖项,然后将它们(可能在
/usr/local/lib/python/site packages/
/usr/local/bin/
中的某个地方)复制到第二个映像(您的发行版映像)中


这是一个关于多级建筑的例子。希望对您有所帮助。

可能python slim base image是不可能的,因为您需要cuda,但我认为您可以尝试多级构建

您可以在第一个基本映像中安装所有依赖项,然后将它们(可能在
/usr/local/lib/python/site packages/
/usr/local/bin/
中的某个地方)复制到第二个映像(您的发行版映像)中


这是一个关于多级建筑的例子。希望对您有所帮助。

通过
CMD
安装运行时依赖项并不是减少Docker映像大小的典型方法。正如OP所指出的,这会增加容器启动的成本

可以对Dockerfile进行一些更改以减小图像大小

  • 使用已安装miniconda但未安装cuda/cudnn的基本映像。OP通过conda安装pytorch、cuda和cudnn,因此映像中会有cudnn和cuda的重复安装(一个来自nvidia/cuda基本映像,另一个来自conda)。有关Azure ML提供的公共可用基本映像的列表,请参阅
  • apt get install
    命令中使用
    --无安装建议
    。这将阻止
    apt get
    安装推荐的依赖项,这些依赖项不是软件包使用所必需的
  • 使用
    COPY
    中的
    --chown
    选项在
    复制过程中更改复制文件的所有权。在
    复制后使用
    运行chown…
    将导致
    /app
    的大小在Docker图像的总大小中计数两次
  • 下面是一个Dockerfile,它实现了我的建议。这将创建一个3.43 GB的Docker映像

    FROM continuumio/miniconda3
    
    RUN apt-get update \
        && apt-get install -y --no-install-recommends \
            curl \
            ca-certificates \
            sudo \
            git \
            bzip2 \
            libx11-6 \
        && rm -rf /var/lib/apt/lists/*
    
    # Create a non-root user
    RUN adduser --disabled-password --gecos '' --shell /bin/bash user \
        && echo "user ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/90-user
    
    # All users can use /home/user as their home directory
    ENV HOME=/home/user
    RUN chmod 777 /home/user
    
    # Install pytorch.
    ENV CONDA_AUTO_UPDATE_CONDA="false"
    RUN conda install --yes python=3.8 \
        && conda install --yes --channel pytorch \
            cudatoolkit=10.2 \
            pytorch=1.5.0=py3.8_cuda10.2.89_cudnn7.6.5_0 \
            torchvision=0.6.0=py38_cu102 \
        && conda clean --all --yes
    
    USER user
    WORKDIR /app
    COPY --chown=user:user . .
    
    CMD ["python", "test.py"]
    

    通过
    CMD
    安装运行时依赖项不是减少Docker映像大小的典型方法。正如OP所指出的,这会增加容器启动的成本

    可以对Dockerfile进行一些更改以减小图像大小

  • 使用已安装miniconda但未安装cuda/cudnn的基本映像。OP通过conda安装pytorch、cuda和cudnn,因此映像中会有cudnn和cuda的重复安装(一个来自nvidia/cuda基本映像,另一个来自conda)。有关Azure ML提供的公共可用基本映像的列表,请参阅
  • apt get install
    命令中使用
    --无安装建议
    。这将阻止
    apt get
    安装推荐的依赖项,这些依赖项不是软件包使用所必需的
  • 使用
    COPY
    中的
    --chown
    选项在
    复制过程中更改复制文件的所有权。在
    复制后使用
    运行chown…
    将导致
    /app
    的大小在Docker图像的总大小中计数两次
  • 下面是一个Dockerfile,它实现了我的建议。这将创建一个3.43 GB的Docker映像

    FROM continuumio/miniconda3
    
    RUN apt-get update \
        && apt-get install -y --no-install-recommends \
            curl \
            ca-certificates \
            sudo \
            git \
            bzip2 \
            libx11-6 \
        && rm -rf /var/lib/apt/lists/*
    
    # Create a non-root user
    RUN adduser --disabled-password --gecos '' --shell /bin/bash user \
        && echo "user ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/90-user
    
    # All users can use /home/user as their home directory
    ENV HOME=/home/user
    RUN chmod 777 /home/user
    
    # Install pytorch.
    ENV CONDA_AUTO_UPDATE_CONDA="false"
    RUN conda install --yes python=3.8 \
        && conda install --yes --channel pytorch \
            cudatoolkit=10.2 \
            pytorch=1.5.0=py3.8_cuda10.2.89_cudnn7.6.5_0 \
            torchvision=0.6.0=py38_cu102 \
        && conda clean --all --yes
    
    USER user
    WORKDIR /app
    COPY --chown=user:user . .
    
    CMD ["python", "test.py"]
    

    如果您使用miniconda,我认为您可以省略使用
    nvidia/cuda
    基本映像,因为miniconda将自行安装cuda/cudnn。如果您使用miniconda,我认为您可以省略使用
    nvidia/cuda
    基本映像,因为miniconda将自行安装cuda/cudnn。谢谢。但是,这个基本映像在Debian上运行。AML(azure ML服务)python SDK不能在Debian上运行,它需要ubuntu。我从来没有使用过AML,但没有提到需要ubuntu。SDK可以与pip install azureml SDK一起安装,谢谢。但是,这个基本映像在Debian上运行。AML(azure ML服务)python SDK不能在Debian上运行,它需要ubuntu。我从来没有使用过AML,但没有提到需要ubuntu。SDK可以与pip install azureml SDK一起安装