这可能就是您!点击 这里 提交我们创客博客系列的摘要。
恭喜!您已经编写了一些有用的 Python 代码。现在呢?您能够在明天、一年后或十年后运行这段代码吗?如果您将它交给其他人,他们能够运行它吗?您能否将其设置为在您不在场的情况下定期运行,或者将其部署到服务器上而无需您记住特殊信息?
如果您没有计划可重复性,那么所有这些问题的答案几乎肯定都是“否”。Python 程序通常建立在来自各种单独安装库的代码基础上,如果其中一个库不可用,或者其版本与您使用的版本不同(更早或更新),您的代码很容易停止工作。幸运的是,Python 有工具可以捕获所有这些依赖项,这样您就可以实现几乎任何级别的可重复性,尽管每个新级别都需要更多工作,并且需要更多磁盘空间或其他资源。
作为一份有帮助的指南,这里列出了可重复性的递增水平;只需选择您需要的级别并按照说明进行操作即可!我们假设您要复制的代码以 Jupyter 笔记本代码单元中的 Python 代码行或 .py Python 文本文件形式表达。我们还假设,如果您的代码需要数据,则数据是静态的,并且足够小,可以与您的代码一起存档(但我们稍后会回到这个假设!)。
-
级别 -1(不可重复):您的代码曾经按某种顺序以某种先前编辑的版本运行并正常工作过,但是如果您执行 python file.py 或“重新启动并运行所有”操作并使用您的笔记本,它将由于某些原因而失败 - 即使您没有改变环境中的任何内容。如果您一直在 Jupyter 或命令行中输入命令,却没有仔细考虑执行顺序,那么这很可能是您开始的地方!
-
级别 0(仅在您今天可重复):您的代码目前在您的初始环境中可重复运行。仅您自己可重复,并且仅当您的环境以及任何其他外部代码和数据可用并且不发生更改并且您知道在该环境中运行哪些命令以及使用哪个环境(其中“命令”类似于 jupyter notebook file.ipynb (+ 重新启动并运行所有) 或 python file.py arg1)。
-
级别 1(其他人通过指导可重复):您已将环境的重要部分捕获在 requirements.txt 或 environment.yml 文件中,并使用版本固定了您的直接依赖项(例如,pandas=1.4.1),并且您保存或分发一个存档(例如,myproject.zip)或一个存储库(例如,在 github.com 上),其中包含您的命令、环境规范、您需要的任何数据文件,以及有关如何复制结果的明确的人类可读说明。您可以和您与之通信的任何人进行复制,只要他们能够在该环境中找到要运行的正确命令,能够正确地解释您的说明,并且能够访问所引用的 pip 或 conda 包,并且没有未固定的包被其他人以不兼容的方式更新。
-
级别 2(今天可重复,任何拥有互联网访问权限的人都可以):您已使用 anaconda-project 或等效工具以机器可读的形式捕获命令、任何外部代码和环境,并使用版本固定了直接依赖项。今天,任何拥有对所引用的 pip 或 conda 包访问权限的人都可以进行复制,只要没有未固定的包发布了不兼容的更新。由于 anaconda-project 明确地捕获了命令,因此只要您在本地测试了项目,就不会出现说明中步骤不明确或缺失的危险,但如果互联网上的可用包(即使您可能从未听说过这些包(如果它们是您正在使用的包的依赖项),即使您从未直接使用过 pytz),它仍然会在发布时失败。
-
级别 3(无限期可重复,任何拥有互联网访问权限的人都可以):您已将命令和环境都捕获到一个完全锁定的项目中(使用 anaconda-project lock、conda-lock 或等效工具),将每个递归依赖项固定到单个构建(不仅仅是 pandas=1.4.1,而且还包括每个安装的依赖项,如 pytz=2020.1,即使您从未直接使用过 pytz)。任何拥有对所引用的 conda 或 pip 包访问权限的人都可以进行复制,只要没有锁定的包变得不可用(这种情况很少发生,但可能会由于后来发现的安全风险或其他问题而发生)。
-
级别 4(无限期可重复,无需依赖互联网):您已将命令和环境都捕获到一个完全锁定的 anaconda 项目中,并使用 anaconda-project –pack-envs 解压并包含所有 pip 或 conda 包。即使没有 conda 存储库可用,或者包已从存储库中删除,只要没有其他内容依赖于系统库,都可以进行复制,但会生成更大的包含二进制文件的存档。请注意,只能以这种方式打包单个平台的包;在其他平台上构建仍然需要互联网访问权限(或者构建单独的 Windows、Linux 和 Mac 存档)。
-
级别 5(使用 Docker 可重复):与级别 4 相同,但创建一个包含您的项目的 Docker 镜像(这可能与使用 anaconda-project dockerize 一样简单)。任何拥有您操作系统 (OS) 访问权限的人都可以进行复制甚至部署,即使系统库发生变化,并且没有软件包存储库可用,只要 Docker 本身可用(今天在很多地方都是可用的)。会生成更大的存档,这些存档对人类来说不太直接可访问,因为它们将配置与二进制工件混合在一起,但与级别 4 相比,它们与底层计算系统的隔离程度更高。
-
级别 6(使用虚拟机可重复):与级别 5 相同,但将 Docker 和 Docker 镜像放在虚拟机 (VM) 镜像上。任何在可以使用 VM 的任何 OS 上的人都可以进行复制 - 即使您不再拥有原始硬件或 OS 类型 - 只要您可以运行 VM 镜像,但由于集成了更多正在使用的底层计算系统,因此会生成比 Docker 镜像更大的存档。
-
级别 7(在未经触碰的硬件上可重复):与级别 6 相同,但将 VM 镜像也安装在为了安全而锁定起来的断开网络连接的物理硬件上。即使当前硬件或 OS 无法再运行 VM 镜像,也可以进行复制,但可能只有那些拥有物理访问权限的人,并且只要硬件仍然可以运行。
除非您明确地使您的项目对其他人可重复,否则您很可能会停留在级别 -1 或级别 0。达到级别 1 需要使用工具来管理与底层系统分离的 Python 环境,例如 pip+venv、poetry 或 conda,这些工具通常可用,但实际上不足以实现可重复性,因为它们不会捕获复制项目所需的命令或数据文件。实际上,我力求创建一个级别 3 存档,这是第一个让我有信心分享我的代码并期望它在几个月后对我或其他人有效运行的级别,同时生成一个紧凑的文件存档,其中只包含严格复制项目所需的必要内容。达到级别 3 确实需要安装 anaconda-project,但这很容易通过开源下载,并且生成的项目存档的大小不会比包含您的项目的任何其他存档大多少。(也计划最终将 anaconda-project 整合到 conda 本身,从而缩小实现可重复性的门槛。)Anaconda Nucleus 包含一个 简单指南,用于使用 anaconda-project 开始使用级别 3 及以上。
级别 4 通常也很有用,但它需要文件大小大幅增加,因为您的归档文件包含特定平台上所有依赖项的副本,因此您不希望每天都创建级别 4 归档文件。不过,在里程碑或项目结束时绝对有用!级别 5 再次增加了所需的文件大小,并且还需要安装 Docker 来测试结果,但这提供了一定程度的保证,即您的项目将保持可用,并且对于部署尤其有用,因为 Docker 在部署系统中得到广泛支持。级别 6 和 7 是为真正偏执的人或在您确实、非常担心以后无法运行该代码的情况下(例如出于监管、法律或产品安全原因)而设的。
请注意,以上级别都假设如果您的代码需要任何数据或其他非代码文件,则这些文件足够小,可以包含在归档文件中,这对于 .zip 归档文件来说很容易,并且得到了 anaconda-project 的良好支持。如果您使用大型远程数据文件,您还需要确保这些文件保持可用并被明确引用,这可能是一个麻烦(并且是一个 单独的主题)。如果您确实引用了任何外部数据文件,最好在归档文件中直接包含一小部分数据,这样至少代码本身仍然可以证明可以以可重复的方式运行,即使完整数据后来不再可用。当您想在新的数据上运行相同的代码并且根本不在乎原始数据,但无法在没有它的情况下使代码工作时,或者当您无法弄清楚代码将接受什么类型的数据时,您会感谢自己后来的决定。
对于依赖于特定硬件(例如特定图形处理单元 (GPU) 模型、特定类型的计算集群或其他系统基础设施)的代码,也是如此。即使您的完整结果依赖于这些专用系统,也必须包含某个版本的代码,该代码可以在“通用”硬件上运行,以便项目未来的用户能够验证基本代码在专用计算系统不再可用时仍然按预期工作。anaconda-project 支持多个命令,因此添加一个用于小测试数据和/或有限计算平台的命令非常简单。
这些级别还假设您的代码是运行然后完成并生成输出的代码。如果您的代码是适合部署的代码,例如仪表板或 REST API,那么您应该争取达到级别 3 或更高级别,然后实际部署并监控结果,理想情况下使用持续集成系统进行测试,以确保重新启动的部署将继续工作。部署会带来各种问题,但如果您将项目持续部署,您不仅可以确保它仍在工作,而且可以立即让每个人都可以使用您的工作成果。
无论您身处何种情况,只要选择您对所涉及的努力和风险感到满意的级别,但如果您的代码有任何价值,至少选择级别 3!
关于作者
Jim Bednar 是 Anaconda, Inc. 的定制服务总监。Bednar 博士拥有德克萨斯大学计算机科学博士学位,以及电气工程和哲学学位。他已发表 50 多篇关于视觉系统、软件开发和可重复科学的论文和书籍。Bednar 博士管理 HoloViz 项目,这是一个开源 Python 工具集合,包括 Panel、hvPlot、Datashader、HoloViews、GeoViews、Param、Lumen 和 Colorcet。Bednar 博士是 2004 年至 2015 年爱丁堡大学计算神经科学讲师和读者,此前曾在国家仪器公司从事硬件工程和数据采集工作。
关于 Maker 博客系列
Anaconda 在一个 每月博客系列中放大了一些最活跃和最受喜爱社区成员的声音。如果您是 Maker,一直在寻找机会讲述您的故事,详细说明您最喜欢的项目,教育您的同龄人并建立您的个人品牌,请考虑 提交摘要。有关更多详细信息以及如何访问大量教育性数据科学资源和讨论主题,请访问 Anaconda Nucleus。