Не­дав­но мне попалась на гла­за мат­пла­та Lenovo RD450X с подоз­ритель­но низ­кой ценой, в пол­тора раза дешев­ле Huananzhi X99 F8D. Она и сей­час дешев­ле. Очень это было заман­чиво, тем более что я дав­но хотел пощупать двух­про­цес­сорную сис­тему.

Мо­ей целью было соб­рать еще один компь­ютер для науч­ных рас­четов, одна­ко, как и в прош­лый раз, эта сис­тема подой­дет и для дру­гих целей. Соб­рав машину, я про­тес­тировал ее воз­можнос­ти на брут­форсе хешей и генера­тив­ных ней­росетях, помимо науч­ных вычис­лений. Резуль­татами я поделюсь в кон­це статьи.

info

О моем прош­лом опы­те читай в статье «Ме­гас­четы. Собира­ем мощ­ный компь­ютер для вычис­лений».

Характеристики

Мат­пла­та, которая меня заин­тересо­вала, под­держи­вает про­цес­соры Xeon E5-26XX v3 и v4, то есть вро­де как всю линей­ку (кро­ме E5-2696 v4 и E5-2687W v4), но к это­му вер­немся поз­же. Под­держи­вает­ся память ECC REG — вплоть до DDR4-2400, 16 сло­тов, то есть мож­но запихать до 1 Тбайт памяти. Так­же есть два PCI-E (3.0) x16 и четыре PCI-E x8, два USB 3.0. С дис­ками тоже все хорошо: на пла­те два разъ­ема Mini SAS 8087 и еще пара SATA. Ну и напос­ледок две сетеву­хи 10 Гбит/с и, конеч­но, BMC, встро­енная видео (ASPEED AST2400). И все это в форм‑фак­торе E-ATX. И все это мень­ше чем за 10 тысяч деревян­ных!

info

С ценами сей­час неоп­ределен­ность: с одной сто­роны, все опи­сан­ное железо уже старье и дешеве­ет, но с дру­гой — кри­зис чипов, кри­зис логис­тики, полити­чес­кая нес­табиль­ность, сан­кции и тор­говые вой­ны, поэто­му цена уже пару лет ста­биль­но дер­жится на уров­не 10 тысяч руб­лей. Прав­да, сей­час на «Али­экс­прес­се» ее не купить — про­дав­цы опа­сают­ся сан­кций. Так что оста­ются переку­пы с «Ави­то» и про­чие спо­собы серого импорта.

Комплект

Процессоры

Как я уже рас­ска­зывал в прош­лой статье, наибо­лее разум­ный выбор про­цес­сора для меня — это Xeon E5-2690 v4. У него дос­таточ­но ядер (14) и буст на все ядра 3200 МГц, а цена впол­не демок­ратич­ная. Да что там демок­ратич­ная, эти про­цы сто­ят дешев­ле кулеров, которые мы пос­тавим!

По­лучит­ся по 135 Вт на камень, что для нашей пла­ты, конеч­но, мно­гова­то. Штат­но в ней сто­ит что‑то вро­де 2640 v4 (90 Вт), но прак­тика показа­ла, что пла­та выдер­жит. На дан­ный момент у меня уже око­ло года наработ­ки 24/7.

В ито­ге име­ем 28 ядер, 56 потоков и 3200 МГц при пол­ной наг­рузке — дос­таточ­но серь­езно даже по нынеш­ним вре­менам. Конеч­но, было бы кру­то впих­нуть туда E5-2699 v4 или E5-2696 v4, но пер­вый камень сто­ит уж очень дорого (крат­но дороже E5-2690 v4 при быс­тро­дей­ствии на 30% боль­ше), а E5-2696 v4 не запус­кает­ся, это я лич­но про­верил. Было грус­тно.

Память

Тут все хорошо, ста­рые «Зионы» все­ядные, и мож­но даже в голову не брать, какой у тебя под­тип памяти и какой у нее ранк. Впро­чем, тут все глад­ко еще и отто­го, что б/у память, ско­рее все­го, с тех же сер­веров, что и б/у про­цы. Если собира­ешь­ся занять все сло­ты, то сто­ит брать LRDIMM, ина­че может не завес­тись на 2400 МГц. В общем, берем восемь пла­нок по 64 Гбайт ECC REG PC4-2400.

У меня сто­ят план­ки фир­мы Kllisre и вот уже год работа­ют без нарека­ний. Повез­ло, навер­ное! Память — это то, на чем в этой машине мож­но хорошо сэконо­мить, я собирал с основным при­целом на кван­товую химию, поэто­му памяти мно­го, и это поч­ти полови­на сто­имос­ти. Для ней­росетей, нап­ример, мож­но и пос­кром­нее раза в четыре.

