简单,就是云中的Python

108 阅读21分钟

那么你只是想大规模地运行python?

图片由作者提供

tl;dr

这是一个关于在Azure中运行代码的基础知识的 "精简 "教程。你的数据与云中的虚拟机一起驻留在存储中,无需探索Azure迷宫般的复杂性,并使用新发布的VS-Code "Azure机器学习-远程 "扩展, 在虚拟机上编程就像在本地机器上开发代码一样简单,但具有云的扩展优势。这是利用云计算与Azure机器学习(AML)所提供的服务的第一步。

云计算服务提供了许多选择,Azure比其他的更多;但由于种类繁多,很难知道从哪里开始。让我们假设你已经订阅了Azure,并且已经开始学习Azure的网络门户,portal.azure.com--其用于设置和管理网络资源的通用图形界面。云组件、服务和产品的一般管理术语是 "资源"。如果你对此不熟悉,可以搜索Azure基础知识的在线课程,其中包括诸如订阅、资源组、区域等内容。哈佛的DS介绍,这样你就会觉得使用Azure网络门户很舒服。请记住,大多数在线培训都是针对企业用户的,比你需要了解的更多细节才能开始。假设你对以合理的成本获得快速的结果感兴趣,而企业用户最关心的问题还包括可用性、可靠性和其他 "实用性",这些都不是你的当务之急--你最终会达到这个目的。在本教程中,你将在Azure Portal中交互式地创建一些Azure ML资源,然后通过VS-Code或命令行工具的组合进行开发。我假设你对编程和在命令行工作很熟悉。我将特别针对我们的任务,即把你的Python应用程序转移到云中运行,根据我的经验,我有强烈的个人偏见,以避免常见陷阱。

为什么你想把你的代码转移到云中的机器上?因为规模。Azure有一些巨大的机器,巨大的网络带宽,以及几乎无限的内存。令人惊讶的是,具有大计算负荷的应用程序在单台机器上可能比在集群上更快,而且更容易设置。当然,如果你的目的是运行PB级的数据,或者训练十亿个节点的神经网络,有合适的虚拟机-集群解决方案。无论是通过集群还是大型虚拟机,对于任何大规模的问题都是一个巨大的福音,不仅是传统的机器学习应用,而且对于那些大规模的MCMC任务,或者在GPU上的训练。

云资源

云服务本质上由三种资源组成:_计算、存储和网络。你的应用资源的集合被指定为一个 "资源组"--一个用于创建、跟踪和拆除云应用的逻辑结构。你的资源组需要包括一个_机器学习工作区,这是一个方便的资源集合,本身就是一种资源。在Azure的图形界面(portal.azure.com)中找到它。

Creating a Machine Learning Workspace in the Azure Portal

图片来源:作者

来吧,创建一个。门户的提示很好,提供了创建一个新的资源组和新的组件资源,用于它的存储账户和其他。采用默认值,继续创建新的组件资源。只要记住工作区的名称,并且在你的应用程序中创建的其他资源使用相同的资源组名称。如果你犯了一个错误,很容易删除整个资源组并重新开始。

计算

简单地说,_计算_由虚拟机(VM)组成,从微小的VM图像到具有巨大内存和GPU的VM,比你办公桌上的任何东西都大。工作区没有任何默认的计算资源,因为它让你可以选择创建单独的虚拟机、虚拟机计算集群,或者使用你现有的计算资源。在本教程中,你需要创建一个 "计算实例"--一个单一的虚拟机--通过选择一个符合你需求的大小。这些在Azure机器学习工作室(AML)中创建的Ubuntu虚拟机是可管理的虚拟机--已经安装了大部分所需的软件,并为你管理更新。这就把设置和配置虚拟机的工作从你的肩上移开了。另外,Azure仍然提供传统的 "数据科学虚拟机",预装了大量的ML工具,但除了一些特殊用途(如运行Windows操作系统),AML计算实例可以取代它们。

存储

存储也可以按规模使用。但与你的桌面不同的是,主要存储不是运行在虚拟机本地磁盘上的文件系统,而是一个具有访问API的独立组件。其中一个原因是,存储是永久性的,但虚拟机是来来去去的;当你需要完成工作时启动它们,然后拆掉它们以节省资金。存储由 "blobs "组成,具有强大的持久性和冗余保证。本教程的一个关键点是演示如何整合现有的Azure存储,这些存储可能已经装载了你的数据。

