Amazon Elastic Compute Cloud
用户指南(适用于 Linux 实例)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

使用 Amazon EI

要启动实例并将其与 Amazon EI 加速器关联,您必须首先配置安全组以及 AWS PrivateLink 终端节点服务。然后,您必须使用 Amazon EI 策略配置实例角色。

为 Amazon EI 配置安全组

您需要两个安全组:一个用于新 Amazon EI VPC 终端节点的入站和出站流量,另一个用于您启动的关联 EC2 实例的出站流量。

为 Amazon EI 配置安全组

为 Amazon EI 加速器配置安全组(控制台)

  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

  2. 在左侧导航窗格中,依次选择安全性安全组创建安全组

  3. 创建安全组中,输入字段值并选择是,创建

  4. 选中您安全组旁边的复选框,然后选择入站规则

  5. 要仅允许来自任意来源的端口 443 的流量,或者仅允许来自您计划关联到实例的安全组的流量,对于类型,请选择 HTTPS

  6. 选择保存出站规则

  7. 要允许从端口 443 流向任意目标的流量,对于类型,请选择 HTTPS

  8. 选择保存出站规则

  9. 添加出站规则,用于限制流向您在上一步中创建的终端节点安全组的流量,或者允许通过 HTTPS(TCP 端口 443)流向任意目标的流量。

  10. 选择 Save

为 Amazon EI 加速器配置安全组 (AWS CLI)

  1. 使用 create-security-group 命令创建安全组:

    aws ec2 create-security-group --description insert a description for the security group --group-name assign a name for the security group [--vpc-id enter the VPC ID]
  2. 使用 authorize-security-group-ingress 命令创建入站规则:

    aws ec2 authorize-security-group-ingress --group-id insert the security group ID --group-name insert the name of the security group --protocol https --port 443
  3. 使用 authorize-security-group-egress 命令创建出站规则:

    aws ec2 authorize-security-group-egress --group-id insert the security group ID --group-name insert the name of the security group --protocol https --cidr 0.0.0.0/0
  4. 使用 create-security-group 命令创建安全组:

    aws ec2 create-security-group --description insert a description for the security group --group-name assign a name for the security group [--vpc-id enter the VPC ID]

Amazon EI 使用 VPC 终端节点来将您 VPC 中的实例私密连接到其关联的 Amazon EI 加速器。您必须先为 Amazon EI 创建 VPC 终端节点,然后才能启动具有加速器的实例。此操作只需对每个 VPC 执行一次。有关更多信息,请参阅推理 VPC 终端节点 (AWS PrivateLink)

配置 AWS PrivateLink 终端节点服务(控制台)

  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

  2. 在左侧导航窗格中,选择终端节点创建终端节点

  3. 对于 Service category,选择 Find service by name

  4. 对于服务名称,选择 com.amazonaws.<your-region>.elastic-inference.runtime

    例如,对于&region-us-west-2区域,选择 com.amazonaws.us-west-2.elastic-inference.runtime

  5. 对于子网,选择应在其中创建终端节点的一个或多个可用区。在您计划启动具有加速器的实例时,必须为可用区选择子网。

  6. 启用私有 DNS 名称并输入终端节点的安全组。选择创建终端节点。记下 VPC 终端节点 ID 以供稍后使用。

配置 AWS PrivateLink 终端节点服务 (AWS CLI)

  • 使用 create-vpc-endpoint 命令并指定 VPC ID、VPC 终端节点(接口)的类型、服务名称、将使用终端节点的子网以及要与终端节点网络接口关联的安全组。有关如何为 VPC 终端节点设置安全组的信息,请参阅为 Amazon EI 配置安全组

    aws ec2 create-vpc-endpoint --vpc-id vpc-insert VPC ID --vpc-endpoint-type Interface --service-name com.amazonaws.us-west-2.elastic-inference.runtime --subnet-id subnet-insert subnet --security-group-id sg-insert security group ID

使用 Amazon EI 策略配置实例角色

要启动带有 Amazon EI 加速器的实例,您必须提供允许在 Amazon EI 加速器上执行操作的 IAM 角色

