Гайд GPT-4 "алхимия": MoE, количество параметров, стоимость обучения и секреты вывода

Оригинал: Подбирая слонов

Источник: Overseas Unicorns

Авторы: Дилан Патель, Джеральд Вонг

Под редакцией: Хайна, Венли, Кейдж

Редактор: Сики

Источник изображения: сгенерировано Unbounded AI‌

Эта статья составлена на основе колонки SemiAnalysis Дилана Пателя и Джеральда Вонга. Не так давно Дилан Патель сообщил новость о внутреннем письме Google: «У нас нет рва, как и у OpenAI».

GPT-4 является результатом глубокого сочетания науки и инженерных инноваций.В середине есть бесчисленное количество трюков.Для внешнего мира,если вы можете понять структуру GPT-4,это как получить "рецепт алхимии" самой сильной модели. Этот контент подробно описывает архитектуру GPT-4, инфраструктуру обучения и вывода, количество параметров, набор обучающих данных, номер токена, стоимость и модель MoE, а также другие параметры и подробную информацию.

Дилан и Джеральд считают, что причина, по которой OpenAI не раскрывает архитектуру GPT-4, заключается не в так называемых соображениях безопасности ИИ, а в том, что эту архитектуру легко скопировать; Джордж Хотц, известный как «гениальный хакер» , также выразил аналогичное мнение, однако Джордж утверждает, что GPT-4 состоит из МО из 8 экспертных моделей, каждая из которых имеет около 1100 параметров.

Два автора предсказывают, что такие компании, как Google, Meta, Anthropic, Inflection, Character.ai, Tencent, ByteDance, Baidu и т. д., в краткосрочной перспективе будут иметь такие же или даже более мощные возможности моделирования, как GPT-4. Несмотря на то, что архитектуру GPT-4 «легко скопировать», по их мнению, у OpenAI самый прочный ров — наибольшее количество конечных пользователей, ведущие инженерные таланты и преимущество первопроходца в изменении моделей между поколениями.

Дружеское напоминание: данные в статье взяты из многосторонней коллекции и исследования оригинального автора и не были подтверждены OpenAI Исследование Дилана Пателя обычно считается очень надежным и может использоваться в качестве хорошего справочного материала для GPT-4. материалы углубленного исследования. Кроме того, мы думаем, что легко воспроизводимые взгляды в статье можно заподозрить в том, что они являются «заголовком», потому что, кроме OpenAI и Google, в настоящее время мало ученых, которые хорошо разбираются в сложной структуре MoE и рассуждениях, и текущий GPT-4 — это только первое поколение MoE, это не окончательный ответ, данный OpenAI, и большой опыт в этом процессе недоступен другим командам, и этот опыт определенно станет уникальным преимуществом OpenAI.

Ниже приводится оглавление этой статьи, и рекомендуется читать его в сочетании с основными пунктами.

👇

01 Обзор

02 Структура модели

03 Набор данных

04 Параллельная стратегия

05 Стоимость обучения

06 МО

07 Рассуждение

08 Инфраструктура и стоимость рассуждений

09 Механизм внимания с несколькими запросами

10 последовательных партий

11 Умозрительное декодирование

12 мультимодальных концепций

01.Обзор

Инженерные возможности OpenAI и то, что они создали, поразительны, но это не значит, что решения непреодолимы. Их решение очень изящно, а также предполагает учет и баланс ряда сложных факторов, и расширение масштаба модели является лишь частью этого. **Самый прочный ров OpenAI связан с тремя аспектами: во-первых, у них больше всего реальных пользователей, во-вторых, ведущие инженерные таланты и, наконец, они, вероятно, сохранят лидирующие позиции в разработке моделей в будущем. **

Важно не только понять, почему GPT-4 выбрал определенную архитектуру, но и совсем недавно мы также расскажем о затратах на обучение и вывод GPT-4 на A100, а также о том, как использовать H100 в архитектуре модели следующего поколения.

OpenAI хочет увеличить размер модели с GPT-3 до GPT-4 в 100 раз. Сутью этого процесса, естественно, является вопрос стоимости**. Плотные преобразователи — это обычно используемые архитектуры моделей, такие как OpenAI GPT-3, Google PaLM, Meta LLaMA, TII Falcon, MosaicML MPT и т. д. В настоящее время не менее 50 компаний используют эту архитектуру для обучения LLM, что является хорошим примером архитектуры. , но его масштабируемость очень ограничена.

В этой статье AI Brick Wall обсудил стоимость обучения модели до выпуска GPT-4. С точки зрения затрат на обучение, плотная модель (плотные трансформеры) вот-вот столкнется с собственной «кирпичной стеной ИИ». Приложите некоторые архитектурные усилия верхнего уровня.

AI Brick Wall: Аппаратное обеспечение на данном этапе достигло своего предела с точки зрения Dense Transformer, поэтому нецелесообразно и дорого постоянно расширять масштаб модели до модели с одним триллионом или десятью триллионами параметров. Перед новым поколением оборудования необходимы различные стратегии и методы для снижения затрат на обучение, повышения эффективности обучения модели и расширения модели до большего количества параметров. Автор считает, что эта серия технологий будет реализована примерно в 2023 году, и среди компаний, способных принять участие, есть OpenAI, Google, DeepMind, Microsoft и Nvidia. Многие из этих стратегий были представлены на конференции NeurIPS и, вероятно, окажут большое влияние на приложения ИИ.