网络服务

网络服务连接_计算_和_存储。_此外,云中的网络由软件定义的虚拟网络组成,它连接到你的本地 "内部 "设备和你的云资源。通过云资源,网络将组件与本地子网、安全服务(防火墙)和面向公众的IP地址的组合粘合在一起。对于一个有连接存储的虚拟机的简单情况,相关的网络看起来就像你的家庭网络,有一个公共IP地址,和一个子网中的NAT-ed地址。你不需要了解太多,因为当你创建一个虚拟机时,它已经为你设置好了。我们将讨论这个问题;但要开始的地方是存储,并把你的数据放到它上面。

设置你的开发环境

在云中运行你的代码,你需要的工具是。

  • VS-Code - 微软的开放源码IDE
  • git。开源的版本控制

还有两个Azure资源。

  • Azure存储
  • 一个带有计算实例的AML工作区。

标题中的插图显示了这些是如何拼凑起来的。一个AML工作区汇集了一系列的资源。你只需要两个:被管理的虚拟机和附加的存储,它把文件系统和你的代码放在一起。此外,你将建立一个Azure存储账户,或为你的数据使用一个现有的账户。这并不是真正必要的,但学习管理存储是很好的经验。资源设置和管理可以完全在门户中完成。至于代码,你用git把它移到AML版本。然后你在本地运行_两份_VS-Code,进行编辑-运行-调试循环。神奇的是,一个副本被附加到AML计算实例上,使它看起来就像另一个本地实例。

我的重点是使用VS-Code进行代码开发,以及它的两个扩展,Azure ML扩展和Azure ML-远程扩展。在VS-Code的 "活动栏 "中安装扩展,在最左边的一栏中找到,看起来像这样。

图片由作者提供

使用Extensions图标来安装这两个VS-Code扩展。

Azure图标将被用来启动远程会话。

作为一个开源项目,改进和扩展VS-Code的势头值得关注,正如其专用博客所讲述的那样硬核的Python开发者可能更喜欢其他专用的Python工具,如_PyCharm_ 或_Spyder_,然而在本教程中,我使用微软的VS-Code,因为它具有优雅的项目管理、符号调试和扩展功能,可以很好地与Azure集成。由于这些原因,我更喜欢它,而不是微软传统的Visual Studio IDE Tools for Python。

所以,如果你还没有安装VS-Code,请安装它。

除了Azure订阅、git和VS-Code之外,你还需要az命令行包,也就是Azure命令行界面(Azure CLI),以及Azure机器学习的扩展,它们在Windows或Unix shells上都有同等的作用。网页上有它的安装程序。

az包管理每一个Azure资源,它的az参考页是Azure的一个完整目录。它是作为Azure的RESTful管理API的一个封装器来实现的。你很少需要直接参考它,因为VS-Code Extensions会帮你调用az,如果缺少它,会提供安装。门户网站也暴露了同样的功能。但这些都是命令行工具的语法糖,你应该注意到这两点。

从长远来看,了解az的另一个原因是为了编写脚本以实现管理步骤的自动化。每次你在门户中创建一个资源时,它都会给你一个下载 "模板 "的选项。模板只是对你所创建的资源的JSON描述。使用az,你可以调用ARM(Azure资源管理器)来自动创建它。ARM是一种用于资源管理的声明性语言,它将资源的创建简化为一条命令。查看az部署组创建...命令的细节。

az扩展中的Azure机器学习(AML)的特定命令需要单独安装。第一次使用az ml时,az会提示你这样做。

不要把az CLI和Azure python SDK混淆,后者有重叠的功能。下面是一个使用SDK以编程方式从存储空间读取的例子。你可以用az CLI做的大多数事情也在python azureml包中以SDK的形式公开。

最后,为了检查az是否在工作,尝试验证你的本地机器和你的云计算订阅。当你运行时,按照指示

$ az login

你在开始时做一次。随后的az命令将不需要认证。

应用程序

好了,你已经有了你的代码和数据,并且安装了工具。让我们开始吧!假设你已经得到了一个新的AML工作区,步骤如下

  1. 设置存储。
  2. 准备好你的代码。
  3. 创建一个AML计算实例,和
  4. 启动一个远程VS-Code会话。

