Исследования для специалистов по данным и инженеров машинного обучения

Ускоренный курс системного проектирования для инженеров машинного обучения

Фундаментальные системные проекты для повышения вашей карьеры

Постановка задачи

В крупных технологических компаниях запуск моделей машинного обучения сложен. Каждая модель машинного обучения, которую вы запускаете, будет переплетена с несколькими сложными системами. На практике вам нужно будет понимать, что бесплатных обедов не бывает, и различные ML-решения нужно адаптировать под сложность системы с учетом.

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

В этой статье я хотел бы рассказать об основах проектирования систем, основанных на моих знаниях за четыре года работы в крупных технологических компаниях. Этот ускоренный курс предназначен для объяснения самых простых систем, на которые часто полагаются крупные технологические компании.

Я считаю, что эта статья поможет вам добиться 10-кратного влияния на работу и хорошо показать себя на собеседованиях по проектированию систем.

Оглавление

  • Основы понимания систем
  • Клиент — серверная архитектура
  • айпи адрес
  • Сетевые протоколы
  • Хранилище
  • Задержка
  • Доступность
  • Одноранговая сеть
  • Опрос и потоковая передача
  • Ограничение скорости
  • Публикация и подписка (PubSub)
  • Что дальше

Основы понимания систем

Клиент — серверная архитектура:

Когда Alibaba говорит, Сезам, откройся! в бескрайнее море интернета

  • Клиент – это машина, которая взаимодействует с сервером.
  • Сервер — это машина, которая слушает клиента и затем отвечает.

Например, когда вы просматриваете google.com с помощью веб-браузеров. Ваш веб-браузер не отображает google.com волшебным образом, а вместо этого связывается с сервером google.com, чтобы понять, что должно быть отображено. Ваш веб-браузер (например, Google Chrome) является клиентом, а google.comсервером, отвечающим на ваш запрос.

У каждого клиента и сервера есть IP-адрес, который обозначает уникальный идентификатор каждой машины. Это определяется 32-битным (IPV 4) или 128-битным (IPV 6), например 127.0.0.1 (localhost). Например, у google.com есть IP-адрес (8.8.8.8 / 8.8.4.4), который можно узнать с помощью dig <address> в командах сервера UNIX или установить команду dig в Windows.

Сопоставление имен хостов с IP-адресами хранится на промежуточном сервере под названием Система доменных имен (DNS), подобно желтым страницам. Например, когда вы просматриваете google.com, вы вводите google.com, а не IP-адрес.

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

Вы можете запустить nc -l 8081, который позволяет вам читать и записывать или указывать сервер с нотацией nc <IP address/localhost> <port>as nc 127.0.0.1 8081 . Это укажет, что означает отправка данных и прослушивание порта. В большинстве случаев 127.0.0.1 обозначает локальный хост, который является вашим текущим локальным адресом компьютера.

IP-адрес

Я дарю вам 8.8.8.8, поскольку Google с гордостью принимает

Короче говоря, IP-адрес — это интернет-протокол для адреса. Когда машина взаимодействует с другими машинами. Данные будут отправлены в IP-пакете, который создает блоки связи между машинами.

Обычно IP содержит заголовок и контент, который лучше всего иллюстрируется следующим образом:

Сетевые протоколы

Как машины общаются друг с другом

Сетевые протоколы — это правила, согласованные между двумя или более компьютерами для связи.

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

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

Как правило, мы используем TCP и HTTP в качестве общих сетевых протоколов:

  • Протокол управления передачей (TCP) позволяет отправлять произвольные длинные фрагменты данных, отслеживая порядок и точность пакета. Если содержимое пакета данных повреждено. TCP попросит сервер повторно отправить пакет.
  • Защищенный протокол передачи гипертекста (HTTP)добавляет структуры к соглашениям TCP на конечных точках, такие как код состояния, методы, бизнес-логика (исключения/ошибки). Это делает связь в сети (например, в Интернете) надежной и удобной в обслуживании. Он обозначает сообщения с HTTP-заголовком и содержимым. Простое сообщение с HTTP может быть показано следующим образом:
method:’POST’
path: ‘/submit’
headers: {
   'content-type': 'application/json',
   'content-length': 30
} 
statusCode: 200
headers:{
},body: '{}
}

Хранилище

