我想知道如何访问sagemaker的script.py入口点中的私有bucket S3文件或文件夹。我使用以下代码将文件上传到S3
boto3_client = boto3.Session(
region_name='us-east-1',
aws_access_key_id='xxxxxxxxxxx',
aws_secret_access_key='xxxxxxxxxxx'
)
sess = sagemaker.Session(boto3_client)
role=sagemaker.session.get_execution_role(sagemaker_session=sess)
inputs = sess.upload_data(path="df.csv", bucket=sess.default_bucket(), key_prefix=prefix)
这是估计器的代码
import sagemaker
from sagemaker.pytorch import PyTorch
pytorch_estimator = PyTorch(
entry_point='script.py',
instance_type='ml.g4dn.xlarge',
source_dir = './',
role=role,
sagemaker_session=sess,
)
现在在script.py
文件中,我想从s3访问df.csv
文件。这是我在script.py
中的代码。
parser = argparse.ArgumentParser()
parser.add_argument("--data-dir", type=str, default=os.environ["SM_CHANNEL_TRAINING"])
args, _ = parser.parse_known_args()
#create session
sess=Session(boto3.Session(
region_name='us-east-1'))
S3Downloader.download(s3_uri=args.data_dir,
local_path='./',
sagemaker_session=sess)
df=pd.read_csv('df.csv')
但这是错误
ValueError: Expecting 's3' scheme, got: in /opt/ml/input/data/training., exit code: 1
我认为一种方法是传递密钥和访问密钥。但我已经过了sagemaker_session
。如何在script.py
文件中调用该会话并读取我的文件。
我认为这种方法在概念上是错误的。
sagemaker作业中的文件(无论是培训还是其他)应在机器初始化期间传递。想象一下,你必须用10台机器创建一个作业,你想读10次文件还是直接复制一次?
在培训工作的情况下,它们应该被传递到合适的位置(在像您这样的直接代码的情况下),或者在管道的情况下作为TrainingInput。
您可以遵循AWS的官方示例:;用PyTorch"训练MNIST模型;
然而,重要的部分只是将输入通道的字典传递给拟合:
pytorch_estimator.fit({'training': s3_input_train})
您可以将频道的名称(在本例中为"train")设置为任何您想要的方式。路径s3将是您的df.csv.中的路径
在script.py中,您可以直接在环境变量之间读取df.csv(或者至少能够在argparse之间指定它)。具有此默认值的通用代码就足够了:
parser.add_argument("--train", type=str, default=os.environ["SM_CHANNEL_TRAINING"])
它遵循命名法";SM_CHANNEL_"+您的频道名称。所以,如果你放了"train": s3_path
,这个变量就会被称为SM_CHANNEL_TRAIN
。
然后,您可以通过指向与该环境变量对应的路径来直接读取文件。