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

将 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 容器中。

激活 MXNet Amazon EI 环境

如果您使用 AWS Deep Learning AMI,请激活 Python 3 MXNet Amazon EI 环境或 Python 2 MXNet Amazon EI 环境,具体取决于您的 Python 版本。

对于 Python 3:

source activate amazonei_mxnet_p36

对于 Python 2:

source activate amazonei_mxnet_p27

将 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