Home » Недетерминизм в GPT-4 вызван разреженным MoE

Недетерминизм в GPT-4 вызван разреженным MoE

Его известный на данный момент, что ГПТ-4/ГПТ-3,5-турбо является недетерминированным, даже при temperature=0.0. Это странное поведение, если вы привыкли к плотным моделям только для декодера, где temp=0 должно подразумевать жадная выборка что должно подразумевать полный детерминизм, потому что логиты для следующего токена должны быть чистой функцией входной последовательности и весов модели.

На вопрос о таком поведении круглые столы разработчиков во время мирового турне OpenAI члены технического персонала отвечали примерно так:

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

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

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


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

В недавнем Мягкое МО paper, в Разделе 2.2 была интересная реклама, которая вызвала связь:

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

в настоящее время общественное знание что GPT-4 является моделью Mixture of Experts. Учитывая, что ГПТ-4 был обучение до второго квартала 2022 г.и что разреженная смесь экспертов существовала задолго до этогоя думаю, что следующая гипотеза оправдана:

API GPT-4 размещается на серверной части, которая пакетный вывод. Хотя некоторая случайность может быть объяснена другими факторами, подавляющее большинство недетерминизма в API объясняется тем, что его архитектура Sparse MoE не может обеспечить детерминизм для каждой последовательности.

Это либо совсем неправильно, либо то, что уже было очевидно и хорошо известно людям, разрабатывающим модели MoE. Как мы можем это проверить?

Вы действительно уверены, что это не оборудование?

Еще нет. Давайте спросить ГПТ-4 написать скрипт для проверки нашей гипотезы:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import os
import json
import tqdm
import openai
from time import sleep
from pathlib import Path

chat_models = ["gpt-4", "gpt-3.5-turbo"]
message_history = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Write a unique, surprising, extremely randomized story with highly unpredictable changes of events."}
]

completion_models = ["text-davinci-003", "text-davinci-001", "davinci-instruct-beta", "davinci"]
prompt = "[System: You are a helpful assistant]nnUser: Write a unique, surprising, extremely randomized story with highly unpredictable changes of events.nnAI:"

results = []

import time
class TimeIt:
    def __init__(self, name): self.name = name
    def __enter__(self): self.start = time.time()
    def __exit__(self, *args): print(f"{self.name} took {time.time() - self.start} seconds")

C = 30  # number of completions to make per model
N = 128 # max_tokens
# Testing chat models
for model in chat_models:
    sequences = set()
    errors = 0 # although I track errors, at no point were any errors ever emitted
    with TimeIt(model):
        for _ in range(C):
            try:
                completion = openai.ChatCompletion.create(
                    model=model,
                    messages=message_history,
                    max_tokens=N,
                    temperature=0,
                    logit_bias={"100257": -100.0}, # this doesn't really do anything, because chat models don't do <|endoftext|> much
                )
                sequences.add(completion.choices[0].message['content'])
                sleep(1) # cheaply avoid rate limiting
            except Exception as e:
                print('something went wrong for', model, e)
                errors += 1
    print(f"nModel {model} created {len(sequences)} ({errors=}) unique sequences:")
    print(json.dumps(list(sequences)))
    results.append((len(sequences), model))
# Testing completion models
for model in completion_models:
    sequences = set()
    errors = 0
    with TimeIt(model):
        for _ in range(C):
            try:
                completion = openai.Completion.create(
                    model=model,
                    prompt=prompt,
                    max_tokens=N,
                    temperature=0,
                    logit_bias = {"50256": -100.0}, # prevent EOS
                )
                sequences.add(completion.choices[0].text)
                sleep(1)
            except Exception as e:
                print('something went wrong for', model, e)
                errors += 1
    print(f"nModel {model} created {len(sequences)} ({errors=}) unique sequences:")
    print(json.dumps(list(sequences)))
    results.append((len(sequences), model))

# Printing table of results
print("nTable of Results:")
print("Num_SequencestModel_Name")
for num_sequences, model_name in results:
    print(f"{num_sequences}t{model_name}")

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

  • API OpenAI очень долго не отвечал. Мне пришлось добавить ведение журнала временных меток, чтобы проверить, не делаю ли я что-то не так — это не так, API просто Действительно медленный, с почти 10 секундной задержкой даже на 3,5 турбо. Интересно, почему?

  • некоторые модели завершения усекали свои ответы очень рано. Я добавил логит-предвзятость по отношению к EOS, чтобы попытаться исправить это.

  • Связанный: нет эквивалентного предубеждения против <|im_end|> жетон; API возвращается, Invalid key in 'logit_bias': 100265. Maximum value is 100257. 100265 – точное значение для <|im_end|>:

    Я полагал, что проблема отсутствия логит-смещения для моделей чата не является проблемой — большинство завершений достигали максимальной длины токена, и в любом случае они были абсурдно более недетерминированными (добавление логит-смещения реально только увеличило бы количество уникальные последовательности)

