20111002 information retrieval raskovalov_lecture3

41
Современные методы увеличения производительности поиска Организация разработки в поиске Яндекса Яндекс Den Raskovalov [email protected] 2.10.2011

Upload: computer-science-club

Post on 15-Jun-2015

914 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 20111002 information retrieval raskovalov_lecture3

Современные методы увеличенияпроизводительности поиска

Организация разработкив поиске Яндекса

ЯндексDen Raskovalov

[email protected]

Page 2: 20111002 information retrieval raskovalov_lecture3

Базовый поиск

● Базовый поиск – это программа, которая по поисковому индексу умеет находить самые релевантные документы, строить сниппеты, возвращать дополнительную документную информацию.

● Индекс обычно содержит миллионы документов.

● Реализован, как HTTP-сервер (для отладки подходит браузер).

● В базовом поиске тратятся 95% всех ресурсов при обслуживании запроса.

● Стоимость кластера - десятки миллионов долларов. 1% производительности - сотни тысяч долларов.

Page 3: 20111002 information retrieval raskovalov_lecture3

Базовый поиск

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

● Форматы, используемые в индексе, рассчитаны на прямую совместимость с системой индексации.

● В разработке программы принимали/принимают участие ~500 программистов.

● Чтобы часто тестировать качество/скорость, нужно, чтобы это не требовало человеческих ресурсов.

● Профайлер – ваш лучший друг (vtune, valgrind, callgrind, kcachegrind).

● Некоторые оптимизации не меняют результаты поиска, некоторые – их немного ухудшают.

Page 4: 20111002 information retrieval raskovalov_lecture3
Page 5: 20111002 information retrieval raskovalov_lecture3

Базовый поиск: тестирование производительности

Page 6: 20111002 information retrieval raskovalov_lecture3

Оптимизации

● Сжатие инвертированного индекса

● Фильтрация

● Синтаксический колдунщик

● Pruning

● Fastrank

● Параллельное выполнение запроса

● Частичное выполнение MatrixNet'а

● Отсечение по времени выполнения запроса

● Использование SSEk инструкций процессора

● Кодогенерация

Page 7: 20111002 information retrieval raskovalov_lecture3
Page 8: 20111002 information retrieval raskovalov_lecture3
Page 9: 20111002 information retrieval raskovalov_lecture3
Page 10: 20111002 information retrieval raskovalov_lecture3
Page 11: 20111002 information retrieval raskovalov_lecture3

Сжатие инвертированного индекса

● Алгоритмы компрессии списка позиций хорошо работают для групп близких чисел.

● Хорошо бы, чтобы документы, содержащие слово, шли подряд.

● Решение? Отсортировать по url ;)

Page 12: 20111002 information retrieval raskovalov_lecture3

Фильтрация

● Пример оптимизации: часто документ не модет пройти фильтрацию, если в нем нет некоторых тяжелых слов:

∑qi∈D

w(qi)>Quorum(Q)⋅∑qi∈Q

w(qi)

Quorum(Q)=1−0.01(1/√(∣Q∣−1))

● Фактически внутри запроса появляются слова, которые связаны AND.● Когда мы итерируемся, если мы можем быстро узнать, какой документ следует за текущим, можно сразу идти на max(next_i)

Page 13: 20111002 information retrieval raskovalov_lecture3

Синтаксический колдунщик

● [скачать учебник философия для вузов платон и демокрит pdf djvu torrent]

● Можно написать алгоритм, который проанализирует синтаксическую согласованность групп слов внутри запроса

● [“скачать учебник” “философия для вузов” “платон и демокрит” “pdf” “djvu” “torrent”]

● Это уменьшит число найденных документов● Сейчас эта оптимизация не используется, как

сильно ухудшающая качество поиска

Page 14: 20111002 information retrieval raskovalov_lecture3

Pruning

● Pruning – раннее отсечение запроса

● Если мы нашли 40000 документов, то мы обрываем поиск.

● Хорошо бы, чтобы хорошие документы были в самом начале.

● Пусть качество == вероятность показа

● Как же быть с эффективностью сжатия индекса?

● Разобьем на 16 групп по качеству, внутри каждой отсортируем по URL'у.

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

Page 15: 20111002 information retrieval raskovalov_lecture3

Fastrank

● Фичей очень много● MatrixNet содержит множество деревьев.● Что же делать?● Нам нужно вернусть обычно лишь 10 лучших