使用 Amazon EI 策略配置实例角色(控制台)

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在左侧导航窗格中,选择策略创建策略

  3. 选择 JSON,然后粘贴以下策略:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "elastic-inference:Connect", "Resource": "*" } ] }
  4. 选择查看策略,输入策略的名称,例如 ec2-role-trust-policy.json,然后添加描述。

  5. 选择 Create policy

  6. 在左侧的导航窗格中,选择角色,然后选择创建角色

  7. 依次选择 AWS 服务EC2下一步:权限

  8. 选择您刚创建的策略的名称 (ec2-role-trust-policy.json)。选择 Next: Review。

  9. 提供角色名称,然后选择创建角色

创建实例时,在启动向导的配置实例详细信息下选择角色。

使用 Amazon EI 策略配置实例角色 (AWS CLI)

  • 要使用 Amazon EI 策略配置实例角色,请按照创建 IAM 角色中的步骤操作。将以下策略添加到您的实例:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "elastic-inference:Connect", "Resource": "*" } ] }

启动带有 Amazon EI 的实例

现在,您可以配置在子网中启动带有加速器的 EC2 实例。您可以选择任意支持的 Amazon EC2 实例类型和 Amazon EI 加速器大小。Amazon EI 加速器可供所有当前一代的实例类型使用。有三种 Amazon EI 加速器大小可供选择:

  • eia1.medium,具有 1 GB 加速器内存

  • eia1.large,具有 2 GB 加速器内存

  • eia1.xlarge,具有 4 GB 加速器内存

启动带有 Amazon EI 的实例(控制台)

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 选择 Launch Instance

  3. 选择 Amazon 系统映像下,选择 Amazon Linux 或 Ubuntu AMI。建议您使用一个深度学习 AMI。

  4. 选择实例类型下,选择实例的硬件配置。

  5. 选择 Next: Configure Instance Details

  6. 配置实例详细信息下,检查配置设置。确保您为之前设置的实例和 Amazon EI 加速器使用具有安全组的 VPC。有关更多信息,请参阅为 Amazon EI 配置安全组

  7. 对于 IAM 角色,选择您在使用 Amazon EI 策略配置实例角色过程中创建的 IAM 角色。

  8. 选择添加 Amazon EI 加速器

  9. 选择 Amazon EI 加速器的大小。您的选项包括:eia1.mediumeia1.largeeia1.xlarge

  10. (可选)您可以通过选择页面底部的下一步,选择添加存储和标签。或者,您可以让实例向导为您完成剩余的配置步骤。

  11. 检查实例的配置并选择启动

  12. 系统将提示您为实例选择现有密钥对,或者创建新密钥对。有关更多信息,请参阅 Amazon EC2 密钥对

    警告

    请勿选择在没有密钥对的情况下继续选项。如果您启动的实例没有密钥对,就不能连接到该实例。

  13. 在进行了密钥对选择后,选择启动实例

  14. 确认页面会让您知道自己的实例已启动。要关闭确认页面并返回控制台,请选择查看实例

  15. 实例下,您可以查看启动的状态。启动实例只需很短的时间。启动实例时,其初始状态为 pending。实例启动后,其状态将更改为 running

  16. 需要几分钟准备好实例,以便您能连接到实例。检查您的实例是否通过了状态检查。您可以在 Status Checks (状态检查) 列中查看此信息。

启动带有 Amazon EI 的实例 (AWS CLI)

要通过命令行启动带有 Amazon EI 的实例,您需要密钥对名称、子网 ID、安全组 ID、AMI ID 以及在使用 Amazon EI 策略配置实例角色部分中创建的实例配置文件的名称。对于安全组 ID,使用您为包含 AWS PrivateLink 终端节点的实例创建的安全组。有关更多信息,请参阅 为 Amazon EI 配置安全组。有关 AMI ID 的更多信息,请参阅查找 Linux AMI

  1. 使用 run-instances 命令启动您的实例和加速器:

    aws ec2 run-instances --image-id ami-insert image ID --instance-type for exmample, m5.large --subnet-id subnet-insert your subnet ID --elastic-inference-accelerator Type=for example, eia1.large --key-name enter your key pair name --security-group-ids sg-enter your security group ID --iam-instance-profile Name="enter the name of your accelerator profile"
  2. run-instances 操作成功后,您的输出类似于以下内容:ElasticInferenceAcceleratorArn 标识 Amazon EI 加速器。

    "ElasticInferenceAcceleratorAssociations": [ { "ElasticInferenceAcceleratorArn": "arn:aws:elastic-inference:us-west-2:204044812891:elastic-inference-accelerator/eia-3e1de7c2f64a4de8b970c205e838af6b", "ElasticInferenceAcceleratorAssociationId": "eia-assoc-031f6f53ddcd5f260", "ElasticInferenceAcceleratorAssociationState": "associating", "ElasticInferenceAcceleratorAssociationTime": "2018-10-05T17:22:20.000Z" } ],

