在云端快速部署具备实时协作功能的JupyterLab应用

本文详细介绍了如何使用AWS开源工具Jupyter Deploy,在几分钟内将支持实时协作的JupyterLab应用部署到云端。内容包括初始设置、配置GitHub OAuth认证、通过基础设施即代码管理云资源,以及如何与团队成员安全共享和协作。

Jupyter notebooks已成为数据科学家、研究人员、教育工作者和分析师用于实验代码、可视化数据和记录发现的流行工具。许多用户在笔记本电脑上运行Jupyter。由于用户无法通过互联网安全地直接访问其本地JupyterLab应用程序,这给与分布式团队协作带来了限制。同样,用户也受限于自身设备的计算能力。如果他们的工作负载需要更多计算资源,例如使用GPU加速器来微调深度学习模型,则需要不同的设置。

大型企业可以负担得起工程师团队来设置和维护支持分布式计算、具有安全快速远程连接的部署框架或托管服务,但这超出了初创公司或研究团队等小型组织的资源范围。

介绍Jupyter Deploy

今天,AWS的AI/ML开源团队很高兴分享Jupyter Deploy的可用性:一个新的开源命令行界面(CLI),可在几分钟内将Jupyter部署到云端。Jupyter Deploy为您提供一个运行在您自己域上的专用且可共享的应用程序,具有加密HTTP(TLS)、GitHub OAuth集成、实时协作以及基于UV的高性能开发环境,用于应用更新和进一步配置您的应用程序。该CLI利用基础设施即代码(IaC),让您可以使用配置文件而不是通过Web控制台手动设置来定义和管理资源。与Jupyter的其他部分一样,Jupyter Deploy CLI是供应商中立的,尽管本博客将重点介绍如何部署到AWS。GitHub OAuth使您的协作者可以使用他们现有的GitHub帐户登录,而无需创建和管理新凭据。

通过Jupyter Deploy CLI的几条命令,您可以设置一个基础设施即代码项目,对其进行配置,并使用它来创建和管理云资源。第一步包括选择一个Jupyter Deploy模板。模板是预构建的基础设施即代码项目,可为您处理技术设置。将它们视为告诉系统确切要创建哪些云资源以及如何配置它们的“配方”。这些模板以Python库的形式提供,在您将其安装到Python环境后,Jupyter Deploy CLI会自动发现它们。

Jupyter Deploy CLI附带一个基本模板,包含terraform基础设施即代码引擎、AWS云提供商、Amazon Elastic Compute Cloud(Amazon EC2)实例和GitHub身份验证。

Jupyter Deploy如何简化协作

一旦您将JupyterLab应用程序部署到新的Amazon EC2实例,您就可以像Jupyter在本地笔记本电脑上运行一样,从Web浏览器访问它。但与本地运行的JupyterLab不同,您也可以将其URL分享给他人。当您的协作者将他们自己的Web浏览器中粘贴该URL时,系统将提示他们通过GitHub进行身份验证。如果他们的身份与您的允许列表匹配,他们将获得对您的JupyterLab应用程序的访问权限,并且由于Jupyter的实时协作功能以及jupyter-server-documents提供的最新改进,你们可以同时工作。

需要更多计算资源?从您的Jupyter Deploy项目目录运行几条命令来更换您的实例。Amazon EC2提供广泛范围的实例类型:例如,您可以为CPU密集型数据科学项目使用计算优化实例,或为深度学习使用GPU实例。

另一位协作者需要访问您的应用程序?另一条简单的命令即可搞定!添加更多存储空间也同样简单;您可以用几条jupyter-deploy命令挂载新的Amazon弹性块存储(Amazon EBS)、扩展现有存储或挂载新的或现有的Amazon弹性文件系统(Amazon EFS)。

如何使用Jupyter Deploy

首次设置过程涉及五个主要步骤:配置AWS、获取域、设置GitHub身份验证、安装工具以及部署您的环境。您可以为未来的部署重复使用您的域、AWS账户、GitHub应用程序。

设置AWS账户并在本地配置AWS凭证

如果您没有AWS账户,可以利用AWS Free Tier计划来设置您的Jupyter Deploy项目。接下来,在您的环境中安装AWS命令行界面(AWS CLI),并配置AWS CLI以访问您自己的AWS账户。

运行以下命令确认您的设置,该命令验证您的AWS凭证是否正常工作:

1
2
3
aws sts get-caller-identity

# 您应该会看到一个引用您AWS账户的响应。

在Amazon Route 53上购买域名

接下来,打开AWS控制台,使用您的电子邮件和密码登录,并导航到Amazon Route 53。Amazon Route 53是管理域名系统(DNS)操作的AWS服务。Amazon Route 53将允许您将DNS记录(一个全局地址,例如amazon.com)关联到基本模板将为您设置的Amazon EC2实例的IP地址。

