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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 Slide

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

    View Slide

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

    View Slide