Последнюю пару недель на нижних уровнях интеллект-стека происходит много интересного. Последний раз я давал какой-то обзор состояния дел в этом стеке в июньской заметке "Болваны для искусственного интеллекта",
http://ailev.livejournal.com/1356016.html. Основная мысль там была в том, что за исключением собственно прикладных платформ для конечных потребителей, все остальные уровни интеллект-стека быстро становятся биржевым товаром, commodity -- взаимозаменяемым, дешёвым, массовым. Вот моя диаграмма интеллект-стека из этой заметки:
Диаграмма эта прелестна тем, что показывает разделение труда: разные люди могут попробовать создать свой пупер-супер-дупер слой, используя интерфейсы платформ нижнего уровня и выдавая стандартный интерфейс для всех тех, кто уровнем выше. И если у вас реализован более-менее эффективный низ, то вы овладели миром: вы становитесь инфраструктурны, вы нужны всем тем, кто наверху. Пояснения к этой платформенной диаграмме см. в материале из моего учебника системного мышления "Модульные описания. Платформы и технологические стеки",
https://ailev.livejournal.com/1380087.html Инфраструктура отличается от любой другой структуры даже не столько тем, что это нижние уровни платформенного стека (инфра- это и означает "под"). Если что-то встречается везде, то это инфраструктура. 220 вольт в розетках в городе -- это инфраструктура, в лесу это не повсеместно, значит там это пока не инфраструктура. Нужно оказаться на нижних уровнях технологического стека, чтобы тебя использовали везде -- и тогда ты станешь инфраструктурой, будешь нужен всем. NVIDIA -- инфраструктурная компания, она делает инфраструктуру для вычислений. Я имел удовольствие на GTC Europe 2017 поговорить с Marc Hamilton, который вице-президент NVIDIA по Solutions architecture and Engineering. Марк аккуратно поправил меня в этом месте: NVIDIA is AI computation company. Она делает инфраструктуру не любых вычислений, а вычислений для интеллект-стека -- с точностью до того, что непонятно, где заканчивается её претензии на уровни. Ибо выгодней всего держать все модули снизу доверху -- тогда все деньги мира твои. В реальности же или ты держишь нижние уровни для множества самых разных реализаций верхних уровней, или держишь какие-то прикладные уровни, а низ заимствуешь. Стек постоянно перетасовывается, интерфейсы бронзовеют, реализации совершенствуются -- пока конкуренция не выбивает кого-то из игры.
Коммодитизация (стандартизация, удешевление) проходит на всех уровнях, разве что по поводу cognitive architecture platform есть ещё сильная неопределённость в том, как может быть устроен этот уровень. С остальными уровнями платформизация происходит обычно довольно быстро. В интеллект-стеке основная платформизация выражается сегодня как TensorFlow+CUDА примерно так же, как в компьютерном мире платформизация выражается словами Windows+Intel. Но сама предметная область ещё очень молода, и если даже в мире компьютерных платформ находится место и ARM, и Android, и Linux, то в мире искусственного интеллекта всё совсем не так уж определённо, и любой "стандарт де-факто сегодняшнего дня" это не норма. Сегодня инфраструктурой для самых разных обучающих алгоритмов (то есть различных их сборников, deep learning frameworks -- всех этих TensorFlow и MXNet, PyTorch и Caffe2) де-факто является NVIDIA CUDA и GPU. CUDA бесплатно, а вот GPU уже за деньги. И ситуация в распространённости самых разных поддерживаемых пакетов меняется быстро.
Последние две недели богаты на события. Так, вычислительная библиотека Theano приказала долго жить 28 сентября 2017 (
https://groups.google.com/forum/#!msg/theano-users/7Poq8BZutbY/rNCIfvAEAwAJ). Причина? Не поспевает в своём развитии за конкурентами: впервые введённые в ней идеи (например, being able to express models as mathematical expressions, rewriting computation graphs for better performance and memory usage, transparent execution on GPU, higher-order automatic differentiation) уже в мейнстриме и есть их реализациии получше. Но эта библиотека всё равно появилась в разряде стратегически поддерживаемых NVIDIA в презентациях на GTC Europe. Задача NVIDIA поддержать CUDA+GPU всё, что шевелится. Сегодня CUDA уже в версии 9 (
https://developer.nvidia.com/cuda-toolkit/whatsnew), а из NVIDIA GPU на GTC Europe 2017 без особого шума заявлен процессор новой архитектуры (следующий за Volta, он войдёт в состав автомобильной платформы Pegasus --
https://nvidianews.nvidia.com/news/nvidia-announces-world-s-first-ai-computer-to-make-robotaxis-a-reality). Вперёд и вперёд, чтобы не выбыть из инновационной гонки, как Theano. И желательно окопаться поглубже, чтобы твоими реализациями пользовались все более высокие уровни, во всём их возрастающем к самому прикладному верху разнообразии.
Проблема ещё и в том, что каждый целевой уровень платформенного стека непонятен никому, кроме людей, занимающихся этим целевым уровнем, а также следующим и предыдущим уровнями стека. Люди следующего уровня должны его знать, чтобы результативно и эффективно использовать модули предыдущего уровня на своём уровне, а люди предыдущего уровня должны его знать, чтобы удовлетворить потребности людей целевого уровня. Деньги в стеке идут от людей самого верхнего, прикладного уровня через все промежуточные люди до самых нижних уровней, где в конечном итоге и происходит реальная работа.
При этом реализаторы каждого уровня пытаются ещё и обеспечить альтернативные "бэкенды" (реализации разных вариантов нижестоящих уровней) -- ибо та или иная инфраструктура может быть попросту где-то недоступна. Часто реализаторы какого-то уровня ещё и сами прикидываются разной инфраструктурой, чтобы повысить вероятность их использования. Стандарты играют в этом ведущую роль, как о которых договорились, так и "де факто" (о которых не договаривались, но просто многим людям которые показались удобными).
На рынке сейчас есть несколько "компиляторов", осуществляющих оптимизирующий перевод/трансляцию представлений высокого уровня технологического стека в формат более низкого уровня. Это стало особо важным потому, что аппаратура для вывода (inference) и обучения (training) обычно используется разная.
У NVIDIA сегодня есть суперкомпьютер DGX-1 с 8 GPU архитектуры Volta для тренинга нейросеток (энергопотребление: 3.2КВт,
https://www.nvidia.com/en-us/data-center/dgx-1/), но вычислять по этим обученным нейросеткам (коннективистским "моделям") нужно на крохотульках с FP16 типа TX-2 (энергопотребление: 7.5Вт,
https://developer.nvidia.com/embedded/develop/hardware), или даже на ещё более мелких 8бит с фиксированной точностью DLA (deep learning accelerator, которые NVIDIA отдала в open source для включения в состав SoC для IoT (
https://ailev.livejournal.com/1376954.html).
Для решения этой задачи перепрыжки между разными форматами моделей служит TensorRT, выход версии 3 которого был только что объявлен на GTC Europe (
https://developer.nvidia.com/tensorrt): TensorRT can be used to rapidly optimize, validate, and deploy trained neural networks for inference to hyperscale data centers, embedded, or automotive product platforms.
TensorRT 3 это крутой продукт, его анонсу в keynote на GTC Europe 2017 было посвящено множество слайдов:
Highlights from this release include:
-- Deliver up to 3.7x faster inference on Tesla V100 vs. Tesla P100 under 7ms real-time latency
-- Optimize and deploy TensorFlow models up to 18x faster compared to TensorFlow framework inference on Tesla V100
-- Improved productivity with easy to use Python API
Другими словами, "если вы используете TensorFlow+TensorRT, то ваш вывод будет в 18 раз быстрей, чем вывод у "просто TensorFlow". То есть "используйте наши GPU, вы никуда не денетесь со своими TPU". Железо железом, но и софтвер тоже является инструментом в конкурентной борьбе. Из 12 тыс. сотрудников NVIDIA 10тыс. инженеры (остальные -- сейлзы и уборщицы), но из них собственно чипами занимаются где-то 500 человек. А остальные? Остальные занимаются софтом, и это стратегическая фишка. Граница между софтом и железом призрачна, меня самого так учили, и люди из NVIDIA это тоже хорошо понимают.
А что используют конкуренты? Неделю появился NNVM компилятор для AI Frameworks (анонс был 6 октября,
http://www.tvmlang.org/2017/10/06/nnvm-compiler-announcement.html). Это классический компилятор "изо всего во всё", с компиляцией в промежуточный язык, который затем исполняется на разных бэкендах:
Куда его отнести в интеллект-стеке? Это драйвер аппаратуры, как и TensoRT -- того же поля ягода. Сравнивать эти компиляторы трудно: TensorRT (по понятным причинам) поддерживает только железо NVIDIA, но зато он быстрый. А NNVM поддерживает всё, что шевелится в плане ускорения тензорных вычислений (включая CUDA), но зато он медленный. Разработчик NNVM пишет: "agree that for inference tensorRT is the ultimate goal. Will need more works on 8bit generation and tuning, but the challenge is exciting" --
https://twitter.com/tqchenml/status/916343288696791042. А дальше competition, в переводе с английского означающее "соревнование". Понятно, что команда TensorRT тоже не дремлет, и соревноваться команде NNVM придётся со следующими версиями TensorRT, причём обеспечивая поддержку самых разных бэкендов и самых разных входных пакетов.
А можно ли договориться о каком-то общем интерфейсе между уровнями? Нет, нельзя договориться. Помните войну браузеров, когда каждый браузер поддерживал старый стандарт веб-страниц HTML плюс новые фичи, не определённые в стандарте? Потом эти фичи попадали в следующую версию стандарта, и так продолжалось несколько лет. Новые фичи обычно требуют идти "мимо стандарта", и если есть достаточная пользовательская база -- то "личная разработка" становится "стандартом де-факто". Потребители выигрывают в любом случае и голосуют деньгами за правильный выбор производителей между стандартами и игнорированием стандартов.
Месяц Facebook и Microsoft предложили стандарт ONNX (Open Neural Network Exchange,
http://onnx.ai/), который вы уже видите на диаграмме как один из входных форматов для NNVM --
https://research.fb.com/facebook-and-microsoft-introduce-new-open-ecosystem-for-interchangeable-ai-frameworks/. А три дня назад к Facebook и Microsoft присоединились AMD, ARM, Huawei, IBM, Intel, Qualcomm --
https://research.fb.com/onnx-ai-format-adds-partners/. Но пока в списке нет Google, и нет NVIDIA.
Есть ли ещё попытки "компилирования"? Например компилятор для TrueNorth --
https://arxiv.org/abs/1601.04187. Можно принимать пари, что меньше чем через месяц объявят о компиляции ONNX на TrueNorth.
Есть и компилятор из CUDA в работающий на картах AMD C++,
https://github.com/ROCm-Developer-Tools/HIP. AMD поддерживает на эту тему большой проект:
https://rocm.github.io/. Но это всё крутится вокруг связки "язык программирования -- GPU", не заходя далеко вверх по интеллект-стеку.
Я очень надеюсь на "войну нейросетевых компиляторов", в этой войне победит потребитель -- на каждом уровне технологического стека свой. Хотя потом задним числом и будут говорить, что "потребитель выбрал неправильную платформу, которая затормозила развитие на десятилетия" (как сейчас говорят про платформу Wintel для классического компьютинга). Но это задним числом.
Ещё одна интересная особенность -- это "империализм" нынешней тусовки deep learning, которая пытается переобозвать платформу учебных алгоритмов deep learning более общим словом. Вот, например, NNVM -- это компилятор "для AI frameworks". По этому поводу шутят в Reddit
https://www.reddit.com/r/MachineLearning/comments/74os65/news_introducing_nnvm_compiler_a_new_open/):
-- A while ago we call them "deep learning frameworks", now it's called "AI frameworks"?
-- Just wait some time and they will become singularity frameworks ;)
-- I still call them ML frameworks..
У нас же в стеке это learning algorithm platform, которые совсем необязательно именно deep learning (там ведь и байесовские алгоритмы могут быть, и эволюционные алгоритмы). AI framework тут, скорее, cognitive architecture platform.
Стратегия NVIDIA тут интересна: Marc Hamilton сказал, что в NVIDIA очень тщательно выбирают, что поместить в GPU. Пока туда не поместили даже DLA -- это будет отдельный чип. И вообще, вопрос даже не про чипы, а про CUDA: на этом уровне осуществляется поддержка "вычислений искусственного интеллекта" (AI computing). Я пробовал поговорить с разными людьми в NVIDIA, насколько они агрессивно относятся к продвижению вверх по интеллект-стеку. Ответ почти от всех был такой: "пробуем продвинуться везде, но самый низ стека -- CUDA и GPU -- не отдадим никому".
Если поглядеть на диаграмму интеллект-стека, то NVIDIA там пытается закрыть пару нижних уровней и закрепиться на буквально всех уровнях выше (скажем, выпуская cuDNN -- оптимизированную для CUDA/GPU NVIDIA библиотеку нейросетевых учебных алгоритмов,
https://developer.nvidia.com/cudnn. Или поддерживая DIGITS -- фреймворк для обучения нейросеток в задачах обработки изображений,
https://developer.nvidia.com/digits).
А ещё NVIDIA закрепляется "вбок": в GPU всегда будет поддержка работы с изображениями -- кодеры/декодеры видео. А хорошо бы и аудио. И вообще, всего остального. Это важно, ибо AI не должен быть глух и слеп. А ещё нужно решать задачи имитационного моделирования: AI должен быть точен в его моделировании мира. И ещё AI должен хорошо работать с данными. В последней презентации Дженсена Хуанга на GTC Europe это всё отражено как инфраструктурный уровень CUDA и разнообразные прикладные стеки AI (объединённых потом сверху уровнем cognitive architecture -- но это в будущем, и не показано, а пока будет торговаться отдельно):
Чистый "ускоритель для deep learning" тут не спасёт, это маленькая часть происходящего в AI. Ускоритель должен быть "для всего, что может потребоваться в AI".
Идеал для NVIDIA, конечно, чтобы жизнь была устроена как в играх по отношению к видеокартам: есть разные всякие искусственные интеллекты, и если ты хочешь от них качества получше, ты лишь покупаешь "интеллект-карту" подороже, как в случае игр и видеокарт. Но в случае искусственного интеллекта всё сразу сложнее на уровне самих карт: для мобильных приложений в телефонах эти карты одни, для роботов и дронов другие, автомобилей -- третьи, а для стационарных мозгов очень хочется иметь серверные фермы, набитые высокопроизводительными мощными платами. Сложность нижнего уровня кучерявится, искусство в том, чтобы поддерживать достаточную простоту и универсальность. За универсальность же приходится расплачиваться производительностью -- ровно тем товаром, которым NVIDIA торгует. Зато нет проблемы масштабирования в обе стороны.
Ещё одно интересное замечание про важность стекового рассмотрения -- это возможность в экстраординарных обстоятельствах пошевелить интерфейсы железа -- пользователи CUDA этого не заметят. Mark Hamilton заметил, что Intel уже давно не имеет возможности шевелить интерфейсы железа, ибо весь текущий софт в мире остановится -- все операционные системы замрут. Это стагнация, это конец развития. Двухуровневость текущего инфраструктурного предложения поставщиков GPU, когда они предоставляют миру не "железный" машинный язык, а софтовый API, даёт возможность развития.
Ещё одна проблема -- это проблема непонимания технологий нижнего уровня платформенного стека. Чем ниже по интеллект-стеку, тем больше проблема непонимания -- "любая достаточно развитая технология неотличима от магии" (третий
закон Кларка), а каждый более низкий слой всё более и более технологичен, всё дальше и дальше от потребителя, всё больше понятен только самым нердам из нердов -- там вся магия. Программирование на CUDA меньшая магия, чем программирование "железа" GPU. Программирование на MXNET меньшая магия, чем программирование на CUDA. Программирование на вчера анонсированном Gluon (
https://aws.amazon.com/blogs/aws/introducing-gluon-a-new-library-for-machine-learning-from-aws-and-microsoft/) -- ещё меньшая магия, чем программирование на MXNet.
Если ты продаёшь верх стека, то должен вещать попсу потребителям, чтобы хорошо продавалось. Если ты продаёшь низ стека (а та же NVIDIA продаёт низ стека), то должен быть "хорошо известен в узких кругах".
Вот я был хорошо известен широким кругам, когда занимался преимущественно управленческим и стратегическим консалтингом. А вот в качестве поставщика know-how по системному мышлению я стал совсем непопсов, хотя это и существенно добавляет к качеству моего управленческого и стратегического консалтинга. У рационалистов из lesswrong ещё хуже: платформа рационализма ещё ниже по технологическому стеку хорошего мышления, чем системное мышление. Про пользу системного мышления ещё есть шанс достучаться до развивающих своё мышление людей, но про пользу рационализма и его логических оснований -- вот тут шансов меньше, люди удовлетворяются "магическими объяснениями" (типа "рационализм вырастает в мозгах при обучении в школе предметам STEM" -- это ведь рассуждение того же типа, что булки растут на деревьях. И ведь точно, булки явно растительного происхождения, а не животного или минерального!). А ведь рационализм в основании системного мышления! Используется он везде, во всех видах мышления, но знают о нём меньше.
У NVIDIA тут та же проблема: GPU ассемблер никому не объяснишь вообще, CUDA есть шанс объяснить программистам, прикладные задачи начинаются с библиотек (типа cuDNN), но дальше в том же AI ещё много-много системных уровней.
Так насколько удаётся объяснить CUDA программистам? Вполне удаётся. Вот цифры популярности CUDA:
Внимание к софту, учёт его многоуровневости решает проблемы железа. Софт делает железо известным и понятным, а железо даёт возможность блеснуть софту во всей его красе. Это верно и для любых других технологических уровней: нижние уровни дают блеснуть верхним, верхние прикладные уровни закрывают "магию" и сложность устройства инфраструктурных нижних.
UPDATE: обсуждение ВКонтакте --
https://vk.com/wall-44016343_16946