要遵循本文中的步骤,您需要拥有一个域并能够使用Amazon Route 53创建DNS记录。如果您没有域,可以从Amazon Route 53控制台购买一个,每年费用不到20美元。导航到Amazon Route53控制台。在导航窗格中,选择"域",然后选择"已注册的域"并选择"注册域"。

我们继续并购买了该域。它会在您的AWS账户中自动创建一个Route 53托管区。根据Amazon Route 53文档,托管区是记录的容器,其中包含有关您希望如何路由域(例如example.com)及其所有子域(例如www.example.com、retail.example.com和seattle.accounting.example.com)流量的信息。托管区的名称与相应的域相同。

设置您的GitHub OAuth应用程序

下一步是设置GitHub OAuth应用程序。Jupyter Deploy将通过引用您GitHub账户中的此GitHub应用程序,将您的Amazon EC2实例配置为重定向用户到GitHub进行身份验证。如果您还没有GitHub OAuth应用程序,请点击此链接在您的GitHub账户中创建一个。

有关更多详细信息,请参阅GitHub文档。

  • 应用程序名称:输入JupyterLab application(或任何名称)
  • 主页URL:输入您的https://jupyter.{您的域},在我们的例子中是example.com
  • 应用程序描述:输入jupyter.{您的域}或留空(有助于记住此OAuth应用程序引用的域)。
  • 授权回调URL:输入https://jupyter.{您的域}/oauth2/callback,在我们的例子中是https://jupyter.example.com/oauth2/callback。GitHub将使用此回调URL将身份验证结果传达给您的应用程序。此URL必须与您的域完全匹配,否则身份验证流程将失败。
  • 启用设备流:保持未设置状态。

现在您的GitHub OAuth应用程序已配置完成,您应该可以在开发者设置页面上看到它。

当您打开它时,您会看到它有一个客户端ID和一个客户端密钥。记下客户端ID,然后生成密钥并保存其值,我们稍后需要这两个值。

创建您的Python环境并安装Jupyter Deploy

接下来,让我们启动jupyter-deploy项目。我们将创建一个Python虚拟环境,将jupyter-deploy项目的依赖项与系统的其余部分分开。我们将使用UV来做到这一点。

  • 打开终端,并导航到您的主目录 cd ~
  • 创建一个UV项目:uv init jupyter-deploy-projects --bare
  • 安装Jupyter Deploy CLI:uv add jupyter-deploy。此命令在当前目录中创建一个虚拟环境,然后下载并安装CLI、基本模板及其依赖项。
  • 现在激活此环境:source .venv/bin/activate
  • 然后运行 jupyter-deploy --help

您已准备就绪!是时候创建我们的第一个Jupyter Deploy项目了。

初始化您的项目

与uv类似,Jupyter Deploy CLI为您设置一个项目:

  • 在您的终端中,为您的项目创建一个新目录:mkdir jupyterlab-on-ec2
  • 更改目录:cd jupyterlab-on-ec2
  • 然后运行 jupyter-deploy init .

这将生成以下项目脚手架结构:

1
2
3
4
5
~/jupyter-deploy-projects/jupyterlab-on-ec2
|_ engine
|_ manifest.yaml
|_ services
|_ variables.yaml

使用Jupyter Deploy的交互式体验配置您的项目

现在是配置您的项目的时候了。您需要准备好:

  • 您的域
  • 您的GitHub OAuth应用程序客户端ID
  • 您的GitHub OAuth应用程序客户端密钥
  • 您的GitHub用户名

运行 jupyter-deploy config -s 以验证您的安装,并提示您安装所需的工具,如terraform、AWS CLI、jq以及您的特定模板可能需要的其他工具。按照这些说明安装依赖项,然后再次运行该命令:jupyter-deploy config -s

该模板使用Let‘s Encrypt来生成TLS证书,以便到您的JupyterLab应用程序的流量是端到端加密的。