Диски

На этот раз я выб­рал чуть более скром­ную кон­фигура­цию: 256 Гбайт SATA SSD под сис­тему, 512 Гбайт NVME SSD под рас­четы и пара 4 Тбайт SATA HDD для хра­нения резуль­татов. Мож­но ска­зать, что сюда я сбаг­рил оста­ток хар­дов. Учи­тывая огромный объ­ем памяти и хорошо работа­ющее кеширо­вание, раз­ницы в боль­шинс­тве рабочих задач меж­ду SATA и NVME на глаз не замет­но.

Видеокарты

Кван­тово‑химичес­кий софт в нас­тоящее вре­мя дру­жит с виде­окар­тами огра­ничен­но. Но на этот раз хотелось, помимо кван­товой химии, занять­ся ИИ, а он как раз замеча­тель­но дру­жит с виде­окар­тами. Но уве­рен­ности, что эти занятия прев­ратят­ся во что‑то серь­езное, у меня пока нет, так что на видяхе я решил сэконо­мить. Луч­ший вари­ант из бюд­жетных — GTX 1080 Ti, цены на них начина­ются при­мер­но с 10 тысяч руб­лей, и виде­опа­мяти там при­лич­но — 11 Гбайт. Короче, для баловс­тва сой­дет.

Блок питания

Блок питания я взял с некото­рым запасом по мощ­ности — DeepCool 850W. Тут глав­ное, что­бы были два вось­мипино­вых про­вода для CPU, ну а шес­типино­вый и 6+2-пиновый для виде­окар­ты сей­час есть в любом бло­ке. Этот блок питания у меня работа­ет уже вто­рой год 24/7.

Корпус и кулеры

Вот тут уже чуть хит­рее: нам нужен кор­пус E-ATX, при­чем такой, что­бы мож­но было орга­низо­вать хорошую про­дува­емость. Отлично подошел DeepCool Matrexx 55 Mesh. Дешево, сер­дито и сим­патич­но! Я купил его в минималь­ной ком­плек­тации и добавил пять кулеров ARCTIC P14 ACFAN00136A: три на фрон­таль­ной панели на вдув и два свер­ху на выдув. Бренд тут не так важен, глав­ное, что­бы кулеры были четырех­пиновые и име­ли мак­сималь­но воз­можную про­изво­дитель­ность. У ука­зан­ных кулеров про­изво­дитель­ность 72,5 CFM. Вен­тилятор на зад­ней панели тоже луч­ше заменить более про­изво­дитель­ным, нап­ример ID-Cooling XF-120, он выда­ет 76,16 CFM.

По­чему нуж­ны имен­но четырех­пиновые? Потому что в такой кон­фигура­ции важен кон­троль обо­ротов. Без наг­рузки сис­тема будет дос­таточ­но холод­ной, и нет никако­го резона гонять через нее ра­диоак­тивный пепел лиш­нюю пыль и кос­пле­ить пылесос. С дру­гой сто­роны, под пол­ной наг­рузкой греть­ся сис­тема будет очень при­лич­но, и тут луч­ше разог­нать кулеры как сле­дует. Хороший вари­ант — взять род­ной 2U-кор­пус с рук, но это может обой­тись дороже материн­ской пла­ты.

Решаем проблемы

На­чина­ем собирать и что видим? Материн­ская пла­та, конеч­но, на мес­то вста­ет нор­маль­но, но неяс­но, куда под­клю­чать перед­нюю панель! Черт с ним с USB, но на перед­ней панели есть еще небес­полез­ная кноп­ка вклю­чения. Начина­ем гуг­лить, и тут при­ходит понима­ние, почему пла­та была такой дешевой. Дело в том, что к ней прак­тичес­ки нет докумен­тации, ману­ал толь­ко на китай­ском и не для пла­ты, а для OEM-сер­вера Lenovo RD450X, а там нет никакой рас­пинов­ки разъ­емов.

К счастью, на форуме overclockers.ru есть пос­вящен­ная этой пла­те тема, сей­час она уже раз­рослась, и энту­зиас­ты успе­ли мно­го чего накопать, а вот год назад все было гораз­до хуже. Тем не менее там есть упо­мяну­тый выше ману­ал и рас­пинов­ка разъ­ема.

Пос­ле дли­тель­ного рас­смат­ривания фотог­рафий этой пла­ты я при­шел к выводу, что нас инте­ресу­ют разъ­емы, ука­зан­ные на кар­тинке ниже.

Интересующие нас разъемы
Ин­тересу­ющие нас разъ­емы