Но за последние 6 месяцев мы поняли, что стоимость обучения может не иметь значения. Хотя тратить миллионы или даже сотни миллионов долларов на обучение моделей звучит безумно, на самом деле для технологических гигантов это тривиальная задача. Большая модель представляет собой проект капитальных вложений (статья капиталовложений), и чем крупнее модель, тем лучше результат.Единственный ограничивающий фактор заключается в том, есть ли у людей достаточные возможности и время, чтобы обеспечить обратную связь и изменить архитектуру модели при расширении модели. шкала.

Meta инвестирует более 16 миллиардов долларов в «Метавселенную» каждый год, Google тратит около 10 миллиардов долларов на попытки новых проектов, Amazon тратит более 50 миллиардов долларов на Alexa, а криптовалюты тратятся на «бесполезные вещи». Более 100 миллиардов долларов потрачено впустую. Общество в целом потратит более 100 миллиардов долларов на создание суперкомпьютеров, способных обучать крупномасштабные модели, которые можно будет производить различными способами. Многие страны и компании будут повторять учения** на больших моделях, что является новой «гонкой вооружений в космосе»**. По сравнению с предыдущей «расходом ресурсов» реальная ценность будет реализована в краткосрочной перспективе из-за появления помощников-людей и автономных агентов.

Но в ближайшие несколько лет Google, Meta и OpenAI, Microsoft и другие компании потратят более 100 миллиардов долларов США на создание суперкомпьютера для обучения модели.

Более важная проблема увеличения размера модели, настоящей «Кирпичной стены ИИ», заключается в ссылке логического вывода. Цель здесь состоит в том, чтобы отделить обучающую вычислительную мощность от вычислительной мощности логического вывода, поэтому для любой модели, которая будет развернута, имеет смысл тренироваться за пределами оптимального для шиншиллы DeepMind. (Примечание по выбору: увеличение объема обучающих данных, чтобы заставить модель переобучаться, является стратегией увеличения возможностей небольших моделей и снижения стоимости рассуждений.) Вот почему используется архитектура разреженной модели (архитектура разреженной модели). Обоснование этой архитектуры не требует, чтобы все параметры были активны.

Оптимальная шиншилла: из статьи Deepmind «Обучение вычислительно-оптимальным моделям больших языков» указывается, какой размер модели и размер данных следует использовать для получения наименьших потерь при фиксированном общем количестве FLOPS.

В настоящее время оптимальная стратегия для шиншиллы является оптимальной стратегией на стороне обучения, а обучение с большим количеством токенов, чтобы превзойти эффект оптимальной для шиншиллы, является оптимальной стратегией на стороне логического вывода. А поскольку затраты на обоснование составляют «большую голову», большинство компаний выберет стратегию, превосходящую оптимальную для шиншилл.

Суть проблемы в ссылке на вывод заключается в том, что стоимость развертывания модели для пользователей и агентов слишком высока. Стоимость логического вывода в несколько раз превышает стоимость обучения, и решение этой проблемы является целью OpenAI с точки зрения архитектуры модели и инфраструктуры.

Когда дело доходит до выводов с большими моделями, особенно с плотными моделями, размер модели может стать многомерной проблемой. Искусственный интеллект устройства — палка о двух концах В этой статье обсуждалась ситуация в контексте граничных вычислений. Проще говоря, терминальные устройства никогда не могут иметь пропускную способность и пропускную способность памяти, необходимые для реализации больших языковых моделей.Даже если пропускная способность достаточна, эффективность граничных устройств в использовании аппаратных вычислительных ресурсов очень низка. Центры обработки данных сталкиваются с аналогичными проблемами.

Использование вычислительных ресурсов очень важно для центров обработки данных и облаков. (Примечание: в настоящее время верхний предел использования GPU/TPU в отрасли составляет около 50%.) Одна из важных причин, по которой программное обеспечение NVIDIA пользуется широкой популярностью, заключается в том, что в процессе постоянного запуска нового поколения GPU NVIDIA также постоянно обновляется Поколение программного обеспечения, которое способствует увеличению использования FLOPS за счет более интеллектуального перемещения данных между чипами, между чипами и между памятью.

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

На данном этапе варианты использования для вывода LLM — это в основном «живые помощники», что ** означает, что он должен достигать достаточно высокой пропускной способности, чтобы быть действительно полезным для пользователей **. Если взять людей в качестве аналогии, средняя скорость чтения людей составляет около 250 слов в минуту, а некоторые люди могут достигать около 1000 слов в минуту.Соответственно модели, это означает вывод не менее 8,33 токена в секунду, предпочтительно 33,33 токена в секунду. токен, можно удовлетворить все потребности человека.

Однако из-за ограничения пропускной способности памяти даже на последнем GPU-сервере NVIDA H100 плотная модель (dense model) с триллионом параметров математически не может достичь такой пропускной способности. Каждый раз, когда генерируется токен, его необходимо загрузить из памяти в чип, а затем этот токен снова отправляется для генерации следующего токена. Кроме того, KV-кэш (KV Cache) для реализации механизма внимания также требует дополнительной пропускной способности.

KV Cache (КВ Кэш): В процессе выборки модель Transformer выполнит операцию самоконтроля (Self-Attention), для чего необходимо извлечь значение ключа для каждого элемента в текущей последовательности (будь то /context или сгенерированный токен) (Key-Value, KV). Эти векторы хранятся в матрице, часто называемой KV-кэшем или прошлым кешем. Функция кэша KV состоит в том, чтобы избежать пересчета вектора ключ-значение каждый раз при выборке токена. Использование предварительно вычисленных значений K и V может сэкономить много времени вычислений, хотя и займет некоторое место для хранения. Кэш KV играет очень важную роль в модели Transformer и может помочь значительно повысить эффективность и производительность модели.

