1P by GN⁺ | ★ favorite | 댓글 1개
  • temperature=0 에서도 GPT-4와 GPT-3.5-turbo가 동일 입력에 대해 매번 다른 출력을 내는 현상, 기존 dense 디코더 모델에서는 발생하지 않는 이례적 동작
  • 그동안 비결정성의 원인은 CUDA 부동소수점 연산의 불안정성 으로 설명되어 왔으나, 이것만으로는 설명 부족
  • Sparse MoE 아키텍처 의 batched inference 구조에서, 같은 배치 내 서로 다른 시퀀스의 토큰들이 expert 버퍼 자리를 두고 경쟁하면서 비결정성 발생
  • 30회 반복 호출 실험에서 GPT-4 는 다른 모델 대비 압도적으로 많은 고유 출력 생성, 가설을 경험적으로 뒷받침
  • 모델은 시퀀스 단위가 아닌 배치 단위에서만 결정적 이라는 점이 GPT-4 API 신뢰성 문제의 핵심 원인

문제 제기 — temperature=0인데 왜 출력이 매번 다른가

  • GPT-4/GPT-3.5-turbo가 temperature=0.0 에서도 비결정적이라는 점은 이미 널리 알려진 사실
    • dense decoder-only 모델에서 temp=0은 greedy sampling 을 의미하고, 이는 완전한 결정성으로 이어져야 함
    • 다음 토큰의 logits가 입력 시퀀스와 모델 가중치만의 순수 함수이기 때문
  • OpenAI World Tour 개발자 라운드테이블에서 기술진의 답변
    • "솔직히 우리도 혼란스럽다. 시스템 버그이거나 최적화된 부동소수점 계산의 비결정성 일 수 있다"는 취지
  • 이 동작은 2년 전 부터 언급된 문제임에도 해결되지 않았다는 점에서 의문 존재
    • reliability를 강조하는 OpenAI가 의도적으로 비결정성을 유지할 이유가 없으므로, 처음에는 해결 불가능한 하드웨어 한계가 가장 그럴듯한 설명으로 간주됨

새로운 가설 — Soft MoE 논문에서 발견한 단서

  • Soft MoE 논문 2.2절에서 결정적 연결고리 발견
    • 용량 제약(capacity constraints) 하에서 모든 Sparse MoE 방식은 고정 크기 그룹 단위로 토큰을 라우팅하고 그룹 내 균형을 강제 또는 유도
    • 그룹이 서로 다른 시퀀스/입력의 토큰을 포함할 때, 이 토큰들은 expert 버퍼의 빈자리를 두고 서로 경쟁
    • 그 결과 모델은 시퀀스 단위에서는 비결정적이고 배치 단위에서만 결정적 이며, 일부 입력 시퀀스가 다른 입력의 최종 예측에 영향을 줌
  • GPT-4가 Mixture of Experts 모델이라는 점은 이미 공개된 사실
    • GPT-4는 2022년 2분기 이전에 학습되었고, Sparse MoE는 그 이전부터 존재
  • 제시된 핵심 가설
    • GPT-4 API는 batched inference 를 수행하는 백엔드에서 호스팅됨
    • 다른 요인도 일부 영향을 줄 수 있으나, API 비결정성의 대부분 은 Sparse MoE 아키텍처가 시퀀스별 결정성을 강제하지 못하는 데서 기인

검증 — 하드웨어 문제가 아님을 확인

  • 가설 검증을 위해 GPT-4에 직접 테스트 스크립트 작성을 요청
    • chat 모델(gpt-4, gpt-3.5-turbo)과 completion 모델(text-davinci-003/001, davinci-instruct-beta, davinci)을 대상으로 동일 프롬프트를 temperature=0 으로 반복 호출, 고유 출력 개수 집계
  • 스크립트 작성 중 발생한 문제들
    • OpenAI API 응답이 매우 느려 3.5 turbo 호출에도 거의 10초 지연 발생, 타임스탬프 로깅을 추가해 자체 오류가 아님을 확인
    • 일부 completion 모델이 응답을 일찍 잘라내, EOS 토큰에 logit bias 를 적용해 보정
    • chat 모델의 <|im_end|> 토큰(100265)에는 동등한 bias 적용 불가, API가 최대값 100257 초과 키 오류 반환
      • 대부분의 completion이 max token 길이에 도달했고 chat 모델은 이미 훨씬 비결정적이었으므로 이 제약은 비핵심 문제로 판단

