За последнее десятилетие наши методы работы с информацией и управления ею резко изменились по двум основным причинам: с одной стороны, стоимость хранения данных становится все ниже и ниже, в основном из-за широкого распространения и распространение общедоступных облачных сервисов; с другой стороны, благодаря повсеместному использованию ERP, CRM, платформ Интернета вещей и другого программного обеспечения для мониторинга и профилирования, огромное количество данных стало доступно компаниям, как об их внутренних процессах, так и о клиентах. предпочтения и поведение. Таким образом, у нас есть возможность обрабатывать все больше и больше данных с постоянно повышением качества данных за небольшую часть затрат.

Доступность этих больших наборов данных для анализа и добычи информации вызвала новый интерес к искусственному интеллекту и, в частности, к машинному обучению (ML), которое можно использовать для получения прогнозных данных. модель из существующего набора данных.

Рост числа интегрированных в Интернет устройств (IoT) резко увеличил скорость создания и хранения данных, а доступность этих данных в сочетании с новыми методами машинного обучения, в свою очередь, открывает множество новых возможностей, которые были бы немыслимы. несколько лет назад. Например, теперь можно узнать, как клиенты используют продукты, какие ошибки или непреднамеренные операции они выполняют, какие части устройства изнашиваются первыми в реальной ситуации, какие компоненты промышленного оборудования с большей вероятностью выйдут из строя. учитывая время использования и показания датчиков (профилактическое обслуживание), автоматически определять, является ли произведенная деталь хорошей или неисправной, основываясь только на изображениях данного компонента и на огромных коллекциях изображений хороших и неисправных компонентов.

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

Поставщики облачных услуг, такие как Amazon Web Services AWS, в настоящее время предлагают широкий спектр сервисов, ориентированных на машинное обучение, для удовлетворения наиболее распространенных вариантов использования клиентами. В настоящее время на AWS доступны следующие сервисы с поддержкой машинного обучения:

  • Amazon Comprehend: сервис для извлечения информации из неструктурированного текста (например, из писем, билетов и т. д.)
  • Amazon Lex: сервис, позволяющий развернуть агент беседы (см. нашу предыдущую статью)
  • Amazon Textract: извлекайте цифровой текст из структурированных и неструктурированных отсканированных документов.
  • Amazon Translate: переводите текст на другой язык.
  • Amazon Transcribe и Amazon Polly: преобразование речи в текст и текста в речь
  • Рекомендации и прогнозирование Amazon: используйте систему рекомендаций и прогнозов Amazon.com для интернет-магазинов.
  • Amazon Rekognition: извлекайте информацию из изображений и видео.

В дополнение к этим полностью управляемым сервисам AWS также предлагает более настраиваемый, настраиваемый и общий сервис: AWS SageMaker. Во второй части этой статьи мы объясним структуру проекта SageMaker, как создать тривиальную модель вывода и узнать, как развернуть службу машинного обучения HTTP с поддержкой SageMaker.

SageMaker: Строительный блок

После открытия консоли AWS SageMaker наше внимание сразу же привлекает боковая панель со списком компонентов и конфигураций SageMaker. Как видно, сервис SageMaker состоит из четырех «подсервисов»:

  • Наземная правда: эта служба позволяет помечать существующий набор данных (например, создавать рамки привязки для всего набора данных изображений). Для этого в сервисе задействованы широкие кадры, доступные через Amazon Mechanical Turk. Также можно использовать существующие модели для маркировки данных, передавая человеческому персоналу только случаи с низкой степенью достоверности.
  • Записная книжка: Эта служба позволяет запускать всего несколькими щелчками мыши экземпляр записной книжки Jupyter, предварительно настроенный с использованием наиболее распространенных библиотек интеллектуального анализа данных и машинного обучения (Conda с Tensorflow или PyTorch). Экземпляры Notebook можно запускать как внутри Vpc (для улучшенного доступа и управления сетью), так и вне Vpc, аналогично тому, что также можно сделать с помощью функций AWS Lambda.
  • Обучение: автоматизированное развертывание учебных заданий. Специалист по данным может выбрать соответствующую модель для обучения выбору из заметной библиотеки существующих общих моделей, после того как модель обучена, ее можно развернуть.
  • Модели. После обучения алгоритма на заданном наборе обучающих данных его можно развернуть с помощью раздела модели.

Также можно развернуть полные проекты SageMaker прямо из AWS Marketplace для решения конкретных задач. Предлагаемые на рынке проекты машинного обучения довольно обширны, и перед началом разработки нового проекта рекомендуется поискать проект, способный выполнить необходимую задачу на рынке.

Создание образца проекта машинного обучения

При разработке службы машинного обучения обычно первым шагом является создание экземпляра Notebook с помощью консоли AWS. Как показано на снимке экрана, можно выбрать имя экземпляра, роль IAM, которую он будет использовать, и решить, помещать ли экземпляр в наш VPC (в этом случае также можно выбрать группу безопасности и подсеть).

Даже если мы решили не размещать экземпляр в нашем VPC, к записной книжке Jupiter можно будет получить доступ только с помощью предварительно назначенного URL-адреса, сгенерированного из наших учетных данных AWS. Как только мы щелкнем по открытому Jupiter, мы увидим стандартный интерфейс Jupyter:

AWS предоставляет ряд примеров, чтобы помочь специалистам по обработке данных стать более уверенными в SageMaker, которые можно найти на вкладке «Примеры SageMaker». В этой статье мы рассмотрим пример классификации изображений с использованием набора данных Caltech 256. Чтобы начать, мы можем просто щелкнуть Использовать классификацию изображений-fulltraining.ipynb

Показан обычный ноутбук Jupiter, и мы можем следовать предоставленным инструкциям.

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

Запустив шаблон, вы затем загрузите набор данных Caltech 256 и подготовите задание по обучению алгоритму классификации изображений. В этом примере используется алгоритм классификации изображений AWS, который использует сверточную нейронную сеть (ResNet). AWS предоставляет широкий спектр общих алгоритмов, уже оптимизированных для SageMaker (см. Документацию AWS), однако также можно развернуть настраиваемую модель для обучения и упаковки в контейнер докеров.

Важно понимать, как разделить набор данных на две части: первую для обучения и вторую для этапа проверки. В этом примере каждый класс изображений (мяч, ванна, Марс, рифф и т. Д.) Разделен на два набора: 60 ​​изображений для обучения, а остальные - для проверки.

Перед началом обучения важно выбрать разумные гиперпараметры: неправильный выбор приведет к неработающим алгоритмам. Выбор этих параметров часто является процессом проб и ошибок, и для этого конкретного приложения наиболее важными параметрами являются скорость обучения и количество эпох.

Скорость обучения - это длина вектора алгоритма наискорейшего спуска: слишком большое, вы выйдете за оптимальное значение, слишком низкое, и обучение будет длиться бесконечно. Число эпох - это количество раз, когда обучающий набор данных передается вперед и назад через нейронную сеть: слишком низкий номер эпохи приведет к недостаточному соответствию данных, но также к малому времени обучения, в то время как слишком высокая эпоха приведет к переобучению данных и очень долгому времени обучения. Лучше избегать как переобучения, так и недостаточного соответствия, потому что обученная модель будет плохо работать с данными проверки.

Например, при использовании значений по умолчанию, предоставленных AWS в этом примере, время обучения очень мало (всего несколько минут), но модель будет классифицировать каждое изображение с чем-то красноватым и неопределенно круглым в нем как… Марс! (Не очень точно :))

После завершения обучения пора развернуть и протестировать обученную модель. Прежде всего, мы можем создать модель, используя результат обучения:

model_name="DEMO-full-image-classification-model" + time.strftime('-%Y-%m-%d-%H-%M-%S', time.gmtime())
print(model_name)
info = sage.describe_training_job(TrainingJobName=job_name)
model_data = info['ModelArtifacts']['S3ModelArtifacts']
print(model_data)
hosting_image = get_image_uri(boto3.Session().region_name, 'image-classification')
primary_container = {
    'Image': hosting_image,
    'ModelDataUrl': model_data,
}
create_model_response = sage.create_model(
    ModelName = model_name,
    ExecutionRoleArn = role,
    PrimaryContainer = primary_container)
print(create_model_response['ModelArn'])

После этого пора выбрать часть набора данных, которая будет использоваться для тестирования: в этом примере были выбраны ванны:

batch_input = 's3://{}/image-classification-full-training/test/'.format(bucket)
test_images = '/tmp/images/008.bathtub'
!aws s3 cp $test_images $batch_input --recursive --quiet

Теперь мы можем создать пакетное задание, чтобы передать все тестовые изображения в модель, которую нужно классифицировать.

timestamp = time.strftime('-%Y-%m-%d-%H-%M-%S', time.gmtime())
batch_job_name = "image-classification-model" + timestamp
request = \
{
    "TransformJobName": batch_job_name,
    "ModelName": model_name,
    "MaxConcurrentTransforms": 16,
    "MaxPayloadInMB": 6,
    "BatchStrategy": "SingleRecord",
    "TransformOutput": {
        "S3OutputPath": 's3://{}/{}/output'.format(bucket, batch_job_name)
    },
    "TransformInput": {
        "DataSource": {
            "S3DataSource": {
                "S3DataType": "S3Prefix",
                "S3Uri": batch_input
            }
        },
        "ContentType": "application/x-image",
        "SplitType": "None",
        "CompressionType": "None"
    },
    "TransformResources": {
            "InstanceType": "ml.p2.xlarge",
            "InstanceCount": 1
    }
}
sagemaker = boto3.client('sagemaker')
sagemaker.create_transform_job(**request)
print("Created Transform job with name: ", batch_job_name)
while(True):
    response = sagemaker.describe_transform_job(TransformJobName=batch_job_name)
    status = response['TransformJobStatus']
    if status == 'Completed':
        print("Transform job ended with status: " + status)
        break
    if status == 'Failed':
        message = response['FailureReason']
        print('Transform failed with the following error: {}'.format(message))
        raise Exception('Transform job failed') 
    time.sleep(30)

Создание пакетного задания запустит EC2 выбранного типа для классификации изображений. После завершения процесса мы можем проверить результаты: если бы при обучении использовались только две эпохи, очень мало изображений было бы правильно классифицировано.

Однако, если результат нас устраивает, мы можем создать конечную точку и, таким образом, развернуть модель:

from time import gmtime, strftime
job_name_prefix = "test"
timestamp = time.strftime('-%Y-%m-%d-%H-%M-%S', time.gmtime())
endpoint_config_name = job_name_prefix + '-epc-' + timestamp
endpoint_config_response = sage.create_endpoint_config(
    EndpointConfigName = endpoint_config_name,
    ProductionVariants=[{
        'InstanceType':'ml.m4.xlarge',
        'InitialInstanceCount':1,
        'ModelName':model_name,
        'VariantName':'AllTraffic'}])
timestamp = time.strftime('-%Y-%m-%d-%H-%M-%S', time.gmtime())
endpoint_name = job_name_prefix + '-ep-' + timestamp
print('Endpoint name: {}'.format(endpoint_name))
endpoint_params = {
    'EndpointName': endpoint_name,
    'EndpointConfigName': endpoint_config_name,
}
endpoint_response = sagemaker.create_endpoint(**endpoint_params)

После успешного создания конечной точки мы можем отправлять на нее изображения через HTTP с использованием пакетов SDK aws, например, с помощью python boto3.

Команда:

runtime.invoke_endpoint(EndpointName=endpoint_name, 
                                   ContentType='application/x-image', 
                                   Body=payload)

где

payload

это изображение.

Таким образом, эта конечная точка может использоваться как приложением, развернутым на AWS (например, функции Lambda, микросервисы докеров, работающие на Fargate, приложения, развернутые на EC2), так и приложениями, работающими локально или даже напрямую клиентами.

В заключение мы представили краткий обзор сервисов AWS Machine Learning и, в частности, мы сосредоточились на том, как развернуть простое приложение машинного обучения с помощью SageMaker. Если вам интересна эта тема или у вас есть вопросы свяжитесь с нами!

Подпишитесь на нас в Twitter 🐦 и Facebook 👥 и присоединитесь к нашей группе Facebook 💬 .

Чтобы присоединиться к нашему сообществу Slack 🗣️ и читать наши еженедельные темы о Фавнах 🗞️, нажмите здесь⬇

Если этот пост был полезен, пожалуйста, нажмите несколько раз кнопку хлопка 👏 ниже, чтобы выразить поддержку автору! ⬇