На этой диаграмме предполагается, что отказ от объединения каждой операции неэффективен и что механизмы внимания требуют сравнимой пропускной способности памяти и аппаратных накладных расходов при чтении параметров. На самом деле, даже с «оптимизированными» библиотеками, такими как NVIDIA FasterTransformer, общие накладные расходы будут выше.

На приведенном выше рисунке показана пропускная способность памяти, необходимая для обслуживания одного пользователя LLM с достаточно высокой пропускной способностью. Из этой картинки видно, что:

• Даже пропускная способность в 8 раз больше, чем у H100, не может обслуживать плотную модель с масштабом в 1 триллион параметров со скоростью 33,33 токена в секунду;

• Кроме того, использование FLOPS для 8x H100 по-прежнему ниже 5% при скорости 20 токенов в секунду, что приводит к чрезвычайно высокой стоимости логических выводов.

Фактически, для современной 8-канальной тензорной параллелизованной системы H100 ограничение вывода составляет около 300 миллиардов параметров прямой связи.

Однако OpenAI достигает скорости человеческого чтения с A100 и моделями с >1 триллионом параметров, широко доступным по низкой цене 0,06 доллара за 1000 токенов, и это возможно именно благодаря его разреженной архитектуре.

Далее мы обсудим архитектуру модели GPT-4, инфраструктуру для обучения и рассуждений, количество параметров, состав набора обучающих данных, количество токенов, количество слоев, параллельные стратегии, мультимодальные визуальные кодировщики, и т. д. за серией различных инженерных разработок.Соображения, методы реализации и то, как OpenAI устраняет узкие места в выводе больших моделей.

02. Структура модели

Масштаб ГПТ-4 более чем в 10 раз больше, чем у ГПТ-3, по нашим оценкам, он имеет около 1,8 трлн параметров, и эти параметры распределены по 120 слоям трансформатора.Для сравнения, параметры ГПТ-3 около 1750 млрд. (Примечание: GPT-3 имеет только 12 слоев трансформатора, а количество слоев составляет 1/10 от GPT-4.)

Чтобы контролировать расходы, OpenAI решила использовать модель MoE. OpenAI использует в модели 16 экспертов типа MLP.2, каждый из которых имеет около 111 миллиардов параметров. Две из этих экспертных моделей вызываются при каждом прямом проходе.

• Mixture-of-Experts (MoE): модель MoE представляет собой архитектуру глубокого обучения, которая обычно состоит из нескольких экспертов (экспертов), каждый эксперт отвечает за обработку различных аспектов входных данных и имеет собственный набор параметров (существуют также некоторые параметры, такие как встраивание, которые могут быть общими для всех экспертов, т.е. общие параметры). В процессе рассуждения модели, в соответствии с различными характеристиками входных данных, модель направляет входные данные разным экспертам.Каждый эксперт обрабатывает соответствующий назначенный вход в соответствии со своим набором параметров и завершает вывод.Конечным выходом является интеграция результатов каждого эксперта.

• MLP: Многослойный персептрон (Multi-Layer Perceptron).MLP представляет собой искусственную нейронную сеть, включающую несколько скрытых слоев.В модели MoE обычно есть несколько независимых экспертов MLP.

Есть много литературы, в которой обсуждается, как направить (назначить) каждый ожидающий токен экспертной модели, но говорят, что набор алгоритмов, используемых OpenAI, довольно прост, по крайней мере, GPT-4 такой.

Кроме того, в механизме внимания используется около 55 миллиардов общих параметров.

Каждый прямой вывод (генерация токена) использует только около 280 миллиардов параметров и 560 терафлопов по сравнению с примерно 1,8 триллиона параметров и 3700 терафлопов, необходимых для каждого прямого вывода, если используется только плотная модель.

03. Набор данных

GPT-4 был обучен примерно на 13 триллионах токенов, что разумно, учитывая, что CommonCrawl RefinedWeb содержит около 5 триллионов токенов высокого качества. Для справки: модели Deepmind Chinchilla и PaLM от Google были обучены примерно с 1,4 трлн токенов и примерно с 0,78 трлн токенов соответственно, а PaLM2, как говорят, обучен примерно с 5 трлн токенов.

CommonCrawl Refinedweb: CommonCrawl — это некоммерческий проект, целью которого является создание и поддержка открытого и доступного набора данных в Интернете, использующего технологию поискового робота для регулярного сканирования веб-страниц в Интернете и систематизации веб-страниц и связанных с ними метаданных и архивов. CommonCrawl RefinedWeb — это библиотека высококачественных текстов, отобранных CommonCrawl из необработанных данных после алгоритмического и человеческого анализа.

Набор данных, используемый OpenAI для обучения GPT-4, — это не 13 триллионов уникальных токенов. Наоборот, из-за отсутствия качественных токенов этот набор данных содержит несколько эпох. Существует 2 эпохи для текстовых данных и 4 эпохи для кодовых данных. (Примечание: это относится к некоторым высококачественным текстам и кодам, которые были изучены моделью много раз.) Это далеко от достижения оптимального для шиншиллы (модель должна быть обучена на удвоенном количестве токенов), что также показывает того, что сеть проста для получения токена, недостаточно. Высококачественные текстовые токены, которые на самом деле существуют в сети, должны быть в 1000 раз больше, чем доступные сегодня, а аудио- и видеотокены — еще больше, но собрать эти токены нельзя просто с помощью веб-скрапинга. К сожалению, мы не нашли много информации о RLHF в OpenAI для данных.

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

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

На этапе предварительной подготовки длина контекста (последовательности) составляет 8k. 32-килобайтная контекстная версия GPT-4 реализована поверх 8-килобайтной тонкой настройки после предварительной тренировки.