现在,您已准备好使用 TensorFlow 或 MXNet 在提供的 AMI 上运行模型。

将 TensorFlow 模型与 Amazon EI 结合使用

启用了 Amazon EI 的 TensorFlow Serving 版本可让您使用 Amazon EI 加速器,无需更改 TensorFlow 代码。AWS Deep Learning AMI 中提供了 Amazon EI TensorFlow Serving。您还可从 Amazon S3 存储桶下载二进制文件,以将其构建到自己的 Amazon Linux 或 Ubuntu AMI 或者 Docker 容器中。

使用 Amazon EI TensorFlow Serving,标准 TensorFlow Serving 推理保持不变。唯一的区别是入口点是一个名为 amazonei_tensorflow_model_server 的不同的二进制文件。

有关更多信息,请参阅 TensorFlow Serving

Amazon EI TensorFlow Serving 的此发布版本已在下列深度学习使用案例和网络架构(及类似变体)上通过测试,可以良好运行,具有节省成本的优点:

使用案例 示例网络拓扑

图像识别

Inception、ResNet、MVCNN

SSD、RCNN

神经机器翻译

GNMT

TensorFlow Serving 示例

以下是如何通过 Amazon EI TensorFlow Serving 运行 Inception 模型的示例。请注意,如果您下载 Amazon EI TensorFlow Serving 以在自己的 AMI 或自定义 AMI 中运行,则必须安装以下依赖项:OpenSSL for IAM Authentication 以及 TensorFlow Serving Python API PIP 程序包。这些依赖项预安装在 AWS 深度学习 AMI 上。

使用 Inception 模型处理和测试推理

  1. 下载该模型。

    curl -O https://s3-us-west-2.amazonaws.com/aws-tf-serving-ei-example/inception_example2.zip
  2. 解压缩模型。

    unzip inception_example2.zip
  3. 下载一张哈士奇的照片。

    curl -O https://upload.wikimedia.org/wikipedia/commons/b/b5/Siberian_Husky_bi-eyed_Flickr.jpg
  4. 导航到安装 AmazonEI_TensorFlow_Serving 的文件夹并运行以下命令来启动服务器。

    AmazonEI_TensorFlow_Serving_v1.11_v1 --model_name=inception --model_base_path=[directory with the unzipped model]/inception_example --port=9000
  5. 当服务器仍在前台运行时,启动另一个终端会话。打开新终端,然后使用您的首选文本编辑器创建具有以下内容的脚本。将其命名为 inception_client.py。此脚本将映像文件名用作参数,并从预训练模型中获得预测结果。

    from __future__ import print_function import grpc import tensorflow as tf from PIL import Image import numpy as np import time from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc tf.app.flags.DEFINE_string('server', 'localhost:9000', 'PredictionService host:port') tf.app.flags.DEFINE_string('image', '', 'path to image in JPEG format') FLAGS = tf.app.flags.FLAGS def main(_): channel = grpc.insecure_channel(FLAGS.server) stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) # Send request with Image.open(FLAGS.image) as f: f.load() # See prediction_service.proto for gRPC request/response details. data = np.asarray(f, dtype = "float") data = np.resize(data, (224, 224, 3)) data = np.expand_dims(data, axis=0) request = predict_pb2.PredictRequest() request.model_spec.name = 'inception' request.inputs['Placeholder:0'].CopyFrom( tf.contrib.util.make_tensor_proto(data, shape=[1,224,224,3], dtype=tf.float32)) start = time.time() result = stub.Predict(request, 60.0) # 10 secs timeout stop = time.time() print("Inception prediction took %fs"%(stop - start)) print("Inception Client Passed") if __name__ == '__main__': tf.app.run()
  6. 现在,运行将服务器位置、端口以及哈士奇照片的文件名作为参数传递的脚本。

    python inception_client.py --server=localhost:9000 --image Siberian_Husky_bi-eyed_Flickr.jpg

有关教程和示例,请参阅 TensorFlow Python API

