Heavy | PyTorch 0.4.0 и официальное руководство по обновлению, поддержка Windows

искусственный интеллект Python PyTorch Windows
Редактор отдела планирования|Наталья
Компиляция | Неясно
Источник | Официальный сайт PyTorch
Руководство по передовой ИИ:Сегодня PyTorch официально выпустил версию 0.4.0 на GitHub.В новой версии сделано много улучшений.Самое важное улучшение заключается в том, что она, наконец, официально поддерживает систему Windows! Также есть большой бонус. Чтобы помочь пользователям старой версии быстрее перейти на новую версию, PyTorch официально написал руководство по миграции кода. AI Frontline составил полный текст этого руководства по миграции. Если вы используете старую версию PyTorch И хотите немедленно обновиться до последней версии, не пропустите!

Для получения дополнительных галантерейных товаров, пожалуйста, обратите внимание на публичный аккаунт WeChat «AI Frontline» (ID: ai-front)

PyTorch, фреймворк для глубокого обучения, созданный командой Facebook Artificial Intelligence Team (FAIR), стал популярным инструментом разработки сразу после запуска в январе 2017 года. Его преимущества в отладке и компиляции делают его популярным среди академических исследователей. Ранее в этом месяце новость о том, что код Caffe2 был объединен с PyTorch, также вызвала бурные обсуждения в отрасли.

Сегодня PyTorch официально выпустил версию 0.4.0 на GitHub, В этом обновлении много улучшений с 0.3.1 до 0.4.0, Самое главное,PyTorch теперь официально поддерживает Windows!До официальной поддержки большинству алхимиков для установки PyTorch в Windows приходилось полагаться на сторонние пакеты Conda, выпущенные другими разработчиками. Однако PyTorch в Windows не поддерживает распределенное обучение и может быть немного медленнее, чем Linux/OSX, поскольку Visual Studio поддерживает более старые версии OpenMP.

Как всегда, вы можете установить PyTorch в Windows, используя команды на http://pytorch.org.

Вот FAQ, который отвечает на большинство вопросов, которые могут возникнуть у вас в Windows:

http://pytorch.org/docs/stable/notes/windows.html

В дополнение к поддержке Windows версия 0.4.0 PyTorch фокусируется на компромиссах с памятью при вычислениях, поддержке нескольких вероятностных распределений, оптимизированных типах данных и коррекции тензоров.

Ниже приведен каталог обновлений для этой версии:

Основные основные изменения
  • Слияние тензора/переменной

  • нульмерный тензор

  • тип данных

  • Руководство по миграции

новая функция
  • Тензоры:

    • Полная поддержка расширенной индексации

    • Быстрое преобразование Фурье

  • Нейронные сети:

    • Компромиссы хранения при вычислениях

    • узкие места, инструмент для выявления горячих точек в коде

  • torch.distributions

    • 24 основных распределения вероятностей

    • Увеличение cdf, дисперсии, информационной энтропии, растерянности и т. д.

  • Распределенное обучение

    • Простая в использовании утилита Launcher

    • Серверная часть NCCL2

  • Расширение С++

  • Поддержка Windows

  • Улучшения ONNX

    • поддержка РНН

Официальное руководство по миграции PyTorch

Чтобы помочь пользователям более старых версий легче преобразовать код в новый API и стиль, а также привлечь больше новых пользователей, команда PyTorch также написала руководство по миграции. AI Frontline составил полное руководство по миграции следующим образом: Если вы хотите быстро обновить код PyTorch с предыдущих версий, читайте дальше!

PyTorch 0.4.0 содержит множество интересных новых функций и несколько важных исправлений ошибок, чтобы предоставить пользователям более удобный и понятный интерфейс. В этом руководстве по обновлению мы опишем важные изменения, которые необходимо внести при обновлении с более старой версии PyTorch до последней версии:

  • Тензор и переменная были объединены

  • Поддержка нульмерных (скалярных) тензоров

  • Устаревший изменчивый флаг

  • dtype, устройство и функции создания тензора в стиле Numpy

  • Пишите независимый от устройства код

Объединить тензор и переменную

torch.Tensor и torch.autograd.Variable теперь объединены в один класс. Точнее, torch.Tensor можно использовать для отслеживания истории и иметь то же поведение, что и старая переменная. Переменная практически не изменилась, но возвращаемый тип стал torch.Tensor. Это означает, что нам больше не нужно использовать обертки Variable в нашем коде.

Тип тензора() меняется

Следует отметить, что type() Tensor не может отражать тип данных, вместо этого вы можете использовать isinstance() или x.type():

Когда теперь автоград отслеживает историю?

require_grad является основным флагом autograd и теперь становится атрибутом Tensor. Те же правила, которые ранее использовались для переменных, применяются к тензорам. Autograd начнет отслеживать историю всякий раз, когда ввод Tensor операции содержит require_grad=True . Например:

флаг require_grad

В дополнение к возможности установить это свойство напрямую, этот флаг можно изменить на месте с помощью my_tensor.requires_grad_() или, как в приведенном выше примере, передать его в качестве аргумента при создании тензора (по умолчанию False), например :

.данные меняются

.data — это основной способ получить базовый тензор из переменной. После слияния вы все еще можете продолжать использовать y=x.data таким же образом, и его семантика останется прежней. Итак, y — это тензор, который использует те же данные, что и x, независимо от истории вычислений x, и его значение require_grad равно False.

