面向数据科学与新一代人工智能的 K8S

数据科学家和软件工程师有许多相同的关注点:可重复的实验(比如可重复的构建);可移植和可复制的环境(如在开发、过渡和生产环境中具有相同的设置);凭证管理;跟踪和监控生产环境中的指标;灵活的路由;轻松扩展。不难看出,应用程序开发人员使用 Kubernetes 所做的事情与数据科学家可能想做的事之间有一些类似之处:

  • 可重复的批处理作业,如 CI/CD 管道,类似于机器学习管道,多个协同阶段在其中以可重复的方式一起处理数据、提取特征、训练、测试和部署模型;
  • 描述服务之间连接的声明性配置有助于创建跨平台的可重复学习管道和模型;
  • 微服务架构支持在管道中对机器学习模型进行简单地调试,并帮助数据科学家和他们团队中的其他成员进行协作。

数据科学家与应用程序开发人员面临许多相同的挑战,但他们也面临一些独特的挑战,这些挑战与数据科学家的工作方式以及机器学习模型比传统服务更难测试和监控这一事实有关。我们将重点讨论一个与工作流相关的问题。

大多数数据科学家使用交互式笔记本(interactive notebooks)工作,这是一个笔记本环境,通常由 Project Jupyter 开发,提供一种交互式 迭代编程环境,用户可以在其中混合说明性本文和代码、运行并更改代码、检查其输出。

这些特性使得该环境对探索性分析非常灵活。然而,它们并不是用于协作或发布的理想软件工件——想象一下,如果软件开发人员发布工作的主要方式是将来自交互式 REPL 脚本发布到 pastebin 服务。

与同事分享交互式笔记本就像分享实体笔记本一样——里面有一些很好的信息,但是必须仔细查找才能找到。由于笔记本的脆弱性和对环境的依赖性,同事在运行笔记本时可能会看到不同的输出——甚至更糟:它可能会崩溃。

数据科学家可能不想成为 Kubernetes 专家——这很好!Kubernetes 的优点之一就是构建更高级工具的强大框架。

Binder 服务 就是其中一个工具,采用一个 Jupyter 笔记本的 Git 存储库,构建容器镜像来提供服务,然后在路由公开的 Kubernetes 集群中启动镜像,这样就可以从公网访问。由于笔记本的一大缺点是其正确性和功能可能依赖于其环境,因此,如果有一个高级工具可用来构建不可变环境为 Kubernetes 上的笔记本提供服务的话,就可以避免许多让人头疼的事。

你可以使用托管的 Binder 服务或 运行自己的 Binder 实例,但是,如果你想在这个过程中获得更大的灵活性,你还可以使用 Source-To-Image(S2I)工作流和工具,以及 Graham Dumpleton 提供的 Jupyter S2I 镜像 上线自己的笔记本服务。事实上,对于基础设施专家或打包专家来说,Source-To-Image 工作流是构建可供主题专家使用的高级工具的良好起点。例如,Seldon 项目 使用 S2I 来简化模型服务发布——只要向构建器提供一个模型对象,它将构建一个容器并将其作为服务公开。

Source-To-Image 工作流的一个优点是,它支持在构建映像之前对源存储库进行任意操作和转换。有个例子可以说明这个工作流有多强大,我们 创建了一个 S2I 构建器镜像,该镜像以一个 Jupyter 笔记本作为输入,该笔记本展示了如何训练模型。然后,它处理这个笔记本以确定它的依赖关系,并提取 Python 脚本来训练和序列化模型。有了这些,构建器就会安装必要的依赖项并运行脚本来训练模型。构建器的最终输出是一个 REST Web 服务,它为由笔记本构建的模型提供服务。你可以看下 notebook-to-model-service S2I 的运行 视频。同样,这不是数据科学家必须开发的工具,但是,创建这样的工具是 Kubernetes 专家和打包专家与数据科学家合作的绝佳机会。

容器系统架构组件选型库

大规模的容器技术运用从来不是一项独立工程,而是一个汇集虚拟化技术、容器编排、任务调度、操作系统、容器仓库、跨节点网络、分布式存储、动态扩缩、负载均衡、日志监控、故障自恢复等系统性难题的复杂有机体。随着 Docker 的诞生和 Google 等互联网公司的推波助澜,这个领域出现了一大批优秀的开源项目,它们在简化容器技术使用成本的同时,也经常使得刚刚接触容器时间不太长的开发者和企业用户感到不知所措。

将知识分类是梳理零散信息的一种有效方式。对于容器技术的生态圈来说,其中涉及领域众多,有的项目横跨多个细分领域,有的项目则是针对特定场景需求定制的,难以对其功能类型做精确定义。不过,若仅考虑通用领域里的相关产品和工具,大致来说可以划分成 14 种主要类别,包括 ——

  1. 容器引擎
  2. 监控和数据收集
  3. 容器管理和界面工具
  4. 基础设施集成
  5. 编排和调度
  6. 容器镜像仓库
  7. 服务发现和容器域名服务
  8. 容器日志收集处理
  9. 容器相关的系统发行版
  10. 容器平台
  11. 容器网络
  12. 容器安全
  13. 容器数据持久化
  14. 容器开发流程工具

云栖社区的这篇文章做了详尽的解读。

Google 开源 Java 容器化工具

Google 云平台官方博客发布了新的开源工具 Jib,一款快速而简单的容器镜像构建工具,能使容器技术和 Java 编程语言更加无缝地协同工作,使 Java 开发人员能更轻松地跨用例部署和控制 Java 应用程序。