Смот­рим и понима­ем, что у них шаг 2 мм и без переход­ника тут не обой­тись. Судя по отзы­вам, мно­гие про­дав­цы ком­плек­туют пла­ту нес­коль­кими переход­никами и перемыч­кой, без которой пла­та не стар­тует.

Переходник
Пе­реход­ник
Перемычка
Пе­ремыч­ка

А еще встре­чает­ся целая пла­та‑переход­ник, которую тоже могут вклю­чить в ком­плект.

Плата-переходник
Пла­та‑переход­ник

Моя была уком­плек­тована толь­ко перемыч­кой (и на том спа­сибо), поэто­му, вос­поль­зовав­шись рас­пинов­кой с форума, я спа­ял такой переход­ник сам — хорошо, что под рукой был нуж­ный разъ­ем.

Распиновка с форума
Рас­пинов­ка с форума
Мой переходник
Мой переход­ник

И, как буд­то это­го недос­таточ­но, разъ­емы выведе­ны вбок, точ­нее вниз, если смот­реть в кор­пусе. А это зна­чит, что не вый­дет под­клю­чить наш переход­ник, не вне­ся модифи­кации в кор­пус. Что ж, мы люди прос­тые! Берем дре­мель и про­пили­ваем окно нуж­ного раз­мера.

Модифицированный корпус
Мо­дифи­циро­ван­ный кор­пус

Пос­ле допили­вания все помеща­ется. Сле­дующей труд­ностью была зад­няя заг­лушка в кор­пус, она нем­ного не сов­падала с разъ­ема­ми на материн­ской пла­те, тут помог­ли нож­ницы по метал­лу (там бук­валь­но пара мил­лимет­ров), полови­ну бор­тика приш­лось отре­зать. Пос­ле это­го все вста­ло как надо. Такая вот рас­пла­та за OEM. Теперь мож­но зак­репить материн­скую пла­ту и прис­тупить к кабель‑менед­жмен­ту.

Кабель-менеджмент
Ка­бель‑менед­жмент

Не забыва­ем про переход­ник.

Переходник
Пе­реход­ник

Все готово! А вот про замороч­ки с охлажде­нием сто­ит погово­рить осо­бо.

Охлаждение процессоров

У меня воз­никла проб­лема с под­бором кулеров для про­цес­соров. Дело в том, что пла­та сер­верная и креп­ления там Narrow ILM 94 × 56. Это неп­рият­но, так как у бытовых «башен» креп­ление Square ILM 80 × 80. Тут надо быть вни­матель­ным, эти креп­ления несов­мести­мы меж­ду собой.

Наглядные отличия Narrow ILM и Square ILM
Наг­лядные отли­чия Narrow ILM и Square ILM

Впро­чем, сущес­тву­ют баш­ни со смен­ными креп­лени­ями и плас­тиковый кре­пеж для Narrow ILM, но с ним есть неп­рият­ность: он широко­ват и поч­ти упи­рает­ся в память, поэто­му если на план­ках памяти сто­ят ради­ато­ры, то умес­тить всё вмес­те не вый­дет.

Пластиковое крепление Narrow ILM
Плас­тиковое креп­ление Narrow ILM

Что­бы избе­жать этих проб­лем, я решил взять сер­верные кулеры — они, мож­но ска­зать, род­ные, и с ними все хорошо, кро­ме цены: сто­ят они дороже про­цес­соров... Впро­чем, проб­лем я таки не избе­жал, и пер­воначаль­но при­обре­тен­ные низ­копро­филь­ные кулеры под кор­пус 2U ока­зались сла­бова­ты (70 гра­дусов в пол­ной наг­рузке) и шумели при­мер­но как фен!

Низкопрофильные кулеры 2U
Низ­копро­филь­ные кулеры 2U

В целом это решение ока­залось неп­ригод­ным, приш­лось рас­кошелить­ся и взять две 3U-баш­ни. Вот с ними все хорошо, тем­перату­ра око­ло 55 в пол­ной наг­рузке, и шума зна­читель­но мень­ше. Как говорит­ся, ску­пой пла­тит дваж­ды.

Башня 3U
Баш­ня 3U

Про управле­ние обо­рота­ми кулера сто­ит погово­рить отдель­но. Нес­мотря на то что пла­та сер­верная и име­ет BMC, кон­троль обо­ротов кулеров там не пре­дус­мотрен, что очень неудоб­но. В интерне­те пишут, что, ког­да в пла­те сто­ят про­цы, с которы­ми она пос­тавля­лась, работа­ет какой‑то пре­дус­танов­ленный про­филь, одна­ко с про­чими про­цами кулеры всег­да работа­ют на пол­ную. Наши 2690 v4 — имен­но такие про­цес­соры. Это проб­лема, так как на холос­том ходу боль­шой поток воз­духа спо­собс­тву­ет активно­му накоп­лению пыли, а уж про шум я мол­чу. При этом под пол­ной наг­рузкой нуж­но хорошее охлажде­ние, и там пол­ные обо­роты умес­тны.

