Во-первых, я должен упомянуть Im о факеле версии 0.3.1, но я рад, если это необходимо, обновить.
Я все еще учусь, поэтому, пожалуйста, дайте мне знать, если я что-то не понял.
Я строю несколько графиков императивно, используя переменные. С течением времени математические выражения могут быть довольно сложными, и некоторые части графиков могут быть сгенерированы с использованием функций градиента автографов, которые затем могут быть задействованы.
Я могу создать любое выражение, которое я хочу, просто отлично. Единственный улов заключается в том, что этот граф может быть довольно "медленным" - для относительно простых операций (умножив матрицы 4хх), это может занять несколько мс.
Однако после создания этих графиков я ожидаю, что я смогу обновить определенные значения переменных и оценить результат графика (или любого узла, действительно) намного быстрее. Я считаю, что это, вероятно, так, так как оценка должна быть полностью реализована в C-back-end, что должно быть довольно отимизировано для скорости? Другими словами, построение графика в python может быть медленным, поскольку оно включает в себя python для циклов и т.п., Но повторная оценка графика со статической топологией должна быть быстрой.
Правильно ли эта интуиция? Если да, то как я могу эффективно назначить значение и переоценить график?
Если вы говорите об обновлении значений входных переменных, и вы просто хотите оценить форвард графика и не собираетесь вызывать .backward()
, вы можете использовать volatile=True
для входных Variable
(Variable
) в Pytorch 0.3.
Эта функция удаляется в 0,4 в пользу менеджера контекста with torch.no_grad():
Обычно это делается во время вывода. Если вы это сделаете, график не будет создан, что позволит избежать накладных расходов.
Из 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,3 и 0,4:
Флагманский флаг теперь устарел и не имеет никакого эффекта. Раньше любое вычисление, которое включает переменную с volatile = True, не отслеживалось автографом. Теперь это заменено набором более гибких контекстных менеджеров, включая torch.no_grad(), torch.set_grad_enabled (grad_mode) и другие.
Поэтому, когда вы говорите: "Тогда, если есть способ превратить все переменные этого графа в энергонезависимые, я могу просто выполнить вывод". , установка входа как volatile
или использование no_grad
сделает именно это.
Что касается примера использования torch.no_grad()
, посмотрите на test
функцию в этом скрипте.
Я не знаю ни одного метода, чтобы избежать создания графика на каждой итерации в режиме обучения в Питорче. Динамические графики стоят дорого. Если вы хотите это, конвертируйте свою модель в Tensorflow/Caffe2/любую библиотеку, поддерживающую статические графики, хотя, по моему опыту, они не обязательно будут быстрее.