Производственное машинное обучение - это больше, чем просто алгоритмы
На данный момент никого не должно удивлять, что 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!