Думаю уже все слышали об 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 |
А что насчет 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 и снова запустил тест(по этой причине результаты немного отличаются от таблицы выше). К сожалению пока получилось ограничить только на 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 ядер, выдали под виртуалку столько.
Автор:
AlexMih23