Ко­роче, активное управле­ние ско­ростью вра­щения кулеров прос­то необ­ходимо. Эту проб­лему я решил под­клю­чени­ем внеш­него кон­трол­лера с USB-интерфей­сом, о котором я тоже писал статью. Решение, воз­можно, не очень эле­ган­тное, но рабочее и дос­таточ­но надеж­ное.

Не так дав­но эн­тузи­асты таки рас­копали спо­соб штат­ного кон­тро­ля обо­ротов кулеров с помощью ути­литы ipmitool. К нес­частью, ког­да я собирал машину, ту статью я не нашел, а может, ее и вов­се не было. Так или ина­че, сей­час я бы поп­робовал исполь­зовать ipmitool. При­веден­ный ниже код дол­жен работать, одна­ко я его не про­верял, поэто­му рас­смат­ривай его как кон­цепт.

#!/bin/zsh
#!/bin/zsh
OLDPWM=30
PWM=30
# Если файл /tmp/old_pwm существует, выход с кодом 2. Это предотвращает повторный запуск скрипта, если он уже выполняется.
if [ -e /tmp/old_pwm ]; then
exit 2
fi
# Будем в цикле проверять температуру и регулировать скорость вентилятора.
while [ true ]; do
# Получаем текущую температуру процессора утилитой sensors.
temp=$(sensors | grep "Package id 1:" | awk '{print $4}' | tr -d '+°C')
temp=${temp%.*}
# Получаем предыдущее значение широтно-импульсной модуляции из файла, если он существует.
# Это значение будет использоваться для сравнения с новым значением, чтобы определить, нужно ли изменять скорость вентилятора.
if [ -e /tmp/old_pwm ]; then
OLDPWM=$(head -1 /tmp/old_pwm)
fi
# Устанавливаем начальное значение ШИМ на 30. Далее будем корректировать это значение в зависимости от текущей температуры.
PWM=30
if [ $temp -ge 40 ]; then PWM=40; fi
if [ $temp -ge 45 ]; then PWM=50; fi
if [ $temp -ge 50 ]; then PWM=70; fi
if [ $temp -ge 55 ]; then PWM=80; fi
if [ $temp -ge 60 ]; then PWM=90; fi
if [ $temp -ge 65 ]; then PWM=100; fi
# Сохраняем новое значение ШИМ в файл /tmp/old_pwm.
echo $PWM > /tmp/old_pwm
# Если новое значение ШИМ отличается от предыдущего, изменяем скорость вентилятора.
# Используем утилиту ipmitool для отправки команды на изменение ШИМ.
if [[ $PWM != $OLDPWM ]]; then
sudo ipmitool raw 0x2e 0x30 00 00 $PWM
fi
# Ждем 30 с перед следующим циклом.
sleep 30
done

В общем, чита­ем тем­перату­ру из вывода sensors, обра­баты­ваем и выс­тавля­ем обо­роты кулеров, но на этот раз через ipmitool.

Прочие особенности

Есть у этой материн­ской пла­ты еще нес­коль­ко осо­бен­ностей. Нап­ример, пер­вое вклю­чение пос­ле дол­гого пре­быва­ния в обес­точен­ном виде может занять мно­го вре­мени. Однажды она стар­товала боль­ше пят­надца­ти минут! Поэто­му не сто­ит панико­вать рань­ше вре­мени, иног­да нуж­но прос­то подож­дать. Надо так­же ска­зать, что до того момен­та, как заг­рузит­ся кон­трол­лер BMC, материн­ская пла­та не реаги­рует на кноп­ку вклю­чения, а заг­ружа­ется он око­ло минуты.

Пос­ле пер­вого запус­ка перезаг­рузка про­исхо­дит уже зна­читель­но быс­трее, но это тоже занима­ет пару минут. При­ходит­ся ждать, пока кон­трол­лер про­ведет диаг­ности­ку обо­рудо­вания и памяти, а ее у меня мно­го. Пла­та нор­маль­но стар­тует в режиме EFISTUB, одна­ко с записью номер 0000 могут быть проб­лемы, осталь­ные номера работа­ют кор­рек­тно.

У пла­ты есть BMC, но воз­можнос­ти там скуд­ные. Впро­чем, может быть, я не оце­нил их, пос­коль­ку исполь­зую пла­ту не впол­не по наз­начению. Дос­туп к BMC воз­можен толь­ко с отдель­ного сетево­го интерфей­са.

С логином и паролем тоже может быть некото­рая заг­воз­дка, но извес­тны стан­дар­тные пары:

lenovo1/Lenovo123
lenovo/len0vO
ADMIN/ADMIN
albert/admin

У меня сра­бота­ла пос­ледняя пара.

В любом слу­чае в UEFI есть нас­трой­ка поль­зовате­лей BMC, там мож­но и поль­зовате­ля добавить, и пароль сбро­сить.

Финальная конфигурация

Итак, вот что у меня получи­лось в ито­ге:

Тест-драйв

А теперь перей­дем к самому инте­рес­ному: про­верим, что мож­но выжать из этой машины. Как ока­залось, выжать мож­но дос­таточ­но! Я уста­новил акту­аль­ный Arch Linux на SATA SSD, но раз­ницы с NVME осо­бой нет, так как опе­ратив­ки вагон и кеширо­вание все сгла­жива­ет. Так­же я вклю­чил параметр ядра mitigations=off, что при­бави­ло 5–10% к быс­тро­дей­ствию.

Кванты

Нач­нем, пожалуй, с того, ради чего все и затева­лось, — с кван­тово‑химичес­ких рас­четов. Ради них, собс­твен­но, тут куча ядер и мно­го памяти. Как и в прош­лый раз, запус­каем тес­товый рас­чет энер­гии молеку­лы сред­него раз­мера с отклю­чен­ными уско­рял­ками и аппрок­симаци­ями.

Тестовая молекула
Тес­товая молеку­ла

Рас­чет про­водит­ся в прог­рам­мном пакете ORCA 5.0.4, вход­ной файл преж­ний.

! UKS b3lyp def2-tzvp tightscf defgrid3 nocosx nori
%pal nprocs N end
%method
AngularGrid 7
IntAcc 5.670
GridPruning OldPruning
BFCut 1e-11
WeightCut 1e-14
end
* xyz 0 1
7 5.263365000 -0.809094000 0.301207000
6 6.573875000 -0.272788000 0.577214000
6 7.676247000 -1.298471000 0.365855000
6 9.040975000 -0.709409000 0.673148000
7 10.148432000 -1.562897000 0.289452000
6 10.248995000 -2.816903000 1.002416000
6 11.415931000 -0.834654000 0.299215000
6 11.219991000 -3.722976000 0.274540000
6 12.616201000 -1.728404000 0.596641000
7 12.479498000 -3.040776000 0.008370000
6 13.574798000 -3.784343000 -0.374628000
6 13.407266000 -5.070792000 -0.923040000
6 14.889954000 -3.303523000 -0.241151000
6 14.497437000 -5.811691000 -1.337626000
6 15.954215000 -4.072569000 -0.671221000
6 15.794150000 -5.329993000 -1.225769000
7 4.835772000 -0.973795000 -0.996077000
6 4.395529000 -1.271139000 1.257513000
6 3.654749000 -1.533350000 -0.876188000
7 3.327586000 -1.736522000 0.465013000
6 2.715758000 -1.933372000 -1.852204000
6 1.545454000 -2.496808000 -1.443497000
6 2.154252000 -2.302219000 0.878375000
6 1.256931000 -2.685894000 -0.059367000
8 4.488440000 -1.288606000 2.474129000
17 17.581746000 -3.423758000 -0.479631000
1 2.033998000 -2.399764000 1.945985000
1 0.324817000 -3.133479000 0.248767000
1 0.816928000 -2.808697000 -2.178230000
1 2.953860000 -1.780764000 -2.894034000
1 6.554111000 0.068581000 1.610272000
1 6.717863000 0.592377000 -0.068151000
1 7.466435000 -2.155921000 1.004541000
1 7.658018000 -1.645300000 -0.666511000
1 9.150192000 0.220009000 0.109847000
1 9.093457000 -0.427101000 1.740796000
1 11.542924000 -0.345204000 -0.668225000
1 11.416418000 -0.043022000 1.063859000
1 13.490643000 -1.237666000 0.182744000
1 12.779915000 -1.795333000 1.679456000
1 11.393404000 -4.624746000 0.871541000
1 10.758268000 -4.030853000 -0.666412000
1 10.539040000 -2.692732000 2.059832000
1 9.281760000 -3.312189000 1.005791000
1 15.101308000 -2.351050000 0.214305000
1 16.645962000 -5.907387000 -1.549807000
1 14.333360000 -6.792112000 -1.764807000
1 12.419211000 -5.483721000 -1.049190000
*

За­пус­каем, смот­рим и добав­ляем новую строч­ку в рей­тинг рас­четных машин.

