使用 Base Command 构建 AI 卓越中心

步骤 #5:使用 Dockerfile 修改镜像

在检查 PyTorch 容器后,我们现在将创建一个修改后的基础镜像版本,其中包含自定义应用程序和脚本,这样我们就不需要在每次启动容器时手动安装它们。这涉及到创建一个 Dockerfile,它允许我们指定在构建新镜像时要调用的各种命令和设置。

要创建 Dockerfile,请使用文本编辑器在本地目录中打开一个名为“Dockerfile”的新文件(确保它使用大写字母“D”且没有扩展名)。有关 Dockerfile 语法和用法的更多信息,请参考 Docker 的官方文档

首先,我们需要指定将要使用的基础镜像。基础镜像为我们提供了一个自定义镜像的起点,我们可以在此基础上构建。由于我们将使用上一节中检查的 PyTorch 镜像作为我们的基础,因此我们的自定义镜像在第一步中看起来将与 PyTorch 镜像相同。要在 Dockerfile 中指定我们的基础镜像,我们将在第一行添加以下内容

复制
已复制!
            

FROM nvcr.io/nvidia/pytorch:22.03-py3

请注意,Docker 将首先尝试使用列出的镜像的本地版本(如果可用),然后尝试从指定的容器注册表中拉取镜像(如果不可用)。如果我们构建镜像时不对 Dockerfile 进行任何其他更改,则我们的镜像将与 NGC 中的 PyTorch 镜像相同,因为我们没有进行任何更改。

为了使自定义镜像更有用,让我们克隆一个存储库,我们可以使用它来运行一些令人兴奋的深度学习示例。我们将使用的存储库是在 NVIDIA 的 GitHub 上找到的 DeepLearningExamples 存储库。我们将使用此存储库在 GPU 上使用 PyTorch 运行示例图像分类应用程序。

Dockerfile 有一个“RUN”指令,它告诉 Docker 在文件中的该步骤运行时运行指示的命令。这允许我们在容器内运行步骤,这些步骤对于以后的指令或在容器内为用户安装软件包可能是必要的。例如,如果我们想安装 htop,类似于我们在上一节中检查容器时的情况,我们将在 Dockerfile 中编写以下内容。请注意,这些是为相同的“RUN”指令编写的。鉴于 Docker 每次提供命令时都会创建一个新的镜像层,我们希望减少 Dockerfile 中唯一 Docker 命令的总数,以保持我们的镜像体积小。

复制
已复制!
            

RUN apt update && \ apt install -y htop

就我们的目的而言,我们不需要 htop 软件包,可以跳过在 Dockerfile 中包含上面的行。相反,我们将希望使用 git(已安装在基础镜像中)在特定提交哈希处克隆 DeepLearningExamples 存储库。下面显示的提交哈希是通过导航到 https://github.com/nvidia/deeplearningexamples 并选择编写时最新的提交哈希找到的。考虑到镜像可以随时构建,并且参考代码和软件包可能随时更新,因此建议尽可能使用代码和应用程序的特定版本或标签,以避免将来出现意外的重大更改。

要在 Dockerfile 中克隆存储库,请在上面的“FROM”行后创建一个空行,然后在下一行添加以下命令

复制
已复制!
            

RUN git clone https://github.com/nvidia/deeplearningexamples && \ cd deeplearningexamples && \ git checkout f3dbf8a69522d69c63c4508769bd8137658786a1

您的 Dockerfile 现在应如下所示

复制
已复制!
            

FROM nvcr.io/nvidia/pytorch:22.03-py3 RUN git clone https://github.com/nvidia/deeplearningexamples && \ cd deeplearningexamples && \ git checkout f3dbf8a69522d69c63c4508769bd8137658786a1

另一个有用的指令是“WORKDIR”命令。这允许我们指定所有后续命令以及容器启动时的工作目录。请注意,WORKDIR 可以根据需要在 Dockerfile 中多次更新。最终列出的 WORKDIR 将是容器在启动时打开的目录。

我们将更新 WORKDIR 命令,以指定我们希望 DeepLearningExamples 存储库中的特定目录成为我们未来命令以及容器运行时的默认目录。在上一命令中的“git checkout”后放置另一个空行后,将以下内容添加到您的 Dockerfile

复制
已复制!
            

WORKDIR /workspace/deeplearningexamples/PyTorch/Classification/ConvNets

接下来,让我们安装运行示例所需的一些软件包。与我们之前运行容器时不同,我们在构建过程中安装的这些软件包将包含在我们的自定义镜像中,我们将无需在运行基于自定义镜像的容器时再次安装它们。

