Полная версия
Машинное обучение на практике – от модели PyTorch до Kubeflow в облаке для BigData
* сети доверия ("deep belief");
* генеративно состязательные сети – противостояние двух сетей: генератора и оценивателя;
* нейронные машины Тьюринга – нейронная сеть с блоком памяти;
* нейронные сети Кохонена – для обучения без учителя;
* различные архитектуры кольцевых нейронных сетей: нейронная сеть Хопфилда, цепь Маркова, машина Больцмана.
Рассмотрим более подробно наиболее часто применяемые сети, а именно, сети прямого распространения, свёрточные и рекуррентные:
Нейронные сети прямого распространения:
* два входа и один выход – Percetron (P);
* два входа, два нейрона полносвязных с выходом и один выход – Feed Forward (FF) или Redial Basics Network (RBN);
* три входа, два слоя по четыре полносвязных нейрона и два выхода Deep Feed Forward (DFF);
* глубокие нейронные сети;
* сеть экстремального распространения – сеть со случайными связями (нейронная эхо–сеть).
Cвёрточные нейронные сети:
* традиционные свёрточные нейронные сети (CNN) – классификация изображений;
* развёртывающие нейронные сети – генерация изображений по типу;
* глубинные свёрточные обратные графические сети (DCEGC) – соединение свёрточной и развёртывающей нейронных сетей для преобразования или объединения изображений.
Рекуррентные нейронные сети:
* рекуррентные нейронные сети – сети с памятью у нейронов для анализа последовательностей, в которых последовательность имеет значение, таких как текст, звук и видео;
* сети с долгой краткосрочной памятью (LSTM) – развитие рекуррентных нейронных сетей, в которых нейроны могут классифицировать данные, какие стоит запомнить в долгоживущую память от тех, которые стоит забыть и удалить информацию из памяти о них;
* глубокие остаточные сети – сети со связями между слоями (по работе сходны с LSTM);
* управляемые рекуррентные нейроны (GRU).
Основы для написания сетей.
До 2015 года с большим отрывом лидировала scikit–learn, которую догонял Caffe, но с выходом TensorFlow он сразу стал лидером. Со временем только набирая отрыв с двухкратного на трёхкратный к 2020 году, когда на GitHub набралось более 140 тысяч проектов, а у ближайшего конкурента чуть более 45 тысяч. На 2020 году по убывающей расположились Keras, scikit–learn, PyTorch (FaceBook), Caffe, MXNet, XGBoost, Fastai, Microsoft CNTK (CogNiive ToolKit), DarkNet и ещё некоторые менее известные библиотеки. Наиболее популярными для отрытых проектов на GitHub можно выделить библиотеку PyTorch и TenserFlow. Если смотреть на количество звёздочек на GitHub по библиотекам, то на 2020 год тысяч звёздочек:
* TenserFlow: 153 * Keras: 51 * PyTorch: 46 * Sckit-learn: 45 * Caffe: 31 * MXNet: 19 * CNTK: 17 * Theane: 9 * Caffe2: 8
PyTorch хорошо для прототипирования, изучения и испробования новых моделей. TenserFlow популярен в производственной среде, а проблема низкого уровня описания решается с помощью Keras:
* FaceBook PyTorch – хороший вариант для обучения и прототипирования из–за высокого уровня и поддержки различных сред, динамический граф, может дать преимущества при обучении. Используется в Twitter, Salesforce.
* Google TenserFlow – имел изначально статический граф решения, ныне поддерживается и динамический. Используется в Gmail, Google Translate, Uber, Airbnb, Dropbox. Для привлечения использования в облаке Google под него внедряется аппаратный процессор Google TPU (Google Tensor Processing Unit).
* Keras является высокоуровневой настройкой, обеспечивающей больший уровень абстракции для TensorFlow, Theano или CNTK. Хороший вариант для обучения. К примеру, он позволяет не указывать размерность слоёв, вычисляя её сам, позволяя разработчику сосредоточиться на слоях архитектуры. Обычно используется поверх TenserFlow. Код на нём поддерживается Microsoft CNTK.
Так же имеются более специализированные фреймворки:
* Apache MXNet (Amazon) и высокоуровневая надстройка для него Gluon. MXNet – фреймворк с акцентом на масштабирование, поддерживает интеграцию с Hadoop и Cassandra. Поддерживается C++, Python, R, Julia, JavaScript, Scala, Go и Perl.
* Microsoft CNTK имеет интеграции с Python, R, C#, благодаря тому что большая часть кода написана на С++. То, что вся основа написана на С++, не говорит о том, что CNTK будет обучать модель на C++, а TenserFlow на Python (который медленный), так как TenserFlow строит графы и уже его выполнение осуществляется на C++. Отличается CNTK от Google TenserFlow и тем, что он изначально был разработан для работы в кластерах Azure с множеством графических процессоров, но сейчас ситуация выравнивается и TenserFlow поддерживает кластера.
* Caffe2 – фреймворк для мобильных сред.
* Sonnet – надстройка DeepMind поверх TensorFlow для обучения сверх глубоких нейронных сетей.
* DL4J (Deep Learning for Java) – фреймворк с акцентом на Java Enterprise Edition. Высока поддержка BigData на Java: Hadoop и Spark.
Со скоростью доступности новых предобученных моделей ситуация разнится и пока лидирует PyTorch. По поддержке сред, в частности публичных облаков, лучше у Фреймворках, продвигаемых вендерами этих облаков, так лучше поддержка TensorFlow лучше в Google Cloud, MXNet – в AWS, CNTK – в Microsoft Azure, D4LJ – в Android, Core ML – в iOS. По языкам общая поддержка в Python практически у всех, в частности TensorFlow поддерживает JavaScript, C++, Java, Go, C# и Julia.
Многие фреймворки поддерживают визуализацию TeserBodrd. Он представляет собой комплексный Web интерфейс многоуровневой визуализации состояния и процесса обучения и его отладки. Для подключения нужно указать путь к модели "tenserboard –logdir=$PATH_MODEL" и открыть localhost:6006. Управление интерфейсом основано на навигации по графу логических блоков и открытию интересующих блоков, для последующего повторения процесса.
Для экспериментов нам понадобится язык программирования и библиотека. Часто в качестве языка берут простой язык с низким порогом входа, такой как Python. Могут быть также и другие языки общего назначения, такие как JavaScript или специализированные, такие как язык R. Мы возьмём Python. Для того чтобы не ставить язык и библиотеки, воспользуемся бесплатным сервисом colab.research.google.com/notebooks/intro.ipynb, содержащим Jupyter Notebook. Notebook содержит в себе возможность не просто писать код с комментариями в консольном виде, а оформлять его в виде документа. Испробовать возможности Notebook можно в учебном плейбуке https://colab.research.google.com/notebooks/welcome.ipynb, такие как оформление текста на языке разметки MD, с формулами на языке разметки TEX, запуск скриптов на языке Python, вывод результатов их работы в текстовом виде и в виде графиков, используя стандартную библиотеку Python: NumPy(НамПай), matplotlib.pyplot. Сам Сolab представляет графическую карту Tesla K80 на 12 часов за раз (на сессию) бесплатно. Она поддерживает различные фреймворки глубокого машинного обучения, в том числе, Keras, TenserFlow и PyTorch. Цена же составляет GPU в Google Cloud:
Tesla T4: 1GPU 16GB GDDR6 0.35$/час Tesla P4: 1GPU 8GB GDDR5 0.60$/час Tesla V100: 1GPU 16GB HBM2 2.48$/час Tesla P100: 1GPU 16GB HBM2 1.46$/час
Попробуем. Перейдём по ссылке colab.research.google.com и нажмём кнопку "создать блокнот". У нас появится пустой Notebook. Можно ввести выражение:
10**3 / 2 + 3
и нажав на воспроизведение – получим результат 503.0. Можно вывести график параболы, нажав кнопку "+Код" в введя в новую ячейку код:
def F(x): return x*x import numpy as np import matplotlib.pyplot as plt x = np.linspace(–5, 5, 100) y = list(map(F, x)) plt.plot(x, y) plt.ylabel("Y") plt.xlabel("X")
Или выведя ещё и изображение:
import os !wget https://www.python.org/static/img/python–logo.png import PIL img = PIL.Image.open("python–logo.png") img
Популярные фреймворки:
* Caffe, Caffe2, CNTK, Kaldi, DL4J, Keras – набор модулей для конструирования;
* TensorFlow, Theano, MXNet – программирование графа;
* Torch и PyTorch – прописать основные параметры, а граф будет построен автоматически.
Рассмотрим работу библиотеки PyTorch (NumPy+CUDA+Autograd) из–за её простоты. Посмотрим на операции с тензорами – многомерными массивами. Подключим библиотеку и объявим два тензора: нажмём +Code, введём код в ячейку и нажмём выполнить:
import torch a = torch.FloatTensor([ [1, 2, 3], [5, 6, 7], [8, 9, 10] ]) b = torch.FloatTensor([ [–1, –2, –3], [–10, –20, –30], [–100, –200, –300] ])
Поэлементные операции, такие как "+", "–", "*", "/" над двумя матрицами одинаковых габаритов производят операции с соответствующими их элементами:
a + b tensor([ [ 0., 0., 0.], [ –5., –14., –23.], [ –92., –191., –290.] ])
Другим вариантом поэлементной операции является применение одной операции ко всем элементом по одиночке, например умножение на –1 или применение функции:
a tensor([ [ 1., 2., 3.], [ 5., 6., 7.], [ 8., 9., 10.] ]) a * –1 tensor([ [ –1., –2., –3.], [ –5., –6., –7.], [ –8., –9., –10.] ]) a.abs() tensor([ [ 1., 2., 3.], [ 5., 6., 7.], [ 8., 9., 10.] ])
Также имеются операции свёртки, такие как sum, min, max, которые на входе дают сумму всех элементов, самый маленький или самый большой элемент матрицы:
a.sum() tensor(51.) a.min() tensor(1.) a.max() tensor(10.)
Но нам будут больше интересны постолбцовые операции (операция будет производиться над каждым столбцом):
a.sum(0) tensor([14., 17., 20.]) a.min(0) torch.return_types.min( values=tensor([1., 2., 3.]), indices=tensor([0, 0, 0]) ) a.max(0) torch.return_types.max( values=tensor([ 8., 9., 10.]), indices=tensor([2, 2, 2]) )
Как мы помним, нейронная сеть состоит из слоёв, слои состоят из нейронов, а нейрон содержит на входе связи с весами в виде простых чисел. Вес задаётся обычным числом, тогда входящие связи в нейрон можно описать последовательностью чисел – вектором (одномерным массивом или списком), длина которого и есть количество связей. Так как сеть полносвязная, то все нейроны этого слоя связаны с предыдущим, а, следовательно, демонстрирующие их вектора имеют тоже одинаковую длину, создавая список равных по длине векторов – матрицу. Это удобное и компактное представление слоя, оптимизированное для использования на компьютере. На выходе нейрона имеется функция активации (сигмойда или, ReLU для глубоких и сверхглубоких сетей), которая определяет, выдаст на выходе нейрон значение или нет. Для этого необходимо применить её к каждому нейрону, то есть к каждому столбцу: мы уже видели операцию к столбцам.
Способы ускорения обучения
Пробежимся по истории развития вычислительных систем которая давала вычислительную основу для развития искусственного интеллекта:
* 1642 – механические вычислительные машины, * 1940 – ламповые вычислительные машины, * 1955 – транзисторные вычислительные машины, * 1965 – компьютеры на интегральных схемах, * 1980 – компьютеры с центральными процессорами, * 1995 – многоядерные видеокарты, * 2006 – компьютеры с многоядерными процессорами, * 2017 – компьютеры с матричными процессорами.
На универсальных процессорах можно выделить три пути обеспечения ускорения вычислений, в частности, ускорения обучения нейронных сетей, – распараллеливание вычислений, увеличение количества операций за единицу времени и увеличение объёма вычислений за операцию. Рассмотрим с самой однозначной и имеющей богатую историю способа повышения производительности – увеличение количества операций за единицу времени. Достигается это за счёт увеличения тактовой частоты процессора. Исторически мы можем проследить её историю на примерах процессоров компании Intel серии Pentium для домашних рабочих станций и игровых персональных компьютеров, которые сделали ставку именно в том числе на неё и сильно продвинулись в этом направлении. Важно заметить, что Intel имела время (история от процессоров Intel Pentium 1 100 Мегагерц до Intel Pentium 4 5600 Мегагерц), средства (эта ниша на была лидером по объёму продаж и были популярны компьютерные игры) и необходимость (имела конкурента AMD, который имел архитектурные преимущества в виде разрядности шины в 64 вместо 32, и в случае смены лидера мог договориться адаптировать программное обеспечение под эту разрядность) для того, чтобы реализовать это направление по максимуму. Процессора Intel Pentium 1 100 Мегагерц работали с охлаждающим модулем, Intel Pentium 2 400 Мегагерц – с радиатором, выше уже требовался, как минимум, вентилятор. Начиная с частоты 3200, пользователи ставили вместо полностью алюминиевого радиатора, сперва алюминиевого с медной подложкой, потом полностью медные, так как теплоёмкость у алюминия 904 Дж/(кг*град), а у менди кратно меньше 381 Дж/(кг*град), что позволяет ему быстрее отдавать тепло дальше. Большие показатели дают другие металлы не слишком мягкие и не слишком легкоплавкие, такие как серебро (250) и золото (130), поэтому пошли не по теплопроводности самого материала, а по забору тепла при плавлении материала в тепловых трубках. Пепловые трубки отходят от подложки и ведут через закреплённые на них пластины, обдуваемые двумя вентиляторами, образуя прямой поток воздуха. Тепловые трубки оказывают хороший результат (100 Вт для 3 штук, 180 Вт для 6 штук), перенос тепла которыми осуществляется за счёт испарения жидкости в них находящийся в испарительной камере у радиатора, но большая площадь меди и большая разность температуры водяного охлаждения предоставило большую популярность, а вот в ноутбуках – наоборот, тепловые трубки очень популярны, а движение возврат конденсата обусловлен капиллярной структурой в самих трубках. А для поддержки больших частот продавались процессоры, которые выбирались из партии экспериментальным путём по возможности стабильно работать на этих частотах, и требовали, зачастую, водяного охлаждения и вынесенным радиатором из их системного блока персонального компьютера. Экстремальные же частоты достигались индивидуально и требовали криогенных установок, иногда в несколько контуров. При всём при этом, с каждым 100 Мегагерц повышение частоты достигалось большими затратами с высокими рисками повреждения процессора и не получало стабильную вычислительную производительность. На 2021 проверяются решение по литографии капилляров для охлаждающей жидкости внутри процессора, что может быть особенно актуально для многослойных процессоров. Приведу процессоры без бюджетных вариантов и серверных версий компании Intel с лидирующей архитектурой x86 в CISC:
1971, 4004: 500—740 кГц 1972, 4040: 500—740 КГц 1972, 8008: 200—800 кГц 1974, 8080: 2—4 МГц 1976, 8085: 3—6 МГц 1978, 8086: 4—16 МГц 1979, 8088: 5—16 МГц 1982, 80188: 6—20 МГц 1982, 80286: 6—20 МГц 1985, 80386: 12—40 МГц 1991, 80486: 16—150 МГц 1993, Pentium: 60—300 МГц 1995, Pentium Pro: 133—200 МГц 1997, Pentium MMX: 166—233 МГц 1997, Pentium II: 233—450 МГц 1999-2003, Pentium III: 0.4—1.4 ГГц 2000-2008, Pentium 4: 1.3—3.8 ГГц 2006-2011, Core 2 Extreme: 2.3—3.2 ГГц 2008-2013, Core i3: 2.4—4.2 ГГц 2008-2020, Core i7: 1.0—4.7 ГГц 2017-2021, Core i9: 2.1—5.3 ГГц
С Pentium III ситуация не так однозначна, так как имеются пересечения по времени и в один год выходят процессоры начального уровня и топового, поэтому детализируем из отрытых источников:
год процессор i7 Base/Boost GHz 2008 Core i7-965 EE 3.2 2009 Core i7-975 EE 3.3 2010 Core i7-980X 3.3 2011 Core i7-990X 3.5 2012 Core i7-3820 3.6 2013 Core i7-4820K 3.7 2014 Core i7-4790K 4.0 / 4.4 2015 Core i7-6700K 4.0 / 4.2 2016 Core i7-7700K 4.2 / 4.5 2017 Core i7-7740X 4.3 / 4.5 2018 Core i7-8086K 4.0 / 5.0 2019 Core i7-9700KF 3.6 2020 Core i7-10700K 3.8 2021 Core i7-11700KF 3.6 год процессор i9 GHz / Boost 2017 Core i9-7900X 3.3 / 4.3 2018 Core i9-9900X 3.5 / 4.5 2019 Core i9-9990XE 4.0 / 5.1 2020 Core i9-11900KF 3.5 / 5.2 2021 Core i9-12900KF 3.5 / 5.3
И видно, что до 2017 года тенденция сохранялась. Понятно, что, конкурентом крупнейшего производителя в первую очередь является он сам и вывод последних разработок менеджментом в гарантированном горизонте их работы в должности. Но и никто не отменял, что отлаживать нужно технологические процессы и архитектуры. С другой стороны, эстафету гонки в Boost за максимальную частоту продолжается тенденция роста максимальной частоты. Boost – это повышение частоты процессора до максимума в текущих условиях. Максимум определяется стабильностью процессора (отсутствием ошибок), которая зависит от стабильности электропитания, качества охлаждения, окружающей температуры и качества процессора, величина которая плавает в определённых пределах. Процессор определяет, не наступили пограничные ли параметры, а если нет – то повышает свою частоту. Технология используется как в процессорах от Intel (Intel Turbo Boost Technology 2.0), так и в процессора от AMD (Precession Boost 2 Curve).
Ускорить вычисления можно разными способами и самый простой в начале оказался за счёт ускорения выполнения отдельных операций. Сами операции состоят из простейших оперций – И, ИЛИ и НЕ, которые реализуются транзисторами. Эти транзиторы переключаются управляющим сигналом, переходя к слудующему сигналу, тем самым простейшие опрерации сдвигаются ("проталкиваются") управляющим сигналом. Этот упрвляющий сигнал позволяет синхронизировать все операции в процессоре и поэтому его частотм назвается опорной частотой центрального процессора. Для других систем, скорость которых не зависит от процессора могут применяться отдельные кварцевые генераторы опорной частоты, например, для шины PCI-Express и мостов. В современных процессорах контрукцией их заложено выполнение нескольлких операций за один тактовый такт. И действительно, задав в два раза большую частоту мы можем произвести в два раза больше операций. Так в 1971 процессор Intel 4004 работал на чистоте 500—740 кГц, а в 1993 процессор Intel Pentium на частотах 60—300 МГц, что больше в 120 раз на минимуме и 400 на максимуме. Проблемой является то, что токи с большими частотами имеют высокое тепловыделение. Так Intel 8008 с частотой 2—4 МГц получил стальную крышку, а размеры стальной крышки росли с ростом подложки, а на Intel Pentium II с частотами 233—450 появился алюминиевый радиатор, на Intel Pentium III с частотами 0.4—1.4 ГГц уже появился кулер (вентилятор) над радиатором, а с Pentium 4 более 3 ГГц уже шли массивные радиаторы 83х68 мм с большим вентилятором 60х60 мм и зачастую с медно-алюминиевыми рёбрами и основанием, при частотах выше 4 ГГц требовалось водяное охлаждение с внешним радиатором. Безусловно, не только при увеличении частоты из-за выделения теплоты требуется уменьшения технологического процесса, но и других физических процессов. Но это всё на десктопных рабочих станциях, а для переносных – единственным решениям оставалось уменьшать частоты до примерно 2.5 ГГц. Посмотрим на тех. процессы: сравнивать имеет смысл только в рамках одной компании, ориентируясь на абсолютные единицы в начале таблицы, а ближе к концу – на относительные:
год, модель: технол. процесс 1971, 4004: 10 мкм 1972, 4040: 10 мкм 1972, 8008: 10 мкм 1976, 8085: 3 мкм 1978, 8086: 3 мкм 1979, 8088: 3 мкм 1982, 80188: 3 мкм 1985, 80386: 1.5 мкм 1991, 80486: 1.0 мкм 1993, Pentium: 0.8 мкм 1997, Pentium II: 0.35 мкм 1999, Pentium III: 0.13 мкм 2000, Pentium 4: 0.18 мкм 2006, Core 2: 0.065 мкм 2008, Core i7: 0.045 мкм 2017, Core i9: 0.014 мкм 2021, Core i9-11: 0.010 мкм
Для Apple:
2017, Apple A11: 0.010 мкм 2018, Apple A12: 0.007 мкм 2020, Apple A15: 0.005 мкм 2022, Apple A16: 0.003 мкм (планы Apple) 2027, 0.002 мкм (тестовый образец от IBM) 2029, 0.0014 мкм (предсказания)
Первыми устройствами были лампы, увеличение числа которых в устройстве ограничивалось их размером и их энергопотреблением. Сделать лампу очень маленькой довольно сложно, так нужно сделать её герметичной и закачать в неё инертный газ. Производители пытались упростить производство делая сборки из лам, когда выплавлялась не одна лампа разом, а несколько – по сути одна лампа, разделённая перегородками. Другими попытками было помещение в одну лампу несколько триодов. Но так или иначе, из-за размера, дороговизны изготовления и потребления электроэнергии их начали заменять транзисторами начиная 1950 в виде отдельных транзисторов, как в то время называли "кристаллических триодов". Долгое время барьером применения в серийного производство для транзисторов было возможность переключить своё состояние за счёт накопления потенциала из-за внешнего радиоактивного фона альфа-частицами – для избежания этого в используются корректоры в процессорах и памяти (error-correcting code memory). В мелко серийном производстве ламповые усилители звука давали определённые искажения, которые были более привычны музыкантам эпохи ламповых усилитей – сейчас подобные искажения эмулируются алгоритмически. Транзисторы 1950 годов представляли из себя отдельные электронные устройства в отдельном корпусе с выводами для впайки на лату, сходных с теми, что сейчас используются в блоках питания. Размеры транзисторов уменьшались и начали выпускать микросборки, представляющий плату в корпусе интегральной схемы, в которую вручную помещались под лупами с помощью пинцетов бескорпусные микроминиатюрные транзисторы и другие элементы поверхностного монтажа, такие как резисторы и транзисторы. Позже, часть этих элементов, таких как транзисторы и конденсаторы эмулировалось самими дорожками в силу сниженной величины токов и напряжений, в которых они работали. Для чего проводилось сужение дорожек лазером для увеличения сопротивления и созданием широкой дрожки по верх другой методом вакуумного напыления (толстопленочной технологии) с последующем заливкой корпуса. В 1960 годах начала развиваться планарная технология для создания монолитных интегральных схем, заключающаяся в том, что не создаются отдельные транзисторы, которые необходимо помещать на печатную плату, а выращиваются прямо "плате" из полупроводника, являющаяся основой всех этих транзисторов. Технология изготовление таких интегральных схем унаследовало литографию, применяющуюся в производстве дороже у печатных плат, только в данном случае формируются не только токопроводящие дрожки, но и полупроводниковые и изолирующие участки (транзисторы). Принцип сводится в равномерном нанесении требуемого покрытия и удаление его с ненужных мест различными методами. Нанесение проводящего слоя осуществляется осаждением, а на полупроводниковой подложке – выращиванием. Для удаления применяют растворители (щёлочи, кислоты), от действие которых в нужных местах защищает предварительно наносимое защитное покрытие, которое можно удалить в последствии специальными растворителями защитных покрытий. Расположение защитного покрытия и определяет расположение требуемого покрытия. Механически наносить покрытие на нужные участки чипа, как это делается на печатных платах, уже не позволяла точность нанесения и количество брака, поэтому тотально применяется фотолитография. Первый опытный образец, произведённой по этой технологии был продемонстрирован в 1959 году. Фотолитография заключается в том, что защитное покрытие наносится равномерно, в нужных местах утверждаются светом, а после промывки незатвердевшие покрытие смывается. Для проекции света его пропускают через маску (трафарет) и фокусируют линзами до нужного масштаба и силы светового потока. Маска в нужных местах пропускает свет, а линзы объектива фокусирую свет более мелкий масштаб. Таким образом точность рисунка защитного покрытия определяется точностью засвечиванием светом ещё незатвердевшего защитного покрытия. В начале века это был обычный свет, но позже длина волны не позволяла достичь необходимой точности и она смещалась в торону более коротковолнового излучения, делая стремясь к более узкому излучению, и соответственно, более точному. Так в 1971 году применялся красный свет 700 нм, в 1975 фиолетовый в 400 нм, ультраиолет с 436 нм от лампы с плазмой из ртути, с 1970 ультрафиолет в 248 нм с помощью плазмы криптона и фтора, далее применяется глубокий ультрафиолетовый (Deep Ultra Violet, DUV) с помощью фторидаргнового лазера в 193 нм, затем 150 нм и 80 нм. В 2001 году был получен экстремальноглубокий ультрафиолет (Extreme Ultra Violet, EUV) с помощью плазмы олова в 13 нм. При такой длине волны свет поглощается воздухом, для чего процесс производится в вакууме, и линзами, для чего фокусируют его специальными зеркала из слоёв кремния и слоёв молибдена. Стоимость и сложность оборудования не позволяет производить его несколькими компаниями поэтому производителями процессоров профинансирована компания ASML, ставшая монополистом. Спросс есть на него есть и он не удовлетворён полностью, так как в 2020 году выпущено всего 31 штука. Разработки аналога ведутся в Китае. Такой лазер обеспечивает точность достаточную для технологических процессов в 1.5 нм. Далее начали вступать квантовые ограничения. Сперва приделом считался процесс 14 нм, потом его отодвинули на 5 нм, сейчас ведётся освоение 3 нм для 2023-2024 года, 2 нм для 2025-2027 года и 1.4 нм для 2029 года, но с каждым разом отодвигание происходит с меньшим шагом, а сложность перехода без брака возрастает. В 2021 году процессоры на 5 нм уже есть в массовом производстве от Apple, процессоры на 3 нм в тестовом у TSMC.