当前位置: 首页 > 知识库问答 >
问题:

入口点脚本存储在定制Sagemaker框架培训作业容器中的何处?

姬实
2023-03-14

我正在尝试创建自己的定制Sagemaker框架,该框架运行定制python脚本,以使用entry_point参数训练ML模型。

遵循pythonsdk文档(https://sagemaker.readthedocs.io/en/stable/estimators.html),我编写了运行培训作业的最简单代码,只是为了了解它的行为以及Sagemaker框架的工作方式。

我的问题是,我不知道如何正确构建Docker容器以运行入口点脚本。

我添加了列车。py将脚本写入容器中,该容器仅记录文件夹和文件路径以及容器环境中的变量。

我能够运行培训作业,但在环境变量和容器中的文件中都找不到入口点脚本的任何引用。

下面是我使用的代码:

  • 自定义Sagemaker框架类:
from sagemaker.estimator import Framework

class Doc2VecEstimator(Framework):
    def create_model():
        pass
  • 火车。py:
import argparse
import os
from datetime import datetime


def log(*_args):
    print('[log-{}]'.format(datetime.now().isoformat()), *_args)


def listdir_rec(path):
    ls = os.listdir(path)
    print(path, ls)

    for ls_path in ls:
        if os.path.isdir(os.path.join(path, ls_path)):
            listdir_rec(os.path.join(path, ls_path))


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--epochs', type=int, default=5)
    parser.add_argument('--debug_size', type=int, default=None)

    # # I commented the lines bellow since I haven't configured the environment variables in my container
    #     # Sagemaker specific arguments. Defaults are set in the environment variables.
    #     parser.add_argument('--output-data-dir', type=str, default=os.environ['SM_OUTPUT_DATA_DIR'])
    #     parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'])
    #     parser.add_argument('--train', type=str, default=os.environ['SM_CHANNEL_TRAIN'])

    args, _ = parser.parse_known_args()

    log('Received arguments {}'.format(args))

    log(os.environ)

    listdir_rec('.')

  • Dockerfile:
FROM ubuntu:18.04

RUN apt-get -y update \
    && \
    apt-get install -y --no-install-recommends \
        wget \
        python3 \
        python3-pip \
        nginx \
        ca-certificates \
    && \
    rm -rf /var/lib/apt/lists/*

RUN pip3 install --upgrade pip setuptools \
    && \
    pip3 install \
        numpy \
        scipy \
        scikit-learn \
        pandas \
        flask \
        gevent \
        gunicorn \
        joblib \
        pyAthena \
        pandarallel \
        nltk \
        gensim \
    && \
    rm -rf /root/.cache

ENV PYTHONUNBUFFERED=TRUE
ENV PYTHONDONTWRITEBYTECODE=TRUE

COPY train.py /train.py

ENTRYPOINT ["python3", "-u", "train.py"]
  • 培训作业执行脚本:
framework = Doc2VecEstimator(
    image_name=image,
    entry_point='train_doc2vec_model.py',
    output_path='s3://{bucket_prefix}'.format(bucket_prefix=bucket_prefix),

    train_instance_count=1,
    train_instance_type='ml.m5.xlarge',
    train_volume_size=5,

    role=role,
    sagemaker_session=sagemaker_session,
    base_job_name='gensim-doc2vec-train-100-epochs-test',

    hyperparameters={
        'epochs': '100',
        'debug_size': '100',
    },
)

framework.fit(s3_input_data_path, wait=True)

我还没有找到一种方法来完成运行train\u doc2vec\u模型的培训工作。py。那么,如何创建自己的自定义框架类/容器呢?

谢谢

共有1个答案

易英奕
2023-03-14

SageMaker团队创建了一个python包SageMaker training安装在您的docker中,以便您的客户容器能够处理外部入口点脚本。请参见此处,以获取使用Catboost执行您想要执行的操作的示例:)

https://github.com/aws-samples/sagemaker-byo-catboost-container-demo

 类似资料:
  • 我正在尝试为Amazon Sagemaker创建自定义模型/图像/容器。我已经阅读了所有的基础教程,如何根据您的要求创建图像。实际上,我有一个正确设置的映像,它运行tensorflow,在本地训练、部署和服务模型。 当我尝试使用sagemaker python SDK运行容器时,问题就出现了。更准确地说,尝试使用框架模块和类创建我自己的自定义估计器来运行自定义图像/容器。 在这里,我张贴的最低代码

  • 我使用Amazon SageMaker要执行3个主要过程。 使用自己的培训python脚本(不使用sagemaker容器、内置算法)[Train.py] - - - -- -- 有什么建议吗?有什么可以遵循的最佳实践吗?先谢谢你。

  • 我想在SageMaker找一份当地的培训工作。 根据这个AWS笔记本(https://github.com/awslabs/amazon-sagemaker-examples/blob/master/sagemaker-python-sdk/mxnet_gluon_mnist/mxnet_mnist_with_gluon_local_mode.ipynb),我能够在本地进行训练和预测。 有没有办法

  • 我一直在SageMaker笔记本实例上使用SageMaker Python SDK运行培训作业,并在本地使用IAM凭据。他们工作得很好,但我希望能够通过AWS Lambda Gateway开始培训工作。 Lambda不支持SageMaker SDK(高级SDK),所以我被迫在我的Lambda处理程序中使用来自boto3的SageMaker客户端,例如: 假设这个boto3服务级别SDK会给我100

  • 也许有人遇到过这样的问题:当sagemaker.tensorflow.TensorFlow类在SageMaker中创建一个训练作业时,我需要设置一个参数,负责在S3中保存训练脚本代码,以便其路径精确:sagemaker_submit_directory或可能module_dir-我不确定。默认情况下,它看起来像这样: 我需要在bucket name和job name之间加上一些东西。我怎么做?我试

  • 我有一个优化代码运行在sagemaker。我想每1小时运行一次代码。我怎么能在sagemaker安排跑步?。我不想调用模型endpoint,但我想在每1小时运行整个代码。