i3-8100 4x3.60GHz 00:39:58
Ryzen 5500U 6x2.1GHz 00:31:24
i7-8700 6x3.2 GHz /8Gb DDR4 2666MHz /SATA HDD 0:30:18
dual Xeon X5650, 12x2.7GHz /144Gb DDR3 /ATA HDD 00:29:45
Xeon E5-2658v3 12x2.6GHz /32Gb DDR4 2133MHz /SATA HDD 00:23:15
i5-10600K, 6x4.5GHz /16Gb DDR4 /SDD 00:22:43
AMD Ryzen 7 3700X 8x3.6GHz 00:19:07
dual Intel Xeon E5-2680v2 10x3.6 GHz /64Gb DDR3 1066MHz /HDD 00:17:17
i9-10920x 12x3.5GHz /128Gb DDR4/M.2 SSD 00:14:40
dual Intel Xeon E5-2697v2 12x2.7GHz /256Gb DDR3 1600MHz /SATA HDD 0:12:57
AMD Ryzen 9 5900X/32Gb/HDD 00:12:23
Xeon 2696v4 22x2.8GHz /512Gb DDR4 2400MHz /RAID0 M2 SSD 00:10:53
AMD Ryzen 9 5950X 16x3.4GHz /64Gb DDR4 /M.2 SSD 00:07:33
---
dual Intel Xeon E5-2690v4 14x3.2GHz /512Gb DDR4 2400MHz /NVME SSD 0:07:24
---
Ryzen Threadripper 3970x, 32x3.7GHz /256Gb DDR4 3200MHz /SSD 0:05:32

Ви­дим, что на этот раз мы обош­ли даже Ryzen 9 5950X и усту­пили толь­ко Ryzen Threadripper 3970x. Я думаю, что это очень хороший резуль­тат. На этой машине за минув­ший год было мно­го чего пос­читано (и что‑то даже опуб­ликова­но). Самый дли­тель­ный рас­чет занял при­мер­но две недели в пол­ной наг­рузке, и машина показа­ла себя очень хорошо. Работа­ет ста­биль­но, не перег­рева­ется.

Брутфорс

Пол­ноцен­но бру­тить пароли Wi-Fi, как в прош­лый раз, я не стал, прос­то уста­новил hashcat, драй­веры Nvidia для CUDA и intel-opencl-runtime для работы на CPU. Пакет intel-opencl-runtime мож­но тянуть с AUR.

За­пус­каем тест:

hashcat -D 1,2 -b -m 22000 |tee hashcat_report.txt

По­луча­ем сле­дующий резуль­тат:

CUDA API (CUDA 12.5)
====================
* Device #1: NVIDIA GeForce GTX 1080 Ti, 8701/11165 MB, 28MCU
OpenCL API (OpenCL 2.1 LINUX) - Platform #2 [Intel(R) Corporation]
==================================================================
* Device #2: Intel(R) Xeon(R) CPU E5-2690 v4 @ 2.60GHz, 257893/515851 MB (64481 MB allocatable), 56MCU
Benchmark relevant options:
===========================
* --opencl-device-types=1,2
* --optimized-kernel-enable
---
* Hash-Mode 22000 (WPA-PBKDF2-PMKID+EAPOL) [Iterations: 4095]
---
Speed.#1.........: 622.3 kH/s (90.12ms) @ Accel:32 Loops:512 Thr:512 Vec:1
Speed.#2.........: 81546 H/s (87.04ms) @ Accel:1024 Loops:512 Thr:1 Vec:8
Speed.#*.........: 703.9 kH/s

Ви­дим и здесь хороший при­рост быс­тро­дей­ствия по срав­нению с моей прош­лой машиной. Два Xeon 2690 v4 дают 81 546 хешей в секун­ду про­тив 52 739 на Xeon 2696 v4. Что любопыт­но, два Xeon 2690 v4 сто­ят раза в два дешев­ле, чем 2696 v4.

Ви­деокар­та, как и в прош­лый раз, ожи­даемо уде­лыва­ет CPU и дает 622,3 килохе­ша в секун­ду про­тив 457,5 для GTX 1080 (без Ti). Отсю­да вывод — луч­ше брать вер­сию с Ti, так как раз­ница в цене несущес­твен­на, а быс­тро­дей­ствия и памяти замет­но боль­ше.

Сум­марно име­ем 703,9 килохе­ша в секун­ду, что поч­ти в пол­тора раза боль­ше, чем в прош­лый раз. Не 4090, конеч­но, зато дешево и сер­дито. Лет пять назад мне такой хеш­рейт казал­ся фан­тасти­чес­ким.

Stable Diffusion

Ге­нера­тив­ные ней­росети — это весь­ма инте­рес­ная и акту­аль­ная тема. Учи­тывая пре­тен­зии нашей сбор­ки на зва­ние рас­четно­го сер­вера, глу­по не поп­робовать запус­тить ней­росет­ку. Из того, что мож­но сей­час запус­тить офлайн, самым популяр­ным вари­антом, веро­ятно, будет Stable Diffusion, его и выберем.