Однако в некоторых случаях .data может быть небезопасным. Любые изменения в x.data не будут отслеживаться autograd, и если x требуется в обратном порядке, расчетный градиент может быть неправильным. Более безопасный подход — использовать x.detach(), который возвращает тензор с общими данными (requires_grad=False), но autograd отследит его изменения, если x нужно использовать в обратном порядке.

Поддержка нульмерных (скалярных) тензоров

Раньше при индексировании тензорного вектора (одномерного тензора) вы получали число Python, а индексирование переменной давало (иногда не обязательно) вектор размера (1,)! Аналогичная ситуация существует для функций сокращения, например, tensor.sum() вернет число Python, а variable.sum() вернет вектор размера (1,).

К счастью, в новой версии корректно реализована поддержка скаляров (0-мерных тензоров)! Скаляры можно создавать с помощью новой функции torch.tensor (более подробно это будет объяснено позже). Теперь мы можем сделать что-то вроде этого:

накопленные убытки

Взяв в качестве примера широко используемый шаблон total_loss+=loss.data[0], до версии 0.4.0 потеря представляла собой переменную, обертывающую тензор размера (1,), а в версии 0.4.0 потеря представляла собой скаляр нулевой размерности. Индексировать скаляры бессмысленно (сейчас выдает предупреждение, но станет ошибкой в ​​0.5.0). Мы можем использовать loss.item() для получения чисел Python из скаляров.

Обратите внимание, что это может потреблять много памяти, если потеря не преобразуется в число Python при ее накоплении. Это связано с тем, что правая часть приведенного выше выражения раньше была числом с плавающей запятой Python, но теперь она становится нульмерным тензором. Таким образом, общая потеря накапливается по тензорам и их историям градиентов, что может дольше сохранять график автоградации.

Устаревший изменчивый флаг

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

dtype, устройство и функции создания в стиле NumPy

В предыдущих версиях нам нужно было указать тип данных (плавающий или двойной?), тип устройства (процессор или cuda?) и макет (плотный или разреженный?) как «тип тензора». Например, torch.cuda.sparse.DoubleTensor представляет тип данных double с разреженным макетом COO, который находится на устройстве CUDA.

В новом выпуске мы представили классы torch.dtype, torch.device и torch.layout, чтобы лучше управлять этими свойствами с помощью функций создания в стиле NumPy.

torch.dtype

Ниже приведен полный список доступных torch.dtypes (типов данных) и соответствующих им тензорных типов.

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

torch.device

torch.device содержит тип устройства (cpu или cuda) и необязательный номер устройства (id). Его можно инициализировать с помощью torch.device('{device_type}') или torch.device('{device_type}:{device_ordinal}').

Если серийный номер устройства не существует, это означает, что это текущее устройство. Например, torch.device('cuda') эквивалентен torch.device('cuda: X'), где X — результат, возвращаемый torch.cuda.current_device() .

Тип устройства тензора теперь можно получить, обратившись к его свойству устройства.

torch.layout

torch.layout представляет макет данных тензора, в настоящее время он может поддерживать Currenttorch.strided (плотный тензор, по умолчанию) и torch.sparse_coo (разреженный тензор в формате COO).

Макет данных Tensor теперь можно получить, обратившись к его свойству layout.

Создать тензор

Теперь вы также можете указать параметры dtype, устройства, макета и require_grad тензора при создании тензора. Например:

torch.tensor(data, ...)

torch.tensor — это недавно представленный метод создания тензора, который копирует различные данные в стиле массива в новый тензор. Как упоминалось ранее, torch.tensor эквивалентен конструктору NumPy numpy.array. В отличие от методов создания torch*Tensor, таким образом мы можем создавать нульмерные тензоры (также известные как скаляры). Кроме того, если аргумент dtype не указан, он выводит соответствующий dtype. Мы рекомендуем этот подход при создании тензоров на основе существующих данных, таких как списки Python. Например:

Мы также добавили больше методов для создания тензоров, некоторые из которых также имеют варианты torch.*_like и tensor.new_* .

1.torch.*_like принимает тензор в качестве входных данных, а не форму. Если не указано иное, по умолчанию возвращается тензор с теми же свойствами, что и входной тензор:

2.tensor.new_* также можно использовать для создания тензора с теми же свойствами, что и у тензора, но для него требуется входной параметр формы:

В большинстве случаев, если вы хотите указать форму, вы можете использовать кортеж (например, torch.zeros((2,3))) или переменную (например, torch.zeros(2,3)).

Пишите независимый от устройства код

В предыдущих версиях было сложно написать код, который не зависит от устройства (независимость от устройства означает, что он может работать как на устройствах CUDA, так и на устройствах ЦП без модификации).

PyTorch 0.4.0 обеспечивает независимость от устройств двумя способами:

  • Получить torch.device всех тензоров через свойство устройства (get_device работает только для тензоров CUDA)

  • Метод to Tensor и Module можно использовать для простого перемещения объектов на разные устройства (без вызова cpu() или cuda() )

Мы рекомендуем такой подход:

Общий пример кода

Чтобы понять общие изменения в 0.4.0, давайте сравним 0.3.1 и 0.4.0 с примерами общего кода:

  • 0.3.1 (старая версия)

  • 0.4.0 (новая версия)

Текст руководства по миграции:

http://pytorch.org/2018/04/22/0_4_0-migration-guide.html

Дополнительные сведения об обновлении новой версии см. на странице PyTorch GitHub:

https://github.com/pytorch/pytorch/releases/tag/v0.4.0


Для получения дополнительных галантерейных товаров, пожалуйста, обратите внимание на публичный аккаунт WeChat «AI Frontline» (ID: ai-front)