Как сохранить набор данных из записной книжки ipython в Azure ML Studio?

Я использую следующую команду для сохранения результатов вывода:

ws.datasets.add_from_dataframe(data, 'GenericCSV', 'output.csv', 'Uotput results')

где ws является azureml.Workspace объект и data является pandas.DataFrame,

Работает нормально, если размер моего набора данных меньше 4 МБ. В противном случае я получил ошибку:

AzureMLHttpError: Maximum request length exceeded.

Как я понял, это ошибка, вызванная ограничениями среды Azure, и максимальный размер набора данных не может быть изменен.

Я мог бы разделить свой набор данных на части по 4 МБ и загрузить их из студии Azure ML, но это очень неудобно, если размер моего выходного набора данных превышает 400 МБ.

3 ответа

Решение

Я прочитал исходный код в пакете python azureml и обнаружил, что при загрузке набора данных они используют простую запись запроса, длина содержимого которой ограничена 4194304 байта.

Я попытался изменить код внутри "http.py" в пакете python azureml. Я разместил запрос с кусочками данных и получил следующую ошибку:

Traceback (most recent call last):
  File ".\azuremltest.py", line 10, in <module>
    ws.datasets.add_from_dataframe(frame, 'GenericCSV', 'output2.csv', 'Uotput results')
  File "C:\Python34\lib\site-packages\azureml\__init__.py", line 507, in add_from_dataframe
    return self._upload(raw_data, data_type_id, name, description)
  File "C:\Python34\lib\site-packages\azureml\__init__.py", line 550, in _upload
raw_data, None)
  File "C:\Python34\lib\site-packages\azureml\http.py", line 135, in upload_dataset
    upload_result = self._send_post_req(api_path, raw_data)
  File "C:\Python34\lib\site-packages\azureml\http.py", line 197, in _send_post_req
    raise AzureMLHttpError(response.text, response.status_code)
azureml.errors.AzureMLHttpError: Chunked transfer encoding is not permitted. Upload size must be indicated in the Content-Length header.
Request ID: 7b692d82-845c-4106-b8ec-896a91ecdf2d 2016-03-14 04:32:55Z

API REST в пакете azureml не поддерживает фрагментированную кодировку передачи. Поэтому я взглянул на то, как студия Azure ML реализует это, и обнаружил следующее:

  1. Публикуем запрос с content-length=0 для https://studioapi.azureml.net/api/resourceuploads/workspaces/<workspace_id>/?userStorage=true&dataTypeId=GenericCSV, который будет возвращать идентификатор в теле ответа.

  2. Разбейте файл.csv на куски размером менее 4194304 байта и отправьте их в https://studioapi.azureml.net/api/blobuploads/workspaces/<workspace_id>/?numberOfBlocks=<the number of chunks>&blockId=<index of chunk>&uploadId=<the id you get from previous request>&dataTypeId=GenericCSV

Если вы действительно хотите эту функциональность, вы можете реализовать ее с помощью Python и вышеупомянутого REST API.

Если вы думаете, что это слишком сложно, сообщите об этом. Пакет Azureml Python все еще находится в стадии разработки, поэтому ваше предложение будет очень полезно для них.

Согласно проекту AzureML на Github, Workspace объект ws работает через HTTP-запрос для управления ресурсами Azure. Итак, ваш код - это запрос API менеджера ресурсов. Ошибка AzureMLHttpError было вызвано чрезмерным ограничением размера запроса API Azure Resource Manager. Максимальный размер ограничения составляет 4194304 байта.

Вы можете найти это в разделе Subscription limits - Azure Resource Manager из документа Azure subscription and service limits, quotas, and constraints пожалуйста, смотрите рисунок ниже.

введите описание изображения здесь

Алексей, ты можешь писать в хранилище BLOB-объектов Azure, но я нахожу методы для этого очень редко документированными.

https://azure.microsoft.com/en-us/documentation/articles/storage-python-how-to-use-blob-storage/

Другие вопросы по тегам