Ис­поль­зовать будем интерфейс AUTOMATIC1111, c Arch Linux он, конеч­но, не очень дру­жит (нуж­ны pip и Python 3.10), зато информа­ции по нему пол­но. Ста­вим из AUR Python 3.10. Пишут, если под­рихто­вать уста­новоч­ный файл, то мож­но запус­тить с акту­аль­ной вер­сией Python, но у меня не получи­лось. В будущем раз­работ­чики обе­щают испра­вить это.

Ка­чаем фай­лик инстал­лятора:

wget https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh

Пра­вить его не при­дет­ся, све­жеус­танов­ленный Python 3.10 он под­хва­тит сам. Запус­каем, и инстал­лятор сам ска­чает все нуж­ные фай­лы и зависи­мос­ти. В резуль­тате скрипт соз­даст пап­ку stable-diffusion-webui, уста­новит туда Stable Diffusion и даже сра­зу запус­тит.

Ес­ли все работа­ет пра­виль­но, то сме­ло жмем Ctrl-C. У нас же не рабочая стан­ция, а сер­вер, поэто­му перехо­дим в пап­ку stable-diffusion-webui и запус­каем webui.sh с парамет­ром --listen в фоне.

$cd stable-diffusion-webui
$nohup webui.sh --listen &

Те­перь мож­но под­клю­чить­ся к веб‑интерфей­су, наб­рав его адрес в бра­узе­ре:

http://server_ip:7860/
Веб-интерфейс
Веб‑интерфейс

Ос­талось толь­ко ска­чать пару‑трой­ку моделей. Могу пореко­мен­довать lyriel v16 и Chip_n_DallE. Класть их нуж­но вот сюда:

stable-diffusion-webui/models/Stable-diffusion/

Что писать в пром­пте и куда жать потом, обсуждать лиш­ний раз не будем. Нас боль­ше инте­ресу­ет быс­тро­дей­ствие. Если генери­ровать изоб­ражения 512 × 512, то это зай­мет око­ло семи секунд на дефол­тных нас­трой­ках. То есть за минуту мож­но наш­лепать десяток кар­тинок, что впол­не при­емле­мо. Если перей­ти на раз­решение 1024 × 1024, то на кар­тинку ухо­дит око­ло минуты, и это уже неп­рият­но.

Что же до срав­нения быс­тро­дей­ствия CPU и GPU, то GTX 1080 Ti ведет с хорошим отры­вом: 7 с про­тив 30 с, которые пот­ребова­лись двум Xeon 2690 v4. Поэто­му, исполь­зуя CPU с таким огромным количес­твом памяти, мож­но замах­нуть­ся на боль­шое раз­решение, но прак­тичес­кого смыс­ла в этом нет.

За­пус­тить Stable Diffusion на CPU мож­но вот такой коман­дой:

./webui.sh --listen --use-cpu all --precision full --no-half --skip-torch-cuda-test

Ко­роче, запус­каем на GPU, работа­ем с раз­решени­ем 512 × 512 и раду­емся жиз­ни без встро­енных раз­работ­чиком ней­рон­ки цен­зуры и огра­ниче­ний. Глав­ное — не всмат­ривать­ся в эти кар­тинки слиш­ком силь­но и не перес­читывать паль­цы!

Пример изображения
При­мер изоб­ражения

LLM

А эта тема, пожалуй, даже инте­рес­нее. Наша машина выг­лядит впол­не под­ходящей, что­бы поп­робовать запус­тить боль­шую язы­ковую модель, опе­рати­вы у нас с избытком, про­пус­кная спо­соб­ность тоже хорошая. Нес­мотря на то что мы исполь­зуем отно­ситель­но ста­рую DDR4 2400, за счет 2 × 4 каналов мы получа­ем 2 × 76,8 Гбайт/с. Короче, сто­ит поп­робовать. Кача­ем с GitHub исходни­ки llama.cpp и собира­ем две вер­сии — для CPU и GPU.

git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
# Для CPU
$make
# Для GPU
$make GGML_CUDA=1

Еще нам понадо­бят­ся сами модели. Боль­ше все­го мне пон­равились OpenChat 3.5, Deepseek Coder 6.7B Instruct и она же, но поболь­ше — Deepseek Coder 33B Instruct.