其他要求和注意事项

支持的模型格式

Amazon EI 通过 TensorFlow Serving 支持 TensorFlow saved_model 格式。

OpenSSL 要求

Amazon EI TensorFlow Serving 需要 OpenSSL 用于 IAM 身份验证。OpenSSL 预安装在 AWS Deep Learning AMI 中。如果您生成自己的 AMI 或 Docker 容器,则必须安装 OpenSSL。

  • 安装适用于 Ubuntu 的 OpenSSL 的命令:

    sudo apt-get install libssl-dev
  • 安装适用于 Amazon Linux 的 OpenSSL 的命令:

    sudo yum install openssl-devel

预热

Amazon EI TensorFlow Serving 提供预热功能,用于预先加载模型并减少首次推理请求时通常会出现的延迟。Amazon Elastic Inference TensorFlow Serving 仅支持预热“serving_default”签名定义。

签名定义

使用多个签名定义可对已使用的加速器内存量产生倍增效应。如果您计划对推理调用练习多个签名定义,则应在为您的应用程序确定加速器类型时测试这些方案。

将 MXNet 模型与 Amazon EI 结合使用

启用了 Amazon Elastic Inference 的 Apache MXNet 版本可让您无缝使用 Amazon EI,只需对 MXNet 代码略微进行修改。您可以将 Amazon EI 用于以下 MXNet API 操作:

  • MXNet Python Symbol API

  • MXNet Python Module API

安装启用 Amazon EI 的 Apache MXNet

启用 Amazon EI 的 Apache MXNet 在 AWS Deep Learning AMI 中提供。“pip”程序包也在 Amazon S3 上提供,因此您可以将其生成到自己的 Amazon Linux 或 Ubuntu AMI 或者 Docker 容器中。

将 Amazon EI 与 MXNet Symbol API 结合使用

mx.eia() 作为调用中的上下文传递给 simple_bind()bind() 方法。有关信息,请参阅 Symbol API

以下示例调用 simple_bind() 方法:

import mxnet as mx data = mx.sym.var('data', shape=(1,)) sym = mx.sym.exp(data) # Pass mx.eia() as context during simple bind operation executor = sym.simple_bind(ctx=mx.eia(), grad_req='null') for i in range(10): # Forward call is performed on remote accelerator executor.forward() print('Inference %d, output = %s' % (i, executor.outputs[0]))

以下示例调用 bind() 方法:

import mxnet as mx a = mx.sym.Variable('a') b = mx.sym.Variable('b') c = 2 * a + b # Even for execution of inference workloads on eia, # context for input ndarrays to be mx.cpu() a_data = mx.nd.array([1,2], ctx=mx.cpu()) b_data = mx.nd.array([2,3], ctx=mx.cpu()) # Then in the bind call, use the mx.eia() context e = c.bind(mx.eia(), {'a': a_data, 'b': b_data}) # Forward call is performed on remote accelerator e.forward()

以下示例通过 Symbol API 在预训练的实际模型 (Resnet-50) 上调用 bind() 方法:

import mxnet as mx import numpy as np path='http://data.mxnet.io/models/imagenet/' [mx.test_utils.download(path+'resnet/50-layers/resnet-50-0000.params'), mx.test_utils.download(path+'resnet/50-layers/resnet-50-symbol.json'), mx.test_utils.download(path+'synset.txt')] ctx = mx.eia() with open('synset.txt', 'r') as f: labels = [l.rstrip() for l in f] sym, args, aux = mx.model.load_checkpoint('resnet-50', 0) fname = mx.test_utils.download('https://github.com/dmlc/web-data/blob/master/mxnet/doc/tutorials/python/predict_image/cat.jpg?raw=true') img = mx.image.imread(fname) # convert into format (batch, RGB, width, height) img = mx.image.imresize(img, 224, 224) # resize img = img.transpose((2, 0, 1)) # Channel first img = img.expand_dims(axis=0) # batchify img = img.astype(dtype='float32') args['data'] = img softmax = mx.nd.random_normal(shape=(1,)) args['softmax_label'] = softmax exe = sym.bind(ctx=ctx, args=args, aux_states=aux, grad_req='null') exe.forward() prob = exe.outputs[0].asnumpy() # print the top-5 prob = np.squeeze(prob) a = np.argsort(prob)[::-1] for i in a[0:5]: print('probability=%f, class=%s' %(prob[i], labels[i]))