То, что вы храните, делает вас тем, кто вы есть

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

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

Задержка

Как долго данные проходят через систему?

Задержка измеряется временем, которое требуется клиенту для чтения данных или получения ответа от сервера.

Задержка очень важна в системах, где важна обратная связь почти в реальном времени, например, в киберспортивных соревнованиях или высокочастотном трейдинге.

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

В целом задержка увеличивается в зависимости от расстояния между клиентом и сервером и типа хранилища:

  • Чтение 1 МБ памяти = 250 микросекунд
  • Чтение 1 МБ SSD = 1000 микросекунд
  • Отправка 1 МБ по сети 1 Гбит/с = 10 000 микросекунд
  • Отправить 1 МБ на жесткий диск = 20 000 микросекунд
  • Пакет CA → NL → CA = 150 000 микросекунд

Доступность

No More Outage, чтобы нанести вред экономике (AWS Outages)

Доступность объясняет, насколько система устойчива к сбоям (отказоустойчивость).

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

  • Диспетчерская вышка аэропорта, где самолеты ориентируются на направления для координации при посадке.
  • Приложения для совместного использования (например, Uber, Gojek, Grab), на которые пользователи полагаются в качестве транспорта для поздней ночи после выпивки в барах?
  • Поставщики облачных услуг (например, Google Cloud Product, AWS), на которых полагаются миллионы компаний для обслуживания своего основного бизнеса (например, Vimeo)

В целом доступность можно измерить следующим образом:

Доступность (%) = количество дней безотказной работы системы / количество дней в году

Например, если система только на пол года, то доступность будет 50%. Если приложение для совместного использования будет доступно только в половине случаев, то оно никогда не выживет на рынке.

Подсчет девяток

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

В целом, крупные технологические компании гарантируют 4 девятки как золотой стандарт своих услуг. Система, которая достигает 4 девяток, называется высокодоступной (HA) системой. Облачные провайдеры (GCP, Amazon) имеют минимальные требования HA в своем соглашении об уровне обслуживания (SLA).

Вот почему крупным технологическим компаниям необходимо нанимать талантливых инженеров по надежности и инженеров по devops, чтобы гарантировать высокие стандарты доступности. Без них у нас не было бы надежных услуг, которые мы обычно воспринимаем как должное!

Резервирование для повышения доступности

Избыточность проста, мы хотим убедиться, что наша система не имеет единой точки отказа, выделяя больше серверов.

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

  • Пассивное резервирование, состоящее из нескольких компонентов для бесперебойной работы. Например, если один сервер Netflix не работает, у нас есть другие серверы, которые берут на себя полезную нагрузку.
  • Активная избыточность, формирующая структуру, в которой несколько систем могут координировать свои действия в случае сбоев в распределенных системах. Одним из распространенных методов автоматизированной оркестровки являются выборы лидеров.

Одноранговая сеть

Развертывание и передача больших файлов на огромное количество машин

Одноранговая сеть — это совокупность компьютеров (например, в системе распространения файлов), которые распределяют рабочую нагрузку между собой, чтобы выполнять ее быстрее.

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

Протокол сплетен

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

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

Еще один популярный широко известный пример — Kraken by Uber, который раздает 1 млн блобов в день. Я настоятельно рекомендую вам прочитать это.

Наш самый загруженный рабочий кластер Kraken распространяет более 1 миллиона больших двоичных объектов в день, при этом 100 000 ежедневных распределений имеют общий размер 1 ГБ или более. Кроме того, при максимальной производительности Kraken позволяет распространять 20 000 больших двоичных объектов размером от 100 МБ до 1 ГБ менее чем за 30 секунд. — Кракен сайт

Голосование и потоковая передача

Слушай и ты найдешь ответ

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

Чтобы проиллюстрировать опрос и потоковую передачу, давайте представим сервер чата.

Опрос: давайте прослушаем любое сообщение через каждые 10 минут.

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

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

Опрос лучше подходит для случаев с фиксированными интервалами для получения такой информации, как ежедневные/еженедельные/ежемесячные отчеты.

Конфигурация (файл конфигурации)

Одна остановка, чтобы контролировать все

Файл конфигурации (config) содержит набор параметров и констант, критически важных для системы. Обычно он пишется в JSON или YAML и может быть либо статическим (жестко запрограммированным), либо динамическим (живет вне кода системного приложения).

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

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