Пер­вая модель, уни­вер­саль­ный тек­сто­гене­ратор, ори­енти­рова­на на англий­ский язык, но с рус­ским тоже неп­лохо справ­ляет­ся, а две пос­ледние нат­рениро­ваны на генера­цию кода, про­верял их на C и Python, справ­ляют­ся они хорошо. Запус­кать их мож­но в двух вари­антах: в чис­то кон­соль­ном виде (llama-cli) и в режиме сер­вера (llama-server). Кста­ти, в отли­чие от AUTOMATIC1111 эти бинар­ники самодос­таточ­ны и пос­ле сбор­ки их мож­но переме­щать куда угод­но.

Ес­ли срав­нивать быс­тро­дей­ствие, то на виде­окар­те модели работа­ют замет­но шус­трее, но есть нюанс: замет­ный при­рост в ско­рос­ти получа­ется, если помес­тить всю модель в виде­опа­мять, а она у нас огра­ниче­на 12 Гбайт. Итак, тес­ты!

CPU

./bin/llama-cli -m deepseek-coder-33b-instruct.Q5_K_M.gguf -p "Напиши функцию сортировки строк пузырьком на C."

Ре­зуль­тат: 2,22 токена в секун­ду. Работа­ет не быс­тро, но тер­пимо: пока отве­чает, чай допить, пожалуй, не успе­ешь (если с чувс­твом пить, конеч­но).

./bin/llama-cli -m deepseek-coder-6.7b-instruct.Q5_K_M.gguf -p "Напиши функцию сортировки строк пузырьком на C."

Ре­зуль­тат: 9,80 токена в секун­ду. А вот это уже бод­рень­ко!

./bin/llama-cli -m openchat_3.5.Q5_K_M.gguf -p "Напиши функцию сортировки строк пузырьком на C."

Ре­зуль­тат: 10,15 токена в секун­ду. Тоже хорошо.

GPU

./llama-cli-gpu -m deepseek-coder-33b-instruct.Q5_K_M.gguf -p "Напиши функцию сортировки строк пузырьком на C."

Ре­зуль­тат: 2,26 токена в секун­ду.

./llama-cli-gpu -m deepseek-coder-6.7b-instruct.Q5_K_M.gguf -p "Напиши функцию сортировки строк пузырьком на C."

Ре­зуль­тат: 10,76 токена в секун­ду.

./llama-cli-gpu -m openchat_3.5.Q5_K_M.gguf -p "Напиши функцию сортировки строк пузырьком на C."

Ре­зуль­тат: 9,96 токена в секун­ду.

А теперь помес­тим модель в память GPU, нас­коль­ко это воз­можно.

./llama-cli-gpu -m deepseek-coder-33b-instruct.Q5_K_M.gguf -ngl 21 -p "Напиши функцию сортировки строк пузырьком на C."

Ре­зуль­тат: 3,10 токена в секун­ду.

./llama-cli-gpu -m deepseek-coder-6.7b-instruct.Q5_K_M.gguf -ngl 24 -p "Напиши функцию сортировки строк пузырьком на C."

Ре­зуль­тат: 22,88 токена в секун­ду.

./llama-cli-gpu -m openchat_3.5.Q5_K_M.gguf -ngl 33 -p "Напиши функцию сортировки строк пузырьком на C."

Ре­зуль­тат: 39,19 токена в секун­ду.

В пос­леднем слу­чае ско­рость прос­то фан­тасти­чес­кая!

В целом LLM чувс­тву­ют себя хорошо, осо­бен­но на виде­окар­те, тем более если все слои уда­ется запихать в память GPU, что, увы, получа­ется не всег­да. Пре­вос­ходс­тво GPU над CPU тут, конеч­но, пос­кром­нее, чем в бру­те, но все рав­но в разы. А дело, видимо, в том, что узкое мес­то — про­пус­кная спо­соб­ность памяти. По лич­ным впе­чат­лени­ям: если запус­кать OpenChat 3.5, как в пос­леднем при­мере, то работать с ним впол­не ком­фор­тно.

Выводы

По­лучил­ся очень недоро­гой и при­лич­ный рас­четный сер­вер. Да, приш­лось мес­тами под­пилить кор­пус и понадо­бит­ся спе­циаль­ный скрипт или даже пла­та для кон­тро­ля ско­рос­ти вен­тилято­ров, но все это отно­ситель­но нес­ложно орга­низо­вать.

Бла­года­ря виде­окар­те мож­но и с ней­росетя­ми поиг­рать. Если для тебя это основное исполь­зование, то кар­ту мож­но взять пок­руче, а вот на опе­ратив­ной памяти можешь сэконо­мить — 128 Гбайт хва­тит с запасом.

К нес­частью, потен­циал для апгрей­да силь­но огра­ничен, но еще нес­коль­ко лет машина точ­но побега­ет. В общем, если ищешь вари­ант подешев­ле и помощ­нее, то RD450X однознач­но зас­лужива­ет вни­мания.