您现在将进入交互式体验。CLI将提示您为此模板的每个必需变量选择值。

  • var.domain,输入您的域(仅域名,不带https://),在我们的例子中是example.com
  • var.letsencrypt email,输入您的电子邮件。Let‘s Encrypt使用它与您即将到期的TLS证书进行通信。您不必确认此电子邮件,在这种情况下,您将不会收到来自let‘s encrypt的任何通信,但您的JupyterLab应用程序将正常工作。
  • var.oauth_allowed_org 留空
  • var.oauth_allowed_teams 输入:[]
  • var.oauth_allowed_usernames 输入 [“您的用户名”]
  • var.oauth_app_client_id 输入客户端ID
  • var.oauth_app_client_secret 输入客户端密钥
  • var.subdomains 输入 jupyter

如果您犯了错误,请运行 jupyter-deploy config --<variable-name> VAR_VALUE

例如 jupyter-deploy config --domain example.com 将在保留其余配置的同时更改域变量。

创建云资源

现在是实际创建您的云资源的时候了。运行以下命令 jupyter-deploy up

这里terraform接管,并为您准备部署。基础设施即代码是一种技术,使您能够基于声明性文件创建和管理多个相互依赖的云资源。Terraform是一个流行的用于基础设施即代码的软件工具。它不隶属于AWS,可用于部署其他云提供商的资源。

Terraform准备计划,并使用您的AWS凭证显示它将在您的AWS账户中创建的资源。提示时输入yes

打开您的应用程序

现在,您的基础设施已准备就绪,并在我们指定的子域.域上为您的应用程序提供服务。

使用jupyter-deploy open访问它。

您的终端可能会显示一个弹出窗口,询问您是否信任此域。既然您拥有它,您可以信任它,所以回答yes

现在您将被重定向到身份验证页面。

按照GitHub OAuth流程进行身份验证。

然后您将被重定向到熟悉的JupyterLab启动页面。

从这里,您可以打开和运行notebooks,安装新软件包,或与终端交互。

添加协作者并共享您的notebook URL

接下来,让我们开始在此应用程序上协作。向您想要协作的人询问他们的GitHub用户名。然后从您的jupyter-deploy项目目录运行以下命令:

1
jupyter-deploy users list

您应该只看到您自己的GitHub用户名。

现在添加您协作者的用户名:

1
jupyter-deploy users add <GITHUB-USERNAME>

通过再次运行jupyter-deploy users list来验证应用程序是否已更新。

然后将您的应用程序URL提供给您的协作者(通过电子邮件、短信,或您喜欢的任何方式)。只有您的协作者可以访问您的应用程序,因此您无需采取措施来保护此URL。如果您不记得URL,请再次运行jupyter-deploy open

现在你们俩都可以从各自的Web浏览器访问JupyterLab应用程序,并且你们将实时看到彼此的变化。

停止您的实例以节省云账单

在一天工作结束时,您可能希望关闭您的Amazon EC2实例以节省AWS账单或免费层级额度。您可以通过为您的jupyter-deploy项目运行一个简单的jupyter-deploy命令来做到这一点。

1
jupyter-deploy host stop

就是这样,您的Amazon EC2实例状态和文件系统将被保留,您可以在重新连接时从中断的地方恢复工作。

需要注意的事项

升级您的实例

基本模板使用t3.medium作为默认的Amazon EC2实例类型。这是简单工作负载的推荐实例,但如果您的工作负载需要更多CPU或更多内存,您可能会遇到容量限制。

这就是基础设施即代码真正有帮助的地方;通过在声明文件中更新一个字符串,我们可以重新应用项目并更改现有基础设施。jupyter-deploy使这变得更加容易,您可以只运行:

1
jupyter-deploy config --instance-type t3.2xlarge

然后:

1
jupyter-deploy up

与GitHub组织和GitHub团队共享对您的JupyterLab应用程序的访问权限

如果您有一个小团队,您也可以在GitHub组织和GitHub团队级别管理对JupyterLab应用程序的访问。jupyter-deploy CLI通过提供jupyter-deploy teamsjupyter-deploy organization命令使这变得容易。

基本模板仅支持GitHub,但还有许多其他支持OAuth2协议的身份提供程序。未来的工作包括在Amazon EC2基本模板中扩展支持其他此类身份,或者通过新模板提供支持。

挂载额外的Amazon EBS卷或Amazon EFS文件系统

您可以轻松创建或关联现有的存储卷或文件系统到为您的JupyterLab应用程序服务的Amazon EC2实例。使用config命令的--additional-ebs-mounts选项来创建或重用Amazon EBS卷,并将它们挂载到您的JupyterLab应用程序的主目录下。您可以通过运行jupyter-deploy config --help找到其他配置选项。

呼吁协作和贡献

本博客引导您完成了将JupyterLab应用程序端到端部署到Amazon EC2的过程,使用GitHub作为OAuth提供程序。还有许多其他部署Jupyter的方法,jupyter-deploy CLI提供了一个可扩展的框架来实现这一点。我们的团队将致力于添加另一个针对Amazon Elastic Kubernetes Service(Amazon EKS)上的Kubernetes的模板。它将支持在集群上运行多个应用程序,并允许用户动态创建、共享和删除他们自己的应用程序。

在远程计算(包括Kubernetes上)运行应用程序并不限于AWS。该项目欢迎添加新功能的贡献,例如其他OAuth提供程序、其他TLS证书提供程序和其他云提供程序。用户将从pypi、GitHub或本地安装模板,使用他们选择的包管理器(如本博客中的pip或uv),然后使用init命令的选项来选择它。

我们鼓励开源贡献者更新AWS EC2基本模板,或改进CLI本身。目前,CLI和基本模板来自同一个GitHub仓库。

要了解更多信息并参与其中,您可以找到以下资源:

  • 项目仓库:https://github.com/jupyter-infra/jupyter-deploy
  • CLI的PyPI页面:https://pypi.org/project/jupyter-deploy/
  • 基本模板的PyPI页面:https://pypi.org/project/jupyter-deploy-tf-aws-ec2-base/
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计