Обновление переменных Pytorch

1

Во-первых, я должен упомянуть Im о факеле версии 0.3.1, но я рад, если это необходимо, обновить.

Я все еще учусь, поэтому, пожалуйста, дайте мне знать, если я что-то не понял.

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

Я могу создать любое выражение, которое я хочу, просто отлично. Единственный улов заключается в том, что этот граф может быть довольно "медленным" - для относительно простых операций (умножив матрицы 4хх), это может занять несколько мс.

Однако после создания этих графиков я ожидаю, что я смогу обновить определенные значения переменных и оценить результат графика (или любого узла, действительно) намного быстрее. Я считаю, что это, вероятно, так, так как оценка должна быть полностью реализована в C-back-end, что должно быть довольно отимизировано для скорости? Другими словами, построение графика в python может быть медленным, поскольку оно включает в себя python для циклов и т.п., Но повторная оценка графика со статической топологией должна быть быстрой.

Правильно ли эта интуиция? Если да, то как я могу эффективно назначить значение и переоценить график?

Теги:
pytorch
autograd

1 ответ

0

Если вы говорите об обновлении значений входных переменных, и вы просто хотите оценить форвард графика и не собираетесь вызывать .backward(), вы можете использовать volatile=True для входных Variable (Variable) в Pytorch 0.3.

Эта функция удаляется в 0,4 в пользу менеджера контекста with torch.no_grad():

Обычно это делается во время вывода. Если вы это сделаете, график не будет создан, что позволит избежать накладных расходов.

Обновить

Pytorch 0.3

Из Pytorch 0.3 docs:

Volatile рекомендуется для режима чисто умозаключений, когда вы уверены, что даже не будете вызывать.backward(). Он более эффективен, чем любые другие настройки автографа - он будет использовать абсолютный минимальный объем памяти для оценки модели. volatile также определяет, что require_grad - False.

а также

Volatile отличается от require_grad тем, как распространяется флаг. Если даже один нестабильный вход в операцию, его выход также будет неустойчивым. Волатильность распространяется по графику намного проще, чем не требующий градиента - вам нужен только один летучий лист, чтобы иметь volatile output, в то время как вам нужны все листья, чтобы не требовать градиента, чтобы иметь выход, который не требует градиента. Используя флажок volatile, вам не нужно изменять какие-либо параметры параметров модели, чтобы использовать их для вывода. Его достаточно для создания неустойчивого ввода, и это гарантирует, что никакие промежуточные состояния не будут сохранены.

Поэтому, если вы используете Pytorch 0.3 и хотите сделать эффективный вывод, вы используете volatile=True на ваших входах.

Pytorch 0.4

Диспетчер контекста был введен в Pytorch 0.4. Из руководства по миграции Pytorch между 0,3 и 0,4:

Флагманский флаг теперь устарел и не имеет никакого эффекта. Раньше любое вычисление, которое включает переменную с volatile = True, не отслеживалось автографом. Теперь это заменено набором более гибких контекстных менеджеров, включая torch.no_grad(), torch.set_grad_enabled (grad_mode) и другие.

Поэтому, когда вы говорите: "Тогда, если есть способ превратить все переменные этого графа в энергонезависимые, я могу просто выполнить вывод". , установка входа как volatile или использование no_grad сделает именно это.

Что касается примера использования torch.no_grad(), посмотрите на test функцию в этом скрипте.

Статические графики во время обучения

Я не знаю ни одного метода, чтобы избежать создания графика на каждой итерации в режиме обучения в Питорче. Динамические графики стоят дорого. Если вы хотите это, конвертируйте свою модель в Tensorflow/Caffe2/любую библиотеку, поддерживающую статические графики, хотя, по моему опыту, они не обязательно будут быстрее.

  • 0
    Спасибо за ответ. Единственная проблема с этим решением состоит в том, что вы не можете получить градиенты чего-то изменчивого. Топология графа должна быть статической независимо от того, вычисляются ли градиенты или нет относительно изменяющейся переменной. Есть ли способ изменить значение, по которому вычисляются градиенты?
  • 0
    Теперь, когда я думаю об этом, это все еще может работать. Если я беру градиент с помощью autograd, я создаю новый график, если я правильно понимаю. Затем, если есть способ превратить все переменные этого графа в энергонезависимые, я могу просто выполнить вывод. Я предполагаю, что менеджер контекста - более чистый способ сделать это, это правильно?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню