Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: dimka8ya от Март 18, 2021, 00:16



Название: нейронная сеть и потоки
Отправлено: dimka8ya от Март 18, 2021, 00:16
Доброго времени суток. я сделал нейронную сеть на QVector<QVector<QVector<double>>> веса; и QVector<Qvector<double>> активированные выходы; , все это работает в одном потоке ,но так медленнннноооо .как я понимаю самые трмоза в математических расчетах сигмоиды и вес * актив.выход . с потоками не разу дело не имел , то что видел в инете - это создаем поток и выводим в терминал . как можно создать параллельные потоки и дождатся их равершения и только потом переходить на следующий слой . у меня Linux , если я правильно понимаю ,то можно создать хоть 10000 потоков и Ось с ними разберется и передаст управление основному потоку ( здесь я могу ошибаться из-за своей безграмотности ). может у кого есть пример похожий на мою проблему или как это можно решить ? спасибо за понимание  ;D


Название: Re: нейронная сеть и потоки
Отправлено: Авварон от Март 18, 2021, 02:22
Может тормозить из-за Copy-On-Write, попробуйте std::vector


Название: Re: нейронная сеть и потоки
Отправлено: dimka8ya от Март 18, 2021, 09:27
QVector и std::vector особой разницы нет . тут именно математика числа double и возведение в степень .


Название: Re: нейронная сеть и потоки
Отправлено: Igors от Март 18, 2021, 09:55
Перед тем как копать/оптимизировать неплохо убедиться что задача вообще "разпоточивается". Это ларчик может просто "не открываться"


Название: Re: нейронная сеть и потоки
Отправлено: ecspertiza от Март 18, 2021, 11:53
1. 10000 потоков создать можно, но из за конкуренции между ними, работать быстрее не станет. Кол-во потоков выставляй кол-ву ядер процессора, в этом случае будет прирост, дальше либо без прироста скорости либо тормоза.
2. Можешь выносить вычисления по нейрону в QtConcurrent например, он возьмет поток из готового пула и отдаст ему расчет, создавай по QtConcurrent на вычисление. Когда все QtConcurrent завершились переходишь к следующему слою. В этом случае у тебя часть нейронов будут считаться в одном потоке, часть в другом и т.д. Не больше тредов чем кол-во ядер, насколько помню.
3. На CPU считать нейросети крайне затратная вещь. Не предназначен он для этого. Если это баловство с сетками или задача в универе, тогда вопросов нет. Иначе подрубай GPU для расчета.


Название: Re: нейронная сеть и потоки
Отправлено: Igors от Март 18, 2021, 12:13
Иначе подрубай GPU для расчета.
Какой "бодрый" совет :) Интересно каким образом его "подрубать"? (давеча создавал похожую тему)


Название: Re: нейронная сеть и потоки
Отправлено: m_ax от Март 18, 2021, 12:19
Цитировать
как я понимаю самые трмоза в математических расчетах сигмоиды и вес * актив.выход .
Нет, дело не в этом.
Как у вас back propagation error происходит/реализовано?


Название: Re: нейронная сеть и потоки
Отправлено: dimka8ya от Март 18, 2021, 12:29
все очень просто
Код:
std::thread t( [=]{
 for( int i=0; i<argc; ++i )
 std::cout << argv[i] << “\n”;
 });
 t.join();


Название: Re: нейронная сеть и потоки
Отправлено: m_ax от Март 18, 2021, 12:31
все очень просто
Код:
std::thread t( [=]{
 for( int i=0; i<argc; ++i )
 std::cout << argv[i] << “\n”;
 });
 t.join();

Это что за..?


Название: Re: нейронная сеть и потоки
Отправлено: ecspertiza от Март 18, 2021, 12:37
Судя по коду имеет смысл почитать про треды для начала )))) У вас тут не будет "параллельной" работы.


Название: Re: нейронная сеть и потоки
Отправлено: dimka8ya от Март 18, 2021, 12:49
Судя по коду имеет смысл почитать про треды для начала )))) У вас тут не будет "параллельной" работы.
согласен . многопоточности нет


Название: Re: нейронная сеть и потоки
Отправлено: dimka8ya от Март 18, 2021, 13:04
Код:
void do_work(unsigned id);
void f()
{
  std::vector<std::thread> threads;
  for(unsigned i=0;i<20;++i)
     {
      threads.push_back(std::thread(do_work,i));
     }
  std::for_each(threads.begin(),threads.end(),std::mem_fn(&std::thread::join));
}


Название: Re: нейронная сеть и потоки
Отправлено: Авварон от Март 18, 2021, 23:33
Код:
for (auto &thread: threads)
    thread.join();
[code]
[/code]


Название: Re: нейронная сеть и потоки
Отправлено: ecspertiza от Март 19, 2021, 10:41
ТС, у тебя задача какая? Побаловаться с нейронками или что то в прод. сделать?


Название: Re: нейронная сеть и потоки
Отправлено: dimka8ya от Март 19, 2021, 17:01
все только для личного пользования . GPU нет , и покупать новый ПК нет желания .  есть ноут 8и ядерный и сейчас думаю как разделить переменное количество нейронов в слое(от 1 до бесконечности) на 7 дополнительных потоков. пробовал разные библиотеки и у всех одна проблема ,нейрон в виде классов ,а это сжирает оперативку и мусор ненужный . вместо сигмоиды пробовал другие активации нейрона , получается усереднение ошибки ( сигмоида ошибка 0.03 , а другие доходили только до 0.14 ) . экспериментировал целый месяц и выводил ошибки на график QCuctom Plot  и пришол к итогу который у меня сейчас . нужно только решить с скоростью обучения сети , так как сеть нужно переучивать постоянно ( мои личные эксперименты и тараканы ) . с моим количеством слоев и нейронов в слое на обучение уходит 2е суток в 1 поток , сеть не стандартная .


Название: Re: нейронная сеть и потоки
Отправлено: dimka8ya от Март 19, 2021, 21:03
оказывается есть драйвер для Linux который поддерживает CUDA ,только это выяснил .
01:00.0 VGA compatible controller: NVIDIA Corporation GF108M [GeForce GT 635M] (rev a1)
новые возможности с новыми тараканами и посредственной видяшкой . к черту CUDA , нет желания прыгать с бубном .


Название: Re: нейронная сеть и потоки
Отправлено: ecspertiza от Март 25, 2021, 10:53
Если для себя тогда дерзайте, удачи вам в этом не легком деле. Но я бы предложил посмотреть в сторону готовых решений типа keras, и т.д


Название: Re: нейронная сеть и потоки
Отправлено: RedDog от Март 25, 2021, 13:17
Вот это не подойдет? https://cloud.google.com/tpu/


Название: Re: нейронная сеть и потоки
Отправлено: dimka8ya от Март 29, 2021, 12:44
попрыгав с бубном и произнеся заклинания , удалось использовать CUDA & Linux .
результат :

GPU: 0.244996 milliseconds
CPU: 7.81898 milliseconds

при прохождении 1 эпохи
ели кому интересно ,то тут весьма не плохо рассказано про сторонние библиотеки и CUDA https://luniak.io/cuda-neural-network-implementation-part-1/ (https://luniak.io/cuda-neural-network-implementation-part-1/)


Название: Re: нейронная сеть и потоки
Отправлено: qtkoder777 от Апрель 05, 2021, 00:01
Доброго времени суток. я сделал нейронную сеть на QVector<QVector<QVector<double>>> веса;
QVector<QVector<double>> уже тормозит адски. Делайте выводы.