результатов.● Давайте выделим “легкие” фичи, подберем

“легкую” функцию ранжирования.

Page 16: 20111002 information retrieval raskovalov_lecture3

Fastrank

if (CurrentDocument.FastRank > FastRankHeap.Min() || FastRankHeap.Size() < 300) {

if (FastRankHeap.Size() >= 300)

FastRankHeap.Pop();

FastRankHeap.Push(CurrentDocument.FastRank);

PositionCache.Memorize(CurrentDocument);

}

Page 17: 20111002 information retrieval raskovalov_lecture3

EarlyRank

● Та же идея, только будем оперировать только наличием/отсутствием слов в тексте/ссылках.

● Будем экономить на чтении и распаковке позиций в инвертированном индексе.

Page 18: 20111002 information retrieval raskovalov_lecture3

Параллельное выполнение запроса

● В типовом современном серверном процессоре 24 ядра.

● Исполнение одного запроса в несколько тредов не увеличиваем емкость (количество запросов, которые можно выполнить за секунду). И даже уменьшает (расходы на слияние).

● Зато позволяет увеличить латентность (среднее время выполнения запроса).

● Можно распараллелить, разбив документы на несколько виртуальных интервалов.

● Можно распараллелить лишь некоторые стадии (после fastrank'а).

● Легкие запросы нет смысла распараллеливать (можно оценить “легкость” прямо во время выполнения запроса).

Page 19: 20111002 information retrieval raskovalov_lecture3
Page 20: 20111002 information retrieval raskovalov_lecture3

Частичое выполнение MatrixNet'а

● Результирующая ”формула” MatrixNet'а состоит из тысяч деревьев, каждое из которых дает небольшой вклад в итоговую релевантность. Нет малого числа “очень важных” деревьев.

● Это позволяет применить привычный прием.

● Если базовому поиску нужно вернуть 10 лучших документов, давайте для 300 документов после FastRank посчитаем 1/10 деревьев MatrixNet. И лишь для 30 лучших по “легкому MatrixNet” посчитаем “полный” MatrixNet.

Page 21: 20111002 information retrieval raskovalov_lecture3

SSE и кодогенерация

● SSE позволяет выполнить одну и ту же операцию (например, сложение, умножение) с векторами из 4/8/16 чисел.

● Именно это и нужно. Можно реорганизовать код так, чтобы вычислять формулы релевантности для “пачек” из 4/8 документов.

Page 22: 20111002 information retrieval raskovalov_lecture3

Кодогенерация

● Многие данные (формулы) удобнее превратить в код на этапе компиляции.

● Он должен помещаться в кэш комманд процессора.

● Удобно использовать шаблоны C++, для явных указаний, какой вариант чаще всего будет использоваться в production (условные дампы).

Page 23: 20111002 information retrieval raskovalov_lecture3
Page 24: 20111002 information retrieval raskovalov_lecture3

Отсечение по времени выполнения запроса

● Хорошо бы, чтобы базовый поиск отвечал всегда за 200ms. Такое ограничение может проистекать из требования, чтобы пользователь всегда получал ответ за 1s.

● Просто ограничить время выполнения запроса на одной машине нельзя? Почему?

● Давайте в процессе исполнения запроса накапливать счетчики:● Число скипов

● Число обработанных позиций

● Число найденных документов

● ...

● Построим регрессионную формулу, предсказывающую время выполнения запроса по внутренним статистикам.

● Если формула предсказывает, что мы работаем уже больше 200ms, прервем поиск.

Page 25: 20111002 information retrieval raskovalov_lecture3

Вопросы?

Page 26: 20111002 information retrieval raskovalov_lecture3

Организация разработки

● Единый репозитарий для всех поисковых проектов.

● Статическая линковка (no dll hell).● Все внешние библиотеки лежат в дереве,

собираются с каждой программой.● Кросплатформенность (linux, freebsd,

windows, mac os, solaris (?) ).● Нет навязываемой IDE (vim, emacs, Eclipse,

Microsoft Visual Studio, NetBeans).

Page 27: 20111002 information retrieval raskovalov_lecture3

Организация разработки

● Своя система описания сборки, построенная над cmake

Page 28: 20111002 information retrieval raskovalov_lecture3

Организация разработки

● Единый инструмент production-операций

● Выполнение на пуле машин● Заведомо одинаковая, оторванная от разрабочтика, среда выполнения

Page 29: 20111002 information retrieval raskovalov_lecture3

Организация разработки

● Система автосборки проверяет собираемость всего дерева почти на каждый коммит.

● Сломавшие сборку мгновенно об этом уведомляются по почте.

● Также часто централизованно запускаются unit-тесты.

● Делается не только для trunk, но и для стабильных веток.

● Любой сложный алгоритм сопровождается viewer'ом (открытость алгоритмов и данных помогает находить ошибки).

Page 30: 20111002 information retrieval raskovalov_lecture3

Организация релизов

● Для хранения кода используется svn.

● Поиск условно поделен на несколько компонентов.

● Каждая компонента имеет свой цикл релизов от trunk. Релиз – ветка в репозитарии. На каждый выложенный бинарник создается тэг (trunk – pre-stable-19 - stable-19-8)

● Между компонентами стараемся использовать расширяемые протоколы (новое просто не используестя). Google Protobuf хорош для этих целей.

● У каждой компоненты есть релиз-инженер(ы).

● Многие компоненты имеют свои системы тестирования (acceptance-тесты у SERP'а, регресионное тестирование у базового и индексатора).

Page 31: 20111002 information retrieval raskovalov_lecture3

Организация релизов

● Любое выкатывание можно откатить.● Для каждой компоненты есть график релизов.

Мини-релиз на каждое изменение (независимость и контролируемость).

● Каждый может легко узнать, из чего сейчас состоит production.

● Когда возможно, релиз выкатывается сначала лишь на часть машин.

● Код – разработчики, ответственность – релиз-инженеры/релиз-менеджеры, выкатка и эксплуатация – системные администраторы.

Page 32: 20111002 information retrieval raskovalov_lecture3

Code Review

● Code Review нужен для контроля качества кода, информирования и согласования с ответственными изменений, обучения разработчиков, избежания создания “велосипедов”.

● Используется Review Board от Google.● Для некоторые компонентов/веток Code

Review обязателен.

Page 33: 20111002 information retrieval raskovalov_lecture3
Page 34: 20111002 information retrieval raskovalov_lecture3
Page 35: 20111002 information retrieval raskovalov_lecture3

Инструменты

● SVN● JIRA (планирование)● Свой баг-трекер● ReviewBoard● Своя система автосборки и тестирования● Все системы самостоятельно “провязаны”

Page 36: 20111002 information retrieval raskovalov_lecture3

Тестирование

● Регулярно централизованно запускаются юнит-тесты.

● Своя система тестирования для каждого компонента.

● Каждое изменение, которое выкатывается в production, тестируется на производительность и влияние на качества поиска (часто в эксперименте на части пользователей).

● Тестируются на качество/производительность большие обновления данных.

● Много мониторингов production-процессов (самые нужные в real-time).

● Иногда кластер для тестирования совпадает по размерам с основным.

Page 37: 20111002 information retrieval raskovalov_lecture3
Page 38: 20111002 information retrieval raskovalov_lecture3

Вопросы?

Page 39: 20111002 information retrieval raskovalov_lecture3

Вопросы и задачи по курсу

● Поисковый индекс разделен по документам, а не по словам (часть слов на одной машине, часть слов – на другой). Почему?

● Почему Яндексу нужны две разные системы построения индекса: batch и real-time?

● Зачем нужно кэшировать поисковые результаты?

● Почему поиск по кусочку индекса занимает 20ms, а параллельный поиск по тысяче кусочков 500ms?

● Зачем нужна стадия фильтрации при поиске? Ведь можно все задачи решить за счет ранжирования?

● Предложите 3-4 признака (фичи), которые могут помочь отличить релевантные документы от нерелевантных (кроме уже упомянутых в течении курса :) )

Page 40: 20111002 information retrieval raskovalov_lecture3

Вопросы и задачи по курсу

● Зачем нужен прюнинг, если есть механизм отсечения по времени выполнения запроса?

● [доп] Напишите простого робота, который способен обнаружить миллион URL'ов в Интернете.

● [доп] Есть эвристический закон, характеризующий распределение слов естественного языка по частоте – закон Ципфа (http://en.wikipedia.org/wiki/Zipf%27s_law). С помощью корпуса из предыдущей задачи (или иного большого) экспериментально определите показатель степени в формуле.

Page 41: 20111002 information retrieval raskovalov_lecture3

Спасибо.

Вопросы?