Производственное машинное обучение - это больше, чем просто алгоритмы

На данный момент никого не должно удивлять, что Python является самым популярным языком для проектов машинного обучения. Хотя у таких языков, как R, C ++ и Julia есть свои сторонники и варианты использования, Python остается наиболее широко распространенным языком, который используется во всех основных фреймворках машинного обучения.

Так что, естественно, наша кодовая база в Cortex - платформе с открытым исходным кодом для развертывания моделей машинного обучения в виде API - составляет 87,5% Go.

Алгоритмы машинного обучения, в которых Python сияет, являются лишь одним из компонентов производственной системы машинного обучения. Чтобы действительно масштабировать производственный API машинного обучения, вам нужна инфраструктура, которая реализует такие функции, как:

  • Автомасштабирование, чтобы колебания трафика не нарушали работу вашего API.
  • Управление API для одновременного развертывания API
  • Постоянные обновления, чтобы вы могли обновлять модели, продолжая обслуживать пользователей

Cortex создан для автоматизации всей этой инфраструктуры, наряду с другими проблемами, такими как ведение журналов и оптимизация затрат.

Go идеально подходит для создания программного обеспечения с учетом этих соображений по нескольким причинам:

1. Параллелизм имеет решающее значение для инфраструктуры машинного обучения.

У пользователя может быть множество различных моделей, развернутых как отдельные API, все управляемые в одном кластере Cortex. Чтобы оператор Cortex мог управлять этими различными развертываниями, ему необходимо обработать несколько разных API. Чтобы назвать пару:

  • API Kubernetes, которые Cortex вызывает для развертывания моделей в кластере.
  • Различные API-интерфейсы AWS - EC2 Auto Scaling, S3, CloudWatch и другие, - которые Cortex вызывает для управления развертыванием на AWS.

Пользователь не взаимодействует напрямую ни с одним из этих API. Вместо этого Cortex программно вызывает эти API для подготовки кластеров, запуска развертываний и мониторинга API.

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

В Go есть элегантное готовое решение этой проблемы: горутины.

В остальном горутины - это обычные функции, которые Go выполняет одновременно. Мы могли бы написать целую статью о том, как горутины работают под капотом, но на высоком уровне горутины - это легкие потоки, автоматически управляемые средой выполнения Go. Многие горутины могут уместиться в одном потоке ОС, и если горутин блокирует поток ОС, среда выполнения Go автоматически перемещает остальные горутины в новый поток ОС.

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

Реализовать все эти функции в Python можно с помощью новейших инструментов, таких как asyncio, но тот факт, что Go разработан с учетом этого варианта использования, значительно упрощает нашу жизнь.

2. Создать кроссплатформенный интерфейс командной строки на Go проще.

Cortex CLI - это кроссплатформенный инструмент, который позволяет пользователям развертывать модели и управлять API непосредственно из командной строки. На GIF-изображении ниже показан интерфейс командной строки в действии:

Первоначально мы писали интерфейс командной строки на Python, но попытка распространить его по платформам оказалась слишком сложной. Поскольку Go компилируется в единый двоичный файл - управление зависимостями не требуется - он предлагает нам простое решение для распределения нашего интерфейса командной строки между платформами без особых дополнительных инженерных усилий.

Преимущества производительности скомпилированного двоичного кода Go по сравнению с интерпретируемым языком также значительны. Согласно компьютерным тестам, Go разительно быстрее Python.

Возможно, не случайно, что многие другие инструменты интерфейса командной строки инфраструктуры написаны на Go, что подводит нас к следующему пункту.

3. Экосистема Go отлично подходит для инфраструктурных проектов.

Одним из преимуществ открытого исходного кода является то, что вы можете учиться на проектах, которыми вы восхищаетесь. Например, Cortex существует в экосистеме Kubernetes (которая сама написана на Go). Нам посчастливилось иметь в этой экосистеме ряд замечательных проектов с открытым исходным кодом, на которых можно было поучиться, в том числе:

  • kubectl: интерфейс командной строки Kubernetes.
  • minikube: инструмент для локального запуска Kubernetes.
  • helm: менеджер пакетов Kubernetes.
  • kops: инструмент для управления производством Kubernetes.
  • eksctl: официальный интерфейс командной строки для Amazon EKS.

Все вышеперечисленное написано на Go - и это не только проекты Kubernetes. Если вы смотрите на инфраструктурные проекты CockroachDB или Hashicorp, включая Vault, Nomad, Terraform, Consul и Packer, все они написаны на Go.

Популярность Go в мире инфраструктуры имеет еще один эффект, заключающийся в том, что большинство инженеров, заинтересованных в работе с инфраструктурой, знакомы с Go. Это упрощает привлечение инженеров. Фактически, один из лучших инженеров Cortex Labs нашел нас, выполнив поиск вакансий Go в AngelList, и нам повезло, что он нашел нас.

4. Работать с Go - одно удовольствие.

И последнее замечание о том, почему мы в конечном итоге создали Cortex на Go, заключается в том, что Go просто хорош.

По сравнению с Python, начать с Go немного сложнее. Однако неумолимая природа Go делает его такой радостью для крупных проектов. Мы по-прежнему тщательно тестируем наше программное обеспечение, но статическая типизация и компиляция - две вещи, которые делают Go немного менее удобным для новичков - действуют для нас как своего рода ограждение, помогая нам писать (относительно) безошибочный код.

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

Python для машинного обучения, Go для инфраструктуры

Мы по-прежнему любим Python, и он имеет свое место в Cortex, особенно в области обработки логических выводов.

Cortex обслуживает TensorFlow, PyTorch, scikit-learn и другие модели Python, что означает, что взаимодействие с моделями, а также обработка до и после вывода выполняется на Python. Однако даже этот код Python упакован в контейнеры Docker, которые управляются кодом, написанным на Go.

Если вы хотите стать инженером по машинному обучению, знание Python более или менее не подлежит обсуждению. Однако если вы заинтересованы в разработке инфраструктуры машинного обучения, вам следует серьезно подумать об использовании Go.

Инженер, интересующийся Go и машинным обучением? Если да, подумайте о том, чтобы внести свой вклад в Cortex!