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