Chainer: граф будується під час обчислення
5 червня 2015 року токійська Preferred Networks випустила Chainer 1.0 — бібліотеку глибокого навчання на Python, у якій граф обчислень не описують наперед: він запам'ятовується сам, поки йде пряме обчислення. У грудні того ж року Сейя Токуй, Кента Оно, Шохей Хідо й Джастін Клейтон назвали цей підхід Define-by-Run на воркшопі LearningSys при NIPS.
Чому це важливо
Модель із циклами й розгалуженнями, як-от рекурентну мережу на входах різної довжини, стало можливо писати звичайним кодом мови й налагоджувати звичайним налагоджувачем. До того фреймворки на кшталт Caffe спершу читали опис моделі з окремого файлу, а вже потім виконували. PyTorch у своєму README називає Chainer серед того, з чого взяв натхнення.
Стаття протиставляє Define-by-Run підходу Define-and-Run, де модель задають файлом Protobuf у Caffe чи YAML у PyLearn2, і називає три його вади: пам'ять під увесь граф, обмежену розширюваність і неможливість користуватися налагоджувачем мови. Для GPU бібліотека має власний CuPy, частково сумісний з NumPy. Порівняно з Caffe перший мінібатч у Chainer повільніший за наступні до 7,0 раза, пряме обчислення повільніше в 1,1–1,8 раза, зворотне — порівнянне або швидше. Стаття про PyTorch 2019 року пише, що Chainer реалізує той самий підхід ціною продуктивності. Чого запис не стверджує: що PyTorch збудовано на архітектурі Chainer, як писав звіт, з якого взято кандидата, — README називає його поряд з autograd і torch-autograd.