当你完成了你的代码后,有一个选择是将它包装在一个 "RESTful "API调用中,作为_Azure Function Application来部署。_这样就把你的应用程序作为一个 "端点 "暴露出来,可以从网上调用。构建Azure函数可以作为另一个教程的主题。

第一件事--准备好你的数据。将数据保存在云中是有好处的。 存储,如Azure的blob存储,便宜、快速,而且容量似乎是无限的;它的费用大约是每月每千兆字节2美分,在移动数据时有少量收费。由于成本和网络带宽的原因,你最好把你的数据一次性转移到云端,而不是在云端对着本地存储的数据运行你的代码。简而言之,你要创建一个存储账户,然后创建一个 "Azure数据湖第二代"(ADL2)blob存储的_容器_--相当于一个分层文件系统。有许多替代blob存储的方法,甚至有更多的高级选项,可以在Azure上运行你能想象到的几乎任何数据库软件,但对于你打算运行的批处理计算,应该从ADL2 blob存储开始。

Blob存储以文件的形式出现,组织在一个分层的目录结构中。顾名思义,它把数据当作一整块的字节,对文件格式视而不见。如果你想使用csv文件,但我建议你使用像parquet这样的二进制格式,因为它的压缩、速度和对定义数据类型的理解。

也许你的数据已经在云中了。如果没有,创建存储的最简单方法是使用门户网站--"创建资源",然后按照提示进行操作。它不需要和你的工作区在同一个资源组,选择权在你。你需要做出的一个关键选择是选择 "数据湖存储第二代"。

This option converts blob storage into adl2 blob storage.

图片来源:作者

从本质上讲,这是一种blob存储,取代了原来建立在平面文件系统上的blob存储。请注意,"Azure Data Lake Gen 1 "存储_不是_blob存储,原因不值得深究,我将忽略它。

你可以使用这个Portal页面交互式地上传数据。下面是一个名为 "data-od "的容器的例子。从顶层的存储账户页面点击几下就可以导航到存储容器和路径到这里。它包含的文件和目录操作命令很像桌面上的 "文件资源管理器"。

Browsing the contents of storage in the Azure Portal

图片由作者提供

稍后我将展示如何以编程方式向存储空间读写数据。

在本教程的精简风格中,我只包含了构成Azure ML的拜占庭式的功能集合中的绝对最低限度。Azure ML有自己的数据存储,或者更准确地说,它把现有的Azure存储组件薄薄地包装成 "数据集",为你的表添加元数据,并为你验证存储,这很好。然而,如果你费心去看,底层的存储资源是可以访问的。本教程--围绕这些高级功能的终端运行--是很好的实践,即使只做一次,也能了解Azure ML存储是如何构成的。

准备好你的代码

与一般的智慧相反,我建议你一旦过了最初的探索性分析,就应该把笔记本的代码转换成Python模块。如果你习惯于使用笔记本,那么虚拟机就很好用。Azure ML工作空间和Spark集群都可以让你运行笔记本,但你在管理、调试、测试和部署你的代码方面会受到限制。笔记本对于探索你的数据是很好的,但是当开发代码供后续使用时,人们会对它们的限制感到厌倦。

  • 他们不能很好地使用git。如果版本之间有合并冲突,要对它们进行差异和编辑冲突是非常令人头痛的。
  • 一旦填充了数据和图形,它们就会变得很大。在你提交之前,要么把它们的输出剥离,以保持它们的可管理性。或者把它们转换成html格式,作为一个可共享的、自我记录的文档。
  • 随着你的代码的增长,模块化的、可调试的面向对象的代码的所有优点都会消失。老实说,VS-Code 中的符号调试器是值得转换的,更不用说将代码按功能组织在不同的模块中的可管理性。
  • Python模块鼓励你建立测试,这是可靠的扩展、重复使用、共享和生产代码的必要做法。

因此,将笔记本降级为只运行一次的实验,并将代码块推广到独立的文件中,以便于测试和调试。

Jupyter在命令行中为你的笔记本生成一个.py文件,用

$ jupyter nbconvert --to-py <your notebook>.ipynb

依靠 git

