Prerequisites - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Prerequisites

  1. 设置 AWS 账户。

    创建 AWS 账户并创建IAM管理员用户。有关如何设置 AWS 账户的说明,请参阅如何创建和激活新的 AWS 账户? 有关如何在您的 AWS 账户中创建管理员用户的说明,请参阅创建您的第一个IAM管理员用户和组

  2. 设置 IAM 角色并附加策略。

    SageMaker Edge Manager 需要访问您的Amazon S3存储桶 URI。为方便实现这一点,请创建一个 角色,该IAM角色可以运行SageMaker并有权访问您的 Amazon S3 URI。您可以使用 IAM、 适用于 Python (Boto3) 的 AWS 软件开发工具包 控制台SageMaker或 创建 角色AWS CLI。以下是如何使用 Boto3 创建 IAM 角色的示例:

    import boto3 import json AWS_REGION = 'us-west-2' # Create an IAM client to interact with IAM iam_client = boto3.client('iam', region_name=AWS_REGION) role_name = 'edge-manager-demo'

    创建描述要附加到IAM角色的IAM策略的词典。语句数组中的第一个语句 ID DeviceS3Access授予设备访问 的权限Amazon S3。SageMakerEdgeApis 授予对获取设备检测信号和注册设备所需的 APIs 的访问权限。您需要在后面的步骤中使用角色别名,以便AWS IoT使用 X.509 证书对连接的设备进行身份验证。为此,请包含 CreateIoTRoleAliasIamPermissionsCreateIoTRoleAlias 语句。

    policy = { "Version": "2012-10-17", "Statement": [ { "Sid": "DeviceS3Access", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::*SageMaker*", "arn:aws:s3:::*Sagemaker*", "arn:aws:s3:::*sagemaker*" ] }, { "Sid": "SageMakerEdgeApis", "Effect": "Allow", "Action": [ "sagemaker:SendHeartbeat", "sagemaker:GetDeviceRegistration" ], "Resource": "*" }, { "Sid": "CreateIoTRoleAlias", "Effect": "Allow", "Action": [ "iot:CreateRoleAlias", "iot:DescribeRoleAlias", "iot:UpdateRoleAlias", "iot:ListTagsForResource", "iot:TagResource" ], "Resource": [ "arn:aws:iot:*:*:rolealias/SageMakerEdge*" ] }, { "Sid": "CreateIoTRoleAliasIamPermissions", "Effect": "Allow", "Action": [ "iam:PassRole", "iam:GetRole" ], "Resource": [ "arn:aws:iam::*:role/*SageMaker*", "arn:aws:iam::*:role/*Sagemaker*", "arn:aws:iam::*:role/*sagemaker*" ] } ] }

    使用您定义的策略创建新IAM角色:

    new_role = iam_client.create_role( AssumeRolePolicyDocument=json.dumps(policy), Path='/', RoleName=role_name, )

    在后面的步骤中创建打包作业时,您将需要 Amazon 资源名称 (ARN),因此也请将其存储在变量中。

    role_arn = new_role['Role']['Arn']

    创建新角色后,附加与 SageMaker 和 交互所需的其他权限Amazon S3:

    iam_client.attach_role_policy( RoleName=role_name, PolicyArn="arn:aws:iam::aws:policy/AmazonSageMakerFullAccess" ) iam_client.attach_role_policy( RoleName=role_name, PolicyArn="arn:aws:iam::aws:policy/AmazonS3FullAccess" );
  3. 创建 Amazon S3 存储桶。

    Edge Manager 访问您的 中的模型Amazon S3,并将您的示例数据从您的设备队列存储到 中Amazon S3。使用以下命令创建 Amazon S3 存储桶:

    # Create an S3 client so SageMaker can interact with S3 s3_client = boto3.client("s3", region_name=AWS_REGION) # Name buckets bucket="demo-bucket" # Create buckets s3_client.create_bucket( Bucket=bucket, CreateBucketConfiguration={ 'LocationConstraint': AWS_REGION } )
  4. 训练机器学习模型。

    有关如何使用 训练机器学习模型的更多信息,请参阅使用 Amazon SageMaker 训练模型SageMaker。您可以选择将本地训练的模型直接上传到 Amazon S3 URI 存储桶中。

    如果您还没有模型,请使用预先训练的 Keras MobileNetV2 模型。

    import tensorflow as tf model = tf.keras.applications.MobileNetV2() model.save("mobilenet_v2.h5")

    模型打包为分层数据格式 (HDF)。 SageMaker 期望保存的模型采用压缩的 tarfile (.tar.gz) 文件格式。使用以下内容将 HD5 模型重新打包为压缩的 tarfile:

    import tarfile with tarfile.open("mobilenet_v2.tar.gz", mode="w:gz") as archive: archive.add("mobilenet_v2.h5")
  5. 将训练后的模型上传到 Amazon S3 存储桶。

    有了机器学习模型后,将其存储在 Amazon S3 存储桶中。

    model_filename= mobilenet_v2.tar.gz # Upload model s3_client.upload_file(filename=model_filename, bucket=bucket, key=model_filename)
  6. 使用 SageMaker Neo 编译您的模型。

    使用 SageMaker Neo 为 边缘设备编译机器学习模型。您需要知道存储Amazon S3桶 URI,其中存储了训练后的模型、用于训练模型的机器学习框架、模型的输入的形状以及目标设备。

    对于 Keras MobileNet V2 模型,使用以下内容:

    data_shape = '{"input_1":[1,3,224,224]}' framework = 'keras' target_device = 'ml_c5'

    有关如何使用 SageMaker Neo 编译模型的更多信息,请参阅使用 Neo https://docs.amazonaws.cn/sagemaker/latest/dg/neo.html编译和部署模型。

  7. 创建和注册AWS IoT事物对象并配置 IAM 角色。

    SageMaker Edge Manager 利用 AWS IoT Core 服务来促进 AWS 云中边缘设备和终端节点之间的连接。在设置设备以使用 后,您可以利用现有AWS IoT功能Edge Manager。

    要将设备连接到 AWS IoT ,您需要创建AWS IoT事物对象,向 AWS IoT IoT 创建和注册客户端证书,并为设备创建和配置 IAM 角色。

    • 使用以下内容创建AWS IoT事物对象:

      # Create an IoT client so you can interact with IoT iot = boto3.client('iot', region_name=region) iot.create_thing_type( thingTypeName=iot_thing_type ) # Create two AWS IoT thing objects iot.create_thing( thingName='sample-device-1', thingTypeName="edge-manager-demo" ) iot.create_thing( iot_thing_num2_name='sample-device-2', thingTypeName="edge-manager-demo" )
    • 创建AWS IoT事物对象后,您需要为事物对象创建 X.509 设备证书。此证书对您的设备进行 身份验证AWS IoT Core。

      使用以下命令创建私有密钥、公有密钥和 X.509 证书文件。

      # Creates a 2048-bit RSA key pair and issues an X.509 # certificate using the issued public key. create_cert = iot.create_keys_and_certificate( setAsActive=True ) # Get certificate from dictionary object and save in its own file with open('./device.pem.crt', 'w') as f: for line in create_cert['certificatePem'].split('\n'): f.write(line) f.write('\n') # Get private key from dictionary object and save in its own file with open('./private.pem.key', 'w') as f: for line in create_cert['keyPair']['PrivateKey'].split('\n'): f.write(line) f.write('\n') # Get a private key from dictioanary object and save in its own file with open('./public.pem.key', 'w') as f: for line in create_cert['keyPair']['PublicKey'].split('\n'): f.write(line) f.write('\n')
    • 创建 AWS IoT 策略文档。此策略授权您的设备与 AWS IoT 服务进行交互。

      为此,请创建一个角色别名,以便您可以更改设备的角色,而无需更新设备。AWS IoT 角色别名提供了一种机制,以便连接的设备AWS IoT使用 X.509 证书对 进行身份验证,然后从与 IAM 角色别名关联的 AWS IoT 角色获取短期 AWS 凭证。

      device_role_name="demo-role-name" role_alias_name = device_role_name + "-alias" # Create role alias with boto3 iot client role_alias = iot.create_role_alias( roleAlias=role_alias_name, roleArn=role_arn, credentialDurationSeconds=3600 ) # Define policy permissions alias_policy = { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iot:AssumeRoleWithCertificate", "Resource": role_alias['roleAliasArn'] } } # Create the policy witht the permissions defined aliaspolicy = iot.create_policy( policyName='aliaspolicy', policyDocument=json.dumps(alias_policy), ) # Attach the policy to client iot.attach_policy( policyName='aliaspolicy', target=create_cert['certificateArn'] )

      获取凭证提供程序的特定于 AWS 账户的终端节点。Edge 设备需要 终端节点才能担任凭证。

      # Get the unique endpoint specific to your AWS account that is making the call. iot_endpoint = iot.describe_endpoint( endpointType='iot:CredentialProvider' ) endpoint = "https://{}/role-aliases/{}/credentials".format(iot_endpoint['endpointAddress'],role_alias_name)

      使用终端节点向凭证提供程序发出 HTTPS 请求以返回安全令牌。以下示例命令使用 curl, ,但您可以使用任何 HTTP 客户端。

      !curl --cert iot.pem.crt --key iot_key.pem.key --cacert AmazonRootCA1.pem $endpoint

      如果已验证证书,请将密钥和证书上传到您的Amazon S3存储桶 URI。

      # Organize S3 bucket, define a folder to store IoT keys and certificate iot_certificates = folder + "/iot_certificates" s3_client.upload_file(filename="public.pem.key", bucket=bucket,key=iot_certificates) s3_client.upload_file(filename="device.pem.key", bucket=bucket,key=iot_certificates) s3_client.upload_file(filename="AmazonRootCA1.pem", bucket=bucket,key=iot_certificates)