Размер пакета в кластере постепенно увеличивался в течение нескольких дней, но, в конце концов, OpenAI использовал размер пакета до 60 миллионов. Конечно, так как не каждый параметр видит все параметры, это просто размер партии 7,5 млн на одного эксперта.

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

Размер пакета оказывает большое влияние на эффект обучения и скорость модели. Чем больше размер пакета, тем больше вычисление параметров обновления каждый раз, но процесс обучения будет более стабильным, поскольку выборки в каждом пакете могут усреднять шум и неопределенность. С другой стороны, если размер пакета слишком мал, процесс обучения может стать нестабильным и потребовать дополнительных шагов обучения для достижения оптимального решения. Кроме того, размер пакета также будет ограничен аппаратными ресурсами. Поэтому в практических приложениях очень важно выбрать подходящий размер партии.

04. Параллельная стратегия

Параллельная обработка на всех графических процессорах A100 очень важна.

OpenAI использует 8-way (8-way) масштабный тензорный параллелизм (Tensor Parallelism), причина в 8-way (8-way), потому что это предел NVLink. Кроме того, мы также слышали, что OpenAI использует стратегию 15-way (15-way) конвейерного параллелизма. Теоретически, 15-процессорных — это слишком много, учитывая время передачи данных и вычислений, но это также разумно, если они ограничены объемом памяти.

Существует несколько классических распределенных параллельных парадигм в обучении больших моделей, а именно конвейерный параллелизм, параллелизм данных и тензорный параллелизм. FastSpeed, распределенная обучающая среда Microsoft с открытым исходным кодом, сочетает в себе эти три параллельные парадигмы.

Если вы просто используете конвейерный параллелизм и тензорный параллелизм, для параметров каждого графического процессора требуется около 30 ГБ в соответствии с FP16, и с учетом кэша KV и накладных расходов KV, если большинство графических процессоров, используемых OpenAI, имеют 40 ГБ A100, эта архитектура от It также разумно в теории. OpenAI может использовать этап 1 ZeRo, FSDP на уровне блоков или гибридный параллелизм общих данных.

• Накладные расходы KV (накладные расходы KV): относится к нагрузке, вызванной дополнительными накладными расходами в системе хранения KV. Эти служебные данные могут включать в себя метаданные для хранения и управления парами ключ-значение, структур индекса, репликации и синхронизации данных, сетевого взаимодействия и т. д. Увеличение накладных расходов KV может привести к снижению производительности, увеличению требований к хранилищу и увеличению сложности системы.

• ZeRo Stage 1: ZeRO (оптимизатор нулевой избыточности) означает, что каждая карта сохраняет полное состояние оптимизатора. Если каждая карта хранит только часть состояния оптимизатора, состояния оптимизатора всех карт вместе образуют полное состояние, то есть Pos (состояния оптимизатора разделов), которое называется ZeRO-stage1.

• FSDP на уровне блоков: относится к блочной технологии динамического квантования полной точности (динамическое квантование полной точности). Более высокая точность модели может быть сохранена во время обучения и рассуждений, что снижает стоимость вывода модели.

Причиной, по которой не используется полная модель FSDP, может быть высокая стоимость связи. Хотя OpenAI имеет высокоскоростную сеть между большинством узлов, возможно, не всеми, мы думаем, что по крайней мере некоторые кластеры имеют гораздо более низкую пропускную способность соединения, чем другие.

Непонятно, как OpenAI избегает огромных пузырей с таким высоким параллелизмом конвейера. Скорее всего, они просто понесли расходы.

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

05. Стоимость обучения

OpenAI использовал около 2,15e25 FLOPS при обучении GPT-4 примерно на 25 000 графических процессоров A100 в течение 90–100 дней обучения, при этом максимальное использование вычислительной мощности составляло от 32% до 36%. **

Это чрезвычайно низкое использование отчасти связано с большим количеством сбоев, которые требуют перезапуска контрольных точек, а упомянутые выше пузыри требуют больших затрат.

Другая причина заключается в том, что all-reduce на стольких графических процессорах обходится очень дорого. Особенно, если мы подозреваем, что кластер на самом деле состоит из множества более мелких кластеров с относительно слабыми сетевыми соединениями, такими как неблокирующие соединения 800G/1.6T между разными частями кластера, но эти некоторые могут подключаться только на скорости 200G/400G.

all-reduce — это операция связи в параллельных вычислениях, которая используется для реализации глобального сокращения данных в распределенных вычислениях. В распределенном глубоком обучении all-reduce — это обычная коммуникационная операция для обмена и агрегирования информации о градиенте между несколькими вычислительными узлами, чтобы обновлять параметры модели во время обучения.

Если их стоимость в облаке составляет около 1 доллара США в час за A100, то только за этот учебный сеанс она составит около 63 миллионов долларов США**. Это не включает все испытания, неудачные попытки и другие затраты на сбор данных, RLHF, персонал и т. д. При учете этих факторов реальная стоимость значительно выше. Кроме того, вам также необходимо учитывать, что вам нужна команда для завершения настройки чипа, сетевого оборудования и центра обработки данных, осуществления капитальных вложений (Capex) и сдачи их в аренду вам.

В настоящее время предварительное обучение может быть выполнено примерно за 55 дней с использованием примерно 8192 H100 при общей стоимости 21,5 млн долларов США, каждый графический процессор H100 стоит 2 доллара США в час.

