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.
На момент тестов оптимизации кода под Эльбрус не проводилось!
ссылка на оригинал статьи https://habr.com/ru/articles/729448/
Добавить комментарий