在 WORKDIR 指令后添加另一个空行,并创建另一个 RUN 指令以使用 Python 的软件包管理器 pip 安装应用程序的依赖项。

复制
已复制!
            

RUN pip install -r requirements.txt nvidia-imageinary==1.1.3

安装依赖项后,我们现在完成了我们的自定义 Dockerfile,它应如下所示

复制
已复制!
            

FROM nvcr.io/nvidia/pytorch:22.03-py3 RUN git clone https://github.com/nvidia/deeplearningexamples && \ cd deeplearningexamples && \ git checkout f3dbf8a69522d69c63c4508769bd8137658786a1 WORKDIR /workspace/deeplearningexamples/PyTorch/Classification/ConvNets RUN pip install -r requirements.txt nvidia-imageinary==1.1.3

现在我们的 Dockerfile 已完成,我们可以构建镜像,它将运行我们在文件中指定的步骤,并将镜像的副本保存到您的本地工作站。为此,运行以下命令,该命令将构建一个名为“nvcr.io/nv-launchpad-orgname/sample-image”的新镜像和标签“1.0”。完整的镜像名称在“-t”标志后指定,是第一个冒号之前的所有内容,标签是第一个冒号之后指定的所有内容。请注意,您的组织名称(在本例中为 nv-launchpad-orgname)可能不同,应更新以反映可从您的帐户访问的提供的组织名称。否则,您可以随意更改镜像名称(在本例中为“sample-image”)和标签(不要忘记命令末尾的“.”)。

复制
已复制!
            

$ docker build -t nvcr.io/nv-launchpad-orgname/sample-image:1.0 .

如果您使用了上面显示的相同 Dockerfile,这将生成类似于以下内容的文本

复制
已复制!
            

Sending build context to Docker daemon 2.048kB Step 1/4 : FROM nvcr.io/nvidia/pytorch:22.03-py3 ---> 4730bc516b92 Step 2/4 : RUN git clone https://github.com/nvidia/deeplearningexamples && cd deeplearningexamples && git checkout f3dbf8a69522d69c63c4508769bd8137658786a1 ---> Running in 326d5fb91a89 Cloning into 'deeplearningexamples'... Note: switching to 'f3dbf8a69522d69c63c4508769bd8137658786a1'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c <new-branch-name> Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at f3dbf8a6 [BERT/PyT] add JIT autocast Removing intermediate container 326d5fb91a89 ---> 08e1c8dd26f8 Step 3/4 : WORKDIR /workspace/deeplearningexamples/PyTorch/Classification/ConvNets ---> Running in 63a3c614dfb1 Removing intermediate container 63a3c614dfb1 ---> a0cc6bb5202e Step 4/4 : RUN pip install -r requirements.txt nvidia-imageinary==1.1.3 ---> Running in 801287fbc5df Looking in indexes: http://pypi.ac.cn/simple, https://pypi.ngc.nvidia.com Collecting dllogger Cloning https://github.com/NVIDIA/dllogger (to revision v1.0.0) to /tmp/pip-install-17k4pxj6/dllogger_ae526c1927be46a8b397f50ec3a3fe85 Running command git clone -q https://github.com/NVIDIA/dllogger /tmp/pip-install-17k4pxj6/dllogger_ae526c1927be46a8b397f50ec3a3fe85 Resolved https://github.com/NVIDIA/dllogger to commit 89913fd227b720a3026550b904cdca0d49d82100 Collecting nvidia-imageinary==1.1.3 Downloading https://developer.download.nvidia.com/compute/redist/nvidia-imageinary/nvidia_imageinary-1.1.3-py3-none-any.whl (13 kB) Collecting pynvml==11.0.0 Downloading pynvml-11.0.0-py3-none-any.whl (46 kB) Requirement already satisfied: Pillow>=7.1.2 in /opt/conda/lib/python3.8/site-packages (from nvidia-imageinary==1.1.3) (9.0.0) Requirement already satisfied: numpy>=1.18.0 in /opt/conda/lib/python3.8/site-packages (from nvidia-imageinary==1.1.3) (1.22.3) Building wheels for collected packages: dllogger Building wheel for dllogger (setup.py): started Building wheel for dllogger (setup.py): finished with status 'done' Created wheel for dllogger: filename=DLLogger-1.0.0-py3-none-any.whl size=5670 sha256=1f358bd0e559e49885ac67146957c1f343e24c400f5142fde7bcffef824dfaaa Stored in directory: /tmp/pip-ephem-wheel-cache-0h6p75zr/wheels/32/ff/4a/1d61bdc575b373a327658f1de2513a0af81094c50c9c56fa8b Successfully built dllogger Installing collected packages: pynvml, nvidia-imageinary, dllogger Attempting uninstall: pynvml Found existing installation: pynvml 11.4.1 Uninstalling pynvml-11.4.1: Successfully uninstalled pynvml-11.4.1 Successfully installed dllogger-1.0.0 nvidia-imageinary-1.1.3 pynvml-11.0.0 WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: http://pip.pythonlang.cn/warnings/venv Removing intermediate container 801287fbc5df ---> b98e9cad2b60 Successfully built b98e9cad2b60 Successfully tagged nvcr.io/nv-launchpad-orgname/sample-image:1.0