Мы ожидаем, что к концу года девять компаний будут иметь больше графических процессоров H100. Возможно, не все эти H100 будут использоваться для обучения моделей, но эти компании определенно будут использовать большие модели и станут важными игроками. Ожидается, что к концу года Meta будет иметь более 100 000 H100, значительная часть которых будет развернута в их собственных центрах обработки данных для вывода, хотя их самый большой отдельный кластер будет иметь более 25 000 графических процессоров H100. (Примечание: вычислительные ресурсы Meta сделают способность LLaMA развиваться важной переменной для открытого исходного кода и частного развертывания.) Многие компании будут обучать модель с теми же возможностями, что и GPT-4, до конца этого года.

06.МОЭ

MoE — это эффективный способ уменьшить количество параметров во время логического вывода, а также увеличить количество параметров, что помогает кодировать больше информации на обучающий токен. Поскольку очень сложно получить достаточно качественных токенов, необходимо выбрать архитектуру MoE. Потому что, если OpenAI действительно хочет внедрить Chinchilla-Optimal, сейчас им нужно обучить удвоенное количество токенов.

При этом OpenAI идет на несколько компромиссов. Например, работать с MoE во время логического вывода очень сложно, потому что не каждая часть модели используется при создании каждого токена. Это означает, что некоторые части могут быть бездействующими, в то время как другие части используются. Это может серьезно повлиять на использование при обслуживании пользователей.

Исследователи доказали, что использование от 64 до 128 экспертов дало лучшие результаты потерь, чем использование 16 экспертов, но это всего лишь исследование. Причин сокращения числа экспертов несколько. Одна из причин, по которой OpenAI выбрала 16 экспертов, заключается в том, что большее количество экспертов затрудняет обобщение и достижение конвергенции. Учитывая такой большой объем обучения, OpenAI предпочла быть более консервативной в отношении количества экспертов.

Кроме того, использование меньшего количества экспертов полезно для архитектур логического вывода. Существуют различные сложные компромиссы при переходе к архитектуре логического вывода MoE. Давайте начнем с основных компромиссов вывода LLM, а затем рассмотрим проблемы, с которыми столкнулся OpenAI, и выбор, который они сделали.

07. Рассуждение

В этой части мы сначала хотим отметить, что каждая компания LLM, с которой мы связались, считает, что библиотека логического вывода FasterTransformer от NVIDIA довольно плохая, а TensorRT еще хуже. Не имея возможности использовать шаблоны Nvidia и модифицировать их, что означает создание собственного решения с нуля, NVIDIA необходимо решить эту проблему как можно быстрее, чтобы адаптироваться к потребностям LLM-логического вывода, иначе он станет фактически открытым инструментом. добавить поддержку стороннего оборудования. Появляется все больше и больше больших моделей, и если NVIDA не может обеспечить программное преимущество в выводе, а ядра по-прежнему нужно писать вручную, то у AMD MI300 и другого оборудования будет гораздо больший рынок.

В логическом выводе LLM есть 3 ключевых фактора, которые в основном связаны с количеством используемых микросхем.

1. Задержка

Модель должна ответить в течение разумной задержки. Люди не хотят ждать несколько секунд, прежде чем начать получать вывод в приложении чата. Время обработки входных и выходных токенов может варьироваться.

2. Пропускная способность

Модель должна выводить определенное количество токенов в секунду. Использование человеком составляет около 30 токенов в секунду, а пропускная способность может быть ниже или выше для различных других вариантов использования.

3. Использование

Аппаратное обеспечение, на котором работает модель, должно обеспечивать высокую степень использования, иначе стоимость будет непомерно высокой. Хотя можно добиться более высокой степени использования, группируя больше пользовательских запросов с большей задержкой и меньшей пропускной способностью, это увеличивает сложность.

Вывод LLM в основном предназначен для балансировки двух основных факторов: пропускной способности памяти и вычислений.

Проще говоря, каждый параметр должен быть прочитан с двумя связанными с ним FLOP. Таким образом, соотношение большинства чипов (например, H100 SXM имеет пропускную способность памяти всего 3 ТБ/с, но имеет 2000 терафлоп/с FP8) совершенно несбалансировано в выводе с размером пакета 1. Если обслуживается только один пользователь, т. е. с размером пакета 1, пропускная способность памяти, необходимая для потоковой передачи каждого параметра для каждого поколения токена, доминирует над временем вывода, а время вычислений практически ничтожно.

Чтобы иметь возможность масштабировать большие модели для нескольких пользователей, размер пакета должен быть больше 1, а стоимость считывания параметров должна распределяться между несколькими пользователями. Например, при размере пакета 256 или 512 каждый прочитанный байт памяти соответствует 512 FLOP/с или 1024 FLOP/с. Это соотношение ближе к соотношению пропускной способности памяти к FLOPS у H100. Помогает достичь более высокой степени использования, но имеет недостаток, заключающийся в более высокой задержке.

Многие думают, что объем памяти является основным узким местом для логического вывода LLM, поскольку размер модели может соответствовать нескольким чипам, но это мнение может быть проблематичным. Хотя для вывода больших моделей требуется несколько чипов, а более высокая емкость памяти приводит к меньшему количеству адаптированных чипов, на самом деле лучше использовать больше чипов, чем необходимо, чтобы уменьшить задержку, увеличить пропускную способность, а большие размеры пакетов можно использовать для постоянного увеличения использования.

Google также упомянул о решении трех вышеупомянутых проблем в отчете о выводах PaLM. Стоит отметить, что **это относится к плотной модели, такой как PaLM, а не к разреженной модели, такой как GPT4. **

