Загоняем Альпаку на Эльбрус

Думаю уже все слышали об Alpaca — аналоге chatGPT, которую можно запустить локально на процессоре. И раз есть такая возможность почему бы не сделать это на Эльбрусе?!

На чем тестировалось

Я решил сравнить три процессора: Эльбрус 8СВ на сервере sumeriko (Доступ можно получить по ссылке), Эльбрус-16С (Спасибо Михаилу Шигорину, у него как раз имеется инженерный образец данного процессора) и Ryzen 7 5800H.

Что было сделано

Я не стал придумывать велосипед и скачал llama.cpp и веса alpaca-7B. Затем собрал с параметрами -O4 -ffast-math и -O3 на Эльбрусе и Ryzen соответственно. Также на Эльбрус-8СВ добавил -ftune=elbrus-8c2, а на Эльбрус-16С добваил -ftune=elbrus-16c. Если кому-то будет интересно поиграться на сервере, то файл весов с alpaca лежит в /srv/home/alex_mih/llama.cpp/models

Запуск

Я решил протестировать сразу 3 системы для наглядности. Тестировались Эльбрус-8СВ, Эльбрус-16с (с 12 ядрами) и Ryzen 7 5800H. Тест скорости проводил следующей командой, которая была предложена пользователем rPman на Хабре.

for a in {1..8};do printf "%s;" $a;./main -t $a -m ./models/ggml-alpaca-7b-q4.bin -s 42 -p "Random joke:" -n 32 2>&1 |grep "llama_print_timings:       eval time" | cut -d "(" -f 2 | grep -o -e "[0-9\.]*" ;done

Для того чтобы условия были равными (на сколько это возможно) сначала я протестировал все три процессора на 8 потоках.

Потоки

Ryzen 7 5800H (ms)

Эльбрус-8СВ (ms)

Эльбрус-16С (ms)

1

716,04

2708,62

2389,05

2

391,81

1379,05

1225,16

3

271,67

935,71

823,20

4

216,83

714,14

638,50

5

171,64

580,71

513,72

6

147,36

491,13

438,66

7

129,04

427,02

380,11

8

123,06

379,25

342,84

График сравнения(Меньше - лучше)

График сравнения (Меньше — лучше)

График Скорости Эльбрус-8СВ

График Скорости Эльбрус-8СВ

График скорости Ryzen 7 5800H

График скорости Ryzen 7 5800H

График скорости Ryzen 7 5800H с ограничением скорости в 1.3GHz

График скорости Ryzen 7 5800H с ограничением скорости в 1.3GHz

График скорости Ryzen 7 5800H с ограничением скорости в 1.3GHz

Грфик скорости Эльбрус-16с

А что насчет 12-ти потоков?

Затем я решил протестировать на 12-ти потоках. Соответственно 8СВ уходит из теста. Скрипт немного изменил.

for a in {1..12};do printf "%s;" $a;./main -t $a -m ./models/ggml-alpaca-7b-q4.bin -s 42 -p "Random joke:" -n 32 2>&1 |grep "llama_print_timings:       eval time" | cut -d "(" -f 2 | grep -o -e "[0-9\.]*" ;done

График сравнения (Меньше - лучше) Тут ограничение по частоте на Ryzen не использовалось

График сравнения (Меньше — лучше) Тут ограничение по частоте на Ryzen не использовалось

А теперь ограничим производительность на Ryzen.

Я решил ограничить частоты на Ryzen и снова запустил тест (по этой причине результаты немного отличаются от таблицы выше). К сожалению пока получилось ограничить только на 1.3GHz (Если получится выставлю на 2.0GHz. Рязань меня не слушает). И вот тут уже результаты довольно близкие. В некоторые моменты Эльбрус даже быстрее. Но судя по всему тут есть какой-то баг в самом llama.cpp так как видно что после 8 потока на Ryzen график немного улетает вверх.

Потоки

Ryzen 7 5800H (ms)

Ryzen 7 5800H (ms) 1.3GHz

Эльбрус-16С (ms)

1

710,80

2296,21

2367,98

2

381,21

1156,99

1218,16

3

264,92

778,34

827,60

4

210,56

592,54

639,17

5

170,64

475,96

514,12

6

147,92

398,64

440,96

7

132,29

350,26

386,43

8

123,84

318,50

338,58

9

176,19

485,80

305,71

10

163,02

441,23

283,96

11

152,79

403,66

259,24

12

145,78

374,52

243,21

График скорости (Меньше - лучше)

График скорости (Меньше — лучше)

Заключение

Может Эльбрус и не показал скорость в разы превышающие результаты по сравнению с Ryzen, но нужно учитывать что Эльбрус 8св 2018 года выпуска, a Ryzen 2021 года, Плюс частоты на данных процессоров разные. (3.2GHz и 4.4GHz в turbo boost на Ryzen, 1.5GHz на Эльбрус-8СВ и 2GHz на Эльбрус-16С). Однако судя по тестам тут была проблема именно с оптимизацией. Судя по всему нужно менять ggml под Эльбрус. Эльбрус-16с поддерживает аппаратную виртуализацию и данный пример был как раз запущен под виртуалкой. По этой причине и было именно 12 ядер, выдали под виртуалку столько.

© Habrahabr.ru