在组织中需要容器化机器学习工作流时,想到了Docker。意识到Docker极大地简化了机器学习工程师的工作。不仅可以使用Docker部署和运行应用程序,而且它还确保应用程序在其他系统上也能在相同的环境中工作。这对于任何需要确保可复现结果的数据科学和机器学习应用程序来说非常重要,Docker通过共享环境、库和驱动程序提供了解决方案。让深入了解一下。
以前,习惯于使用虚拟机来在系统中运行不同的应用程序。虚拟机运行一个独立的客户操作系统,并通过Hypervisor访问主机资源。每个虚拟机都运行一个独立的客户操作系统(如Linux或Windows),与主机操作系统无关。运行虚拟机的主要缺点是——每个客户操作系统都有自己的运行内核,这会使用许多资源来支持其库和依赖项,虚拟机通常需要很长时间才能启动自己的客户操作系统,而且部署对于虚拟机来说可能有点耗时。
那么,Docker提供了什么来克服这些缺点呢?Docker是一种虚拟化技术,它通过使用容器来帮助轻松部署和管理应用程序。容器通常与主机机器的其他容器共享内核。容器是轻量级的,彼此隔离,并且将它们自己的软件、库和依赖项捆绑在一起。容器之所以轻量级,是因为它们不像虚拟机那样运行单独的客户操作系统,这也使它们能够快速启动。为了创建、执行和管理容器,使用Docker作为管理应用程序。
Docker Engine - Docker引擎用于应用程序的容器化。这是一个客户端-服务器应用程序,有一个长期运行的守护进程,API接口用于与守护进程通信,以及CLI客户端。
Docker Daemon - Docker使用客户端-服务器架构,客户端向Docker守护进程发送响应。Docker守护进程是一个持续运行的运行时进程,管理容器。Docker守护进程接收API请求,并管理不同的对象,如容器和镜像。
Images -Docker镜像是一个包含不同应用程序代码、库和依赖项的文件,这些是使应用程序运行所需的。Docker的镜像文件是一个只读模板,包含可以创建Docker容器的指令。要构建自己的定制镜像文件,需要创建一个Dockerfile,定义创建镜像并执行它所需的步骤。
Docker Registry - 创建Docker镜像后,可以在一些开放平台或一些私有注册表中共享它,以便应用程序可以与其他人共享,或者可以根据要求进行限制。还可以将镜像推送到DockerHub、AWS ECR等地方,以便进一步使用。
Containers - 容器是镜像的可运行实例,可以使用Docker创建、启动或停止容器。容器是轻量级的——容器共享系统内核,因此它们不需要任何单独的操作系统来运行。容器是安全的——所有容器都是隔离的,因此运行在其中的应用程序是安全的。容器是标准和便携的——容器在注册表服务器和容器主机之间是便携的。
要安装Docker,可以使用以下链接,并按照这里描述的程序进行。
安装Docker后,可以从命令提示符中确认安装。命令“docker”的输出将是这样的——如果Docker准备好了,可以从DockerHub下载任何预上传的镜像,这是一个开放的Docker镜像仓库。让尝试一个简单的镜像,登录Docker Hub并搜索镜像,hello-world(寻找官方镜像以避免任何问题)。现在,使用CLI中的命令拉取这个镜像:
docker pull hello-world
它将把最新的镜像拉取到系统。如果想检查系统中的Docker镜像,请在CLI中运行以下命令:
docker image ls -a
现在,让尝试运行其中一个Docker镜像。已经从Docker Hub下载了“hello-world”镜像,要运行它,必须运行命令:
docker run hello-world
这将输出结果。
现在让有一个容器化非常简单的机器学习代码的例子。对于初学者,创建了一个基本的机器学习模型,用于使用线性回归模型预测薪资(代码可在中找到)。在容器化代码之前,需要创建一个Dockerfile。
Dockerfile是一个文本文件,包含创建Docker镜像所需的所有命令。用户可以运行docker build命令来执行创建镜像所需的一系列命令,docker build命令运行Dockerfile中的命令并创建镜像。例如,运行了以下命令来执行docker build:
docker build -t new_image .
以下是输出供参考:也可以使用CLI命令检查Docker镜像:
docker image ls
在上面的输出中,可以看到已经成功地为项目创建了一个Docker镜像。
现在,有了Docker镜像,那么如何将这个镜像在容器中运行呢?容器有自己的文件系统、网络和隔离的进程。要将Docker镜像在容器中运行,必须使用以下命令:
docker run -d -p 8000:8000 new_image
同样,要停止容器的运行,可以使用命令:
docker stop