Если приложению требуется минимально возможная задержка, нам нужно больше микросхем и разделить модель на максимальное количество способов, чтобы быть экономичным. Меньшие размеры пакетов обеспечивают меньшую задержку, но меньшие размеры пакетов также приводят к более низкому MFU [использованию], что приводит к более высокой общей стоимости токена (в секундах чипа или долларах).

Если приложению требуется автономный вывод, а задержка не является проблемой, то основная цель — максимизировать пропускную способность на чип (т. е. минимизировать общую стоимость токена). Увеличение размера пакета является наиболее эффективным, так как большие размеры пакета обычно приводят к лучшему MFU [использованию], но некоторые стратегии секционирования, которые неэффективны для небольших размеров пакетов, увеличиваются по мере роста размера пакета и становятся эффективными.

**Больше чипов и большие партии обходятся дешевле, потому что увеличивают коэффициент использования, но это также вводит третью переменную — время работы в сети. ** Метод развертывания модели на нескольких чипах может эффективно решить проблему задержки, но за счет утилизации.

Как часть времени хранения, связанная с весовой нагрузкой, так и время вычисления без внимания пропорциональны размеру модели и обратно пропорциональны количеству микросхем. Для данной схемы разделов время, необходимое для обмена данными между чипами, уменьшается медленнее (или вообще не уменьшается) с количеством используемых чипов, поэтому по мере увеличения количества чипов это становится все более и более важным узким местом.

Мы заметили, что требования к памяти для кэша KV резко возросли по мере роста размера пакета.

Если приложению необходимо генерировать текст с контекстами длительного внимания (контексты длительного внимания), это значительно увеличит время вывода. Для модели с более чем 500 байтами многоголового внимания кэш KV внимания может стать очень большим: для модели с размером пакета 512 и длиной контекста 2048 общий объем кеша KV составляет 3 ТБ, т.е. в 3 раза больше размера параметра модели. Встроенная память (on-chip memory) должна загружать кэш KV из внечиповой памяти (off-chip memory), который загружается каждый раз при генерации токена.В этот период вычислительное ядро чипа в основном простаивает.

Длинные последовательности особенно неприятны для пропускной способности и емкости памяти. Причина, по которой OpenAI GPT-3.5 turbo с контекстами 16k и GPT-4 с контекстами 32k дороги, заключается в том, что они не могут обрабатывать большие пакеты из-за ограничений памяти.

Меньшие партии приводят к меньшему использованию оборудования. Кроме того, кэш KV раздувается по мере увеличения длины последовательности. Кэш KV не может быть разделен между пользователями, поэтому требуется отдельное чтение памяти, что еще больше снижает пропускную способность памяти. См. ниже дополнительную информацию о MQA.

##08. Инфра и стоимость рассуждений

Инфра

Архитектура MoE делает вывод о том, что GPT-4 сталкивается с проблемами с точки зрения задержки, пропускной способности и использования. Поскольку прямой проход каждого токена может быть направлен к различным экспертным моделям, в этом случае очень сложно добиться малой задержки, высокой пропускной способности и высокой степени использования, особенно при большом размере пакета.

Архитектура OpenAI GPT-4 содержит 16 экспертных моделей, а на каждый прямой канал приходится 2 маршрутизатора. Это означает, что при размере пакета, равном 8, считанный параметр каждого эксперта может занимать только «1» размера пакета. А если серьезно, это также приводит к размеру пакета 8 для одного эксперта, в то время как размер пакета других экспертов может быть только 4, 1 или 0.

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

** Инфраструктура выводов является одним из основных соображений для OpenAI при выборе небольшого числа экспертов по разработке MoE**. Если они используют больше экспертов, пропускная способность памяти становится большим узким местом для логического вывода. OpenAI часто достигает размеров пакетов более 4 КБ в своих собственных кластерах логического вывода, а это означает, что даже при оптимальном распределении нагрузки между экспертами каждый эксперт может достичь размера пакета только около 500. Это требует очень большого использования для достижения.

Насколько мы понимаем, OpenAI выполняет вывод на кластере из 128 графических процессоров и имеет несколько таких кластеров в разных центрах обработки данных и географических регионах. Вывод выполняется параллельно с 8-сторонними тензорами и 16-сторонними конвейерами. Используя 8 графических процессоров на узел, каждый графический процессор имеет только около 130 байт параметров, или менее 30 ГБ на графический процессор в FP16 и менее 15 ГБ в FP8/int8. Это позволяет выполнять вывод на A100 40 ГБ, если размер кэша KV для всех пакетов не слишком сильно раздувается.

FP16, FP8 и int8 — это представления с разной числовой точностью (точность), которые часто используются в процессе вычислений в глубоком обучении, чтобы уменьшить использование памяти и вычислительных ресурсов, тем самым повышая эффективность обучения модели и рассуждений.

FP16, FP8 и int8 соответственно относятся к 16-битным числам с плавающей запятой, 8-битным числам с плавающей запятой и 8-битным целым числам, точность которых ниже, чем у 32-битных чисел с плавающей запятой одинарной точности (FP32). ), но они могут значительно уменьшить объем памяти и вычислительные ресурсы. Используйте для ускорения обучения модели и логического вывода в глубоком обучении. Например, использование FP16 может сократить время вычислений более чем вдвое без потери точности, а использование int8 может сократить время вычислений примерно в 4 раза без потери точности.

Следует отметить, что использование низкоточных расчетов может оказывать определенное влияние на точность модели, поэтому необходимо сделать компромисс между точностью и эффективностью и выбрать наиболее подходящий метод представления точности в соответствии с конкретные требования к задаче.

