Думаю уже все слышали об 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 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 |
![График сравнения(Меньше - лучше) График сравнения(Меньше - лучше)](https://webcf.waybackmachine.org/web/20230417100456/https://habrastorage.org/getpro/habr/upload_files/291/588/fc5/291588fc535ccd8ac3e40ad01f946b9c.png)
![График Скорости Эльбрус-8СВ График Скорости Эльбрус-8СВ](https://webcf.waybackmachine.org/web/20230417100456/https://habrastorage.org/getpro/habr/upload_files/237/f4e/99b/237f4e99b68c582b1607734e3a6aa672.png)
![График скорости Ryzen 7 5800H График скорости Ryzen 7 5800H](https://webcf.waybackmachine.org/web/20230417100456/https://habrastorage.org/getpro/habr/upload_files/b81/a2e/e24/b81a2ee2410ecea8537e12e49734ee9c.png)
![График скорости Ryzen 7 5800H с ограничением скорости в 1.3GHz График скорости Ryzen 7 5800H с ограничением скорости в 1.3GHz](https://webcf.waybackmachine.org/web/20230417100456/https://habrastorage.org/getpro/habr/upload_files/eda/52f/713/eda52f713ea6c65ed7374902328c8727.png)
![График скорости Ryzen 7 5800H с ограничением скорости в 1.3GHz График скорости Ryzen 7 5800H с ограничением скорости в 1.3GHz](https://webcf.waybackmachine.org/web/20230417100456/https://habrastorage.org/getpro/habr/upload_files/a4e/f26/93e/a4ef2693e46f9cf52425ca16a542804d.png)
А что насчет 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 не использовалось](https://webcf.waybackmachine.org/web/20230417100456/https://habrastorage.org/getpro/habr/upload_files/ee0/975/6c3/ee09756c34cb2d2e75ea369b59b424e9.png)
А теперь ограничим производительность на Ryzen.
Я решил ограничить частоты на Ryzen и снова запустил тест(по этой причине результаты немного отличаются от таблицы выше). К сожалению пока получилось ограничить только на 1.3GHz(Если получится выставлю на 2.0GHz. Рязань меня не слушает).Я понимаю что этот тест нечестный. В дальнейшем поправлю таблицы для Ryzen. И вот тут уже результаты довольно близкие. В некоторые моменты Эльбрус даже быстрее. Но судя по всему тут есть какой-то баг в самом llama.cpp так как видно что после 8 потока на 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 |
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 |
![График скорости (Меньше - лучше) График скорости (Меньше - лучше)](https://webcf.waybackmachine.org/web/20230417100456/https://habrastorage.org/getpro/habr/upload_files/8ce/2e3/1c6/8ce2e31c615ba94283f12fdc0c7ed854.png)
Заключение
Может Эльбрус и не показал скорость в разы превышающие результаты по сравнению с Ryzen, но нужно учитывать что Эльбрус 8св 2018 года выпуска, a Ryzen 2021 года, Плюс частоты на данных процессоров разные. (3200MHz и 4400MHz в turbo boost на Ryzen, 1500MHz на Эльбрус-8СВ и 2000MHz на Эльбрус-16С). Однако судя по тестам тут была проблема именно с оптимизацией. Судя по всему нужно менять ggml под Эльбрус. Эльбрус-16с поддерживает аппаратную виртуализацию и данный пример был как раз запущен под виртуалкой. По этой причине и было именно 12 ядер, выдали под виртуалку столько.