Загоняем Альпаку на Эльбрус
Думаю уже все слышали об 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 |
График сравнения (Меньше — лучше)
График Скорости Эльбрус-8СВ
График скорости Ryzen 7 5800H
График скорости Ryzen 7 5800H с ограничением скорости в 1.3GHz
Грфик скорости Эльбрус-16с
А что насчет 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.
Я решил ограничить частоты на 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 ядер, выдали под виртуалку столько.