경험적 결과

  • 3회 시도, N=30, max_tokens=128 조건의 고유 출력(평균/30)
    • gpt-4: 12, 11, 12 — 평균 11.67
    • gpt-3.5-turbo: 4, 4, 3 — 평균 3.67
    • text-davinci-003: 3, 2, 4 — 평균 3.00
    • text-davinci-001: 2, 2, 2 — 평균 2.00
    • davinci-instruct-beta: 1, 1, 1 — 결정적, 출력이 반복 루프로 붕괴
    • davinci: 1, 1, 1 — 결정적, 출력이 반복 루프로 붕괴
  • logit_bias 문제를 발견하기 전 max_tokens=256 조건 결과
    • gpt-4: 30, gpt-3.5-turbo: 9, text-davinci-003: 5, text-davinci-001: 2

결과 해석

  • GPT-4 의 고유 출력 수는 비정상적으로 높아, 긴 출력에서는 사실상 항상 비결정적
  • 반복 루프로 붕괴하지 않은 다른 모델들도 일정 수준의 비결정성 보유, 이는 GPU 연산 불안정성 이 일부 무작위성의 원인이라는 공개 주장과 부합
  • 남은 의문점
    • text-davinci-001에서 gpt-3.5-turbo로 갈수록 무작위성이 점진적으로 증가하는 이유에 대한 명확한 설명 부재
    • GPT-4의 강한 비결정성이 MoE가 아닌 단순 파라미터 수 때문일 가능성도 배제 못 함, 다만 더 빠른 Turbo가 davinci보다 더 비결정적인 점은 이 설명과 상충

함의

우리는 너무 뒤처져 있다

  • 비결정성이 Sparse MoE의 batched inference 에 내재된 특성이라면, 해당 분야 종사자에게는 자명하게 보여야 할 사실
  • 대다수 GPT-4 사용자가 API 불안정성의 원인을 모르는 현실은, 가설이 틀렸거나 MoE 모델을 이해하는 사람이 너무 적어 이 설명이 공론화되지 못했음을 시사
  • Google Deepmind 는 이를 알고 있었고 논문에 지나가는 한 문장으로 적을 만큼 사소하게 다룸, dense 모델만 다루는 다른 조직보다 Deepmind에 더 낙관적일 근거

GPT-3.5-Turbo도 MoE일 가능성

  • 3.5-turbo가 GPT-4와 동일 아키텍처 를 공유하되 파라미터 수만 훨씬 적다는 소문 존재
  • Turbo 성능에 도달하려면 70B 파라미터 가 필요한 현 상황은, OpenAI가 처리하는 트래픽 규모와 속도를 고려할 때 단일 dense 모델로 설명하기 어려움
  • Turbo는 API에서 logprobs 가 비공개로 제한된 유일한 다른 모델
    • 기존 설명은 distillation 정확도 상승 방지였으나, Orca 등 사례를 보면 설득력 약화
    • OpenAI가 ChatCompletions에 logprobs 통합 작업 중이라고 공개 발표한 점은, "distillation 방지"보다 "본질적으로 너무 무작위적이라 안정적 엔지니어링이 어려움"이라는 해석에 무게

결론

  • OpenAI GPT 모델이 temperature=0에서 비결정적이라는 점은 누구나 아는 사실
  • 통상 원인은 CUDA 최적화 부동소수점 연산의 부정확성 으로 지목됨
  • 제시된 다른 가설: Sparse MoE 모델의 batched inference가 GPT-4 API 비결정성의 근본 원인, 기존 설명보다 더 깔끔한 가설
  • GPT-4(및 일부 3.5 모델) API 호출이 다른 OpenAI 모델보다 훨씬 비결정적임을 경험적으로 입증
  • 속도, 비결정성, logprobs 제거를 근거로 GPT-3.5-turbo 역시 MoE일 가능성 추정

댓글과 토론

