“Распределенные” вычисления на мобильных платформах. Зачем еще нужен “металический” фреймворк iOS Денис Свинарчук
https://github.com/dnevera/highload2016
• HLParallelSorting - битоническая сортировка на GPU и генератор случайных чисел
• HLMoexStatistic - работа со структурированными не графическими данными на примере обезличенных сделок MOEX
• HLCNNDigitalRecognition - пример распознавания рукописных цифр от 0-9 на примере размеченных данных для CNN MNIST
2016• Современные вычисления: ещё, ещё больше узлов, ещё больше кластеров, ещё больше облачных сервисов
Ещё, ещё больше вычислений
Ещё, ещё больше узлов
Ещё, ещё больше связности
Ещё, ещё больше ящиков
2016• Современные вычисления: ещё, ещё больше узлов, ещё больше кластеров, ещё больше облачных сервисов
• Современные клиенты: мобильники с мощными ускорителями вычислений. Почему они простаивают?
2016• Современные вычисления: ещё, ещё больше узлов, ещё больше кластеров, ещё больше облачных сервисов
• Современные клиенты: мобильники с мощными ускорителями вычислений. Почему они простаивают?
• Почему вычислять на клиентах хорошо. Почему иногда плохо. Что можно сделать?
Мобильники с мощными ускорителями• Любой современный смартфон мощнее любого PC — первого спирального витка эпохи “толстых клиентов”
Мобильники с мощными ускорителями• Любой современный смартфон мощнее любого PC — первого спирального витка эпохи “толстых клиентов”
• Больше памяти, больше производительности
Мобильники с мощными ускорителями• Любой современный смартфон мощнее любого PC — первого спирального витка эпохи “толстых клиентов”
• Больше памяти, больше производительности
• Современная быстрая беспроводная технология связи
Мобильники с мощными ускорителями• Любой современный смартфон мощнее любого PC — первого спирального витка эпохи “толстых клиентов”
• Больше памяти, больше производительности
• Современная быстрая беспроводная технология связи
• Чумовые возможности “сопроцессоров”
Мобильники с мощными ускорителями
Для чего весь этот рост используется• Игры
Для чего весь этот рост используется• Игры • Анимация UI
Для чего весь этот рост используется• Игры • Анимация UI • Опять игры
Для чего весь этот рост используется• Игры • Анимация UI • Опять игры • Инстаграм
Для чего весь этот рост используется• Игры • Анимация UI • Опять игры • Инстаграм • Цифровые гитарные комбики из AppStore
Для чего весь этот рост используется• Игры • Анимация UI • Опять игры • Инстаграм • Цифровые гитарные комбики из AppStore • Рендеринг png в html Webkit
Для чего весь этот рост используется• Игры • Анимация UI • Опять игры • Инстаграм • Цифровые гитарные комбики из AppStore • Рендеринг png в html Webkit • Парсинг JSON
?
Для чего на самом деле можно• Анализ больших массивов данных
Для чего на самом деле можно• Анализ больших массивов данных • Решение экспертных задач
Для чего на самом деле можно• Анализ больших массивов данных • Решение экспертных задач • Машинное обучение
Для чего на самом деле можно• Анализ больших массивов данных • Решение экспертных задач • Машинное обучение • Торговые стратегии
Для чего на самом деле можно• Анализ больших массивов данных • Решение экспертных задач • Машинное обучение • Торговые стратегии • Распределенная обработка очень больших массивов данных
Вычисления • Числовые:
• Нечисловые: func quicksort<T: Comparable>(a: [T])->[T] { guard a.count > 1 else { return a } let x = a[a.count/2] return quicksort(a.filter { $0 < x }) +
a.filter { $0 == x } + quicksort( a.filter { $0 > x })
}
Вычисления • CPU — …
Вычисления • CPU — …
• DSP — digital signal processor
DSP
Вычисления • CPU — …
• DSP — digital signal processor
• GPU — graphics processing unit
GPU
Доступ к ускорителям iOS
• vDSP (DSP)
• OpenGL ES 2.0/3.0 (GPU)
• Metal (GPU)
vDSPБазовый набор процедур над одномерными данными на сигнальном сопроцессоре
• y ← 𝝰x+y, C ← 𝝰AB+𝝱C
• Conv, window над ℝ и ℂ • FFT • FIR • IIR
OpenGL ES
Можно всё!А не только 3D
OpenGL ES
Но хостовый код!и вообще…
OpenGL ES
Metal
Можно всё!А не только 3D
GPGPU
Metal (что нам от него нужно)• API прямого доступа к GPU
Metal (что нам от него нужно)• API прямого доступа к GPU
• Распараллеливание вычислений (числовые, нечисловые)
Metal (что нам от него нужно)• API прямого доступа к GPU
• Распараллеливание вычислений (числовые, нечисловые)
• Конвейеры задач
Metal (что нам от него нужно)• API прямого доступа к GPU
• Распараллеливание вычислений (числовые, нечисловые)
• Конвейеры задач
• Графические вычисления
Metal• Очень низкие накладные расходы
Metal• Очень низкие накладные расходы
• Прекомпиляция шейдеров
Metal• Очень низкие накладные расходы
• Прекомпиляция шейдеров
• Динамическая параметризация
Metal• Очень низкие накладные расходы
• Прекомпиляция шейдеров
• Динамическая параметризация
• Прелиминарная проверка интерфейсов (ввода-вывода данных и их форматов, кодов возврата etc.)
Metal• Эффективные параллельные вычисления
Metal• Эффективные параллельные вычисления
• Разделяемый доступ к ресурсам CPU/GPU
Metal• Эффективные параллельные вычисления
• Разделяемый доступ к ресурсам CPU/GPU
• Явная синхронизация данных CPU/GPU
Metal• Эффективные параллельные вычисления
• Разделяемый доступ к ресурсам CPU/GPU
• Явная синхронизация данных CPU/GPU
• Синхронный многопоточный доступ к очереди команд
Metal
Metal• Произвольные типы данных
typedef struct { uint id; uint time; float value; float sortable;} Trade;
Например
kernel void randomKernel( device float *array [[buffer(0)]],
… )
kernel void bitonicSortKernel(device float *array [[buffer(0)]],…)
MetalПроизвольная структура данных
kernel void bitonicSortKernel(
device Trade *array [[buffer(0)]],)
Например, приложения
Умный торговый терминал, Metal
Умный торговый терминал, Metal
• Фильтр большая выборка сделок (N·1e6) (x10)
Умный торговый терминал, Metal
• Фильтр большая выборка сделок (N·1e6) (x10)
• Расчет гистограммы по выборке (x100)
Умный торговый терминал, Metal
• Фильтр большая выборка сделок (N·1e6) (x10)
• Расчет гистограммы по выборке (x100)
• Апроксимация распределения (x10)
Умный торговый терминал, Metal
• Фильтр большая выборка сделок (N·1e6) (x10)
• Расчет гистограммы по выборке (x100)
• Апроксимация распределения (x10)
• Расчет интенсивности торговли, 𝝈 (ско), профит фактор (vDSP)
Большие графы, Metal
Большие графы, Metal
• Кластеризация (в разы)
Большие графы, Metal
• Кластеризация (в разы)
• K-means (x50 раз)
Большие графы, Metal
• Кластеризация (в разы)
• K-means (x50 раз)
• K-NN (x400 раз)
Модные APIЕще больше возможностей
iOS >=10 Neural Networks API
• BNN — Basic Neural Networks
• MPSCNN — Convolution Neural Networks
iOS >=10 Neural Networks API
MPSCNNMetal Perfomance Shader CNN, профит-фактор
Бонусы Metal
• CUDA -> Metal
• Open CL -> Metal
НО!
Очень много “больших” данных
• Сделки торговых систем
Очень много “больших” данных
• Сделки торговых систем
• Данные для анализа
Очень много “больших” данных
• Сделки торговых систем
• Данные для анализа
• Размеченные данные и данные весов слоев NN
Очень много JSON
func convertStringToDictionary(text: String) -> [String:AnyObject]? {
if let data = text.dataUsingEncoding(NSUTF8StringEncoding) {
return try! NSJSONSerialization.JSONObjectWithData(data, options: [])
}
return nil
}
Очень много JSONПолитики отстрела приложений iOS
• Таймаут watchdog’а
• User force-quit
•Low memory termination
• SIGABRT, SIGBUS, SIGSEGV
Очень много JSON
•Много RAM
Очень много JSON
•Много RAM
•Всегда много CPU
Очень много JSON
•Много RAM
•Всегда много CPU
•Очень много батарейки
Можно, конечно, так
Очень много JSON
func readline() -> String? { var line:UnsafeMutablePointer<CChar>? = nil var linecap:Int = 0 defer { free(line) }
return getline(&line, &linecap, file) > 0 \ ? String(cString:line!) : nil }
Сделки по ФР за день JSON
Сделки по ФР за день JSON
Сделки по ФР за день JSON
reading time = 76s, trades = 374995
Сделки по ФР за день JSON• PNG
• JPG
• MP4
• H.264
⬅ Никого не смущает бинарный формат
JSON RAW
Сделки по ФР за день RAW
var trades:[Trade] = [Trade](repeating:Trade(), count:count)let fd = open(path, O_RDONLY, S_IRUSR)let mp = mmap(nil, size, PROT_READ, MAP_FILE, fd, 0)
memcpy(trades,mp,size)
Сделки по ФР за день RAW
memcpy(trades,mp,size) == копирование в память GPU
Сделки по ФР за день RAW
var trades:[Trade] = [Trade](repeating:Trade(), count:count)let fd = open(path, O_RDONLY, S_IRUSR)let mp = mmap(nil, size, PROT_READ, MAP_FILE, fd, 0)
let buffer = makeBuffer(bytesNoCopy: mp, length: size)
Сделки по ФР за день RAW
reading time = 0.032s, trades = 374995
Сделки по ФР за день JSON
Сколько времени уйдет на запрос расчета статистики к серверу?
• Затраты на вычисления статистики на сервере • Затраты на доставку ответа • Затраты на парсинг ответа
• На каждую статистику
• Затраты на доставку ответа • Затраты на снепшот (один раз) • Затраты на добавление буфера в память (ε сек) • Затраты на вычисления
• Но это все статистики! А не одна
JSON+CPU RAW+GPU
JSON+CPU
0,0
0,3
0,5
0,8
1,0
Вычисление Доставка Парсинг
0,3
1,0
0,4
RAW+GPU
0,0
0,4
0,8
1,2
1,6
Доставка Снепшот Вычисление
1,5
0,03
1,0
Очень много JSON
•Никогда много RAM •Всегда мало CPU •Мало батарейки
Быстрые и горячие
Оптимизация. Быстро
Оптимизация. Холоднее
Оптимизация. RT быcтро
39.6º
Оптимизация. RT достаточно быстро
37.5º
Итоги
Итоги
Вопросы?
• https://github.com/dnevera/highload2016
• https://imagemetalling.wordpress.com