gpt4 book ai didi

python - 如何在 Jupyter 笔记本中将 python 文件作为模块导入?

转载 作者:行者123 更新时间:2023-12-04 00:27:01 24 4
gpt4 key购买 nike

我正在开发 AWS Glue 脚本并尝试使用开发终端节点。我按照向导创建了一个 Dev Endpoint 和一个附加的 SageMaker 笔记本。当我打开 SageMaker 笔记本时,它会将我定向到一个名为 Jupyter 的网页。

在 Jupyter 中,我使用我的 python 文件创建了几个笔记本。问题是一些共享的 python 文件不能作为模块导入到笔记本中。我收到以下错误:“
没有名为 shared.helper 的模块
回溯(最近一次通话最后):

Import Error: No module named shared.helper



这是我在 Jupyter notebook 上的项目结构:
my_project/

├── scripts/
│ ├── a_notebook.ipynb
│ ├── b_notebook.ipynb
| ├── c_notebook.ipynb
│ ├── __init__.py
│ └── shared/
└── helper.py
└── config.py
└── __init__.py

我尝试了很多尝试,我在互联网上搜索过,但没有奏效。

a_notebook.ipynb , 我只用 import shared.helper as helper ,它向我显示了上述错误。

不知道AWS Glue有没有什么关系?当我从 AWS Glue 控制台下的 Sagemaker 笔记本打开 Jupyter 时。

最佳答案

TLDR

According to the docs



您需要将 python 文件上传到 S3 存储桶。如果您有多个,则需要将它们拉上 zipper 。当您启动 dev 端点时,有一个设置 Python library pathSecurity configuration, script libraries, and job parameters (optional) 下设置包含自定义库(包括脚本、模块、包)的 S3 存储桶的路径。您还需要确保附加到开发端点使用的 IAM 角色的 IAM 策略有权访问该存储桶的 list/head/getobject 等。

细节

这是一些额外的工作,但主要原因是需要将库加载到 Spark 集群中的每个 DPU(执行容器)。

当您使用 Sparkmagic (pyspark)内核,它使用一个名为 livy 的 Spark 库连接到远程 Spark 集群并在其上运行您的代码。 dev endpoint实际上是一个 Spark 集群,并且您的“Sagemaker notebook”^ 正在连接到 Spark 集群上的 livy 主机。

这与普通的 Python 环境有很大不同,主要是因为 present-working-directory 和执行代码的位置不同。 Sagemaker 允许使用大量 Jupyter magics ,所以你可以测试一下看看。

例如在一个段落中运行这个

%pwd

它将向您展示您期望看到的内容,例如

/home/ec2-user/SageMaker



试试这个:

%ls

你会看到这样的东西

Glue Examples/ lost+found/ shared/ a_notebook.ipynb



这些魔法正在使用笔记本的上下文并向您显示相对于它的目录。
如果你试试这个:

import os
print(os.getcwd())

你会看到完全不同的东西:

/mnt/yarn/usercache/livy/appcache/application_1564744666624_0002/



那是集群上驱动程序容器中的 Spark(hadoop HDFS 真的)目录。 Hadoop 目录以冗余方式分布,因此说该目录位于该容器中并不一定正确,也不是很重要。关键是该目录位于远程集群上,而不是运行笔记本的 ec2 实例上。

有时加载模块的一个好技巧是修改你的 sys.path。包含要从中导入模块的目录。不幸的是,这在这里不起作用,因为如果您附加了 /home/ec2-user/Sagemaker到路径,首先该路径在 HDFS 上不存在,其次 pyspark 上下文无法搜索笔记本 EC2 主机上的路径。

您可以做的另一件事来证明这一切都是正确的,那就是在正在运行的笔记本中更改您的内核。有一个 kernel Jupyter 中的菜单选项。我建议 conda_python3 .

当然,这个内核不会连接到 Spark 集群,所以没有 Spark 代码可以工作,但是你可以再次尝试上面的测试 %pwd , 和 print(os.getcwd())并看到它们现在显示相同的本地目录。您还应该能够导入您的模块,尽管您可能需要修改路径,例如

import os
import sys
shared_path = '/home/ec2-user/SageMaker/shared'
if shared_path not in sys.path:
sys.path.append(shared_path)

然后你应该能够运行它

import helper

但是此时,您不在 Sparkmagic (pyspark) 内核中,所以这对您没有好处。

这是一个很长的解释,但它应该有助于弄清楚为什么将脚本上传到 S3 存储桶的烦人要求。当您的开发端点启动时,它有一个 Hook 可以从该位置加载您的自定义库,以便它们可用于 Spark 集群容器。

^ 请注意,Sagemaker 是 AWS 对 Jupyter 笔记本的品牌 reshape ,这有点令人困惑。 Sagemaker 也是 AWS 中用于自动化机器学习模型训练/测试/部署生命周期管理的服务的名称。它本质上是 Jupyter 笔记本加上一些调度以及顶部的一些 API 端点。如果不是 papermill 之类的东西,我会感到惊讶。在引擎盖下运行。

关于python - 如何在 Jupyter 笔记本中将 python 文件作为模块导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55704243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com