POST请求失败,大数据发送到部署在Azure容器上的模型

时间:2019-10-02 11:52:14

标签: azure-machine-learning-service

摘要

我有一个通过Azure机器学习服务SDK部署在Azure容器实例上的PyTorch模型。该模型以标准numpy格式拍摄(大)图像进行分类。

似乎,我在服务器端遇到了HTTP请求大小限制。对模型的请求在尺寸为8-9mb的PNG图像中成功,而在尺寸为15mb +的图像中失败。具体来说,它失败,并显示413请求实体太大。

我认为,作为部署过程的一部分,限制是在正在构建的Docker映像的Nginx中设置的。我的问题:鉴于此问题是由于HTTP请求大小限制引起的,在azureml API中是否有任何方法可以增加此限制?

部署过程

部署过程按预期成功。

from azureml.core import Workspace
from azureml.core.model import InferenceConfig, Model
from azureml.core.webservice import AciWebservice, Webservice
from azureml.exceptions import WebserviceException
from pathlib import Path

PATH = Path('/data/home/azureuser/my_project')

ws = Workspace.from_config()
model = ws.models['my_pytorch_model']

inference_config = InferenceConfig(source_directory=PATH/'src',
                                   runtime='python',
                                   entry_script='deployment/scoring/scoring.py',
                                   conda_file='deployment/environment/env.yml')

deployment_config = AciWebservice.deploy_configuration(cpu_cores=2, memory_gb=4)
aci_service_name = 'azure-model'

try:
    service = Webservice(ws, name=aci_service_name)
    if service:
        service.delete()
except WebserviceException as e:
    print()

service = Model.deploy(ws, aci_service_name, [model], inference_config, deployment_config)

service.wait_for_deployment(True)
print(service.state)

通过requests

进行测试

使用请求的简单测试:

import os
import json
import numpy as np
import requests
from PIL import Image as PilImage

test_data = np.array(PilImage.open(PATH/'src/deployment/test/test_image.png')).tolist()
test_sample = json.dumps({'raw_data': 
    test_data
})
test_sample_encoded = bytes(test_sample, encoding='utf8')

headers = {
    'Content-Type': 'application/json'
}

response = requests.post(
    service.scoring_uri,
    data=test_sample_encoded,
    headers=headers,
    verify=True,
    timeout=10
)

对于大型文件,在requests中产生以下错误:

ConnectionError: ('Connection aborted.', BrokenPipeError(32, 'Broken pipe'))

我想这是请求中的一个已知错误,当​​服务器在数据上传完成之前关闭了连接时。

通过pycurl

进行测试

使用卷发包装,我得到了一个更可解释的答复。

import pycurl
from io import BytesIO

c = pycurl.Curl()
b = BytesIO()

c.setopt(c.URL, service.scoring_uri)
c.setopt(c.POST, True)
c.setopt(c.HTTPHEADER,['Content-Type: application/json'])
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.setopt(c.POSTFIELDS, test_sample)
c.setopt(c.VERBOSE, True)
c.perform()

out = b.getvalue()

b.close()
c.close()

print(out)

对于大文件,这会产生以下错误:

<html>
    <head>
        <title>
            413 Request Entity Too Large
        </title>
    </head>
    <body bgcolor="white">
        <center>
            <h1>
                413 Request Entity Too Large
            </h1>
        </center>
        <hr>
        <center>
                nginx/1.10.3 (Ubuntu)
        </center>
    </body>
</html>

使我相信这是Nginx配置中的问题。具体来说,我想将client_max_body_size设置为10mb。

问题总结

鉴于我确实遇到了Nginx配置问题,我可以以某种方式更改它吗?如果不使用Azure机器学习服务SDK,则可能通过覆盖/etc/nginx/nginx.conf文件?

2 个答案:

答案 0 :(得分:0)

在生成的图像中,nginx配置中的client_max_body_size设置为100m。不支持更改nginx配置。

答案 1 :(得分:-1)

要对大型数据进行评分,您可能需要研究不同的体系结构。在HTTP请求正文中传递大量原始数据并不是最有效的方法。

例如,您可以建立计分管道。例如,请参阅此笔记本:Pipeline Style Transfer

或者,如果要使用ACI Web服务,则可以将图像暂存到Blob存储,然后通过引用将图像传递到Blob位置。