Чтобы избежать слишком нерегулярной сетевой связи и в то же время избежать непомерно высокой стоимости пересчета кэша KV между каждым поколением токенов, различные уровни, содержащие разных экспертов, не разделяются на разных узлах для совместного использования кэша KV.

**Самая большая сложность для всех будущих расширений модели MoE и условной маршрутизации. Как справиться с ограничением в 120 слоев маршрутизации вокруг кэша KV. **

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

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

Кроме того, в процессе кодирования и декодирования входных данных может возникнуть некоторый шум по поводу декодирования логического вывода, о котором мы поговорим позже. Более важным вопросом является определение того, следует ли верить такому шуму. Это также может объяснить, почему имеет смысл включать меньше слоев в головной узел.

обоснование стоимости

По сравнению с моделью Давинчи с параметрами 175Б, ГПТ-4 имеет в 1,6 раза больше параметров прямой связи, но стоимость в 3 раза больше, чем у Давинчи. В основном это связано с тем, что GPT-4 требует более крупного кластера и обеспечивает более низкую загрузку.

Мы предполагаем, что использование 128 A100 для логического вывода с длиной контекста GPT-4 8k (seqlen) стоит около $0,0049 за 1k токенов. При использовании 128 H100 для вывода в контексте GPT-4 8k стоимость 1k токенов составляет около 0,0021 доллара США. (Примечание. Текущая цена GPT-4-8k составляет 0,03/1 тыс. входных токенов, 0,06/1 тыс. выходных токенов. В настоящее время использование чипов логического вывода в OpenAI не будет таким экстравагантным, как предполагает автор. Этот расчет можно использовать как более низкий. связаны с будущим снижением цен.) Важно отметить, что **эти затраты рассчитаны с учетом высокой степени использования и размера партии. **

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

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

Возобновить обучение контрольной точки небольшой тестовой модели, как правило, при обучении модели глубокого обучения, перезапустить обучение меньшей модели (например, подмножество, используя только подмножество), чтобы быстро протестировать новые структуры модели или алгоритмы за короткий период времени . Этот подход может помочь исследователям быстро повторять дизайн модели и находить оптимальные структуры и параметры модели.

09. Многозапросный механизм внимания

Использование Multi-Query Attention довольно распространено, но мы хотим подчеркнуть, что OpenAI делает то же самое. В общем случае нужна только 1 голова внимания, а объем памяти можно значительно уменьшить для кэширования KV. Тем не менее, GPT-4 с 32 КБ контекстов, безусловно, не может работать на 40 ГБ A100, а максимальный размер пакета в 8 КБ уже ограничен. Если не будет MQA, максимальный размер партии в 8 КБ будет сильно ограничен, а экономическая выгода сильно сократится.

• Multi-Query Attention (MQA): быстрое декодирование преобразователя: одна записывающая головка — это все, что вам нужно.

В традиционном механизме внимания запрос (запрос) сопоставляется с набором пар ключ-значение для получения взвешенного представления для каждого ключа. В то время как при многозапросном внимании существует несколько запросов, и каждый запрос сопоставляется с парами ключ-значение, чтобы получить различное взвешенное представление для каждого ключа. Этот процесс можно рассматривать как кодирование ввода в нескольких разных «представлениях», что приводит к более полному и точному представлению.

• Внимание Голова (Head): В модели глубокого обучения она обычно содержит несколько слоев (layers) и головку (head), которая используется для сопоставления вывода модели с желаемым выходным пространством. Слой заголовка обычно добавляется в модель для выполнения определенных задач, например, в задачах обработки естественного языка заголовок обычно используется для преобразования вывода модели в текст для классификации текста и других задач. В модели глубокого обучения за головой обычно следует последний слой, который используется для преобразования вывода последнего слоя в желаемую форму вывода.

10. Непрерывная пакетная обработка

Чтобы обеспечить некоторую степень максимальной задержки и оптимизировать стоимость логического вывода, OpenAI использует как методы переменного размера пакета, так и методы непрерывного пакетирования. Этот подход может улучшить использование вычислительных ресурсов без ущерба для производительности модели, а также добиться меньшей задержки и более высокой пропускной способности в процессе логического вывода модели. Если вы не понимаете концепцию непрерывной пакетной обработки, стоит прочитать официальную статью AnyScale Как непрерывная пакетная обработка обеспечивает 23-кратную пропускную способность при выводе LLM при одновременном снижении задержки p50. (Примечание Pickup: среда распределенных вычислений Ray, разработанная Anyscale, используется OpenAI в инфраконвейере модели. Pickup уже публиковал исследование этой компании.)

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

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

Источник: Anyscale

11. Спекулятивное декодирование

Ходят слухи, что OpenAI использует технологию Speculative Decoding в задаче вывода модели GPT-4. Хотя мы не можем быть уверены в точности этого сообщения, общие различия в задержке и дисперсии от одного токена к другому как для простых задач поиска, так и для более сложных задач, по-видимому, предполагают, что этот метод возможен. Однако из-за слишком большого количества переменных мы не можем подтвердить, действительно ли используется этот метод.

Во избежание споров о содержании некоторый контент в Accelerating LLM Infeference with Staged Speculative Decoding цитируется здесь, а ключевое содержание выделено полужирным шрифтом.

Использование LLM обычно делится на два этапа:

1. Этап предварительного заполнения

На этом этапе в качестве входных данных сначала дается подсказка(), которая проходит через модель для создания кэша KV и первых выходных логитов. Среди них logits — это вектор распределения вероятностей, выдаваемый LLM на каждом временном шаге, который используется для представления возможности каждого токена. Эта фаза предварительного заполнения обычно выполняется быстро из-за параллельных вычислений.

2. Этап декодирования