将 Amazon EI 与 MXNet Module API 结合使用

创建 Module 对象时,传递 mx.eia() 作为上下文。有关更多信息,请参阅 Module API

要使用 MXNet Module API,您可以使用以下命令:

# Load saved model sym, arg_params, aux_params = mx.model.load_checkpoint(model_path, EPOCH_NUM) # Pass mx.eia() as context while creating Module object mod = mx.mod.Module(symbol=sym, context=mx.eia()) # Only for_training = False is supported for eia mod.bind(for_training=False, data_shapes=data_shape) mod.set_params(arg_params, aux_params) # Forward call is performed on remote accelerator mod.forward(data_batch)

以下示例在预训练的实际模型 (Resnet-152) 上将 Amazon EI 与 Module API 结合使用:

import mxnet as mx import numpy as np from collections import namedtuple Batch = namedtuple('Batch', ['data']) path='http://data.mxnet.io/models/imagenet/' [mx.test_utils.download(path+'resnet/152-layers/resnet-152-0000.params'), mx.test_utils.download(path+'resnet/152-layers/resnet-152-symbol.json'), mx.test_utils.download(path+'synset.txt')] ctx = mx.eia() sym, arg_params, aux_params = mx.model.load_checkpoint('resnet-152', 0) mod = mx.mod.Module(symbol=sym, context=ctx, label_names=None) mod.bind(for_training=False, data_shapes=[('data', (1,3,224,224))], label_shapes=mod._label_shapes) mod.set_params(arg_params, aux_params, allow_missing=True) with open('synset.txt', 'r') as f: labels = [l.rstrip() for l in f] fname = mx.test_utils.download('https://github.com/dmlc/web-data/blob/master/mxnet/doc/tutorials/python/predict_image/cat.jpg?raw=true') img = mx.image.imread(fname) # convert into format (batch, RGB, width, height) img = mx.image.imresize(img, 224, 224) # resize img = img.transpose((2, 0, 1)) # Channel first img = img.expand_dims(axis=0) # batchify mod.forward(Batch([img])) prob = mod.get_outputs()[0].asnumpy() # print the top-5 prob = np.squeeze(prob) a = np.argsort(prob)[::-1] for i in a[0:5]: print('probability=%f, class=%s' %(prob[i], labels[i]))

Amazon EI Apache MXNet 的此发布版本已在下列深度学习使用案例和网络架构(及类似变体)上通过测试,可以良好运行并提供节省成本效益。

使用案例 示例网络拓扑

图像识别

Inception、ResNet、VGG、ResNext

SSD 

              

文本到语音转换

WaveNet  

其他要求和注意事项

  • Amazon EI Apache MXNet 随 MKLDNN 生成。因此,使用 mx.cpu() 上下文时支持所有操作。不支持 mx.gpu() 上下文,因此无法在本地 GPU 上执行操作。

  • MXNet Imperative 模式或 MXNet Gluon API 当前不支持 Amazon EI。

  • mx.eia() 当前不提供 MXNet 上下文的完整功能。您不能通过编写如下所示的内容,在 Amazon EI 加速器上分配 NDArray 的内存:x = mx.nd.array([[1, 2], [3, 4]], ctx=mx.eia())。这会导致错误。相反,您应使用:x = mx.nd.array([[1, 2], [3, 4]], ctx=mx.cpu())。MXNet 会根据需要将您的数据自动传输到加速器。

  • 因为 Amazon EI 只支持推理、backward() 方法或带有 for_training=True 的 bind() 调用。由于 for_training 的默认值为 True,请务必设置 for_training=False

将 ONNX 模型与 Amazon EI 结合使用

您可以部署开放神经网络交换 (ONNX) 格式模型,使用 Amazon Elastic Inference 增强的 Apache MXNet 进行推理。这使得用户可以使用 PyTorch、Chainer、CNTK 和其他 ONNX 兼容框架生成模型,通过将模型导出到 ONNX 来高效使用 Amazon Elastic Inference 加速。

有关使用 AWS Deep Learning AMI 应用具有 MXNet 的 ONNX 模型,请参阅将 Apache MXNet 与 ONNX 模型结合使用进行推理。使用以下命令激活环境:source activate amazonei_mxnet_p36。将上下文配置为 ctx = mx.eia()