Как стать автором
Обновить

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

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров6.1K

UPD: Это старая реализация. Оптимизированная часть описана в статье

Думаю уже все слышали об 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с(с 8 ядрами) и 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 3200MHz (ms)

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

Эльбрус-16С 2000MHz (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

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


Бенчмарки

(Данная часть будет обновляться) Спасибо entityfx за дополнительные тесты.

тесты были сделаны при помощи benchmark-q4_0-matmult. Собиралось через команду: make benchmark

На данный момент нет доступа к Ryzen на котором проводились тесты выше, так что пока добавил Ryzen 7 1700X (Спасибо Вячеславу за тест)

1 поток

FLOPS_per_u_Second

Эльбрус 4С

750 МГц

735.60

Эльбрус 8С

1300 МГц

3455.45

Эльбрус 8СВ

1550 МГц

7202.17

Эльбрус 16С

2000 МГц

10761.69

Core i7 2600K

3400 МГц

14224.27

Intel Core i5 8250U

2000..3400 МГц

27306.49

Байкал-М

1500 МГц

3307.45

Ryzen 7 1700X

3400..3800 МГц

18888.65

Ну и в многопоточном тесте.

8 потоков

FLOPS_per_u_Second

Эльбрус 4С

750 МГц (4 потока)

2858.15

Эльбрус 8С

1300 МГц

26892.26

Эльбрус 8СВ

1550 МГц

55424.05

Эльбрус 16С

2000 МГц

82397.41

Core i7 2600K

3400 МГц (4 потока)

40267.38

Intel Core i5 8250U

2000..3400 МГц

111165.17

Байкал-М

1500 МГц

24025.62

Ryzen 7 1700X

3400..3800 МГц

111718.20

Байкал-T1

1200МГц (2 потока)

1204.32

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

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

Потоки

Ryzen 7 5800H 3200MHz (ms)

Ryzen 7 5800H 1300MHz (ms)

Эльбрус-16С 2000MHz (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

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

Заключение

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

P.S.

На момент тестов оптимизации кода под Эльбрус не проводилось!

Теги:
Хабы:
Всего голосов 32: ↑25 и ↓7+18
Комментарии35

Публикации

Истории

Работа

Программист С
46 вакансий

Ближайшие события