如何在 Sagemaker 的处理步骤中将包上传到实例?

我必须对一些数据进行大规模特征工程。我当前的方法是使用启动实例SKLearnProcessor,然后通过选择更大的实例大小或增加实例数量来扩展作业。我需要使用一些默认情况下未安装在 Sagemaker 实例上的软件包,因此我想使用 .whl 文件安装这些软件包。


另一个障碍是 Sagemaker 角色无法访问互联网。


import boto3

import sagemaker

from sagemaker import get_execution_role

from sagemaker.sklearn.processing import SKLearnProcessor


sess = sagemaker.Session()

sess.default_bucket()        


region = boto3.session.Session().region_name


role = get_execution_role()

sklearn_processor = SKLearnProcessor(framework_version='0.20.0',

                                     role=role,

                                     sagemaker_session = sess,

                                     instance_type="ml.t3.medium",

                                     instance_count=1)


sklearn_processor.run(code='script.py')

尝试的解决方案:

  1. 将包上传到 CodeCommit 存储库并将存储库克隆到 SKLearnProcessor 实例中。因错误而失败fatal: could not read Username for 'https://git-codecommit.eu-west-1.amazonaws.com': No such device or address。我尝试将存储库克隆到 sagemaker 笔记本实例中并且它可以工作,所以这不是我的脚本的问题。

  2. 使用 bash 脚本通过 CLI 从 s3 复制包。我使用的 bash 脚本基于这篇文章。但包永远不会被复制,并且不会抛出错误消息。

  3. 还研究了使用该包s3fs,但似乎不适合复制轮文件。

备择方案

我的客户对于是否从自定义 Docker 镜像启动容器犹豫不决。还有其他选择吗?


紫衣仙女
浏览 83回答 2
2回答

慕森王

2. Use a bash script to copy the packages from s3 using the CLI. The bash script I used is based off this post. But the packages never get copied, and an error message is not thrown.这种方法似乎很合理。您最好覆盖tocommand上的字段,运行 bash 脚本,就像安装包含 python 依赖项的wheel,然后运行主 python 入口点脚本。SKLearnProcessor/bin/bashinstall_and_run_my_python_code.sh此外,您可以使用ProcessingInput来下载代码,而不是使用AWS S3调用来下载脚本中的代码,而不是使用bash脚本中的AWS CLI调用来下载代码,这就是SKLearnProcessor下载入口点script.py代码的方法。所有实例。

弑天下

还有其他一些选择。这是我能想到的所有选项(有些已经提到了)使用sagemaker.processing.*Processor.run(code=<bash script>)bash 脚本从存储库中提取:提交到 Codecommit/Github/Bitbucket 存储库,并使用您的运行 bash 脚本通过从同一存储库克隆来进行设置Hijack&nbsp;ProcessingInput:指向ProcessingInput本地目录,或者通过将文件上传到 S3 并指向ProcessingInput同一个 S3 来进行预先设置。将您的库打包并推送到本地存储库(Nexus、EC2、CodArtifact,支持此),然后像任何带有 bash 运行文件的 python 包一样安装它们。劫持sagemaker.sklearn.estimator并用于source_dir指定您的整个源目录从包中编译一个轮子并推送到容器并ProcessingInput安装。这些都不是很好。我没有做1,因为我不想每次都推送最新的代码来测试,不想构建一个包(3)或编译一个轮子(5),并使用估计器来运行处理作业似乎是错误的。使用 2,在我的情况下,有必要将单个文件放在正确的位置(ProcessingInput不支持单个文件,并且我在更高的目录中有 pyproject.toml),因此运行该作业的作业脚本通过订购进行预先设置并将文件上传到 S3,我在ProcessingInput.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python