Hacker News 의견들
  • 부동소수점 오차는 보통 결정적이라서, 같은 계산을 두 번 돌리면 비트 단위까지 같은 결과가 나와야 함
    결과가 갈라지는 건 버퍼를 제대로 0으로 초기화하지 않거나, 경쟁 상태가 있거나, 반올림 모드 플래그를 일관되게 설정하지 않는 등 다른 상태나 엔트로피 원천이 있을 때뿐임
    AI/ML 생태계에서 급조되는 코드 품질을 보면 이 세 가지가 모두, 어쩌면 그 이상도 벌어지고 있을 것 같음

    • GPU에서는 그렇지 않음: https://www.twosigma.com/articles/a-workaround-for-non-deter...
      이 경우에는 GPU 병렬성 때문에 숫자를 더하는 순서가 비결정적이고, 그 결과가 약간 달라질 수 있음
      잘 모르는 시스템 위에 작성된 코드를 두고 남의 코드를 깎아내리는 건 피하는 편이 좋음
      CPU도 병렬 처리 때문에 같은 일이 생길 수는 있지만, CPU의 개별 명령 대부분은 결정적인 반면 CUDA는 비결정적인 기본 연산을 제공함
      이는 결정적 대응물보다 빠르기 때문에 의도된 설계이고, 이걸 나쁜 코드가 만든 버그처럼 표현한 점이 문제임
    • 병렬성이 들어가면 그 말은 깨질 수 있음
      예를 들어 덧셈이나 곱셈 같은 일부 부동소수점 연산은 결합법칙이 성립하지 않으므로, 축소(reduction)를 끝내는 실행 순서에 따라 결과가 달라짐
      병렬 상황에서는 성능 때문에 축소 순서를 비결정적으로 만드는 구현도 있고, 그래서 최종 결과도 비결정적이 됨
    • 수학적으로는 계산이 결정적이지만, 실제 계산을 수행하는 물리적 장치가 소프트웨어 결과를 시간의 함수로 만들 수 있는 여러 방식이 있음
      GetTimeOfDay() 호출만으로도 가능하고, 여러 프로세서 사이의 클록 주파수 드리프트도 그럴 수 있음
    • Alhazen의 원형 당구 문제를 n단계 시뮬레이션하면 여러 번 실행해도 결과가 같을지 궁금함
      https://forumgeom.fau.edu/FG2012volume12/FG201216.pdf
    • 큰 규모에서는 좋은 ECC 메모리가 없다는 것만으로도 엔트로피가 생기기에 충분함
  • 참조 논문의 발췌를 제대로 이해했는지 모르겠음
    더 효율적인 추론 일부가 완전히 별개의 입력, 예컨대 다른 사용자의 입력에서 온 토큰을 섞는 데 의존한다는 뜻인가? 그리고 우연히 같은 묶음에 들어간 다른 입력에 따라 ‘전문가’ 배정 비율이 달라지고, 최종 완성 결과도 달라진다는 뜻인가?
    그렇다면 단순히 비결정성을 도입하는 것뿐 아니라, 같은 전문가 배정을 놓고 경쟁하는 동시 요청 수에 응답 품질이 좌우될 수도 있음
    예를 들어 힌디어 번역/해석을 잘하는 시스템 부분이 인도 피크 시간대에는 같은 역량을 놓고 동시에 경쟁하는 입력이 많아져 더 나쁜 결과를 낼 수 있음
    시간이 지나며 품질이 떨어졌다고 느끼는 또 다른 설명일 수도 있음. 예전에는 특정 테스트가 안정적으로 성공했지만 관련 전문가의 혼잡이 적었고, 지금은 동시 사용량이 늘어 같은 테스트가 그 전문가의 노력을 충분히 얻지 못하는 상황일 수 있음
    어떤 하위 전문가가 특정 영역에서 처음에는 인상적으로 잘하면 그 영역의 사용이 더 많이 몰리고, 새 혼잡 때문에 모방 사용들은 더 이상 같은 전문가 배정을 받지 못해 초기의 인상적인 성능이 떨어지는 수렁도 생길 수 있음
    효과가 강하고 OpenAI가 이를 알면서도 공개하지 않았다면, 처음에는 혼잡하지 않은 Mixture-of-Experts 시스템의 대표성 없는 뛰어남으로 사용자를 끌어들인 뒤 더 혼잡한 시스템의 낮은 품질 결과를 제공하는 미끼 상품처럼 볼 수도 있음

    • 결과는 30번 시도에서 본질적으로 12개의 고유 응답이 나온 것으로 보이는데, 토큰을 섞는다면 기대할 결과는 아님
      아마 배치를 다르게 묶는 것 같음. 배치 10개를 5개씩 2그룹으로 나눌 때 내 프롬프트가 첫 번째 그룹에 들어가느냐 두 번째 그룹에 들어가느냐에 따라 답이 달라지고, 배치 안 같은 위치에 있으면 같은 답을 얻는 식임
      같은 배치, 즉 시퀀스와 순서가 같다면 전체 배치는 결정적이지만, 배치를 섞으면 그 결정성을 잃음
    • 그럴듯한 결과이고, 사실이라면 OpenAI 모델은 경쟁 모델이나 오픈소스 모델에 비해 큰 타격을 받을 수 있음
      지금도 신뢰성은 많은 업무 핵심 흐름에서 LLM의 광범위한 도입을 막는 핵심 장애물 중 하나임
      GPT-4가 본질적으로 비결정적이고 불안정하다는 소문이 사실이라면, 대부분의 기업은 특정 도메인에 맞춰 성능이 비슷한 오픈소스 LLM을 미세조정하는 편이 나음
      도메인 특화 모델은 항상 범용 모델보다 나은 성능을 내므로, 그쪽이 성능상 이득도 더 큼
  • GPT-3.5가 MoE 모델이라면 오픈소스 진영에 꽤 희망적인 신호 아닌가?
    좋은 오픈소스 MoE 모델이 나오면, 기존 디코더 모델의 변형 같은 형태일 수도 있고, 훨씬 적은 자원으로 훨씬 많은 일을 할 수 있다는 뜻임
    MoE 모델을 처음부터 학습해야 하는지는 모르겠음

    • 동의하고, Meta가 그런 방향으로 뭔가 하고 있기를 정말 바람
      FLOPs:메모리 비율을 낮추는 방식, 예컨대 Soft MoE는 CPU나 적어도 Apple Silicon에서의 추론도 더 의미 있게 만들 수 있음
    • 단일 소비자용 GPU로 돌리는 추론 환경에는 나쁠 수 있음
  • 배치 안의 시퀀스들이 서로의 라우팅에 영향을 줄 수 있다면, 이상하고 구현하기 어려운 부채널 공격 가능성이 생기는 느낌임

    • 맞는 것 같음. 다만 실제로 악용하기는 매우 어려울 듯함
  • 정말 훌륭한 작업임. 여러 이유로 MoE에 강하게 반대해 왔는데, Substack 글이나 소문 반복이 아닌 설득력 있는 증거는 처음 봄
    GPT-4가 비결정적이라는 걸 전혀 몰랐고, 하루에 2시간 정도 쓰고 있음
    왜 대충 봐서는 알아차리기 어려웠는지 이해됨. 기억 속에서는 “느낌”이 비슷하고 비슷한 어휘를 많이 쓰지만, 형식은 완전히 다르고 핵심 단어 일부가 같으면서 동의어구처럼 바뀌는 식임

    • MoE 연구 전문가는 아니지만, Soft MoE 논문에 적힌 걸 보고 확인해 봐야겠다고 느꼈음
      링크한 gist 예시를 보면 비결정적 출력은 정말 비슷함: https://gist.github.com/152334H/047827ad3740627f4d37826c867a...
      무작위성이 제한되어 있어야 하므로 이 부분은 적어도 놀랍지 않음
      OpenAI가 언젠가는 이 무작위성을 줄일 방법을 찾아낼 것 같음. ChatCompletions에 logprobs를 다시 추가하겠다는 공개 약속도 있으니 더 그럴 듯함
    • GPT-4 웹 채팅을 하루 두 시간 쓴다면 그럴 수 있음
      같은 입력으로 API를 반복 호출해 프로그램을 개발하는 식이면 비결정성을 놓치기 어려움
    • MoE에 강하게 반대했던 이유가 궁금함
    • 무엇에 쓰는지 궁금함. 플러그인을 많이 쓰는지도 궁금함
      이렇게 많이 쓰는 사람이 이번 주에 나온 기능 묶음까지 포함해 어떤 통찰을 얻었을지 관심 있음
  • MoE는 Mixture of Experts, 즉 전문가 혼합을 뜻함

    • 고마움. Margin of Error인 줄 알았음
      글 중간쯤에서야 약어를 거의 우연처럼 풀어 쓰는데, 의도한 독자는 전문가 혼합인 듯하고 나는 그 안에 없었음
  • GPT-3.0의 davinci-instruct-beta 모델들은 이미 2021년 초부터 비결정적인 logprobs를 반환했음
    이건 추측이고, CUDA 자체도 비결정성 버그가 자주 있음
    text-davinci-001text-davinci-002는 FeedMe와 SFT로 학습됐고, text-davinci-003은 RLHF였음
    모델 자체도 높은 온도에서는 분산이 더 큼

    • 기반 모델, 즉 davincicode-davinci-002는 어떨까?
  • “이 토큰들은 종종 전문가 버퍼의 사용 가능한 자리를 두고 서로 경쟁한다”면, 내가 긴 코드를 요청할 때 ChatGPT가 함수 자리에 자주 플레이스홀더만 써 넣는 이유도 이것 때문인가?

  • “이 토큰들은 종종 전문가 버퍼의 사용 가능한 자리를 두고 서로 경쟁한다”라니, 그럼 부하가 높을 때 결과가 달라진다는 뜻인가?
    가끔 출력 품질이 달라지는 느낌도 높은 부하로 설명되는 건가?

  • MoE는 Mixture of Experts를 뜻함