git值得真正的敬意。当你的项目规模扩大,你与他人合作------这些事情使你对你的组织有价值------git是你工作的舒适家园。任何一个SW工程师都知道,如果你 "破坏了构建",只需几个命令就能恢复到工作状态,没有什么比这更让人欣慰的事情了。有记录的历史也是给后人的一份礼物。可以说,git的复杂性使分层文件系统的复杂性相形见绌,但当你每次走出git的舒适区时,依靠Stack Overflow并不可耻。相信我,任何可以想象到的任务都有一个git命令。

假设你的代码在你选择的git仓库中。git将是你在云和本地文件系统之间来回移动代码的工具。

设置云资源--Azure机器学习(AML)工作区

我假设你已经创建了一个AML工作区。要启动网络版,一旦你导航到工作区,就有这个按钮。

launch studio button

图片由作者提供

参观工作区

工作区在一个地方收集了大量与机器学习相关的功能。我只谈一下本教程使用的几个功能。然而,使用VS-Code的好处是,你不需要到这里来。你在工作室里需要做的一切都可以从Azure远程扩展中完成。

  • 计算实例进入工作区窗格后,在其左侧的菜单中,有一个 "计算 "菜单项,它将你带到一个创建新计算实例的面板。创建一个。你有很多大小的选择--你能说64个核心和128G内存吗?或者用4个NVIDA Teslas?否则,接受默认值就可以了。你可以在不使用实例时启动和停止实例以节省资金。
  • 代码编辑在 "笔记本"(一个错误的名称)下,有一个附加在工作区的文件系统的视图。它实际上是一个基于网络的IDE,用于在紧要关头编辑和运行代码。它可以包括笔记本、普通的python文件、本地的git仓库等等。这个文件系统隐藏在工作区的相关AML存储中,所以即使计算实例被删除,它也会持续存在。你创建的任何新的计算实例将共享这个文件系统。
  • AML存储工作室不会显示其连接的AML存储账户,所以把它看作是一个黑盒子,远程文件系统和其他工件都存储在这里。目前,与外部Azure存储一起工作--为什么?所以你看如何通过存储与其他Azure服务集成。你们中勇敢的人可以使用门户来浏览工作区附带的默认存储。存储账户可以通过其名称找到,该名称以工作区名称的混合版本开头,后面是一个随机字符串。

请记住,所有这些你需要的工作区功能都通过VS-Code扩展在你的桌面上公开。

开发周期

让我们进入有趣的部分--这些组件如何一起工作并提供更好的体验。值得注意的是,当远程使用云资源时,VS-Code的本地编辑-运行-调试周期几乎是没有区别的。此外,本地和远程VS-Code实例同时在你的桌面上运行,这比运行远程桌面服务器("rdp")或完全在浏览器中尝试远程工作的体验要顺利得多。这多酷啊!

让我们来看看这些步骤。

在本地运行

对云的认证由VS-Code的Azure ML扩展管理;一旦你开始运行并连接到你的工作区,你将不需要再次认证。

  • 在你的git仓库中VS-Code的.vscode文件夹所在的本地目录中启动VS-Code。(那里的 launch.json 文件配置了每个文件的运行调试会话。要学会向它添加配置)。)
  • 一旦你对代码在本地运行感到满意,就用git来提交和推送它。如果你提交了笔记本,最好先把它们的输出 "清理 "掉,以保持其可管理的大小。
  • 从Azure ML扩展中启动Azure ML计算实例。首先使用VS-Code活动菜单中的Azure图标(见上文)连接到你的工作区。你可以通过隐藏的右键菜单项 "连接到计算实例 "从本地VS-Code实例中生成一个远程连接的VS-Code实例。

图片来自作者

这将启动虚拟机,并在你的桌面上生成第二个VS-Code实例,连接到你的远程Workspace文件系统上

远程运行