Ограничение скорости

Затем мой отец сел рядом с ним, обнял моего брата за плечо и сказал: Птица за птицей, приятель. Просто бери птицу за птицей. — Энн Ламотт, Птица за птицей

Ограничение скорости ограничивает количество запросов, отправляемых в систему или из системы. Чаще всего он используется для ограничения количества входящих запросов с целью предотвращения спама и атак типа «отказ в обслуживании» (DoS), когда злоумышленник пытается вывести из строя или повредить систему, чтобы сделать ее недоступной для пользователей.

Ограничение скорости может быть применено на уровне IP-адреса, на уровне учетной записи пользователя или на уровне региона и реализовано на таких уровнях, как 1 запрос в 1 секунду или даже 5 запросов в 10 секунд для каждого клиента. Простой способ реализовать ограничение скорости — Redis (хранилище ключей и значений в памяти).

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

Регистрация и мониторинг

Записывайте все важное!

Ведение журнала

Ведение журнала записывает важные показатели в каждой системе.

Полезно хранить системные журналы, такие как ошибки, для отладки будущих проблем. Вы можете хранить журналы в формате JSON и хранить их в базе данных (например, Google StackDriver).

Мониторинг

Мониторинг использует журналы для более простого управления системой.

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

  • На сколько больше покупок по сравнению с лучшими рекомендациями?
  • Какие типы книг потребители покупают по рекомендациям

Мониторинг измеряет данные с течением времени, чтобы вы знали, что важно. Я выпустил учебник по Google Data Studio, который вы можете использовать прямо сейчас, чтобы создать потрясающий дашборд бесплатно. Вы также можете использовать такие инструменты, как Prometheus, Influx DB и Grafana, для создания диаграмм с системами оповещения.

Опубликовать Подписаться (PubSub)

Распространяйте и получайте информацию в темах

Публикация, подписка (Pubsub) — это системная структура для разработки передачи большой контекстной информации нужным клиентам/промежуточным серверам. В общем, в каждой системе PubSub есть четыре важных объекта: 1) Издатели, 2) Подписчики, 3) Темы, 4) Сообщение.

На этой диаграмме показан простой дизайн pubsub:

  • Издатели публикуют сообщения в тему
  • Каждая тема будет хранить сообщения в очередях в постоянных хранилищах и сохранять порядок сообщений. Каждая тема обеспечивает различное контекстуальное понимание сообщений.
  • После активации подписчики извлекают сообщения из тем, на которые подписаны. Это означает, что подписчик 1 будет получать сообщения по обеим темам, тогда как подписчики 2 и 3 будут получать сообщения только по разработке программного обеспечения.
  • Кроме того, поскольку тема хранится в постоянных хранилищах, вам гарантируется, что сообщения будут разосланы подписчикам.
  • Хранение сообщений в очередях также будет означать, что подписчики будут получать одни и те же сообщения независимо от того, сколько раз это выполняется. Это означает, что системы pubsub являются идемпотентными (всегда одинаковые результаты).

Существует множество инструментов, которые могут помочь вам создать системы pubsub, такие как: Apache Kafka, Google Cloud Pubsub.

Что дальше

Для лучшего понимания того, как отточить свои навыки системного проектирования, я настоятельно рекомендую вам ознакомиться с Учебником по системному дизайну Донна Мартина. Он включает в себя другие концепции, не рассмотренные здесь, например: уменьшение карты, дизайн API и т. д.

Если вы хотите узнать больше о программной инженерии, интервью и профориентации, пожалуйста, посетите мой следующий пост или свяжитесь со мной в Linkedin:









Благодарим Альберта Бингей за отзывы, прочтение и интересные отзывы об этой статье.

Соли Део Глория

об авторе

Винсент борется со злоупотреблениями в Интернете с помощью ML @ Google. Винсент использует расширенную аналитику данных, машинное обучение и разработку программного обеспечения для защиты пользователей Chrome и Gmail.

Помимо своей работы в Google, Винсент также является выпускником Технологического института Джорджии CS MSc, триатлетом и избранным автором для Towards Data Science Medium, который помогает начинающим специалистам по машинному обучению и данным с более чем 1 миллионом зрителей по всему миру.

Наконец, свяжитесь с Винсентом через LinkedIn, Medium или Youtube Channel.