• Как тренировать нейронную сеть, если размер модели больше, чем имеющийся объём памяти устройства?

    FerroPanda
    @FerroPanda Автор вопроса
    В моём случае актуальным является PyTorch и там я нашёл как использовать параллелизм модели.
    Single-Machine Model Parallel Best Practices
    Если по простому, то раскидываем слои модели по разным устройствам и они поочереди считаются. Для ускорения процесса используется поточность - пока вторая карта считает последние слои, первая уже начинает считать первые слои на следующем примере.
    Ответ написан
    Комментировать
  • Где происходит ввод вывод и проверка данных?

    FerroPanda
    @FerroPanda
    Если до сих пор не разобрался, то добро пожаловать в PyTorch.)))
    https://proglib.io/p/generativno-sostyazatelnaya-n...
    Ответ написан
    Комментировать
  • Как сделать автозапуск приложения на Server 2012 в окружении определённого пользователя?

    FerroPanda
    @FerroPanda Автор вопроса
    Нужно просто настроить автологин для этого пользователя.
    Ответ написан
    Комментировать
  • PyTorch CUDA out of memory как исправить?

    FerroPanda
    @FerroPanda
    Столкнулся с такой же проблемой, почитал интернет и понял одну штуку. Да, хочется сразу всё загрузить в память и данные, и модель сети пожирнее и хотелось, чтобы torch сам управлял памятью/порциями данных и т.д. Фиг вам - это делаете вы сами своими ручками.
    Если данных много и они не помещаются в память, то вы подгружаете их частями из файла. Так же и с видеопамятью - если туда всё не влазит, то это ваша проблема по разделению всего этого на минимально приемлемые части и подгрузка/выгрузка из памяти видеокарты. Если ваша модель НН очень большая, то вы должны своими ручками разделить её на части и обрабатывать её послойно загружай/выгружая в память gpu. Ну и всё остальное в таком же духе.
    Короче, torch сам менеджментом памяти на gpu не занимается. Если данные в память видеокарты не влазят, то он просто выпадает в ошибку.
    Есть какие-то библиотеки, которые работаю обёрткой для torch и занимаются этим менеджментом, но я в ту сторону ещё не копал.
    Если у кого-то есть другая информация, то с радостью почитаю.

    P.S. В частности про Stable Diffusion. Там есть такая настройка как "Low memory mode (for 8Gb GPUs)", что можно интерпретировать как "режим для отстойных видях, у которых всего 8Гб памяти" ... а вы пытаетесь запустить на 6Гб ... сомневаюсь.
    Ответ написан
    Комментировать
  • Как правильно оформить функцию потерь в torch?

    FerroPanda
    @FerroPanda Автор вопроса
    Сам разобрался.
    В итоге всё сводится к тому, чтобы в своей какой-то функции обработать ответы сети, оценить их и самостоятельно высчитать ошибку. Потом взять любой ответ сети, на его основе создать свой правильный ответ, в сравнении с которым будет ошибка нужного нам размера, и потом это всё запихнуть в функцию потерь. Вся фишка в том, что к ответам сети привязаны графы их получения, т.е. в тензоре ответа сети есть вся последовательность как он получен. И на основании правильного ответа, ответа сети и этого графа, привязанного к ответу сети, выполняется обратное распространение ошибки. Нет графа - нет обучения. ))
    Ещё один момент - если в сети используется какой-то не типовой не дифференцируемый слой, то штатная оптимизация тоже не будет работать, но при этом никаких ошибок не покажет.
    В моём случае с выходной активацией softmax это оказалось не очень удачным вариантом, потому что допустим при ошибке 0,2 я не смог придумать как правильно создать целевой ответ.
    Условный код как это работает:
    optimizer.zero_grad()
    answers = agent.forward(train_data)
    #вычисляем ошибку на основе ответов сети в какой-то своей функции f(). 
    #Получаем например 0,2 - типа ошибка 20%
    nn_error = f(answers)
    #берём первый из ответов сети, который содержит граф расчётов
    nn_ans = answers[0]
    #тут нам нужно создать правильный ответ - возможны вариант и нужно придумать правильно
    #чтобы получить правильный можно как прибавить 20%, так и вычесть. Я прибавил.
    target_ans = nn_ans * (1 + nn_error)
    #функцию потерь можно сделать как свою, так и использовать штатную
    f_loss = nn.L1Loss()
    loss = f_loss(nn_ans, target_ans)
    loss.backward()
    optimizer.step()
    #print(list(agent.parameters()))
    Ответ написан
  • Какими алгоритмами обучения можно воспользоваться, с нестандартной функцией ошибки, которые на прямую не используют выходы обьучающих данных?

    FerroPanda
    @FerroPanda
    Я тоже не профессионал, но попробовал бы в данном случае генетический алгоритм - отбирать лучшего из пачки, немного мутировать, не забывая об исследователях, и дальше.
    Ответ написан
    Комментировать
  • Как сделать синхронизацию между облачными хранилищами?

    FerroPanda
    @FerroPanda
    О-диск (https://disk-o.cloud/) не подойдёт?
    Ответ написан
    Комментировать
  • Где можно арендовать дешевый сервер?

    FerroPanda
    @FerroPanda
    Всегда и на любом масштабе выгоднее своё, если в долгую.
    Была у меня как-то попытка влезть в аренду.
    Всё зависит от потребностей, сроков и необходимой надёжности.
    У меня была потребность 2 ядра, 4 гб и винт небольшой. Бэкапы свои, электричество и провайдер сильно не шалили. В итоге мне дешевле было купить неттоп и кинуть его в дальний угол, что я и сделал.
    Если это небольшое своё предприятие и несколько часов простоя не смертельная проблема, то проще купить на Али подходящий ксеон или собрать обычный хороший комп, взять хороший бесперебойник и наладить бэкапы - один на внешний диск, другой в облако - благо это сейчас дёшево. В итоге это всё обойдётся дешевле, чем аренда, если у вас руки есть.
    Аренда имеет смысл, если:
    1. Нужен аптайм 99,999999%
    2. Руки на это не заточены
    3. Ресурсы нужны на короткое время.
    4. Нужно быстро и много ресурсов.
    Во всех остальных случаях лучше своё железо.
    Если для вас первое это стоимость, то аренду можно не рассматривать.

    16 ядер, 64Гб оперативки - вы с али можете уложиться в 50к, что эквивалентно 3-м месяцам аренды.
    Если вам на месяц, то арендуйте. Если это рабочий сервер допустим под 1С, то покупайте.
    Ответ написан
    Комментировать
  • Нужен пример кода на Питоне обучения НС с подкреплением. Есть у кого?

    FerroPanda
    @FerroPanda Автор вопроса
    Вот нашёл ещё хороший пример для разбора и обучения на нём
    https://www.machinelearningmastery.ru/reinforcemen...
    Ответ написан
    Комментировать
  • Правильно ли я понимаю разницу между нейронной сетью и компьютерной программой?

    FerroPanda
    @FerroPanda
    Если совсем упрощённо.
    Программа это чётка последовательность действий Если-То-Иначе (Если высоко, то отойти назад, иначе прыгнуть).
    Нейронная сеть это сложная подгонка под ответ, ответ не бывает точным. Даже если он на 100% правильный, то это случайность. В примитивно варианте, НС это среднее арифметическое между примерами на которых учили эту НС.
    Если сеть учили на командах "ходить", а вы ей скажите "взлетай", то ответ она тоже выдаст, но он скорее всего будет абсурдным, но при этом не очевидно ошибочным, т.е. будет похож на правду.
    Ответ написан
    Комментировать
  • С какими ограничениями я могу столкнуться, если буду писать на чистом Keras?

    FerroPanda
    @FerroPanda
    На Keras вам будет недоступно обучение с подкреплением.
    Но лучше всё-таки начать с Keras - понять основы, набить пару шишек. И когда придёт осознание того, что вам нужно либо остаться на Keras, либо уйти в pytorch ... либо всё бросить.
    Ответ написан
    Комментировать
  • Матрица. Как правильно подать данные для обучения нейронной сети?

    FerroPanda
    @FerroPanda Автор вопроса
    Для keras при обучении LSTM, RNN или свёрточных сетей такие данные нужно подавать в виде тензора, т.е. делать матрицу трёхмерной или больше. Любую двухмерную матрицу M(Х, Y) можно представить как трёхмерную M(X, Y, Z), где Z=1.
    Делается это с помощью reshape - изменяется размерность массива при сохранении данных.
    M =np.reshape(M, (X, Y, Z)) или M =np.reshape(M, (X, Z, Y))
    В моём же случае если Х количество обучающих выборок, то графики в эксельку сохраняем как матрицу М(Х, 400), а потом после загрузки данных делаем M =np.reshape(M, (X, 4, 100)).
    В итоге получается Х наборов двухмерных матриц 4х100.
    В принципе, для загрузки в питон, в файл можно сохранить все данные в одну строчку, а потом с помощью reshape нарезать их в нужный формат (2d, 3d, 4d и т.д.).
    Ответ написан
    Комментировать
  • Как посчитать сколько нужно видеопамяти для тренировки нейронной сети?

    FerroPanda
    @FerroPanda Автор вопроса
    Сам отвечу. Необходимый объём памяти равен объёму обучающей выборки +ещё чуть-чуть. Если данных больше, чем объём памяти видеокарты, то падает производительность ядра, т.к. начинается постоянная подкачка данных из оперативной памяти в память видеокарты. Загрузка процессора видеокарты в таком случае падает в 2-3 раза, иногда больше.
    Если у вас обучающая выборка 10+ Гб, то на 1060 возможно загрузка карты будет постоянная приближённая к максимуму. Т.е. проц не быстрый и успевает обработать то, что подгрузилось. Карта 1080 и выше в такой ситуации будет постоянно простаивать в ожидании данных, т.е. время обучения НС окажется условно одинаковым.
    Если же объём выборки будет в районе 5-6 Гб или меньше, то 1080 окажется существенно быстрее.
    Ответ написан
    Комментировать
  • Как прогнозировать многомерные временные ряды в Keras?

    FerroPanda
    @FerroPanda
    Я так понял, что это возможно только в LSTM и подобных структурах.
    Создаёшь трехмерный массив data(x, y, z) где -
    x - количество обучающих выборок
    y - количество векторов в одной обучающей выборке
    z - количество данных в одном векторе.

    Потом создаёшь слой LSTM
    model.add(LSTM(units=32, input_shape=(y, z)))
    x указывать не нужно сеть сама поймёт что к чему.
    units - это количество выходов на следующий слой (32 как пример).

    Если моё представление ошибочно, то думаю меня поправят, но вроде работает.
    Ответ написан
    Комментировать