请注意,出现在远程连接的VS-Code终端窗口中的终端实例是在你的虚拟机上运行的!不需要为 "putty "或ssh设置公钥来启动远程shell。同样,在VS-Code中可见的文件系统是工作区文件系统。这真是太酷了!

  • 当然,第一件事是通过使用git拉出你最近的修改,使Workspace文件系统中的存储库成为最新的。然后就是正常的编辑-运行-调试,但所有的计算和文件访问都在云端。
  • 在你的本地机器上运行两个VS-Code实例,你可以同时在本地和远程版本之间来回工作,用git传输代码变化。
  • 在远程实例中,Azure ML Extension的菜单自然是禁用的。将一个 "远程 "生成一个 "远程 "是没有意义的。
  • 当你完成后,为了省钱,可以把虚拟机旋下来。你的远程文件系统被保存在Storage中,不需要你做什么。

如果你在用git移动文件时比较马虎(你忘记了什么,或者你需要移动一个秘密文件),请注意VS-Code的远程连接实例可以查看云端或本地文件系统,使其成为在它们之间移动文件的 "后门"。建议使用git来保持两个文件系统中代码的一致性,所以要少用这个后门。

另外,远程会话也可以在门户中调用。试着在你的本地机器上从AML Studio笔记本窗格中打开一个远程VS-Code会话。

An alternate way to launch VS-Code in a Workspace.

图片由作者提供

如果你的计算实例正在运行,你可以启动一个VS-Code的_本地_实例,远程连接到工作区的_云_文件系统(不仅仅是在Portal编辑器中打开的文件)和运行在计算实例上的shell。但我想你会发现,直接从本地VS-Code实例中生成远程会话,要比在Portal中Azure ML页面的Studio窗格中启动它更容易。

程序化的adl2文件访问

要在云中运行你的代码,你需要的一个变化是取代本地文件IO。对代码的主要改动是用对Blob存储的python SDK的调用代替本地文件系统的IO调用。当代码在本地运行时,或者在虚拟机中,当你切换你的应用程序以处理云中的数据时,这都是可行的。

有几种方法可以为虚拟机访问文件。下面是使用Azure python SDK的一种方法,它以最小的依赖性工作,尽管它需要编写大量的代码。把这个包在一个模块里,然后把你的精力放在手头的计算任务上。python SDK在不同的包中定义了许多类。这个类,DataLakeServiceClient是专门针对adl2 blob存储的。在本地,你需要获得这些包。

pip install azure-storage-file-datalake 

"pyarrow "是pandas需要的。Apache项目 "arrow "是一种内存中的数据格式,可以说很多语言。

在这个代码片断中,第一个函数返回一个与存储的连接。第二个函数定位文件,以字节字符串的形式检索文件内容,然后将其转换为一个可以作为Pandas DataFrame读取的文件对象。无论你引用的是你创建的Azure ML工作空间中的默认存储,还是Azure云中其他部分的一些预先存在的存储,这个方法都是一样的。详见docs.microsoft.com/en-us/azure…

你可以使用 __name__ == '__main__' 部分来嵌入测试代码。当你导入文件时,它不会被运行。但是当你开发其他使用这个脚本的时候,你可以用已知blob的路径来调用这个文件,以测试它是否有故障。

DataLakeServiceClient使用一个 "账户密钥 "字符串对Azure Storage进行认证,该字符串是你从门户中的存储账户 "访问密钥 "窗格中恢复的。帐户密钥是一个88个字符的随机字符串,可作为存储帐户的 "密码"。从这个窗格中复制它。

Where to find a storage account access key.

图片来源:作者

因为它是保密的,所以它不应该被嵌入到代码中,而是隐藏在本地目录下的另一个文件secrets.py中,该文件只包含全局变量的分配,在这里是AZURE_STORAGE_ACCOUNT,STORAGE_ACCOUNT_KEY,和CONTAINER。

把文件名放在你的.gitignore文件中,因为它是你不想分享的东西。这是一个简单的执行安全的方法,还有几个更好的,但更复杂的替代方案。你可以在环境变量中保留秘密,或者更好地使用Azure "钥匙库 "来存储秘密,或者直接将秘密管理留给Azure ML。如果你在单独开发代码时仔细管理,那么账户密钥是一个简单的解决方案,但在为企业系统构建代码时,你会想要扣减认证。

同样,还有一些更复杂的、"轻代码 "的方法来检索Blobs。如前所述,Azure ML有它自己的精简包装器和一个为工作区创建的默认存储账户,在那里可以存储你的数据。但正如我所主张的,你会想知道如何连接到任何Azure数据,而不仅仅是AML管理的数据。不客气地说,AML倾向于为数据科学 "简化 "基本的云服务,但并不总是使事情变得更简单,而且可能隐藏了引擎盖下的东西,当 "简单 "的服务不能做你想要的事情时,就会造成混乱。

