Pull to refresh

Comments 37

UFO just landed and posted this here
Как можно видеть, Java единовременно использует минимум 4 ядра, в то время как программа на C++ — одно.

Стесняюсь спросить, с каких это пор за использование ядер отвечает язык, а не программист? Ну и кто вообще в наше время обучает нейросети на процессоре?
Простите, а как компилятор распаралелит линейный код?
Гошечка может упрощать, но работа все равно за программистом
Если код написан «с умом», то и компилятор может распараллелить. Тем более, что код там не линейный по определению, иначе его было бы невозможно на GPU ускорять. Если по классике делать, то каждый нейрон на слое не зависит от остальных нейронов на этом слое, поэтому в пределах одного слоя всё паралелится замечательно. Матричные умножения тоже параллелятся. Так что тут 100% корявый код. Скорее всего ещё и реализация с ошибками, раз на С++ результат обучения иной получился. Один и тот же алгоритм должен давать один и тот же результат, если обучающие данные в одном и том же порядке подаются.

Да как бы и там надо писать код, go и так далее, да ещё и за памятью следить.
В общем это так не работает.

Стоп-стоп-стоп.
Во-первых, пожалуйста, опубликуйте код на всех языках и со всеми параметрами запуска.
Во-вторых — если алгоритм одинаковый, почему где-то он использует несколько ядер, а где-то — одно?
В-третьих, опять же, если алгоритм одинаковый, чем объясняется
вывод после обучающего сета программы написанной на С++ был другим, что повлекло за собой изменение количества эпох которое ей потребовалось для должного обучения
? Может, в коде C++ просто-напросто баг?
Да, там и на Java/Kotlin процессор не загружен и всё время разные ядра нагружены. Задача обучения нейросети и процессор не нагружен на 100% всё время? А что тогда вообще измеряется? И что-то с планированием потоков там же — мало того, что это дико не эффективно (ибо, кэши), так ещё и указывает на ошибку в коде.
C C++ вообще трэш и угар. Везде используется несколько потоков, а на C++ — один, т.е. вообще разная структура программ — что вообще сравнивает автор? И загрузка сети (соотношение принято/отправлено) на C++ не соответствует таковой на Java — т.е. там не просто структура программы разная, но и алгоритмы разные, и, как говорит сам автор, результаты (штоа?!!!)
У вас какая-то хрень с Java/Kotlin под Windows — что-то с параметрами запуска.
И у вас серьёзные ошибки в программах на Java и C++. Это по видно по совершенно ненормальным графикам процессора и сети (сети ?!). Они не могут так выглядеть на этой задаче.
Ну, и кроме того, у вас все программы используют разные подходы.
Такой громкий заголовок, интересная тема, и, уж простите, такое низкое качество по факту.
А вот это:
Неожиданно медленными оказались результаты работы программы написанной на C++. Отчасти это можно объяснить большим количеством эпох которое ей потребовалось для нахождения правильного ответа.

вообще не понятно, как комментировать. Вы точно понимаете, о чём написали?

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

Тогда о чём пост, что тестирует автор и почему у него такие результаты?
на мой взгляд, пост ни о чем, автор тестирует ненаучным способом какую-то чушь, не относящуюся к реальным задачам и поэтому у него такие результаты.
Чего-то протестировали, какой-то результат получили… Классика.
Ахахаха!

Неожиданно медленными оказались результаты работы программы написанной на C++. Отчасти это можно объяснить большим количеством эпох которое ей потребовалось для нахождения правильного ответа.


А вода не стекает с плоской земли, отчасти из за бортиков по краям :)))
Спасибо! Вы сделали мой день более веселым.
Я еще затра сюда загляну, посмотрю в камменты.

