在深度学习领域,经常关注最新的SOTA模型和它们如何通过数据科学的又一里程碑。然而,很少有人讨论部署这些模型需要多少工程工作。从Python包到系统级依赖,再到CPU架构、CUDA版本,以及像DeepStream或TensorRT这样的复杂工具,这些都需要大量的管理和协调工作。
可能会觉得在技术栈中添加另一项技术会使事情变得更简单,这似乎有些违反直觉。也许这就是为什么许多人仍然不使用Docker进行模型部署的原因。本文不是关于如何使用Docker部署计算机视觉模型的——已经有一个优秀的教程涵盖了这个主题——而是关于为什么应该在深度学习生态系统中使用Docker。
Docker是一个使用容器开发和部署应用程序的工具。它允许将软件及其所有依赖项打包,一直到操作系统级别。Docker生态系统建立在三个支柱上:
可以配置Docker在服务器上运行GPU加速的容器,这是部署模型的一种很好的方式,因为它允许它们在隔离的环境中运行。应用程序可以使用不同版本的深度学习库,有时甚至是CUDA,而不会相互影响。
查看下面的图表,了解更多关于主机配置要求的信息。
每当有人想说服使用Docker时,他们都会从同一个论点开始。它解决了“在机器上可以工作”的问题。虽然这可能是大多数项目的情况,但对于深度学习来说肯定不是这样。CUDA的容器化仍然有很多需要改进的地方,很多事情都取决于正确配置主机。然而,这比直接在机器上安装环境要好得多,特别是如果同时在多个项目上工作的话。
Docker解决得很好的问题是兼容性和可复现性。AWS Batch、EC2/ECS、Lambda和SageMaker都与Docker兼容。Azure和Google Cloud Platform (GCP)上的对应产品也是如此。Docker可能是唯一完全通用的选项,允许在这些平台上部署模型。
同一个镜像可以在云中和本地的PC上工作(假设系统满足正确的硬件要求并且设置正确),也可以在像NVIDIA Jetson和Raspberry Pi这样的边缘设备上工作。
Docker也是从他人那里学习的好方法。很有可能世界上的某个工程师已经解决了一个非常相似——通常不是不常见的——问题,正面临的问题。此外,许多开源深度学习项目开始采用Docker,并在他们的仓库中发布示例Dockerfile。
DeepStream或TensorRT只是一些可以给性能提升的库,但需要与底层硬件紧密集成。不幸的是,这些技术通常有相当大的配置开销。
当然,当使用更奇特的设备时,这个过程变得更加复杂。根据经验,自定义ARM部署无疑是最痛苦的。组装一个完全工作的Python环境需要很多时间,因为必须从源代码构建每个包,并确保驱动程序、包和系统模块是兼容的。如果决定在不同类型的机器上进行基准测试或部署到不同的边缘设备,可能需要从头开始。
使用Docker的一个最大优势是利用现有的基础镜像的可能性。Docker允许用一个命令跳过管道步骤,专注于实际的应用程序和模型部署。四处走走NVIDIA NGC。不再需要想知道需要哪个版本的CUDA或cuDNN。也许会找到一个基础容器,可以为节省大量的头痛。
在深度学习项目中,测试GPU依赖的代码是困难的。通常,这归结为在CPU上测试一切,并希望这就足够了,或者在极端情况下,模拟所有与GPU相关的内容。
但是,如果不测试将在生产中运行的实际代码,还不如根本不测试。在浮点精度、量化、张量设备管理、支持的操作、批处理、内存管理等方面有很多陷阱,真的希望在开发期间抓住这些,而不是在部署之后。
使用Docker,可以构建一个容器镜像,并在部署过程的任何阶段使用它。这个镜像可以发送到带有GPU的运行器,并用于测试应用程序。这不是最便宜的解决方案,所以可能值得降低这种测试的频率。
Docker为提供了一个快速开始、迭代和专注于最重要的事情——应用程序的方式。模型的部署已经足够复杂了,所以不要让它变得更难。此外,当时间到来时,运行在云上可能比想象的要容易。
如果计划部署在Roboflow平台上训练的模型,请使用官方推理服务器Docker镜像。为CPU和GPU机器提供支持。将从Docker的所有优势中受益,除此之外,还有高级的Roboflow功能,如主动学习。