Через час ожидания и написания скриптов я получил подтверждение:

Эмпирические результаты

Вот результаты (3 попытки, N=30, max_tokens=128):

Название модели Уникальные завершения (/30) Среднее (/30) Примечания
gpt-4 12,11,12 11,67
ГПТ-3,5-турбо 4,4,3 3,67
текст-davinci-003 3,2,4 3.00
текст-davinci-001 2,2,2 2.00
davinci-инструктировать-бета 1,1,1 детерминированный Выходы ухудшились в повторяющийся цикл
Да Винчи 1,1,1 детерминированный Выходы ухудшились в повторяющийся цикл

Прежде чем я заметил logit_bias проблема, я также получил следующие результаты (max_tokens=256):

Название модели Уникальные завершения (/30) Примечания
gpt-4 30
ГПТ-3,5-турбо 9
текст-davinci-003 5
текст-davinci-001 2 Заметил проблему смещения логита в этот момент

Да, я уверен

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

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

  1. Меня все еще частично смущает постепенное увеличение рандома от text-davinci-001 до gpt-3.5-turbo. У меня нет четкого объяснения, почему 003 достоверно более рандомен, чем 001, или турбо в большей степени, чем 003. Хотя я ожидаю, что только модели чата будут моделями MoE, а не какая-либо из моделей завершения 3.5, я не уверен. чувствовать себя уверенно, основываясь на имеющихся доказательствах.
  2. Это только свидетельство того, что что-нибудь делает GPT-4 гораздо более недетерминированным, чем другие модели. Может быть, я все еще совершенно не прав насчет МО. Может быть, это просто из-за количества параметров. (но тогда – почему Turbo более непредсказуем, чем davinci? Turbo быстрее; если вы предполагаете ту же архитектуру, Turbo должен быть меньше)

Подразумеваемое

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

Мы так далеко позади

Если недетерминизм является неотъемлемой чертой пакетного вывода с Sparse MoE, тогда этот факт должен быть очевиден для всех, кто работает с моделями в этом ключе.

Учитывая, что подавляющее большинство пользователей GPT-4 до сих пор понятия не имеют, что делает их вызовы API ненадежными, следует сделать вывод, что (я совершенно не прав, ИЛИ) слишком мало людей знают что-либо о моделях MoE, чтобы запускать это объяснение в общественное сознание.

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

GPT-3.5-Turbo тоже может быть МО

я слышал слух, когда-топро 3,5-турбо разделяя та же архитектура как ГПТ-4; просто с гораздо меньшими параметрами, чем у него, или даже у ГПТ-3.

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

Перенесемся в настоящее, и мы все еще страдаем от режима, который требует 70B параметров для соответствия производительности Turbo – номер, который просто не имеет смысла сколько трафика обрабатывает OpenAI и какую скорость они получают.

Также легко заметить, что Турбо — единственная другая модель в API, имеющая свою logprobs ограничено от всеобщего обозрения. Распространенным объяснением было то, что они были ограничены предотвратить повышенную точность дистилляциичто сегодня звучит немного наивно, учитывая косатка и другие. OpenAI также публично заявил что они работают над тем, чтобы интегрировать logprobs в ChatCompletions, что делает «предотвращение дистилляции» менее вероятным, чем «это трудно надежно спроектировать, потому что они по своей сути слишком случайны прямо сейчас»:

Но, тем не менее, как я уже сказал ранее — не совсем уверен в этом. Может быть, кто-то должен открыть рынок предсказаний?

Заключение

  • Всем известно, что модели OpenAI GPT недетерминированы при температуре = 0.
  • Обычно это связано с недетерминированными неточностями операций с плавающей запятой, оптимизированными CUDA.
  • Я выдвигаю другую гипотезу: пакетный вывод в разреженных моделях MoE является основной причиной большей части недетерминизма в API GPT-4.. Я объясню, почему эта гипотеза более точная, чем предыдущая.
  • Я эмпирически продемонстрировал, что вызовы API к GPT-4 (и, возможно, к некоторым моделям 3.5) значительно более недетерминированы, чем другие модели OpenAI.
  • Я предполагаю, что GPT-3.5-turbo также может быть MoE, из-за удаления скорости + не-det + logprobs.


2023-08-04 21:37:09


1691199569
#Недетерминизм #GPT4 #вызван #разреженным #MoE

Read more:  Джордж, Шарлотта и Луи «виноваты» в том, что Кейт и Уильям опоздали на коронацию, говорит Омид Скоби

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.