现在我们已经在本地构建了一个修改后的镜像,我们可以将其推送到 NGC,以便我们可以在其他机器上使用它并与团队成员协作。假设您已按照上述步骤在本地登录到 NGC,请运行此命令,根据需要更新镜像名称和标签

复制
已复制!
            

$ docker push nvcr.io/nv-launchpad-orgname/sample-image:1.0

在推送镜像时,您将看到类似于以下内容的输出

复制
已复制!
            

The push refers to repository [nvcr.io/nv-launchpad-orgname/sample-image] c170ca729e6b: Pushed 62f753b7286f: Pushed 9c7a2e08fe4c: Mounted from nvidia/pytorch fe48bfeac91d: Mounted from nvidia/pytorch 6d24369f9726: Mounted from nvidia/pytorch 0f010943c2be: Mounted from nvidia/pytorch 80df8233699e: Mounted from nvidia/pytorch 4995463ed504: Mounted from nvidia/pytorch c68289e5466a: Mounted from nvidia/pytorch b92c6f3cf8ba: Mounted from nvidia/pytorch ea54ed1c9d39: Mounted from nvidia/pytorch e94fa5c9c518: Mounted from nvidia/pytorch 8456d4967bfe: Mounted from nvidia/pytorch 40f364efa84f: Mounted from nvidia/pytorch 65c14c7eaf47: Mounted from nvidia/pytorch 14e6ddddf256: Mounted from nvidia/pytorch 7821737d952f: Mounted from nvidia/pytorch 77a776e8014b: Mounted from nvidia/pytorch 7a7051e759c4: Mounted from nvidia/pytorch e1aa1f9ee97e: Mounted from nvidia/pytorch 3b720402b8ab: Mounted from nvidia/pytorch 3b1792efdad9: Mounted from nvidia/pytorch 5f70bf18a086: Mounted from nvidia/pytorch 6ba71d233b75: Mounted from nvidia/pytorch 5342e89df8e3: Mounted from nvidia/pytorch fc3209a87194: Mounted from nvidia/pytorch 1ee80d85e1cf: Mounted from nvidia/pytorch 489f24d7d381: Mounted from nvidia/pytorch f7655918bfe6: Mounted from nvidia/pytorch 5ec341fc8fe7: Mounted from nvidia/pytorch 8fb729c89bb4: Mounted from nvidia/pytorch 852255d743c1: Mounted from nvidia/pytorch abf81ae6f4c8: Mounted from nvidia/pytorch f89ef356505e: Mounted from nvidia/pytorch 6fb2a344ac89: Mounted from nvidia/pytorch 850236713495: Mounted from nvidia/pytorch b9dfd77f5b0a: Mounted from nvidia/pytorch 6a1014d46250: Mounted from nvidia/pytorch 85f49f4e6923: Mounted from nvidia/pytorch 2f175b794573: Mounted from nvidia/pytorch 899455397741: Mounted from nvidia/pytorch 2df8c0a32afe: Mounted from nvidia/pytorch a060c5cefec7: Mounted from nvidia/pytorch 83cdade3c9b5: Mounted from nvidia/pytorch fec6965e7a6b: Mounted from nvidia/pytorch 2ff0ade8d3c9: Mounted from nvidia/pytorch 01e996931197: Mounted from nvidia/pytorch 867d0767a47c: Mounted from nvidia/pytorch 1.0: digest: sha256:64e3f9abb33ac2b7287d8626d79ef9bff2d5126eadce40699a2651c7aee72ec9 size: 10642

一旦镜像完全推送,它现在应该可以在 NGC 上使用,以便在 Base Command 上使用,并允许在不同的系统上本地拉取镜像。

© 版权所有 2022-2023 NVIDIA。 上次更新时间:2023 年 1 月 10 日。