Ага… на плейстешне… и он окажется быстрее всех. Как можно давать какие-то графики, не показав код и параметры, я тоже не понял.
Заглянул в neuron1cpp… Вопросов больше не имею :)
А не надо… «кода» хватило :)
c++
Заменив «string» на «const string &» время работы уменьшилось с 13 до 10 секунд.
Повсеместно передаются std::vector по значению, это тоже сильно влияет на производительность. По быстрому сделал возврат константной ссылки на статический вектор из тела функции (при каждом вызове делаю clear), теперь отрабатывает за 1 секунду.
За 10 минут ускорил программу в 13 раз! Распаралелить не получилось, надо дольше думать и без статических векторов код писать (передавать через аргумент по ссылке).

Для std::string можно сравнивать через ==, без strcmp. Это не влияет на производительность, просто их можно сравнивать напрямую.
Уже ближе к истине «Питон проигрывает С в 100 раз» (с) Гвидо.

В 5 раз ускоряет включение оптимизации, в 2 раза больше эпох, и твоя замена еще в 13 раз.

5*2*13

Но, честно говоря, без распараллеливания всерьез говорить не о чем.
У меня было 1200000 итераций, во всех попытках. Компилировал в Windows MSVS-2019. Очень смущает, что зависит от компилятора, где-то прям серьёзная ошибка, наверное.
Зачем сравнивать строки и передавать вектора?!
Мы же не хотим измерять, как работает strcmp и менеджер памяти.
Так как вектора используются просто для выборки — переделал на for по коллекции с нужным условием.
С фиксом для количества эпох время обучения сократилось со 102 до 1 секунды.
Для сравнения — kotlin на этой же машине выдаёт 7 секунд.
Я не разбирался в логике программы и что там и зачем, а просто починил" очевидные проблему. Зачем сравнивал, зачем передавал — вопросы к автору.
Как и ожидалось, автор тестировал непонятно что, написанное непонятно как. Возможно, в debug сборке вообще.
Вечер уже наступил? Мне бы было интересно посмотреть Java-код)

Было бы интересно увидеть C# в этом сравнении

Не факт, что в ближайшее время будет время для написания. Если есть желание, можете перевести на C# своими силами, я добавлю результаты в таблицу.
UFO just landed and posted this here
даже на одной выборке, на одном ПК, под одной ОС сеть может найти решение, а может и не найти...

Это как? Там случайные числа используются или таймстампы?

если подавать 2 одинаковые обучающие последовательности 2 на 2 одинаковые нейронки, почему бы ей не найти 2 одинаковых решения и не иметь одинаковые веса синапсов в конце обучения. Рандом же не используется.
Меня признаться наоборот смущает, что результаты работы программы на СПП отличаются от результатов работы программы на той же яве.
При одинаковых начальных весах.
Но уже одно то, что вариант на C++ по скорости сопоставим с вариантом на Python говорит, что тут что-то не так.
Выше уже есть ссылки на код, а ценности как не было, так и нет…
Запустил у себя на чем было под рукой
gcc 5.2 win32
C++ -O2 45c
C++ 212c
2 400 000 итераций

pyton 2.7.8 -O 223с
1 200 000 итераций o_O

Самое интересное, что CPU при этом не занят. 4 ядра по 20% и для Питона и для С++
Причем программы однопоточные.

В общем отличный тест, рановато еще автору писать на Хабре =)
Неплохой тест получился.
Приятно, когда берёшь исходник и он компилируется и работает.
К тому же вышло неплохое сравнение именно реализации на разных языках программирования.
Конечно качество кода хромает и сложно говорить о сравнении производительности между языками — всё-таки для одних языков используются ссылочные типы, а для с++ доступ по индексу.

Я так понимаю, что если алгоритм одинаковый и входные данные одинаковые, то количество эпох, как и конечный результат должны быть одинаковыми и тогда только имеет смысл сравнивать время, затраченное на получение результата.
В этой же статье сравнивается радиус кривизны рук программистов, которые переписывали алгоритм на разные языки, не более того. Java, Kotlin вообще не понятно зачем сравнивать. И там и там на выходе должен быть ± одинаковый байткод. Не скажу автору спасибо за потраченное время, и.к. потрачено оно впустую.

Sign up to leave a comment.

Articles

Change theme settings