容器技术使得 Java 人员比以往都更接近『一次编写,随处运行』的工作流程,但要容器化 Java 应用程序却不是一件简单的事:你必须编写 Docker file,以 root 身份运行 Docker 守护程序,等待构建完成,最后将图像推送到远程注册表。并非所有 Java 开发人员都是容器专家;容器化 Java 应用程序,并不是建一个 JAR 包那么简单。Docker 构建流程:

为了应对这一挑战,Google 发布了 Java 容器 Jib,允许 Java 开发人员使用他们所知道的 Java 工具构建容器。Jib 是一个快速而简单的容器镜像构建器,它可以处理应用程序打包到容器映像中的所有步骤。它不需要开发者编写 Docker file 或安装 Docker,它直接集成到 MavenGradle 中 -开发者只需将插件添加到构建中,就可以立即将 Java 应用程序容器化。Jib 构建流程:

  1. 简单 – Jib 利用 Docker 镜像中的分层功能,并与构建系统集成,以通过以下方式优化 Java 容器映像构建:简单 –  Jib 在 Java 中实现,并作为 Maven 或 Gradle 构建的一部分运行。你不需要维护 Docker file、运行 Docker 守护程序,甚至无需创建具有所有依赖项的 JAR。由于 Jib 与你的 Java 构建紧密集成,因此它可以访问打包应用程序所需的所有信息。在后续容器构建期间,将自动选择Java构建中的任何变体。
  2. 快速 –  Jib 利用图像分层和注册表缓存来实现快速,增量构建。它能够读取你的构建配置,将你的应用程序组织到不同的层(依赖项,资源,类)中,并仅重建和推送已更改的层。在项目上快速迭代时,Jib 可以仅将已更改的层推送到注册表,以此来节省构建时间
  3. 可重现 –  Jib 支持从 Maven 和 Gradle 构建元数据以声明方式构建容器图像,因此可以配置为只要输入保持不变,就可以通过配置创建可重现的构建镜像。

另外,Jib 可作为 Maven 和 Gradle 的插件使用,并且需要最少的配置。只需将插件添加到构建定义中并配置目标镜像即可。如果要构建到私有注册表,请确保使用注册表配置 Jib。最简单的方法是使用 docker-credential-gcr 之类的凭证助手。如果需要,Jib 还提供了用于为 Docker 守护程序构建映像的其他规则。

Docker如何提升数据科学与深度学习科研效率?

跨象乘云™融能平台,是基于容器架构的深度学习与新一代人工智能科研教学一体化实验平台,满足多个科研项目、云服务层、系统框架、以及科研与教学环境之间所需要的集群管理,调度与隔离需求。通过统一的可视化基础架构管理界面,提升数据科学与深度学习科研工作效率。

今天,以 Docker 为代表的容器技术逐步取代虚拟主机,成为云计算架构下的基本业务单位。几乎所有软件工程师都在使用容器来开发,测试,部署新的应用程序 —— 不单是因为容器具有更全面的开源生态系统;同时,卸载掉底层操作系统,大幅度降低容器镜像的体积,相对于虚拟主机而言,容器变得更适合在互联网实现发布。如 Docker Hub 等公共容器云服务,让科研机构与企业在更短的时间按内实现微服务部署。因此,各大软件厂家,也纷纷开始拥抱容器技术,以迎接新一轮的云计算技术变革。而跨象乘云也理所当然的选择采用容器作为深度学习与新一代人工智能科研教学一体化实验平台的基础架构。

对于数据科学与深度学习科研人员而言,容器所带来的科研效率提升来源于:

1.有效重现数据结果及运算模型

作为数据科学科研人员,让数据结果,运算模型能够重现是验证科研成果的重要标准之一,不但有助于同业评审,而且可以确保你创建的模型、应用或分析结果可以无障碍地运行。过去,结果重现却因为模型所依赖的操作系统、编译器、驱动程序、配置文件以及代码成功运行所需数据源等诸多条件,变得几乎无法在别的设备上重现。现在,使用 Docker 将数据结果,运算模型及依赖条件封装在容器中,便能让科研成果通过互联网发布到全球各地。在全球任意一台设备上实现数据结果及运算模型的重现。

2.有助于科研环境的迁移与扩展

科研项目是否具备到计算环境的迁移与扩展,极大地影响科研项目本身的生产力。数据科学与深度学习科研的初始化工作常常是:原型设计、探索和算饭研究,这些工作并非立即就需要特定的计算资源,往往在笔记本电脑或个人计算机上即可完成。之后,则需要不同的计算资源来显著加速你的工作进度 —— 比如使用更多 CPU 或强大的 GPU 来执行深度学习等任务。Docker 能让科研环境的迁移变得非常简单。

3.强化科研项目落地能力

对于数据科学与深度学习科研人员而言,熟练使用 Docker,将科研项目模型或分析结果,更为高效的部署成应用。譬如:通过融能™的智能输出层,发布用作提供图像识别的 REST API,从而让企业也能更快的使用高等院校的科研成果,或协助你的数学模型验证。另外,Google 数据科学家 Martin Zinkevich,在他写的:

Rules of Machine Learning:
Best Practices for ML Engineering

中特别强调工程模型对于数据科学与深度学习科研工作的重要意义。对于大多数机器学习应用场景来说,我们需要解决的问题大多数都是工程问题,解决这些工程问题需要的并不是复杂的理论,更多是对细节、架构、过程的仔细推敲和精致追求。而这些都是普通的科研人员可以做到的,如果说顶级的科研人员做的是95分以上的系统,那么我们只要对工程架构、过程和细节做好足够的优化,我们也可以做出至少80分的系统。