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.
На момент тестов оптимизации кода под Эльбрус не проводилось!