我能够成功地将成批的图像作为numpy数组发送到使用TF服务设置的SageMaker端点,并获得响应,如下所示:
def predict_random_batch(self, batch_size, verbose=0, initial_args=None):
batch = np.random.uniform(low=-1.0, high=1.0, size=(batch_size,self.size,self.size,3))
data = {'instances': np.asarray(batch).astype(self.dtype)}
if verbose: self.total_size(data)
request_args = self._create_request_args(data, initial_args)
response = self.sagemaker_session.sagemaker_runtime_client.invoke_endpoint(**request_args)
probs = self._handle_response(response)['predictions']
return probs
predictor.predict_random_batch(3)
但是,numpy数组很大。我正在尝试在发送前压缩图像批处理。这就是我要尝试的:
def predict_random_batch_TEST(self, batch_size, verbose=0, initial_args=None):
import base64
batch = np.random.uniform(low=-1.0, high=1.0, size=(batch_size,self.size,self.size,3))
batch = batch.astype(self.dtype)
encoded_input_string = base64.b64encode(batch)
input_string = encoded_input_string.decode("utf-8")
instance = [{"b64": input_string}]
data = json.dumps({"instances": instance})
request_args = self._create_request_args(data, initial_args)
if verbose: self.total_size(data)
response = self.sagemaker_session.sagemaker_runtime_client.invoke_endpoint(**request_args)
probs = self._handle_response(response)['predictions']
return probs
但是这将返回错误:
ModelError:调用时发生错误(ModelError) InvokeEndpoint操作:使用以下命令从模型接收到客户端错误(400) 消息“ {“错误”:“ JSON值:。 。 。不是对象“}”
有人知道我如何压缩一批图像以能够发送更大的批量大小?显然,SM施加了5MB的有效负载限制,当以numpy数组发送时,该限制不是很大。
答案 0 :(得分:1)
在将图像发送到端点之前,我使用单独的API来调整图像的大小。这是代码段,修改它应该没有问题。
h = body['height']
w = body['width']
image = base64.b64decode(body['data'])
L = len(image)
image = np.fromstring(image, np.uint8)
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
(H, W, _) = image.shape
image = cv2.resize(image, (h, w,))
image = cv2.imencode('.jpeg', image)
data = base64.b64encode(image[1].tostring())
完整文章:https://medium.com/@julsimon/using-chalice-to-serve-sagemaker-predictions-a2015c02b033