Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2019. Антон Кочепасов (Rambus) — Как считать на питоне быстрее, чем на C++

CodeFest
April 11, 2019

CodeFest 2019. Антон Кочепасов (Rambus) — Как считать на питоне быстрее, чем на C++

Сравнение скорости разработки и исполнения программ на языках С++ и python на примере развития проекта статистического анализа сигналов за последние несколько лет.

В докладе расскажу, как статистические вычисления были реконструированы от сложного, большого проекта на C++ со множеством низкоуровневых оптимизаций до простого кода на python, который оказался в 5 раз меньше по размеру и в 10 раз быстрее. Как не стать жертвой роста сложности, успеть распознать проблему вовремя и что делать для улучшения ситуации.

Упоминаются: C++, python, cython, numpy, MKL.

CodeFest

April 11, 2019
Tweet

More Decks by CodeFest

Other Decks in Technology

Transcript

  1. Как считать на Питоне
    быстрее, чем на C++
    Или простота неэффективности
    против эффективной мощности
    Антон Кочепасов Principal Engineer Rambus

    View full-size slide

  2. Антон Кочепасов
    20 лет опыта в индустрии
    В данный момент
    Principal Engineer
    [email protected]
    [email protected]
    2

    View full-size slide

  3. О чем история?
    О неэффективности
    О простоте
    Об общении с пользователями
    Об использовании правильных инструментов
    3

    View full-size slide

  4. → Восстанавливает ключ шифрования
    ← Защищает от подобного взлома
    • Открыта в Cryptography Research
    в середине 90х
    • Лицензирована многими компаниями заинтересованными в
    сохранении секретов
    4
    Атака по побочным каналам

    View full-size slide

  5. • Использует побочные эффекты
    процесса шифрования:
    • потребление энергии
    • ЭМ излучение
    • температура
    • звук
    5
    Атака по побочным каналам
    (продолжение)

    View full-size slide

  6. Атака по побочным каналам
    (разбиения)
    128 разбиений для одного промежуточного раунда
    256 разбиений для каждого байта в S-блокеблоке
    Тысячи разбиений данных в одном полном анализе
    6
    <4.5

    View full-size slide

  7. Что это сейчас было?
    Стат-блокеанализ многократного переразбиения данных для того, чтобы
    отличить два разных бита исходного текста хотя бы в одной точке.
    Примерный объем данных для небольшой атаки на одно незащищенное
    устройство:
    100тыс точек * 1тыс следов * 8 байт * 4096 разбиения ≈ 3 TB
    7

    View full-size slide

  8. Основные этапы работы аналитика
    • Сбор электромагнитных следов (часы/дни)
    • Эффективное использование устройства и осциллоскопа
    • Повышение отношения сигнал/шум
    • Сотни гигабайт / терабайты
    • Статистическая обработка
    • Кеширование решений
    • Ограничение области вычислений
    • Численно-нестабильные алгоритмы
    8

    View full-size slide

  9. Реализация
    «...Любой мало-блокемальски сложный performance-блокеcritical код пишется
    на C++» (© просторы интернета)
    Весь код для сбора и обработки – C++.
    Писали и оптимизировали более 20 лет.
    9

    View full-size slide

  10. Размышления об улучшении
    • Параллелизация ввода-блокевывода и вычислений
    • SIMD intrinsics (SSE, AVX)
    • NUMA
    • OpenMP
    • Datacenter
    • Прочие красивые акронимы
    • Неделя чтения и изменения кода ни к чему не привела
    10

    View full-size slide

  11. Причины неудачи
    Очень сложный код
    • Кеширование
    • Шаблоны
    • Ассемблерные вставки
    • Несогласованные наименования
    • ...
    Коллеги: «Это решение специального случая с помощью высоко-блоке
    оптимизированного кода. Этот код писал гений и улучшали неглупые люди.
    Такое трудно понять быстро.»
    11

    View full-size slide

  12. Что бы сказал Эрик Липперт
    “If you don't understand why you're writing some code, either figure it out, or write
    different code that you do understand.” *
    * Eric Lippert – разработчик языка C#. Цитата со StackOverflow:
    https://stackoverflow.com/questions/21692193/why-блокеnot-блокеinherit-блокеfrom-блокеlistt/21694054#comment32799488_21694054
    12

    View full-size slide

  13. Попытка разобраться в задаче
    Общение с аналитиками
    Неэффективная, простая, модульная реализация на питоне
    Готовые компоненты:
    numpy, scipy
    Юнит тестирование критических участков вычисления
    “Бесплатно”
    Во время ожидания сбора сигнала
    13
    foo bar baz

    View full-size slide

  14. Результаты
    Медленнее в разы
    Коллеги: «Это же Питон»
    14

    View full-size slide

  15. Через долину отчаяния…
    Побочные эффекты
    Модульность
    Простота
    21й век
    «Все уже придумано до нас»
    Поиск существующих решений и библиотек
    Научные и индустриальные статьи
    60е: Kahan, Welford, …
    00e и 10е: Choi, Sweetman, Pebai, Terriberry, …
    Все еще “бесплатно” – во время сбора сигнала
    15

    View full-size slide

  16. … К склону просветления
    Максимально простой инкапсулированный код
    Итеративные методы из статей
    Возможность вычислений в памяти (без дискового ввода-блокевывода)
    Кеширующие оптимизации из C++ кода
    Библиотеки прекомпиляции в C код:
    Numba
    Cython (выбран)выбран)
    Встроенный бенчмарк и метрики производительности
    16

    View full-size slide

  17. Результаты
    Заметно медленнее почти во всех случаях
    Коллеги: «Это же Питон»
    Пара аналитиков: «Мне нравится этот вычислитель. Можешь добавить еще вот
    такую функциональность?»
    17

    View full-size slide

  18. Подъем по склону
    Модульное решение позволяет легко поставить задачу, проконтролировать
    выполнение и оттестировать каждый блок. Cython позволяет переносить
    критические участки на C и подключать любую нативную библиотеку.
    Задача для стажера:
    • Использование BLAS из scipy.linalg для алгебраических вычислений
    • Реализация BLAS в Anaconda: Math Kernel Library (Intel MKL)
    • Оптимизация размера кеширующих хешей для одномерных случаев
    • Перенос одномерного итеративного подхода на двумерные статистики и
    корреляции
    18

    View full-size slide

  19. Результаты
    Вычисления реализованы маленькими простыми блоками в cython с
    использованием BLAS.
    Схожая одномерная производительность**. Двумерные статистики - от 10х.
    Коллеги: «Это же П... Погоди, а как мерил?»
    Аналитики: «Мне очень нравится! Можешь добавить еще вот такую
    функциональность? А такую?»
    Технический директор: «Есть прототип будущей системы. Можешь сделать
    библиотеку потокового анализа?» ─ «Библиотека уже готова.»
    ** Кроме чтения с диска очень коротких следов
    19

    View full-size slide

  20. Дальше, дальше, дальше...
    Обсуждение деталей со стажером:
    • Упрощение вычисления двумерного случая и улучшение использованием
    памяти через умножение матриц (BLAS DSYRK)
    • Адаптация подхода из двумерных статистик для корреляций и одномерного
    случая (BLAS DGEMM)
    20

    View full-size slide

  21. Результаты
    Одномерные статистики быстрее до 10х* **. Двумерные – до 1000х.
    Потоковые вычисления работают итеративно со скоростью сбора
    следов, масштабируются под вычисления на одной машине. В 5 раз
    меньше строк кода. 2 патента.
    Коллеги: «Мы можем улучшить текущий код C++, но это будет сложно. И долго.»
    Аналитики: «Мы забросили старый подход. На Linux можно перенести?» ─ «Уже
    готово.»
    Продажники: «Требуем прототип системы анализа, пусть даже сырой.»
    CEO: «Чем вы пожертвовали для такого улучшения?»
    * В cython модуле с использованием numpy, scipy слинкованными с Intel MKL (Anaconda)
    ** Кроме чтения с диска очень коротких следов
    21

    View full-size slide

  22. Почему так получилось?
    • Обратная связь от пользователей
    • Широкий взгляд на задачу
    • Управление сложностью
    • Простота важнее эффективности
    • Модульность
    • Исследование существующих подходов
    • Использование правильных готовых инструментов
    22

    View full-size slide

  23. Что говорит Майкл Джексон
    Two rules in the matter of optimization:
    Rule 1: Don't do it.
    Rule 2 (for experts only). Don't do it yet -блоке that is, not until you have a perfectly
    clear and unoptimized solution.
    © Michael A. Jackson. Principles of Program Design, Academic Press, 1975
    23

    View full-size slide

  24. Следующие шаги в проекте
    24
    • Создание оптимального генератора разбиений для разных видов анализа

    View full-size slide

  25. @akss_nsk
    Anton Kochepasov Principal Engineer Rambus
    Вопросы?
    a.kochepasov
    [email protected]

    View full-size slide