На этом этапе из выходных логитов выбирается токен и возвращается в модель для создания логитов для следующего токена. Это повторяется до тех пор, пока не будет сгенерировано нужное количество токенов. Поскольку каждое декодирование должно выполняться последовательно для создания токена, арифметическая интенсивность этого второго этапа (т. е. вычисляемые FLOP/байты пропускной способности памяти) очень низка при работе небольшими партиями (примечание: последовательность вычислений приводит к недоиспользованию вычислительной мощности). ) Поэтому декодирование обычно является самой дорогой частью авторегрессионной генерации.

Вот почему гораздо дешевле вводить токены, чем выводить токены в вызовах API OpenAI.

Основная идея спекулятивного декодирования состоит в том, чтобы использовать меньшую и более быструю черновую модель для заблаговременного декодирования нескольких токенов и подачи их в модель оракула в виде пакета. Если прогнозы черновой модели верны (т. е. согласуются с прогнозами модели оракула), один пакет можно использовать для декодирования нескольких токенов, что значительно экономит пропускную способность памяти и время для каждого токена.

Модель Oracle относится к более крупной и медленной модели LLM, используемой в методе спекулятивного декодирования для проверки прогнозов черновой модели. Модель Oracle рассчитает распределение вероятностей следующего токена на основе результатов прогнозирования черновой модели и ранее сгенерированных токенов, а затем вернет это распределение вероятности в черновую модель в качестве выходных данных.

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

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

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

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

Мы думаем, что если OpenAI использует спекулятивное декодирование, они, вероятно, используют его только для коротких последовательностей длиной около 4 токенов. Кроме того, некоторые люди думают, что снижение производительности модели GPT-4 связано с тем, что OpenAI добавил маловероятностные последовательности из модели спекулятивного декодирования в предварительное обучение модели, что может быть неправдой.

Кроме того, некоторые люди думают, что модель Барда также использует спекулятивное декодирование, потому что Google ждет, пока будет сгенерирована полная последовательность, прежде чем отправить ее пользователю, но мы не верим в это предположение.

12. Визуальный мультимодальный

Vision Multi-Modal, вероятно, наименее привлекательная часть GPT-4, по крайней мере, по сравнению с другими исследованиями. До сих пор никто не исследовал коммерциализацию мультимодальных исследований LLM.

Мультимодальное зрение: относится к совместной обработке и анализу информации из разных модальностей (например, изображений, текстов, голосов и т. д.). Обычно информация этих разных модальностей семантически связана, поэтому их объединение может предоставить более богатую информацию и более точные результаты вывода.

Визуальные мультимодальные возможности GPT-4 достигаются за счет визуального кодировщика, независимого от текстового кодировщика, и имеет механизм перекрестного внимания (Cross-Attention) с текстовым кодировщиком.Говорят, что его архитектура аналогична модели Flamingo. Кодер зрения был точно настроен на модели GPT-4 с 1,8 триллионами параметров, однако он был предварительно обучен только с дополнительными ~ 2 триллионами токенов текстовых данных, а не данных зрения.

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

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

OpenAI планирует обучать модель зрения с нуля, но технология еще не отработана, поэтому они надеются снизить риск за счет обучения по тексту.

**Ходят слухи, что OpenAI GPT-5 будет обучать модели зрения с нуля и иметь возможность автоматически генерировать обработку изображений и звука. **

Основная цель визуальной мультимодальной технологии состоит в том, чтобы позволить автономным агентам читать веб-страницы и транскрибировать их изображение и видеоконтент. Данные, используемые OpenAI для обучения этой модели, включают в себя совместные данные (включая визуализированный LaTeX/текст), снимки экрана веб-страницы и примеры кадров видео Youtube и т. д., а для расшифровки используется технология Whisper.

Одна интересная вещь в проблеме чрезмерной оптимизации LLM заключается в том, что стоимость ввода-вывода визуальной модели отличается от стоимости ввода-вывода простой текстовой модели. Стоимость ввода-вывода текстовой модели очень низкая, но в модели видения стоимость ввода-вывода загрузки данных примерно в 150 раз выше, чем у текстовой модели. Размер каждого токена составляет 600 байт, тогда как у текстовой модели всего 4 байта. В настоящее время ведется большая работа по исследованию сжатия изображений. (Примечание Xianxiang: текстовую информацию легче сжимать, а токенизация изображений/видео — направление, заслуживающее внимания в мультимодальной сфере.)

Стоимость ввода-вывода: стоимость ввода-вывода относится к затратам времени, ресурсов и энергии, необходимых для выполнения операции ввода/вывода в компьютерной системе. Эти затраты включают такие аспекты, как передача, хранение и обработка данных. В области машинного обучения и глубокого обучения стоимость ввода-вывода обычно относится к стоимости чтения и записи данных с носителя (например, жесткого диска, памяти, сети и т. д.). Во время обучения модели и вывода стоимость операций ввода-вывода может стать узким местом, влияющим на производительность и эффективность системы. Следовательно, для повышения производительности и эффективности компьютерных систем необходимо учитывать и оптимизировать затраты на ввод-вывод.

Это очень важно для поставщиков, оптимизирующих свое оборудование через 2-3 года, чтобы учесть сильные визуальные и звуковые возможности каждой модели. Они могут обнаружить, что их архитектура плохо подходит. В целом, будущие архитектуры LLM, безусловно, будут развиваться дальше сокращенных текстовых плотных моделей и/или моделей MoE, которые мы видим сегодня.

Ссылка

Посмотреть Оригинал
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Награда
  • комментарий
  • Поделиться
комментарий
0/400
Нет комментариев
  • Закрепить