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凭证是否正常工作:
|
|
在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 .
这将生成以下项目脚手架结构:
|
|
使用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项目目录运行以下命令:
|
|
您应该只看到您自己的GitHub用户名。
现在添加您协作者的用户名:
|
|
通过再次运行jupyter-deploy users list来验证应用程序是否已更新。
然后将您的应用程序URL提供给您的协作者(通过电子邮件、短信,或您喜欢的任何方式)。只有您的协作者可以访问您的应用程序,因此您无需采取措施来保护此URL。如果您不记得URL,请再次运行jupyter-deploy open。
现在你们俩都可以从各自的Web浏览器访问JupyterLab应用程序,并且你们将实时看到彼此的变化。
停止您的实例以节省云账单
在一天工作结束时,您可能希望关闭您的Amazon EC2实例以节省AWS账单或免费层级额度。您可以通过为您的jupyter-deploy项目运行一个简单的jupyter-deploy命令来做到这一点。
|
|
就是这样,您的Amazon EC2实例状态和文件系统将被保留,您可以在重新连接时从中断的地方恢复工作。
需要注意的事项
升级您的实例
基本模板使用t3.medium作为默认的Amazon EC2实例类型。这是简单工作负载的推荐实例,但如果您的工作负载需要更多CPU或更多内存,您可能会遇到容量限制。
这就是基础设施即代码真正有帮助的地方;通过在声明文件中更新一个字符串,我们可以重新应用项目并更改现有基础设施。jupyter-deploy使这变得更加容易,您可以只运行:
|
|
然后:
|
|
与GitHub组织和GitHub团队共享对您的JupyterLab应用程序的访问权限
如果您有一个小团队,您也可以在GitHub组织和GitHub团队级别管理对JupyterLab应用程序的访问。jupyter-deploy CLI通过提供jupyter-deploy teams和jupyter-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/