Классификация изображений Sagemaker: лучший способ выполнить вывод на многих изображениях в S3?

Я обучил модель с помощью встроенного образа докера RESnet18, и теперь я хочу развернуть модель на конечной точке и классифицировать ~ 1 миллион образов. У меня есть все мои обучающие, проверочные и тестовые изображения, хранящиеся на S3 в формате RecordIO (преобразованные с помощью im2rec.py). Согласно документам:

Алгоритм Amazon SageMaker Image Classification поддерживает для обучения типы контента RecordIO (application / x-recordio) и image (application / x-image). Алгоритм поддерживает только application / x-image для вывода.

Поэтому я не могу сделать вывод о моих тренировочных данных в формате RecordIO. Чтобы преодолеть это, я скопировал все необработанные изображения .jpg (~ 2 ГБ) в свой экземпляр Sagemaker Jupyter Notebook и выполнил вывод по одному следующим образом:

img_list = os.listdir('temp_data') # list of all ~1,000,000 images

for im in img_list:
    with open('temp_data/'+im, 'rb') as f:
        payload = f.read()
        payload = bytearray(payload)
    response = runtime.invoke_endpoint(EndpointName=endpoint_name, 
                                       ContentType='application/x-image', 
                                       Body=payload)

    etc...

Излишне говорить, что перенос всех данных в мой экземпляр Notebook занял много времени, и я бы предпочел не делать этого до выполнения логического вывода. Почему SageMaker Image Classification не поддерживает RecordIO для вывода? И что еще более важно, как лучше всего выполнить вывод для множества изображений, не перемещая их из S3?


person Bow    schedule 26.04.2018    source источник


Ответы (2)


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

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

Если вам нужен прогноз на основе HTTP, вот ваши варианты:

1) Используйте API-интерфейс SageMaker SDK Predictor.predict () на любом компьютере (при условии, что он имеет правильные учетные данные AWS) https://github.com/aws/sagemaker-python-sdk

2) Используйте API-интерфейс AWS Python SDK (также известный как boto3) invoke_endpoint () на любом компьютере (при условии, что он имеет надлежащие учетные данные AWS).

Вы даже можете создать простой сервис для выполнения предварительной или постобработки с помощью Lambda. Вот пример: https://medium.com/@julsimon/using-chalice-to-serve-sagemaker-predictions-a2015c02b033

Если вам нужно пакетное прогнозирование: самый простой способ - получить обученную модель из SageMaker, написать несколько строк специального кода MXNet для ее загрузки и выполнения всех ваших прогнозов. Вот пример: https://mxnet.incubator.apache.org/tutorials/python/predict_image.html

Надеюсь это поможет.

person Julien Simon    schedule 12.07.2018
comment
Спасибо! Я закончил тем, что использовал собственный скрипт, используя реализацию keras Resnet18, которую я докерил с поездом точки входа. В сценарии поезда есть флаг для переключения между обучением и оценкой прогнозов модели. - person Bow; 14.07.2018

Amazon SageMaker теперь поддерживает пакетное прогнозирование, которое больше подходит для вашего варианта использования:

person ishaaq    schedule 17.07.2018