Комментарии 20
Хотя гибкость и простота PyTorch, конечно, фантастические — за это можно всё простить!
Конкретных бенчмарков я не видел, но по субъективным ощущениям на моих задачах PyTorch работает с той же скоростью, что и TensorFlow. Если погуглить, то на первой странице выдачи окажутся ссылки на весьма неоднозначные посты и issue. У кого-то PyTorch в два раза обгоняет TensorFlow по скорости, у кого-то работает медленнее. Нельзя однозначно сказать, что PyTorch медленнее остальных фреймворков, но и рекорды он никакие, конечно, бьёт.
Разработчики утверждают, что сейчас они активно трудятся над JIT-компилятором. Когда он появится вопрос производительности должен будет отпасть сам собой.
www.youtube.com/watch?v=ghZyptkanB0
Пара простых вопросов. Умеет ли PyTorch оптимизировать выражения вида x + y — z? Т.е. создаст ли он промежуточный тензор под результат операции a = x + y? Насколько сложные выражения он умеет таким образом оптимизировать.
Второй вопрос — умеет ли он делать прямой AD (как у вас в примере), или же только обратный?
Ну и наконец — есть ли что-то вроде обертки для C++?
1) PyTorch ничего сам не оптимизирует, всё в руках программиста.
Если вы напишите
a = x + y - z
то два промежуточных тензора будут созданы.
Если же вы напишите
a = x.add(y).sub_(z)
то будет создан только один промежуточный тензор.
Если вы напишите
a = x.add_(y).sub_(z)
то ни одного тензора не будет создано, содержимое x
будет изменено, a
и x
будут указывать на один и тот же тензор.
2) Нет, не умеет.
3) Пока нет. В качестве основного способа деплоя моделей авторы видят конвертацию в формат Caffe2 или TensorFlow. Для написания же расширений в скором времени должен появиться интерфейс на C.
1) PyTorch ничего сам не оптимизирует, всё в руках программиста.
Жаль, всегда хочется немного упростить себе жизнь =)
a = x.add_(y).sub_(z)
Правильно ли я понимаю, что дифференцировать по этому выражению все еще возможно?
Еще такой вопрос — PyTorch выделяет для каждого тензора дополнительную память для самого дифференцирования сразу при создании тензора, или же как-то хитрее?
Тензоры не хранят никакой дополнительной информации сами по себе, для этого используется обёртка torch.autograd.Variable
.
Дополнительная память выделяется только при вызове backward()
и только в том объеме в каком она требуется.
Inplace функции add_()
и sub_()
допустимы для автоматического дифференцирования.
в TensorFlow мы «программируем» граф на некотором декларативном урезанном DSL, который затем компилируется в код на C и исполняется
Странное утверждение верное лишь очень в малой части (XLA compiler — experimental and considered alpha)
Имхо, PyTorch'у сильно не хватает мощной поддержки со стороны какого-нибудь гиганта рынка… по удобству эксплуатации оно по субъективным ощущениям превосходит мейнстримный tensorflow, но вот в деталях везеде чувствуется, что сделано тяп-ляп: например, фреймворк мало того, что не позволяет модельки прозрачно запускать на мобильных девайсах, так там даже запустить инференс модели, тренированой на GPU, на CPU — это танцы с бубном вокруг контейнейра с весами. И такая небрежность чувствуется во всем… в то время как tensorflow хоть и не так удобен, зато выглядит как законченые продукт, готовый к исопльзованию.
После этого интервью другие модные фреймворки стали казаться мне стариками.
FB — так себе гигант, у них семь пятниц на неделе: то они поддерживали торч (еще луашный), то они переключились на caffe2, а теперь у них появилась новая игрушка в виде pytorch… при этом качество выпускаемых ими подобных продуктов традиционно "так себе" (тот-же caffe2 периодически вообще не компилируется из мастера, а уж CI-ные билдеры я там зелеными и не видел никогда :-) )
К этому классу фреймворков как раз и относятся Torch и PyTorch.Кажется, Torch состоит из фиксированных модулей. А к динамическим фреймворкам можно еще добавить Chainer.
Для Torch есть AD, так что в теории он может использоваться для построения динамических графов. Модуль torch.nn
же действительно представляет собой коллекцию заранее написанных и оптимизированных блоков.
В целом, да, Torch нельзя назвать настолько же динамическим, как PyTorch, однако, на мой взгляд, он намного ближе к PyTorch, чем к представителям двух других групп.
Про Chainer не знал, спасибо. Посмотрел сейчас: он выглядит точь в точь как PyTorch вплоть до названий класов и методов. Интересно, у них общие корни или они просто синхронно пришли к похожей структуре и похожему API?
PyTorch — ваш новый фреймворк глубокого обучения