其他服务,点缀,和下一步工作

对于那些受益于更多处理能力的计算任务,云提供了分布式计算的集群。但在跳到集群的分布式处理方案(如dask)之前,考虑一下python的多处理模块,它提供了一个简单的方法来利用多核机器,并绕过python的单线程架构。对于一个令人尴尬的并行任务,使用该模块在多个数据集上运行相同的代码,因此每个任务在它自己的进程中运行,并返回一个父进程收到的结果。该模块的导入是

from multiprocessing import Process, Manager

Process类为每个实例生成一个新的操作系统进程,Manager类则收集实例的结果。

至于超越一台机器的问题,则是天空的极限了。Apache Spark集群无缝整合了Python、R、SQL和Scala的编码,以互动方式处理巨大的数据集,其工具是为数据科学量身定做的。Azure上的Spark有几种类型,包括第三方的DataBricks,以及以数据库为中心的Spark和MSSQL集群的整合,品牌为 "Synapse"。

更多的机器学习功能

本文的重点是Azure ML中的扩展机会,但我有没有提到Azure ML的ML功能?除了你会有提升开发规模的乐趣之外,你已经开始了使用Azure的数据科学工具的学习曲线。为了跟踪和比较多次运行的结果,AzureML与MLFlow集成。请看这篇文章。在管理数据方面,AML的 "数据集 "用元数据点缀了数据文件。甚至还有一个类似于python SDK的R的SDK。有实验、运行、环境和模型管理的对象。"AutoML "使监督学习模型的选择和调整自动化。这只是几个例子,说明Azure ML如何重新包装服务,成为机器学习任务的 "一站式 "商店。

Azure函数的部署和超越

Azure不仅可以用于大规模运行实验,还可以用于围绕你的代码建立一个应用程序。云应用由网络服务的集合组成,在独立的虚拟机上运行。为了方便起见,人们会避免在 "基础设施 "层面上工作,而转向 "管理服务",在那里,虚拟机不被暴露,只有接口被暴露,就像我们对管理计算实例所做的那样。你可以把你的代码作为RESTful http端点发布到云端,做同样的事情。对你的客户来说,它看起来就像一个URL,只不过它不是返回一个网页,而是返回你的计算结果。构建这个的基本方法是将你的代码包裹在Azure函数中。一个Azure函数通常在几秒钟内运行,并且在每次调用时不会保存状态。(保存状态是blob存储的作用,还记得吗?)在实现http端点方面有几个更有特色的替代方案,例如基于Docker容器的方案,当然还有一些可以从Azure ML工作区获得,但所有方案都是作为管理服务工作的,使实施独立于它所建立的平台 "基础设施"。如何使用AF值得单独的教程,但为了让你开始,请将Azure函数扩展加载到VS-Code中并浏览它的功能。还记得我说过,所有东西的本地管理都是由Az提供的吗? 我没有告诉你全部事实。对于AF,你需要以az func开头的命令单独安装Azure Functions核心工具。VS-Code会在你安装VS-Code Azure Functions扩展时提示你进行安装。

既然你没有被写代码所困扰,你就可以着手整合全部的云服务:数据库、虚拟主机、高级人工智能和安全---就像你最喜欢的在线零售网站在建立企业Azure应用时可能做的那样。

VS-Code远程扩展源

github.com/microsoft/v…

Python SDK参考

[azuresdkdocs.blob.core.windows.net/web/python/azure-state-file-datalake/12.0.0b7/azure.storage.filedatalake.html?highlight=datalakefileclient#azure.storage.filedatalake.DataLakeFileClient](https://azuresdkdocs.blob.core.windows.net/web/python/azure-storage-file-datalake/12.0.0b7/azure.storage.filedatalake.html?highlight=datalakefileclient#azure.storage.filedatalake.DataLakeFileClient)

原文发表于 techcommunity.microsoft.com/t5/ai-custo…


Simple, Just Python in the Cloud最初发表于Towards Data Scienceon Medium,在那里人们通过强调和回应这个故事继续对话。